Neste artigo estaremos criando um sistema de alimentação para animais de estimação que pode ser controlado pelo WhatsApp.
Componentes necessários
Ferramentas necessárias/bibliotecas necessárias
Máquina baseada em Linux
API WhatsApp baseada em Python
Baseado em MQTT
IDE Python
IDE do Arduino
Informações técnicas
O projeto completo conta com três tipos de comunicação e dispositivos. XMPP (WhatsApp, MQTT e Arduino Serial) também pode ser categorizado como comunicação M2M (comunicação máquina a máquina).
Os desafios técnicos eram criar um dispositivo que pudesse ser controlado com uma interface que estivesse prontamente disponível para todos. Portanto, usaremos o WhatsApp com MQTT para controlar o comedouro dos animais de estimação.
Diagrama de bloco
A caixa de alimentação para animais de estimação é controlada por uma porta controlada por Atmega328 (Arduino UNO) e ESP. Arduino está recebendo comandos via MQTT usando ESP. Existe uma máquina baseada em Linux que executa a API do WhatsApp para ler mensagens do WhatsApp e enviá-las ao corretor MQTT. O ESP recebe comandos do corretor para controlar o servo conectado à porta do sistema de alimentação.
Diagrama de circuito
Conexão para servo
Como funciona o sistema
Quando uma mensagem é enviada do dono do animal para o sistema de alimentação do animal usando o WhatsApp, a mensagem vai primeiro para a máquina Linux, onde a mensagem é lida do WhatsApp usando API. A mensagem é verificada se algum comando estiver disponível para controlar o sistema. O comando é extraído e enviado ao sistema usando MQTT. A mensagem é recebida pelo ESP e enviada ao Arduino via Serial, e se a mensagem disser para abrir a porta do sistema de alimentação, o servo se move e a porta é aberta.
Entendendo o código-fonte
Como o projeto tem duas partes
- Leia mensagens pelo WhatsApp e envie-as para MQTT: Inclui código para máquinas Linux e instalação da API do WhatsApp e implementação do MQTT.
- Leia mensagens pelo MQTT e controle o servo motor: código Arduino para controlar o servo e ESP para comunicação pelo MQTT.
Vamos primeiro entender a comunicação com WhatsApp e MQTT.
Código para script Python
O script python é instalado com a API “Yowsup” do WhatsApp para ler e enviar mensagens do WhatsApp.
Existem dois arquivos neste script run.py e camada.py.
Compreendendo o arquivo Run.py
Chamaremos nossas bibliotecas no topo do arquivo
de yowsup.stacks importar YowStackBuilder
de yowsup.layers.auth importar AuthError
de yowsup.layers importar YowLayerEvent
de yowsup.layers.network importar YowNetworkLayer
de yowsup.env importar YowsupEnv
- Também anexaremos o arquivo da camada no topo porque a classe principal “Ecocamada” existe dentro desse arquivo.
Da importação da camada EchoLayer
- Podemos nomear qualquer arquivo de camada, mas devemos colocar o mesmo nome aqui.
- Dentro de py, declararemos nossa variável principal para senha e eventos que queremos que ocorram.
credenciais = (“91xxxxxxxxxx”, “HkhWVW5/Wnr493HXK8NKl/htpno=”)
- Agora passamos para a camada e construímos a pilha. Além disso, o loop que manterá a conexão ativa é chamado.
stack.setCredentials(credenciais)
stack.broadcastEvent(YowLayerEvent(YowNetworkLayer.EVENT_STATE_CO
NNECT)) #enviando o sinal de conexão
stack.loop #este é o programa mainloop
Compreendendo o arquivo layer.py
Este arquivo contém a biblioteca de protocolos para MQTT e pode receber mensagens do WhatsApp.
Entendendo como as mensagens são recebidas do WhatsApp
Este arquivo contém a classe que receberá todas as mensagens recebidas para este número, e que será uma entidade de retorno de chamada para que qualquer outro loop possa ser executado dentro do arquivo.
@ProtocolEntityCallback(“mensagem”)
def onMessage(self, messageProtocolEntity):
se for verdade:
Os dados da mensagem e o número de onde veio a mensagem podem ser obtidos abaixo.
incomming_message_data = mensagemProtocolEntity.getBody
Isso obterá o corpo da mensagem, que é a mensagem real. Ele será armazenado em uma variável string “incomming_message_data”
incomming_message_sender = mensagemProtocolEntity.getFrom
Esta linha irá armazenar o número de contato da mensagem recebida na variável string “incomming_message_sender”
Compreendendo as camadas MQTT para envio e recebimento
Em primeiro lugar, importaremos as bibliotecas necessárias para o MQTT.
importar paho.mqtt.client como mqtt
importar paho.mqtt.publish como publicar
agora iremos declarar uma variável chamada client com mqtt client.
cliente = mqtt.Cliente
Agora faremos dois retornos de chamada de função 1. Para receber mensagens, 2. Fazer algo na conexão bem-sucedida.
cliente.on_connect=on_connect
cliente.on_message=on_message
Finalmente, nos conectaremos ao broker MQTT em uma porta e iniciaremos o cliente dentro de um loop sem bloqueio
cliente.connect(“corretor.hivemq.com”, 1883, 60)
cliente.loop_start
Depois que a conexão for bem-sucedida, podemos enviar mensagens usando este
publicar.single(tópico, message_data, hostname=”broker.hivemq.com”)
Então, agora quando qualquer mensagem é recebida no WhatsApp, ela é armazenada em uma string, e então essa string é escaneada em busca de algumas palavras-chave que definem aquela mensagem como um comando para ligar/desligar o servo.
elif(“luzes acesas” em incomming_msg):
#Faça algo na partida
Agora, se a condição for atendida, enviamos o comando de controle para o corretor MQTT.
publicar.single(“ts/dog”, “feed”, hostname=”broker.hivemq.com”)
Quando alguma mensagem não reconhecida é recebida, a mensagem no WhatsApp é respondida que é inválida.
Código para Arduino
O Arduino é instalado com um código que recebe dados em série e controla o servo de acordo.
Primeiro adicionamos uma biblioteca “Servo” para controlar o servo facilmente
#include
meuservo.attach(5); // anexa o servo no pino 9 ao objeto servo
meuservo.write(0);
Além disso, quando uma string específica for recebida como “feed” ele irá girar o Servo onde a porta estará aberta e ao receber “ok” irá fechar a porta.
if (rec == “alimentar”) {
meuservo.write(180);
}
if (rec == “ok”) {
meuservo.write(0);
}
Código para ESP
O ESP está conectado ao Arduino na porta serial e inscrito em um tópico MQTT para recebê-lo. Ele envia os dados recebidos no tópico MQTT para a porta serial e os dados da serial para o tópico MQTT.
Para saber mais sobre ESP e MQTT, consulte nossos artigos anteriores.