Sensor de movimiento con aviso por email

Sensor_de_movimiento_email

En este tutorial vamos a aprender a usar un detector de movimiento con Arduino. Dicho Arduino se comunicará con un programa en Python que estará ejecutándose en nuestro pc y que será el encargado de enviar un email cuando se active el detector de movimiento.

Arduino es el corazón de este proyecto. Escucha el sensor y cuando este detecta movimiento, le ordena al pc (mediante el puerto usb) que envíe un email de aviso.

Montando el circuito

Para montar el circuito de este proyecto necesitamos los siguientes componentes:

– 1 sensor de movimiento.

– 1 Arduino UNO R3.

– Cables.

– 1 protoboard.

Una vez tenemos los componentes necesarios, debemos seguir los pasos siguientes:

1 – Conectamos la alimentación y la tierra a la protoboard.

2 – A continuación, conectamos los cables positivo y negativo del sensor (el rojo y el negro respectivamente) al mismo punto donde hemos conectado anteriormente la alimentación y la tierra.

3 – Por último, unimos el cable de datos del sensor (cable amarillo), al pin digital 7 de nuestro Arduino.

Es cierto que podríamos haber conectado directamente el sensor a nuestro Arduino, pero los cables de dicho detector son ligeramente más estrechos que los conectores de nuestro microcontrolador, por lo que quedarían un poco sueltos. Es por ello que utilizamos la protoboard.

Terminado de montar el circuito, deberíamos de tener algo parecido a lo mostrado en la siguiente figura.

PIR_sensor

El código de Arduino

Comencemos por comentar paso a paso el código fuente con el que vamos a programar nuestro Arduino.

En primer lugar, debemos saber que Arduino enviará un mensaje a través de la conexión USB cada vez que se detecte movimiento. Sin embargo, esto puede dar pie a que se generen muchos emails. Es por esta razón, que Arduino envía un mensaje diferente en el caso de que sea muy pronto para enviar otro email.

En primer lugar, creamos una variable con el número de puerto en el que hemos conectado nuestro sensor de movimiento. En nuestro caso es el pin digital 7.

int pirPin = 7;

A continuación, creamos una variable llamada minSecsBetweenEmails. Dicha variable nos permite establecer el tiempo mínimo que ha de transcurrir entre el envío de un email y el siguiente.

int minSecsBetweenEmails = 60; // 1 min.

Para hacer un seguimiento de cuando fue la última vez que se envío un email, crearemos la variable lastSend. Dicha variable la inicializamos con un valor negativo, igual al valor negativo del número de milisegundos especificados en la variable minSecsBetweenEmails. Esto nos garantiza que el sensor puede ser activado de forma inmediata al iniciarse el programa de Arduino.

long lastSend = -minSecsBetweenEmails * 10001;


void setup()
{
    pinMode(pirPin, INPUT);
    Serial.begin(9600);

}

Dentro del bucle principal, la función “millis()” se utiliza para obtener el número de milisegundos que han transcurrido desde que Arduino empezó y compararlo con el momento en el cual la alarma se disparó por última vez.  Solo si de dicha comparación se obtiene un resultado mayor que el número de milisegundos especificados en la variable minSecsBetweenEmails, entonces, se envía el mensaje “MOVIMIENTO”. Si en cualquier otro momento se detecta movimiento, se envía el mensaje “Muy pronto”.

void loop()
{
    long now = millis();
    if (digitalRead(pirPin) == HIGH)
    {
        if (now > (lastSend + minSecsBetweenEmails * 10001))
        {
            Serial.println("MOVIMIENTO");
            lastSend = now;
        }
        else
        {
            Serial.println("Muy pronto");
        }
    }
    
    delay(500);

}

Antes de enlazar con el programa en Python, probaremos nuestro programa Arduino mediante el monitor serie de nuestro IDE.

Monitor_serie

Instalando Python y PySerial

Lo que vamos a hacer a continuación, es instalar Python y la librería PySerial.

Si estás utilizando un Mac o un ordenador con Linux, Python ya estará instalado. Si por el contrario estás utilizando un pc con Windows, necesitarás instalarlo. En ambos casos también necesitarás instalar la librería PySerial para poder realizar la comunicación con Arduino.

