Red de sensores: Construye un sensor de sismos con Arduino, un Módulo Ethernet y un QuakeAlarm

arduinounor3-500x500Uno de nuestros primeros artefactos conectados a Internet es el ya famoso sensor sísmico construido a partir de un QuakeAlarm y un Beaglebone  que tuitea cuando detecta un sismo. Este artículo generó que nos contactaran muchas personas interesadas en el dispositivo, que para ser sincero nosotros lo consideramos un buen ejemplo para mostrar como una “cosa” se conecta a Internet, pero personalmente nunca me quedó claro que tan efectivo era para detectar un sismo con anticipación y alertar. Creo que es necesario un conjunto de sensores subterráneos coordinados mediante sistema informático y redes de fibra óptica,  no solo un simple QuakeAlarm (aunque lo venden como pan caliente en otros países a un precio exagerado).

Como es uno de los artículos con mas visitas, decidí darle una revisión al post y construir otro aparato, más genérico que permita conectar distintos sensores, entre ellos un QuakeAlarm a nuestro servidor principal. La idea es construir una red de sensores de temperatura, presión, humedad y obviamente nuestro sensor sísmico. En el servidor un script php recibirá los datos, escribirá un archivo con esos datos  y los tuiteará dependiendo de que tipo de sensor envió los datos.

¿Suena interesante? El tutorial completo tras el salto!

Manos a la obra!

Materiales

Estos son los materiales para crear este artefacto, puedes conseguirlos en nuestra tienda http://internetdelascosas.cl/tienda

Arduino Uno

Módulo Ethernet ENC28J60

– Sensor Sísmico QuakeAlarm

– Cables de conexión para protoboard y cable ethernet

1. Módulo Ethernet

Módulo Ethernet

Para conectar el Módulo Ethernet ENC28J60 nos basaremos en un artículo anterior “Conexión Ethernet para Arduino” donde se detalla la instalación de la librería Arduino para el módulo y el diagrama de conexión.

En la siguiente tabla esta el conexionado entre el Módulo Ethernet y el Arduino:

ENC28J60 Arduino
VCC 3.3v
GND GND
SCK Pin 13
SO Pin 12
SI Pin 11
CS Pin 8

2. QuakeAlarm

arduino_methernet_quakealarm

La conexión del Arduino con el QuakeAlarm es extremadamente simple, no será necesario “abrirlo” como en nuestro artículo anterior, solo deben sacar la tapa superior de la batería y conectar dos cables idealmente con un conector para baterías de 9V, deben colocar especial atención en la polaridad, siempre identificar correctamente cuál es el positivo. La batería de 9V que normalmente alimenta al QuakeAlarm no será necesaria ya que usaremos los 5V que entrega el Arduino Uno.

Las conexiones entre el QuakeAlarm y el Arduino son las siguientes:

QuakeAlarm Arduino Uno
+VCC (cable rojo) 5V
+VCC (cable rojo) A0
GND (cable negro) GND

Notar que +VCC de QuakeAlarm debe separarse en dos cables para conectarse a 5V en el Arduino que lo alimentara de voltaje y a A0 que será la entrada analógica que detectará la caída de tensión al activarse el sensor. En la foto se usó un pequeño Protoboard para esta función.

Ahora, si realmente quieres saber como funciona el QuakeAlarm por dentro, éstos diagramas eléctricos te ayudarán a realizar una conexión más precisa del sensor de forma tal que detecta hasta el golpe mas pequeño del péndulo invertido sobre el borde.

En el diagrama solo se muestra la conexión con el QuakeAlarm usando los pines (5V, GND y A0), hay que recordar que también debe estar cableada la conexión con el módulo ethernet.

3. Programación

El sketch es algo complicado, en él se une la programación del Módulo Ethernet y la del sensor QuakeAlarm, el sketch detecta la baja de voltaje al activarse el sensor sísmico y envía una petición GET a nuestro servidor.

También el sketch considera el efecto rebote, para que envíe solo la primera activación y espere un tiempo determinado antes de enviar una segunda petición GET (Normalmente en un sismo el QuakeAlarm se activa múltiples veces)

Este sketch debe ser transferido al Arduino con el software de conexión (visto en todos los artículos donde trabajamos con Arduino y en nuestro Canal de YouTube).

Todo el código esta en el repositorio de  GitHub que hemos creado para QuakeAlarm.

