Manual

do

Maker

.

com

Como usar MQTT com Arduino

Como usar MQTT com Arduino

Se você ainda não conhece o MQTT, sugiro que se apresse em fazê-lo, porque esse é o protocolo da Internet das Coisas e está cada vez mais presente em dispositivos embarcados.

Em outros artigos escrevi sobre a utilização de MQTT com Raspberry e ESP8266, assim como a configuração de um broker, que pode estar rodando em X86 ou no próprio Raspberry.

No artigo de hoje vamos ver como colocar o Arduino para conversar com o MQTT; não confunda com o broker. Recentemente em uma discussão em um fórum um jumento sugeriu a instalação do OpenCV no Arduino para fazer treinamento e detecção facial e sei lá mais o quê. Depois o jumento ficou reformulando as próprias afirmações, então faço questão de enfatizar que em relação ao broker, não sei se seria possível sua implementação em Arduino, mas um client é totalmente possível, como você verá a seguir. Em relação ao OpenCV, escrevi alguns artigos aqui no site e em breve disponibilizarei um artigo com LPR. Continuando.

Instalar a biblioteca MQTT para Arduino

Chega a arder a orelha só de pensar em como escrever esse artigo simplório, mas eu não poderia deixar de escrevê-lo porque ele agrega informações a esse outro artigo onde explico como configurar um broker. Basicamente, você deverá acessar os menus da IDE do Arduino na ordem Sketch->Include Library->Manage Libraries e então escolher a biblioteca que deseja utilizar, digitando "MQTT" na caixa de pesquisa. Eu escolho a biblioteca que aparece em segundo, logo abaixo da biblioteca da Adafruit. No menu File->Examples você deve encontrar o sub-menu CMMC MQTT Connector, onde diversos exemplos estão dispostos. Se você não leu os artigos anteriores relacionados a MQTT, dê uma pesquisada  aqui no site.

Publish com MQTT

Abra o exemplo basic_mqtt. Na primeira aba você tem os parâmetros que deverão ser ajustados para se conectar ao seu broker. Mais uma vez, a configuração de um broker pode ser vista nesse artigo. Os parâmetro que deverão ser ajustados são basicamente host, usuário, senha e, se requerido em sua configuração do broker,  o client ID. O intevalo de envio está definido na macro PUBLISH_EVERY, que inicialmente está em 10 segundos, mas você pode mudar para qualquer intervalo maior que todo o tempo requerido para a transação completa.

Logo mais abaixo estão dispostas configurações relacionadas ao WiFi, as quais provavelmente não serão utilizadas por você, exceto tenha um módulo WiFi, mas minha recomendação é que utilize um ethernet shield. Se for para utilizar wireless, que seja algo como um NRF ou preferencialmente o Whisper Node. Se for para utilizar WiFi, então deixe o Arduino de lado e utilize um ESP8266, sendo possível fazê-lo.

No arquivo _publish.h (que também abre na IDE do Arduino, juntamente ao basic_mqtt) você pode ver o formato da mensagem, que é um objeto json preenchido com alguns parâmetros. Como toda a conexão MQTT estabelecida, a resposta da comunicação é recebida através de um callback. Nessa biblioteca você encontra esse callback no arquivo _receive.h, que compõe um string e a imprime na serial. Se precisar manipular a resposta ou simplesmente interagir com o programa principal, faça-o através desse arquivo. Do mesmo modo, formate a mensagem em _publish.h e no código principal, defina as variáveis desejadas para o envio. No basic_mqtt a inicialização do recurso é feita em setup() e no loop() é necessário chamar o método loop() da instância MQTT:

void setup()
{
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  while(WiFi.status() != WL_CONNECTED) {
    Serial.println("CONNECTING...");
    delay(300);
  }
  init_hardware();
  init_mqtt();
}

void loop()
{
  mqtt->loop();
}

O init_mqtt() vem do arquivo init_mqtt.h, nde são atribuidos os valores para as variáveis host, port etc. O problema é que nesse arquivo também é iniciado o WiFi, de modo que você precisará modificar um bocadinho o código, caso use realmente um ethernet shield. Mas obviamente é muito melhor não ter que modificar nada, não é mesmo?

MQTT PubSubClient

Então experimente a biblioteca MQTT PubSubClient é bem mais enxuta e familiar, porque o endereço do servidor é definido no formato do tipo IPAddress; o callback também está explicito no arquivo principal, de modo que fica mais claro para quem não tem intimidade ainda com MQTT e deseja saber o funcionamento "nos bastidores". Já é um código a ser utilizado com ethernet shield, portanto você não precisará fazer adaptações, tem um método de callback para tratar reconexão e por fim, o loop do client dentro da função loop() do sketch default do Arduino.

Existem diversas bibliotecas e você poderá experimentar qualquer uma delas. Se você não tem linux em sua máquina, utilize uma VM. Se tiver um Raspberry, configure um broker nele, então faça o teste com o MQTT e Arduino e esteja familiarizado para o post onde faremos uma USCA (Unidade Supervisora de Corrente Alternada), seguindo os mesmos padrões eletrônicos da USCA que fiz para uma empresa de telecom, baseado no projeto dos engenheiros elétricos responsáveis pelas antenas de telefonia.

Inscreva-se no nosso canal Manual do Maker no YouTube.

Também estamos no Instagram.

Nome do Autor

Djames Suhanko

Autor do blog "Do bit Ao Byte / Manual do Maker".

Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.