
Ciao a tutti! In questo articolo verrà spiegato dettagliatamente e mostrato come impostare il controllo remoto del modulo esp8266 in soli 20 minuti di tempo libero utilizzando un'applicazione Android tramite il protocollo MQTT.
L'idea del controllo e monitoraggio remoto ha sempre affascinato gli appassionati di elettronica e programmazione. La possibilità di ricevere o inviare dati necessari in qualsiasi momento, indipendentemente dalla propria posizione, offre ampie opportunità. Nei miei articoli precedenti ( e ) ho cercato di esaminare diverse soluzioni disponibili e relativamente semplici per implementare il controllo remoto dei microcontrollori tramite Internet. Tuttavia, il tempo e il mondo non si fermano mai: il progresso continua il suo inarrestabile cammino avanti. In questo breve lasso di tempo, il modulo esp8266 ha acquisito una grande popolarità grazie al suo prezzo basso e al wi-fi integrato, diventando uno dei componenti principali della "Smart Home".
Attualmente, MQTT è il protocollo di trasferimento dati più avanzato e popolare tra i singoli dispositivi all'interno dei sistemi di «Smart Home». Presenta numerosi vantaggi rispetto ad altri protocolli:
— basso consumo di traffico;
— la connessione tra client e server è sempre aperta;
— non sovraccarica la banda internet;
— assenza di ritardi nella trasmissione dei dati;
— un comodo sistema di sottoscrizioni ai topic;
Tutto ciò consente il monitoraggio e il controllo in tempo reale. Tuttavia, MQTT richiede un proprio server che funge da intermediario tra i client della rete. Ci sono due soluzioni: creare il proprio server o utilizzare servizi di terze parti.
Il sistema di gestione descritto è composto da due parti principali: un server MQTT (di solito uno solo) e diversi client. Nel nostro caso, i client saranno un'applicazione Android e il modulo esp8266.
Il funzionamento del sistema è il seguente. I clienti si connettono al server e subito dopo ogni cliente si iscrive ai temi di interesse. Tutta la comunicazione tra i clienti avviene tramite il server, che reindirizza i dati agli altri clienti in base alle loro iscrizioni.
Server MQTT.
Nel nostro caso, utilizzeremo un servizio estremamente conveniente che offre un piano tariffario gratuito (Cute Cat), che coprirà completamente le esigenze per attuare un piccolo sistema di «smart home».

Registriamoci sul sito e otteniamo i dati necessari per accedere al server. Durante la configurazione dei clienti, è necessario utilizzare la porta standard (senza SSL e TLS).

Applicazione Android.
La nostra applicazione fungerà da telecomando per il microcontrollore e recepirà e visualizzerà tutte le informazioni ricevute dall'esp8266.
L'applicazione si chiama ed è un client mqtt preconfigurato con un numero ridotto di widget molto pratici. Maggiori dettagli sul funzionamento dell'app possono essere visti nel video.
Esp8266.
Il modulo viene programmato nell'ambiente di programmazione Arduino, ma vorrei far notare che ci sono problemi di flashing nelle ultime versioni di Arduino, quindi consiglio di utilizzare la versione 1.6.4.
Per esempio, al esp8266 sono collegati un LED (pin 5) e un sensore di temperatura ds18b20 (pin 2).
Poiché è necessario ottenere dati per controllare il LED, l'esp dopo il collegamento deve iscriversi al topic corrispondente 'test/led', altrimenti tutti i dati inviati passeranno oltre il nostro microcontrollore.
Per inviare i dati di temperatura non è necessario iscriversi, ma durante la trasmissione dei valori di temperatura è necessario specificare il topic a cui andranno questi dati.
Di seguito è riportato uno sketch con dettagliati commenti.
Sketch 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 del punto di accesso Wi-Fi
const char *pass = "PASSWORD"; // Password del punto di accesso
const char *mqtt_server = "server"; // Nome del server MQTT
const int mqtt_port = 11140; // Porta per la connessione al server MQTT
const char *mqtt_user = "Login"; // Credenziali per il server
const char *mqtt_pass = "Pass"; // Password del server
#define BUFFER_SIZE 100
bool LedState = false;
int tm=300;
float temp=0;
// Функция получения данных от сервера
void callback(const MQTT::Publish& pub)
{
Serial.print(pub.topic()); // Stampa il nome del topic sulla seriale
Serial.print(" => ");
Serial.print(pub.payload_string()); // stampiamo i dati ricevuti sulla porta seriale
String payload = pub.payload_string();
if(String(pub.topic()) == "test/led") // controlliamo se i dati provengono dal topic giusto
{
int stled = payload.toInt(); // convertiamo i dati ricevuti in tipo integer
digitalWrite(5, stled); // accendiamo o spegniamo il LED a seconda dei valori ricevuti
}
}
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("Collegando a ");
Serial.print(ssid);
Serial.println("...");
WiFi.begin(ssid, pass);
if (WiFi.waitForConnectResult() != WL_CONNECTED)
return;
Serial.println("WiFi connesso");
}
// подключаемся к MQTT серверу
if (WiFi.status() == WL_CONNECTED) {
if (!client.connected()) {
Serial.println("Collegando al server MQTT");
if (client.connect(MQTT::Connect("arduinoClient2")
.set_auth(mqtt_user, mqtt_pass))) {
Serial.println("Connesso al server MQTT");
client.set_callback(callback);
client.subscribe("test/led"); // ci iscriviamo al topic con i dati per il LED
} else {
Serial.println("Impossibile connettersi al server MQTT");
}
}
if (client.connected()){
client.loop();
TempSend();
}
}
} // fine del ciclo principale
// Функция отправки показаний с термодатчика
void TempSend(){
if (tm==0)
{
sensors.requestTemperatures(); // otteniamo il valore della temperatura dal sensore
float temp = sensors.getTempCByIndex(0);
client.publish("test/temp", String(temp)); // inviamo il valore della temperatura al topic del sensore
Serial.println(temp);
tm = 300; // pausa tra l'invio dei valori di temperatura di circa 3 secondi
}
tm--;
delay(10);
}
Il risultato è uno strumento comodo per il controllo remoto e il monitoraggio dei dati, abbastanza semplice da apprendere e accessibile anche ai principianti.
Video di dimostrazione del sistema di gestione

Istruzioni video dettagliate per la configurazione del sistema

Una delle opzioni per controllare esp8266 tramite protocollo MQTT

Controllo di una striscia LED tramite internet

Se avete domande su questo materiale, vi consiglio di guardare la seconda parte del video, dove il materiale è presentato in modo più visivo.
Nell'archivio ci sono lo sketch e tutte le librerie necessarie per il flashing del microcontrollore con lo sketch dell'esempio.
Vi informo che la libreria ESP8266WiFi.h non è inclusa in questo archivio, può essere installata tramite il gestore delle schede nell'ambiente Arduino.
Server MQTT —
Link all'app IoT MQTT Dashboard —
Grazie a tutti per l'attenzione.
Fonte: habr.com