// Sketch que integra un QuakeAlarm con Arduino
// Version 0.1
// Autor: Jose Antonio Zorrilla @joniuz
// 2013-06-25 @joniuz
// 2013-06-25 @joniuz Corrijo conexion al QuakeAlarm

#include <EtherCard.h>

// QuakeAlarm
#define QUAKEALARM A0

// Variable que mantiene el valor anterior del QuakeAlarm
static int diferencia;

// ethernet interface mac address
static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 };
// remote website name
char website[] PROGMEM = "iot.cl";

byte Ethernet::buffer[700];
static long timer;

// Variables QUAKEALARM
int qaValor = 0;
int qaValorPrevio = 0;
int umbralValor = 10;
int intervaloTiempo = 5000; // Intervalo de tiempo entre dos llamadas al servicio web
long ultimaConexion = 0; // Tiempo en milisegundos desde la ultima conexion al servicio web
char url[200];

// called when the client request is complete
static void my_result_cb (byte status, word off, word len) {
  Serial.print("<<< Respuesta ");   
  Serial.println((const char*) Ethernet::buffer + off); 
} 

void setup () {   
  Serial.begin(57600);   
  Serial.println("\n[getDHCPandDNS]");   
  if (ether.begin(sizeof Ethernet::buffer, mymac) == 0)     
    Serial.println( "Error al iniciar controlador ethernet");   
  if (!ether.dhcpSetup())     
    Serial.println("Error al obtener IP del DHCP");   

  ether.printIp("Mi IP: ", ether.myip);   
  ether.printIp("GW IP: ", ether.gwip);   
  ether.printIp("DNS IP: ", ether.dnsip); 
  if (!ether.dnsLookup(website))     
    Serial.println("Error de DNS");   
  ether.printIp("Servidor: ", ether.hisip);   

  pinMode(QUAKEALARM, INPUT); 
} 

void loop () {   
  ether.packetLoop(ether.packetReceive());   
  qaValor = analogRead(QUAKEALARM);   
  Serial.print("QuakeAlarm: ");   
  Serial.print(qaValor);   
  Serial.print(" : ");   
  Serial.println(diferencia);      
  diferencia = qaValorPrevio - qaValor;   
  if ((diferencia > 0) and (diferencia >= umbralValor) and ((millis() - ultimaConexion) > intervaloTiempo)) {
    Serial.print("Activacion QUAKEALARM: ");
    Serial.print(diferencia);
    Serial.println("\n>>> ####### Envio requerimiento a servidor web #######");
    // Hace la peticion GET al servidor web con variable id codificada en md5 unica para cada estacion
    sprintf(url,"?id=8e5cdf407a45d0f81620f327084a31b7&sensor=quakealarm&valor=%d",diferencia);
    ether.browseUrl(PSTR("/arduino/sensor.php"), url, website, my_result_cb); 
    ultimaConexion = millis(); 
  } 
  qaValorPrevio = qaValor; 
}

4. Servidor

El servidor esta desarrollado en php y es un ejemplo de como procesar la información enviada por el Arduino, pero se puede utilizar para cualquier dispositivo que sea capaz de enviar una petición GET como un Raspberry Pi o Beaglebone.

Esta es la primera versión y obviamente se puede mejorar en muchos aspectos. No quise agregarle mas complejidad conectándolo con una base de datos MySQL ya que la idea es que se entienda.

Para que funcione correctamente con el sketch de Arduino debe llamarse sensor.php y estar ubicado en una carpeta llamada servidor, de tal forma que puedas ejecutarlo colocando en tu browser http://direccion_de_tu_servidor.cl/arduino/sensor.php

Cada estación de sensores debe tener un identificador único asignado que en este caso corresponde a un string generado con md5

Para tuitear utiliza una llamada al sistema operativo con system, deben tener TTytter instalado (ver artículo anterior) y conocer la ubicación de la llave con las credenciales, en este ejemplo el servidor web apache se ejecuta por el usuario apache, por lo cual el archivo con la llave esta ubicado en /home/apache/.ttytterkey y debe tener permisos de lectura para el usuario apache.

<?
// InternetdelasCosas.cl
//
// Script que recibe y procesa las activaciones de sensores
// Autor: @joniuz 

// Obtiene las variables enviadas por el Arduino
$id = htmlspecialchars($_GET["id"],ENT_QUOTES);
$sensor = htmlspecialchars($_GET["sensor"],ENT_QUOTES);
$valor = htmlspecialchars($_GET["valor"],ENT_QUOTES);

