Arduino + Python + SMTP Gmail

Vamos a hacer que el sensor de ultrasonido (HC-SR04) conectado a un Arduino UNO R3 nos detecte algún objeto que se le interponga o un intruso.

Arduino + Python + SMTP Gmail

¡Hola! En el tutorial de hoy vamos a hacer que el sensor de ultrasonido (HC-SR04) conectado a un Arduino UNO R3 nos detecte algún objeto que se le interponga o un intruso. Para hacerlo más interesante, cuando detecte una acción, nos enviará un correo electrónico usando el SMTP de Google.

EXPOSICIÓN DEL PROYECTO

Desde mi computadora, y mediante un código en Python, leeremos líneas de información enviados desde un Arduino R3. Si por ejemplo la línea leída es igual a 'H' podrá envíar un correo electrónico.

¿ Qué es SMTP ? El SMTP es un Protocolo para la transferencia simple de correo electrónico. En este caso usaremos el SMTP server de Google. Pueden consultar la librería de smtp de Python en el siguiente enlace http://docs.python.org/2/library/smtplib.html

REALIZACIÓN DEL PROYECTO

Este tutorial se va a dividir en dos partes distintas:

Parte 1: Arduino (código y montaje) Parte 2: Python (código y ejecución)

- PARTE 1: ARDUINO

El código de Arduino es realmente sencillo y, el montaje más aún, pues es colocar el Sensor de Ultrasonido(HC-SR04). Además les invito a revisar el artículo siguiente Sensor de Ultrasonidos HC-SR04 para que tenga una idea más completa del uso de este sensor, y si ya lo han leído espero que sea para refrescar la memoria.

Si ya haz usado Arduino antes, entenderás este código a la primera. Si, por lo contrario, es tu primera vez, no se preocupe, es muy intuitivo y está explicado por cada línea.

#define trigPin 8                                         //Definimos Trigger pin #define echoPin 7                                         //Definimos Echo pin int rangoMaximo = 40;                                     //Rango máximo necesitado int rangoMinimo = 0;                                      //Rango mínimo necesitado int duracion, distancia; void setup() { Serial.begin (9600); pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); } void loop() { digitalWrite(trigPin, HIGH);                          //El siguiente ciclo trigPin / echoPin delayMicroseconds(1000);                              //se utiliza para determinar la distancia del digitalWrite(trigPin, LOW);                           //objeto más cercano haciendo rebotar ondas sonoras fuera de ella duracion = pulseIn(echoPin, HIGH);                    //Determina la duración distancia = (duracion/2) / 29.1;                      //Calcula la distancia en cm if (distancia >= rangoMaximo || distancia <= rangoMinimo){ Serial.println("La casa está segura.");             //Envía a la computadora por el puerto serial el mensaje: 'La casa está segura.' } else { Serial.println("Hay un intruso en la casa.");        //Envía a la computadora por el puerto serial el mensaje: 'Hay un intruso en la casa.' } delay(500);                                           // Hace un retardo de 0.5 segundos antes de la próxima lectura. }

- PARTE 2: Python

Vamos, ahora, con la parte del código en Python. Esta parte consiste en la programación del código que nos permitirá leer los datos envíados desde el Arduino. Llamaremos a este código arduino_smtp.py o como ustedes prefieran llamarle.

Antes de escribir el código, tendremos que instalar la librería ‘python-serial’ para que no nos de error en la ejecución:

sudo apt-get install python-serial

Si estamos en Windows sería de esta forma, primero localizamos la carpeta en dónde hemos descargado la librería usando el CMD y por último debemos de escribir lo siguiente:

python setup.py install

Con esto ya instalamos la librería en Windows. ¡Y ahora vamos a la primera parte del código! No os olvidéis de importar las librerías serial, time y smtplib:

-*- encoding: utf-8 -*- import serial import time import smtplib USUARIO_GMAIL = 'micorreo@gmail.com' CONTRASENA_GMAIL = 'micontraseña' DESTINATARIO = 'destinatario@dominio.com' REMITENTE = 'micorreo@gmail.com' ASUNTO  = ' ¡ Hay un intruso en su hogar. ! ' MENSAJE = ' ¡ Su sensor de seguridad ha detectado movimiento en su casa. ! ' arduino = serial.Serial('COM4', 9600, timeout = 3.0)    #El puerto se abre inmediatamente en la creación de objetos, cuando se da un puerto.

Como pueden apreciar, tenemos que definir variables para usar el SMTP de Google y estas son:

  • En primer lugar, definir USUARIO_GMAIL con nuestro correo gmail y CONTRASENA_GMAIL con su respectiva contraseña.
  • En segundo lugar, definir el cuerpo del correo electrónico: definimos al DESTINATARIO y un REMITENTE. El destinatario es la persona que recibe el correo electrónico y el remitente la persona que lo envía.
  • En tercer lugar, definir el ASUNTO del correo electrónico y su respectivo MENSAJE.
  • Y por último, definir el objeto arduino con los siguientes parametros: puerto_com, baudios y tiempo de espera respectivamente.

¡ A continuación la segunda parte del código !

Creamos un método con el nombre 'enviar_correo_electronico' o el que ustedes prefieran ponerle. Dentro de este método debe de estar todo el proceso del envío de un correo electrónico usando el SMTP server de Google. Sin más preambulos este es el código. :-D

def enviar_correo_electronico(): print("Envíando e-mail") smtpserver = smtplib.SMTP("smtp.gmail.com",587)     #Definimos el objeto 'smtpserver' con smptlib.SMTP, SMTP("",) Administra la conexión SMTP smtpserver.ehlo()                                   #Este método prepara envíar un correo electrónico smtpserver.starttls()                               #Pone la conexión con el servidor SMTP en el modo de TLS. smtpserver.ehlo() smtpserver.login(USUARIO_GMAIL, CONTRASENA_GMAIL)   #Iniciamos sesion en el SMTP server de Google header  = 'To:      ' + DESTINATARIO + '\n'         #Construimos el 'HEADER' para envíar el correo electrónico header += 'From:    ' + REMITENTE    + '\n' header += 'Subject: ' + ASUNTO       + '\n' print header msg = header + '\n' + MENSAJE + ' \n\n'             #Concatenamos el'HEADER' y el 'MENSAJE' del correo electrónico smtpserver.sendmail(REMITENTE, DESTINATARIO, msg)   #Envíamos el correo electrónico smtpserver.close()                                  #Cerramos la conexión con el SMTP server de Google

¡ Ahora la parte final del código ! Para el funcionamiento de este método tendremos que hacer un while que tenga una condición verdadera. En cristiano sería decir: mientras sea verdadero debe de hacer tal cosa. El código es el siguiente :-D

while True: lineaLeida = arduino.readline()                     #Guardo una línea leída desde el puerto serial print(lineaLeida)                                   #Imprime la variable mensaje if lineaLeida[0] == 'H' :                           #Si la línea contiene a 'H' envía un correo electrónico enviar_correo_electronico()                     #Envío un correo electrónico time.sleep(0.5)                                     #Suspende la ejecución por 0.5 segundos # EOF

Para ejecutar este código, simplemente tendremos que introducir lo siguiente en la consola que están usando de su Sistema Operativo de preferencia:

python arduino-smtp.py

Como resultado deberían llegar a algo como esto :D

Aquí les dejo el link del repositorio dónde está este proyecto https://github.com/IvanAliaga/TutorialGeekyTheory

Y también un video con el resultado de este proyecto:

Gracias por haber leído este tutorial. Si tienen alguna duda me pueden preguntar sin ningún problema.