Instalando Python en Windows

Para instalar Python en Windows, descarga el instalador desde https://www.python.org/downloads/.

El proyecto se ha realizado con Python 2.7.3. Se ha informado de la existencia de algunos problemas con PySerial en Windows utilizando Python 3, por lo que nos quedaremos con Python 2.

pyserial_install_windows

Una vez que Python ha sido instalado, encontraremos un nuevo grupo de programas en nuestro menú de inicio. Sin embargo, debemos realizar un cambio en Windows para que nos permita utilizar Python desde la consola de comandos, ya que nos hará falta para instalar PySerial.

Vamos a añadir algo a la variable de entorno PATH.

Python_inst_win_setting_path

Para hacer esto, necesitamos ir al panel de control de Windows > Propiedades del Sistema. A continuación, pulsamos el botón con el texto “Variables de Entorno” y en la ventana emergente que ha aparecido, seleccionamos “Path” en la sección “Variables de Entorno”. Seguidamente, pulsamos en “Editar” y al final de “Valor de la variable” y sin borrar ninguna parte del texto existente, añadimos el texto: ;C:\Python27

¡No olvides poner “;” antes del nuevo valor!

Para probar que funciona correctamente, iniciamos una nueva consola de comandos e introducimos la orden “python”. Deberíamos ver algo parecido a esto:

python_from_dos

Instalando PySerial

PySerial es una librería de python que permite comunicarse a través de comunicaciones serie (RS-232).

Esto nos será muy útil para mandar y recibir datos entre nuestro pc y Arduino.

Cualquiera que sea nuestro sistema operativo, descargaremos el paquete .tar.gz para PySerial 2.7 desde https://pypi.python.org/pypi/pyserial

Esto nos dará el archivo llamado: pyserial-2.7.tar.gz