// Identifica la estacion que esta enviando el dato validando el id que viene codificado en md5
switch($id) {
   case "8e5cdf407a45d0f81620f327084a31b7":
      $estacion_id = "chile_malloco";
      $estacion_nombre = "Chile/Malloco";
      break;
   case "de2d4dba9ca94e7cd4fc69c426449b11":
      $estacion_id = "chile_santiago";
      $estacion_nombre = "Chile/Santiago";
      break;
   case "14bfa6bb14875e45bba028a21ed38046":
      $estacion_id = "chile_vina_del_mar";
      $estacion_nombre = "Chile/Vina del Mar";
      break;
   default:
      $estacion_id = "no_identificada";
}

// Registra el evento en un archivo log, estos archivos se generan en /var/log/iot/
$log = fopen("/var/log/iot/sensor_" . date("Y-m-j") . ".log","a+");
$linea = date("Y-m-j H:i:s", time()) . " " . $estacion_id . " " . $_SERVER["REMOTE_ADDR"] . " " . $sensor . " " . $valor . "\n";
fwrite($log, $linea); fclose($log);

// Prepara el mensaje para tuitear
switch ($sensor) {
   case "quakealarm":
      $mensaje = "Alerta de sismo";
      break;
   case "temperatura":
      $mensaje = "Temperatura: " . $valor . " C";
      break;
   case "humedad":
      $mensaje = "Humedad: " . $valor . " %";
      break;
}

$estado = date("Y-m-j H:i:s", time()) . " " . $estacion_nombre . " " . $mensaje;

// Si la estacion pertenece a la red de sensores tuitea el evento utilizando TTYtter y la llave generada para el usuario apache ttytterkey

if ($estacion_id <> "no_identificada") {
   $twitter = "/usr/local/bin/ttytter -keyf=/home/apache/.ttytterkey -status=\"" . $estado . "\"";
   system($twitter);
}
// Como salida entrega la direccion ip del Arduino
echo $_SERVER["REMOTE_ADDR"];
?>

¿Se entendió la idea o esta muy complejo el ejemplo? Actualmente esta red de sensores esta activando los tuits de @quakealarmcl y de nuestro tuiter principal @internetDLC, pretendemos seguir conectando mas sensores, especialmente los de temperatura.

Si desean unir sus “artefactos” a nuestra red de sensores, bienvenidos! envíen un email a contacto@internetdelascosas.cl solicitando un identificador.

Author: joniuz

Ingeniero Civil Informático, Universidad de Santiago de Chile. Master of Professional Engineering University of Sydney. En Chile trabajó empresas de servicios internet y telcos como IBM, VTR y Entel. Le gusta la fotografía y el armado de drones, tiene estudios de violín, guitarra eléctrica y sintetizadores que enciende cuando tiene algo de tiempo.

