
Olá a todos! Neste artigo, falaremos em detalhes e mostraremos como configurar o controle remoto do módulo esp8266 em apenas 20 minutos de tempo livre usando um aplicativo Android com o protocolo MQTT.
A ideia de controle remoto e monitoramento sempre fascinou os entusiastas de eletrônica e programação. A possibilidade de obter ou enviar dados a qualquer momento, independentemente da localização, oferece amplas oportunidades. Em meus artigos anteriores ( e ) eu tentei discutir algumas opções acessíveis e relativamente simples para a implementação do controle remoto de microcontroladores pela internet. No entanto, o tempo e o mundo não param – o progresso continua seu movimento implacável para frente. Nesse curto período, o módulo esp8266 ganhou ampla popularidade graças ao seu baixo custo e Wi-Fi embutido, tornando-se um dos componentes principais da "Casa Inteligente".
Atualmente, o MQTT é o protocolo de transmissão de dados mais avançado e popular entre dispositivos em sistemas de "Casa Inteligente". Ele possui uma série de vantagens em relação a outros protocolos:
— baixo consumo de tráfego;
— a conexão entre cliente e servidor está sempre aberta;
— não sobrecarrega a banda de internet;
— ausência de atrasos na transmissão de dados;
— sistema de assinaturas conveniente para tópicos;
Tudo isso possibilita o monitoramento e controle em tempo real. No entanto, o MQTT requer um servidor próprio, que atua como mediador entre os clientes da rede. Aqui, há duas opções: criar seu próprio servidor ou usar serviços de terceiros.
O sistema de controle descrito consiste em duas partes principais: um servidor MQTT (que geralmente é único) e vários clientes, que podem ser muitos. No nosso caso, o aplicativo Android e o módulo esp8266 atuarão como clientes.
O algoritmo de funcionamento do sistema é o seguinte. Os clientes se conectam ao servidor e, logo após a conexão, cada um deles se inscreve nos tópicos que lhe interessam. Toda a comunicação entre os clientes passa pelo servidor, que redireciona dados para outros clientes com base em suas assinaturas.
Servidor MQTT.
Neste caso, vamos utilizar um serviço extremamente conveniente que possui um plano gratuito (Cute Cat), que atende totalmente às necessidades para a implementação de um pequeno sistema de "casa inteligente."

Vamos nos registrar no site e obter os dados necessários para acessar o servidor. Ao configurar os clientes, é necessário usar uma porta comum (sem SSL e TLS).

Aplicativo para Android.
Nosso aplicativo servirá como controle remoto para o microcontrolador e também receberá e exibirá todas as informações recebidas do esp8266.
O aplicativo se chama e é um cliente mqtt pronto com poucos widgets muito úteis. Mais detalhes sobre o funcionamento do aplicativo podem ser vistos em um vídeo.
Esp8266.
O módulo é programado no ambiente de programação Arduino, mas quero ressaltar que o módulo possui problemas de flash nas versões mais recentes do Arduino, portanto, recomendo usar a versão 1.6.4.
Como exemplo, um LED (pino 5) e um sensor de temperatura ds18b20 (pino 2) estão conectados ao esp8266.
Como é necessário receber dados para controlar o LED, o esp deve se inscrever no tópico correspondente "test/led" após a conexão; caso contrário, todos os dados enviados passarão despercebidos pelo nosso microcontrolador.
Para enviar os dados da temperatura, a inscrição não é necessária, mas ao transmitir os valores da temperatura, é necessário indicar o tópico para onde esses dados vão.
Abaixo, está o esboço com comentários detalhados.
Esboço Esp8266_mqtt.ino// Светодиод подлкючен к 5 пину
// Датчик температуры ds18b20 к 2 пину
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 2
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
const char *ssid = "AIRPORT"; // Nome do ponto de acesso Wi-Fi
const char *pass = "PASSWORD"; // Senha do ponto de acesso
const char *mqtt_server = "server"; // Nome do servidor MQTT
const int mqtt_port = 11140; // Porta para conexão ao servidor MQTT
const char *mqtt_user = "Login"; // Login do servidor
const char *mqtt_pass = "Pass"; // Senha do servidor
#define BUFFER_SIZE 100
bool LedState = false;
int tm=300;
float temp=0;
// Функция получения данных от сервера
void callback(const MQTT::Publish& pub)
{
Serial.print(pub.topic()); // exibindo no console serial o nome do tópico
Serial.print(" => ");
Serial.print(pub.payload_string()); // exibindo no console serial o valor dos dados recebidos
String payload = pub.payload_string();
if(String(pub.topic()) == "test/led") // verificando se os dados vieram do tópico necessário
{
int stled = payload.toInt(); // convertendo os dados recebidos para o tipo inteiro
digitalWrite(5,stled); // ligando ou desligando o LED dependendo dos valores recebidos
}
}
WiFiClient wclient;
PubSubClient client(wclient, mqtt_server, mqtt_port);
void setup() {
sensors.begin();
Serial.begin(115200);
delay(10);
Serial.println();
Serial.println();
pinMode(5, OUTPUT);
}
void loop() {
// подключаемся к wi-fi
if (WiFi.status() != WL_CONNECTED) {
Serial.print("Conectando a ");
Serial.print(ssid);
Serial.println("...");
WiFi.begin(ssid, pass);
if (WiFi.waitForConnectResult() != WL_CONNECTED)
return;
Serial.println("WiFi conectado");
}
// подключаемся к MQTT серверу
if (WiFi.status() == WL_CONNECTED) {
if (!client.connected()) {
Serial.println("Conectando ao servidor MQTT");
if (client.connect(MQTT::Connect("arduinoClient2")
.set_auth(mqtt_user, mqtt_pass))) {
Serial.println("Conectado ao servidor MQTT");
client.set_callback(callback);
client.subscribe("test/led"); // subscrevendo ao tópico com dados para o LED
} else {
Serial.println("Não foi possível conectar ao servidor MQTT");
}
}
if (client.connected()){
client.loop();
TempSend();
}
}
} // fim do ciclo principal
// Функция отправки показаний с термодатчика
void TempSend(){
if (tm==0)
{
sensors.requestTemperatures(); // obtemos o valor da temperatura do sensor
float temp = sensors.getTempCByIndex(0);
client.publish("test/temp",String(temp)); // enviamos o valor da temperatura para o tópico do termômetro
Serial.println(temp);
tm = 300; // pausa entre o envio de valores de temperatura de cerca de 3 segundos
}
tm--;
delay(10);
}
Como resultado, obtemos uma ferramenta conveniente para controle remoto e monitoramento de dados, que é bastante simples de aprender e acessível até para iniciantes.
Vídeo demonstrando o funcionamento do sistema de controle

Instrução em vídeo detalhada sobre como configurar o sistema

Uma das opções de uso do controle ESP8266 através do protocolo MQTT

Controle de fita LED pela internet

Se você tiver dúvidas sobre este material, recomendo assistir à segunda parte do vídeo, onde o conteúdo é apresentado de forma mais visual.
O arquivo contém o sketch e todas as bibliotecas necessárias para programar o microcontrolador com o exemplo.
Ressalto que a biblioteca ESP8266WiFi.h não está incluída neste arquivo, ela deve ser instalada através do gerenciador de placas no ambiente Arduino.
Servidor MQTT —
Link para o aplicativo IoT MQTT Dashboard —
Agradeço a todos pela atenção.
Fonte: habr.com
