Alarma láser con Arduino y alertas por Twitter cuando se activa

Arduino es una de las formas más divertidas de comenzar con la electrónica para unir el mundo digital con el físico. En estas placas se puede grabar fácilmente software para que interactúe con sus diferentes entradas y salidas digitales y analógicas.

En la red se pueden encontrar muchos tutoriales para comenzar y en YouTube muchos videos que enseñan desde lo más básico hasta lo más avanzado de Arduino. Un kit básico con la placa y algunos accesorios ronda los 30 dólares y son ideales para comenzar.

En este post comentaré cómo controlar una alarma láser desde internet y que al ser activada envíe una notificación por Twitter directamente al celular.

alarma laser con arduino y alertas por twitter

Los materiales::

– Una placa Arduino Uno con una Ethernet Shield que permite conectarle un cable de red.
– Un fotoresistor con una resistencia de 10K Ohms.
– Un Led con una resistencia de 220 Ohms.
– Un láser.
– Una cuenta de Twitter.

En la siguiente imagen se puede ver el esquema para armar el circuito y más abajo se puede ver y descargar el código para cargar en el Arduino.

esquema arduino laser con alarma

El Led y el Laser están conectados a un mismo Pin de la placa para ser controlados al mismo tiempo, ya que el led vendría a cumplir la función de un indicador visual para saber si la alarma se encuentra encendida o apagada.

Funciona de forma muy simple, cuando el fotoreceptor deja de recibir la luz del láser se publica un mensaje en Twitter.

En lugar de un láser se podría utilizar un sensor de movimiento o algún otro, pero lo interesante del láser es que tiene un gran alcance y con pequeños espejos se puede hacer rebotar la luz por todos lados como en las películas:

lasers en una gran pelicula

Para conectar el Arduino con Twitter se pueden seguir estos pasos, los mensajes no se envían directamente a Twitter desde la placa, sino que pasan por la web arduino-tweet.appspot.com y luego se publican. Por ello se recomienda no enviar más de un tweet por minuto para evitar saturar su servidor y además Twitter no permite enviar el mismo tweet repetido por lo cual desde el código se generan números que varían para que los mensajes sean siempre diferentes.

Las notificaciones en el celular se reciben simplemente activándolas en la aplicación de Twitter para la cuenta utilizada con el Arduino, de esta forma cada vez que esta cuenta publica un nuevo tweet se recibe la alerta.

Para hacerlo más divertido le agregué un control desde internet que permite controlar el láser desde una página web (todo ya está incluido de forma funcional más abajo en el código). Esto se logra creando un Web Server en la placa Arduino y permitiendo que salga hacia internet con una redirección de puertos en el router y un servicio DDNS como noip.com que se encargue de resolver la IP dinámica que pueda tener la conexión del router.

Con todo esto montado, es hora de verlo en funcionamiento:

El código se puede descargar desde aquí, recordar cambiar la IP de la red local y configurar bien el router para acceder desde internet, también cambiar el Token de Twitter y cargar su librería en Arduino para que funcione.

Código:

#include <SPI.h>
#include <Ethernet.h>
#include <Twitter.h> // librería se descarga desde arduino-tweet.appspot.com y se guarda en la carpeta libraries del software de Arduino

// Variables
int analogZero,analogZero2; // Variables para pines analógicos que generan códigos al azar en Tweets
char msg[140]; // Mensaje para Twitter
byte lasercontrol = 0; // Control on / off del laser
int alarma=3; // Pin para controlar on / off del led y el láser
int fotoreceptor = 0; // Valor del fotoreceptor en entrada A0
int fotoreceptorValor; // Valor del fotoreceptor que depende de la luz
String estado="Apagada"; // Alarma inicia Apagada

// Configuración de red en placa Arduino y Twitter
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,1,101); // IP local asignada asigada a la placa Arduino
IPAddress gateway(192, 168, 1, 1); // IP del Router
IPAddress subnet(255, 255, 255, 0);
EthernetServer server(8085); // Puerto del Arduino, se puede cambiar
Twitter twitter("123456789abcdfghi"); // Token de la cuenta de Twitter

void setup()
{
Serial.begin(9600);

Ethernet.begin(mac, ip);
server.begin();

pinMode(alarma,OUTPUT);

}

void loop()
{
// Lecturas de los pines A1 y A3 para generar códigos al azar y publicar en Twitter
analogZero=analogRead(1);
analogZero2=analogRead(3);

// Se configura el Web Server
EthernetClient client = server.available();

if (client) {
boolean currentLineIsBlank = true;
String cadena="";
while (client.connected()) {
if (client.available()) {
char c = client.read();
cadena.concat(c);

int posicion=cadena.indexOf("ALARMA=");

if(cadena.substring(posicion)=="ALARMA=ON") // Si la alarma se Enciende desde la App
{
digitalWrite(alarma,HIGH);
estado="Encendida";
lasercontrol=1;
}
if(cadena.substring(posicion)=="ALARMA=OFF") // Si la alarma se Apaga desde la App
{
digitalWrite(alarma,LOW);
estado="Apagada";
lasercontrol=0;
}

if (c == 'n' && currentLineIsBlank) {

client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println();

// Página web HTML
client.println("<html>");
client.println("<head>");
client.println("</head>");
client.println("<body>");

client.println("<center><img src="http://i.imgur.com/FCzkAUu.png"></center>");

client.println("<br /><h3 align='center'>Alarma = ");
client.print(estado);
client.println("</h3>");

client.println("<div style='text-align:center;'>");
client.println("<button onClick=location.href='./?ALARMA=ON' style='margin:auto;background-color: #4CAF50;color: snow;padding: 10px;border: 1px solid #4CAF50;width:80px;'>");
client.println("Encender");
client.println("</button>");
client.println("<button onClick=location.href='./?ALARMA=OFF' style='margin:auto;background-color: #4CAF50;color: snow;padding: 10px;border: 1px solid #4CAF50;width:65px;'>");
client.println("Apagar");
client.println("</button>");
client.println("<br /><br />");

client.println("</body>");
client.println("</html>");
break;
}
if (c == 'n') {
currentLineIsBlank = true;
}
else if (c != 'r') {
currentLineIsBlank = false;
}
}
}
delay(1);
client.stop();

}

// Se captura el valor del fotoreceptor, sin incidencia de la luz del láser es menor a 750
fotoreceptorValor= analogRead(fotoreceptor);

// Si el fotoreceptor deja de recibir luz del láser y ALARMA está ON
if ( (fotoreceptorValor<750) && (lasercontrol==1) ) {

// Se publica mensaje en Twitter, analogZero y analogZero2 publican números al azar para Twitter
sprintf(msg, "Alarma láser de spamloco activada!: %d%d.", analogZero, analogZero2);

// Opcional muestra el mensaje en el Puerto Serie
Serial.println(msg);
Serial.println("Conectando a Twitter…");

if (twitter.post(msg)) {
int status = twitter.wait(&Serial);
if (status == 200) {
Serial.println("200 OK");
} else {
Serial.print("Error : code ");
Serial.println(status);
}
} else {
Serial.println("Fallo en la conexión.");
}

delay(60001); // Delay de un minuto para no hacer spam en Twitter
}

}
// Fin del código

4 comentarios en «Alarma láser con Arduino y alertas por Twitter cuando se activa»

  1. ESPECTACULAR!

    Te lo agradezco un montón, excelente el aporte.
    En unos meses espero mudarme y me viene genial para la ventana del balcon y meterle a esto del Arduino que es algo que me debo

    Saludos!!

    Responder

Deja un comentario