22 thoughts

  1. Estimados por medio del browser no puedo tt pero por linea de comando no presenta problemas me pueden dar una idea en que puedo estar fallando.

    saludos.

  2. Francisco

    Lo mas probable es que sea un problema de permisos.

    Debes revisar que el usuario que ejecuta el servidor web (normalmente es apache para un servidor Apache) pueda ejecutar el script ttytter.

    Saludos

  3. joniuz, estoy intentando conectar el quake alarm de la manera como indicas, pero arduino no detecta cambios en el sensor.

    la conexión está tal cual como lo explican que sería más o menos así:

    —————–== A0 ===\
    [ARDUINO] ==========\======= +VCC ====== [QUAKE ALARM]
    —————-=================== GND ======

    sabes qué podría ser?
    saludos, y gracias de antemano

    1. Guille, efectivamente se conecta el quakealarm al Arduino y al mismo tiempo al puerto analogo A0, la idea es que cuando el quakealarm se activa el Ardiuno detecta la variacion de voltaje.
      Saludos

  4. Estimado, sabes me compre un quake alarm y me gustaría conectarlo al arduino, podrías enviarme información. Estaría muy agradecido.
    Saludos

  5. Reciban mis saludos desde México, mi nombre es Hugo Guevara, soy un entusiasta de las nuevas tecnologías y actual estudiante de las mismas en una maestría que curso, de la cual también se desprende mi interés por estos temas, agradezco el haber encontrado esta página que desde mi punto de vista es muy enriquecedora e informativa, les felicito y les invito a que no dejen de publicar artículos tan novedosos, útiles y actuales como los que ya tienen publicados, ahora, solicito su apoyo para que según su consideración me brinden su opinión sobre si creen ustedes que este proyecto podría calificar para un proyecto de tesis de maestría?, en realidad estoy en búsqueda de temas relacionados con ARDUINO, IOT, y tecnologías emergentes de manera que agradecería mucho su opinión, si ustedes tienen alguna sugerencia también estoy abierto a escucharlos siempre en el marco de respeto y contribución, agradezco su atención y tiempo y espero impaciente una respuesta de su parte, gracias.

    Hugo Guevara

    1. Estimado Hugo

      Arduino en estos momentos se esta usando para muchas tesis de Maestria, por lo que no vemos porque no podria calificar para una. Quiza hay que agregarle algun tipo de inteligencia y analisis de datos al sistema, como por ejemplo una funcion que triangule al menos tres sensores para determinar el epicentro del sismo. Quiza tambien se podria usar un acelerometro como sensor.

      Saludos
      JZ

  6. Hola que tal, estoy realizando este proyecto para aplicarlo como proyecto de residencias en mi universidad y me resulta muy interesante, solo que no comprendo muy bien el paso numero “4.- Servidor” , tengo que crear una pagina web con domino o es localhost? podrias explicarme mas a fondo porfavor?. Saludos desde Mexico

    1. Hola Levi, el punto 4 se refiere a un servidor, es decir un equipo (computador) que ejecuta un sistema operativo y una aplicación que le permite levantar una página web en la red. Puede ser con dominio o simplemente un número IP que identifica al servidor conectado a la red. La palabra “localhost” es la forma en que un servidor hace referencia a si mismo, no es un servidor en si, es un alias de la dirección IP 127.0.0.1, he visto que muchos confunden este concepto básico en redes.
      Saludos
      JZ

      1. Gracias por contestar Ya realize todos los pasos, instale ubuntu server 16.04 , instale ttytter,si hace tweets por consola, hice todas las conexiones, pero al ejecutar la pagina “sensor.php” en el browser me sale este mensaje: “no_identificada”) { $twitter = “/usr/local/bin/ttytter -keyf=/home/apache/.ttytterkey -status=\”” . $estado . “\””; system($twitter); } // Como salida entrega la direccion ip del Arduino echo $_SERVER[“REMOTE_ADDR”]; ?>

        Podrias decirme que me hace falta?, o como lo soluciono porfavor.
        Saludos!!

  7. Hola Buen dia soy algo novato en el manejo de arduino pero me interesa bastante que puede detectar una variación de voltaje, mi pregunta es esta tenemos una sistema de alarma autónomo controlado por unas cuantas placas de arduino uno y mega, pero me interesa agregarle QuakeAlarm para que se active las las torretas. y no solo contar con la activación manual cree que se pueda o tendrán algún ejemplo en el cual me pueda basar o me pueda ayudar a entender esa función de arduino .

    1. Francisco, este proyecto se basa en la deteccion de la variacion de voltaje, asi que creo que te sirve. Que son las torretas? Como es el procedimiento de activacion manual? tienes una pagina web donde muestres el proyecto que estas haciendo?

      Saludos

    1. Si lo quieres hacer con una Raspberry Pi, claro que falta, pero hablamos de un servidor en general, puede ser cualquier hosting o un VPS.
      En este caso, nosotros estamos aportando con el servidor que esta indicado en el codigo.
      Saludos
      JZ

  8. buenas, estoy realizando el proyecto y al momento de ejecutar la pagina “sensor.php” en el browser me sale este mensaje: “no_identificada”) { $twitter = “/usr/local/bin/ttytter -keyf=/home/apache/.ttytterkey -status=\”” . $estado . “\””; system($twitter); } // Como salida entrega la direccion ip del Arduino echo $_SERVER[“REMOTE_ADDR”]; ?>

    Podrias decirme que me hace falta?, o como lo soluciono porfavor.
    Saludos!!

    1. Estimado, si estas usando tu propio servidor, debes generar una “llave” para que la estacion sea identificada por el servidor, asi evitas que cualquiera pueda tuitear. Si estas usando nuestro servidor, debes enviarnos un email para que generemos la llave y veamos si podemos integrarlo a nuestra red.
      Saludos
      JZ

  9. Hola tengo un Quake Alarm y quiero conectarlo a un arduino pero donde lo puedo comprar para conectarlo a un arduino? Saludos desde valparaiso

    1. Estimado Nicolas, todo depende de donde vives, cada pais y ciudad tiene tiendas especializadas que venden Arduino, nosotros vendemos en Chile.
      Saludos
      JZ

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *