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.

Consigue gratis tu cuenta

Curso de Python 3

En este curso de programación en Python 3 aprenderás lo fundamental para poder hacer tus propios proyectos. ¿Quieres saber cómo empezar a programar? ¡Apúntate a este curso!

Comenzar ahora

¡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.


¿Quieres seguir aprendiendo?