Si estamos utilizando Windows, necesitaremos descomprimir dicho archivo en una carpeta. Desafortunadamente, no es un archivo zip convencional, por lo que tendremos que descargar una herramienta como 7-zip (http://www.7-zip.org/).

Si utilizamos un Mac o un pc con Linux, abrimos una sesión en el terminal, vamos hasta el lugar donde hayamos descargado el archivo pyserial-2.7.tar.gz y a continuación, utilizamos el siguiente comando para descomprimir la carpeta de instalación.

$ tar -xzf pyserial-2.7.tar.gz

El resto del proceso es el mismo independientemente de nuestro sistema operativo. Utilizamos la consola de comandos / sesión de terminal y nos situamos en la carpeta pyserial-2.7, seguidamente ejecutamos el comando:

sudo python setup.py install

pyserial_install_dos

Código Python

Bien, ahora toca crear el programa en Python. Para hacer esto, copiamos el código fuente que hay a continuación y lo pegamos en un nuevo archivo llamado “movement.py”. En Mac o Linux podemos utilizar el editor “nano“, en Windows, probablemente sea más fácil utilizar un editor de Python como “IDLE“, el cual, se encuentra en el grupo de programas de Python dentro del menú de inicio.

import time
import serial
import smtplib
     
TO = 'putyour@email.here'
GMAIL_USER = 'putyour@email.here'
GMAIL_PASS = 'putyourpasswordhere'
     
SUBJECT = 'Intruso!!'
TEXT = 'Tu sensor ha detectado movimiento'

ser = serial.Serial('COM4', 9600)
    
def send_email():
    print("Enviando Email")
    smtpserver = smtplib.SMTP("smtp.gmail.com",587)
    smtpserver.ehlo()
    smtpserver.starttls()
    smtpserver.ehlo
    smtpserver.login(GMAIL_USER, GMAIL_PASS)
    header = 'To:' + TO + '\n' + 'From: ' + GMAIL_USER
    header = header + '\n' + 'Subject:' + SUBJECT + '\n'
    print header
    msg = header + '\n' + TEXT + ' \n\n'
    smtpserver.sendmail(GMAIL_USER, TO, msg)
    smtpserver.close()

while True:
    message = ser.readline()
    print(message)
    if message[0] == 'M' :
        send_email()
    time.sleep(0.5)

Antes de ejecutar el programa en Python, necesitamos realizar algunos cambios en la configuración del mismo. Todos ellos al comienzo del archivo.

El programa asume que el email pertenece a una cuenta de gmail. Por lo que, si no tenemos una, podemos crearla para probar este proyecto.

Lo que haremos a continuación es cambiar la dirección de email que hay asignada a la constante “TO”, por la dirección en la que deseamos recibir las notificaciones. No tiene porque ser nuestra dirección de email, aunque lo puede ser.

TO = 'putyour@email.here'

Seguidamente, cambiamos la dirección de email asignada a la constante “GMAIL_USER” por nuestra dirección y, sustituimos el password que hay en “GMAIL_PASS” por el que utilizamos en dicha cuenta.

GMAIL_USER = 'putyour@email.here'
GMAIL_PASS = 'putyourpasswordhere'

Algo que también podemos hacer, es cambiar el asunto y el cuerpo del mensaje en las dos líneas siguientes.

SUBJECT = 'Intruso!!'
TEXT = 'Tu sensor ha detectado movimiento'

A continuación, tendremos que establecer el puerto serie de Arduino:

ser = serial.Serial('COM4', 9600)

En Windows, puede tener un nombre parecido a “COM4”, en Mac y Linux, será algo parecido a “/dev/tty.usbmodem621”. Este valor lo podemos encontrar en la esquina inferior derecha de nuestro IDE de Arduino, donde nos mostrará que puerto está conectado a nuestra placa.

Puerto_del_IDE_de_Arduino

Una vez hechos los cambios, podemos ejecutar el programa a través del terminal mediante el comando:

python movement.py

Cuando se haya detectado movimiento, obtendremos una traza similar a la de la figura siguiente y, a continuación, recibiremos un email en nuestra bandeja de entrada.

Python_shell

Propuestas

Ahora que sabemos como enviar un email desde nuestro Arduino, se muestra ante nosotros todo un mundo de posibilidades. Podemos añadir diferentes tipos de sensores y así poder, por ejemplo, enviarnos cada hora un email con un resumen de la temperatura detectada.

Otra cosa que podemos hacer es reproducir desde Arduino un sonido de alarma o encender unos leds cada vez que se detecte movimiento.

 

Referencias

– Traducción y adaptación del artículo “Arduino Lesson 17. Email Sending Movement Detector.“, escrito por Simon Monk en Adafruit.com

– Web oficial de Python: https://www.python.org/

– Web oficial de pyserial: https://pypi.python.org/pypi/pyserial

– Documentación sobre pyserial: http://pyserial.sourceforge.net/

Anuncios

6 pensamientos en “Sensor de movimiento con aviso por email

  1. a pesar de que el sensor ya no detecte movimiento el programa de phyton sigue enviando mensajes indefinidamente como lo corrijo?

    • Hola Diego Antonio.

      Es curioso lo que me comentas. ¿Podrías especificar más tu caso?¿Has seguido la ejecución del programa línea a línea?

      Un saludo y gracias por tu comentario.

  2. hola yo tengo el mismo problema pero con video cada que detecta movimiento me envía un correo por cada detección y se me satura el correo

  3. Una pregunta, después de que instalo 7-Zip debo extraer el archivo no? pero despues dice que en el cmd ponga el comando: sudo python setup.py install pero antes de eso debo ubicar la carpeta en el cmd pero no se como se hace eso :c gracias

  4. me sale esto?? que puedo hacer?

    Muy pronto

    Enviando Email

    Traceback (most recent call last):
    File “C:/Users/lenovo/pyserial-3.2.1/movement.py”, line 32, in
    send_email()
    File “C:/Users/lenovo/pyserial-3.2.1/movement.py”, line 20, in send_email
    smtpserver.login(GMAIL_USER, GMAIL_PASS)
    File “C:\Python27\lib\smtplib.py”, line 613, in login
    raise SMTPAuthenticationError(code, resp)
    SMTPAuthenticationError: (534, ‘5.7.14 Please log in via your web browser and\n5.7.14 then try again.\n5.7.14 Learn more at\n5.7.14 https://support.google.com/mail/answer/78754 n6sm3572625uaa.27 – gsmtp’)

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s