Sistema de alimentação de animais de estimação usando WhatsApp (protocolo em ponte com MQTT)

Sistema de alimentación de mascotas mediante WhatsApp (protocolo puente con MQTT)

En este artículo crearemos un sistema de alimentación para mascotas que se puede controlar a través de WhatsApp.

Componentes necesarios
Herramientas requeridas/bibliotecas requeridas

Máquina basada en Linux
API de WhatsApp basada en Python
Basado en MQTT
IDE de Python
IDE de Arduino

Informaciones técnicas
El proyecto completo cuenta con tres tipos de comunicación y dispositivos. XMPP (WhatsApp, MQTT y Arduino Serial) también se puede clasificar como comunicación M2M (comunicación de máquina a máquina).

Los desafíos técnicos eran crear un dispositivo que pudiera controlarse con una interfaz que estuviera disponible para todos. Por tanto, utilizaremos WhatsApp con MQTT para controlar el plato de comida de las mascotas.

Diagrama de bloques

Figura 1 Sistema de alimentación de mascotas mediante WhatsApp

La caja de alimentación para mascotas está controlada por un puerto controlado por Atmega328 (Arduino UNO) y ESP. Arduino recibe comandos a través de MQTT usando ESP. Existe una máquina basada en Linux que ejecuta la API de WhatsApp para leer los mensajes de WhatsApp y enviarlos al corredor MQTT. El ESP recibe comandos del corrector para controlar el servo conectado al puerto del sistema de energía.

Diagrama de circuito

conexión servo
Cómo funciona el sistema
Cuando el dueño de la mascota envía un mensaje al sistema de alimentación de la mascota mediante WhatsApp, el mensaje primero va a la máquina Linux donde se lee el mensaje desde WhatsApp mediante API. El mensaje se comprueba si hay algún comando disponible para controlar el sistema. El comando se extrae y se envía al sistema mediante MQTT. El mensaje es recibido por el ESP y enviado al Arduino vía Serial, y si el mensaje dice que abra la puerta del sistema de energía, el servo se mueve y se abre la puerta.

Entendiendo el código fuente
Como el proyecto tiene dos partes

  • Leer mensajes vía WhatsApp y enviarlos a MQTT: Incluye código para máquinas Linux e instalación de la API de WhatsApp e implementación de MQTT.
  • Leer mensajes vía MQTT y controlar el servomotor: código Arduino para controlar el servo y ESP para comunicación vía MQTT.

Primero comprendamos la comunicación con WhatsApp y MQTT.

Código para secuencia de comandos Python
El script de Python se instala con la API “Yowsup” de WhatsApp para leer y enviar mensajes de WhatsApp.

Hay dos archivos en este script run.py y Layer.py .

Comprender el archivo Run.py
Llamaremos a nuestras bibliotecas en la parte superior del archivo.

desde yowsup.stacks importe YowStackBuilder
de yowsup.layers.auth importar AuthError
desde yowsup.layers importa YowLayerEvent
desde yowsup.layers.network importe YowNetworkLayer
desde yowsup.env importar YowsupEnv

  • También adjuntaremos el archivo de capa en la parte superior porque la clase principal "Ecolayer" existe dentro de este archivo.

Desde la importación de capas EchoLayer

  • Podemos nombrar cualquier archivo de capa, pero aquí debemos poner el mismo nombre.
  • Dentro de py, declararemos nuestra variable principal para la contraseña y los eventos que queremos que ocurran.

credenciales = (“91xxxxxxxxxx”, “HkhWVW5/Wnr493HXK8NKl/htpno=”)

  • Ahora pasamos a la capa y construimos la pila. Además, se llama al bucle que mantendrá viva la conexión.

pila.setCredentials(credenciales)
pila.broadcastEvent(YowLayerEvent(YowNetworkLayer.EVENT_STATE_CO
NNECT)) #enviando la señal de conexión
stack.loop #este es el programa del bucle principal

Comprender el archivo Layer.py
Este archivo contiene la biblioteca de protocolos para MQTT y puede recibir mensajes de WhatsApp.

Comprender cómo se reciben los mensajes de WhatsApp
Este archivo contiene la clase que recibirá todos los mensajes entrantes para este número y que será una entidad de devolución de llamada para que se puedan ejecutar otros bucles dentro del archivo.

@ProtocolEntityCallback(“mensaje”)
def onMessage(self, mensajeProtocolEntity):
si es verdad:

Los detalles del mensaje y el número del que proviene el mensaje se pueden obtener a continuación.
incomming_message_data = mensajeProtocolEntity.getBody

Esto obtendrá el cuerpo del mensaje, que es el mensaje real. Se almacenará en una variable de cadena "incomming_message_data"
incomming_message_sender = mensajeProtocolEntity.getFrom

Esta línea almacenará el número de contacto del mensaje recibido en la variable de cadena “incomming_message_sender”

Comprender las capas MQTT para enviar y recibir
En primer lugar, importaremos las bibliotecas necesarias para MQTT.
importar paho.mqtt.client como mqtt
importar paho.mqtt.publish cómo publicar

Ahora declararemos una variable llamada cliente con cliente mqtt.
cliente = mqtt.Cliente

Ahora haremos dos devoluciones de llamada de funciones: 1. Para recibir mensajes, 2. Haga algo en caso de una conexión exitosa.
client.on_connect=on_connect
client.on_message=on_message

Finalmente, nos conectaremos al broker MQTT en un puerto e iniciaremos el cliente dentro de un bucle sin bloqueo.
cliente.connect(“corretor.hivemq.com”, 1883, 60)
cliente.loop_start

Una vez que la conexión sea exitosa, podemos enviar mensajes usando este
publicar.single(tema, datos_mensaje, nombre de host =”broker.hivemq.com”)

Entonces, ahora, cuando se recibe cualquier mensaje en WhatsApp, se almacena en una cadena y luego esa cadena se escanea en busca de algunas palabras clave que definan ese mensaje como un comando para encender/apagar el servo.
elif(“luces encendidas” en incomming_msg):
#Haz algo en el partido

Ahora, si se cumple la condición, enviamos el comando de control al broker MQTT.
publicar.single(“ts/dog”, “feed”, nombre de host=”broker.hivemq.com”)

Cuando se recibe algún mensaje no reconocido, se responde al mensaje en WhatsApp que no es válido.

Código para Arduino
Arduino se instala con un código que recibe datos en serie y controla el servo en consecuencia.

Primero agregamos una biblioteca "Servo" para controlar el servo fácilmente.
#incluir Luego conectamos el servo de acuerdo con el diagrama del circuito y podemos controlar el servo enviando el ángulo al objeto servo.

miservidor.attach(5); // conecta el servo en el pin 9 al objeto servo
myservo.write(0);

Además, cuando se recibe una cadena específica como "alimentación", girará el Servo donde se abrirá la puerta y al recibir "ok" cerrará la puerta.
si (rec == “alimentar”) {
myservo.write(180);
}
si (rec == “ok”) {
myservo.write(0);

}

Código para ESP
El ESP está conectado al Arduino en el puerto serie y suscrito a un tema MQTT para recibirlo. Envía los datos recibidos sobre el tema MQTT al puerto serie y los datos del serie al tema MQTT.

Para obtener más información sobre ESP y MQTT, consulte nuestros artículos anteriores.

Regresar al blog

Deja un comentario

Ten en cuenta que los comentarios deben aprobarse antes de que se publiquen.