
Hallo zusammen! In diesem Artikel wird ausführlich beschrieben und gezeigt, wie man in nur 20 Minuten Freizeit die Fernsteuerung des esp8266-Moduls mit einer Android-Anwendung über das MQTT-Protokoll einrichtet.
Die Idee der Fernsteuerung und -überwachung hat schon immer die Köpfe von Menschen in der Elektronik und Programmierung beschäftigt. Die Möglichkeit, jederzeit die benötigten Daten zu erhalten oder zu senden, unabhängig von unserem Standort, eröffnet viele Möglichkeiten. In meinen vorherigen Artikeln ( und ) habe ich versucht, einige verfügbare und relativ einfache Varianten der Umsetzung der Fernsteuerung von Mikrocontrollern über das Internet zu betrachten. Doch die Zeit und die Welt stehen nicht still – der Fortschritt schreitet unaufhaltsam voran. In dieser kurzen Zeit hat das Modul esp8266 große Popularität erlangt, da es durch seinen niedrigen Preis und integriertes Wi-Fi zu einem der Hauptbestandteile des „Smart Home“ wurde.
Derzeit ist MQTT das fortschrittlichste und beliebteste Protokoll zur Datenübertragung zwischen einzelnen Geräten im Rahmen von „Smart Home“-Systemen. Es bietet eine Reihe von Vorteilen im Vergleich zu anderen Protokollen:
— geringer Datenverbrauch;
— die Verbindung zwischen Client und Server ist immer offen;
— belastet nicht den Internetkanal;
— keine Verzögerungen bei der Datenübertragung;
— bequeme Abonnementsysteme für Themen;
All dies ermöglicht eine Überwachung und Steuerung in Echtzeit. Allerdings erfordert MQTT einen eigenen Server, der als Vermittler zwischen den Clients im Netzwerk fungiert. Hier gibt es zwei Möglichkeiten: entweder einen eigenen Server erstellen oder externe Dienste nutzen.
Das beschriebene Steuersystem besteht aus zwei Hauptteilen: einem MQTT-Server (in der Regel nur einer) und den Clients, von denen es ziemlich viele geben kann. In unserem Fall werden die Android-Anwendung und das esp8266-Modul als Clients fungieren.
Der Ablauf des Systems ist folgender: Die Clients verbinden sich mit dem Server und unmittelbar nach der Verbindung abonniert jeder von ihnen die für ihn interessierenden Themen. Die gesamte Kommunikation zwischen den Clients erfolgt über den Server, der die Daten gemäß ihren Abonnements an andere Clients weiterleitet.
MQTT-Server.
In unserem Fall werden wir einen äußerst praktischen Dienst nutzen, der einen kostenlosen Tarif (Cute Cat) anbietet, der alle Anforderungen für die Umsetzung eines kleinen eigenen «Smart Home»-Systems erfüllt.

Wir werden uns auf der Website registrieren und die erforderlichen Daten für den Zugriff auf den Server erhalten. Bei der Einrichtung der Clients muss der Standardport (ohne SSL und TLS) verwendet werden.

Anwendung auf Android.
Unsere Anwendung wird als Fernbedienung für den Mikrocontroller fungieren und wird auch alle von esp8266 empfangenen Informationen anzeigen.
Die Anwendung heißt und ist ein fertiger MQTT-Client mit einer kleinen Anzahl sehr praktischer Widgets. Eine detaillierte Erklärung zur Verwendung der Anwendung kann im Video angesehen werden.
Esp8266.
Das Modul wird in der Programmierumgebung Arduino geflasht, ich möchte jedoch darauf hinweisen, dass das Modul in den neuesten Versionen von Arduino Probleme mit dem Flashen hat, deshalb empfehle ich, die Version 1.6.4 zu verwenden.
Zum Beispiel sind an esp8266 eine LED (Pin 5) und ein Temperatursensor ds18b20 (Pin 2) angeschlossen.
Da zur Steuerung der LED Daten benötigt werden, muss sich esp nach dem Anschluss auf das entsprechende Topic «test/led» abonnieren, sonst gehen alle gesendeten Daten an unserem Mikrocontroller vorbei.
Für die Übertragung von Temperaturdaten ist kein Abonnement erforderlich, aber beim Senden von Temperaturwerten muss das Topic angegeben werden, in das diese Daten gesendet werden.
Im Folgenden finden Sie den Sketch mit detaillierten Kommentaren.
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"; // Name des WLAN-Zugangspunkts
const char *pass = "PASSWORD"; // Passwort für den Zugangspunkt
const char *mqtt_server = "server"; // Name des MQTT-Servers
const int mqtt_port = 11140; // Port für die Verbindung zum MQTT-Server
const char *mqtt_user = "Login"; // Anmeldedaten vom Server
const char *mqtt_pass = "Pass"; // Passwort vom Server
#define BUFFER_SIZE 100
bool LedState = false;
int tm=300;
float temp=0;
// Функция получения данных от сервера
void callback(const MQTT::Publish& pub)
{
Serial.print(pub.topic()); // Ausgabe des Topic-Namens an den Serial-Port
Serial.print(" => ");
Serial.print(pub.payload_string()); // Ausgabe der empfangenen Daten an den Serial-Port
String payload = pub.payload_string();
if(String(pub.topic()) == "test/led") // Überprüfen, ob die Daten vom richtigen Topic stammen
{
int stled = payload.toInt(); // Umwandlung der empfangenen Daten in den Typ Integer
digitalWrite(5, stled); // LED ein- oder ausschalten, abhängig von den empfangenen Werten
}
}
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("Verbinde mit ");
Serial.print(ssid);
Serial.println("...");
WiFi.begin(ssid, pass);
if (WiFi.waitForConnectResult() != WL_CONNECTED)
return;
Serial.println("WiFi verbunden");
}
// подключаемся к MQTT серверу
if (WiFi.status() == WL_CONNECTED) {
if (!client.connected()) {
Serial.println("Verbinde mit dem MQTT-Server");
if (client.connect(MQTT::Connect("arduinoClient2")
.set_auth(mqtt_user, mqtt_pass))) {
Serial.println("Verbunden mit dem MQTT-Server");
client.set_callback(callback);
client.subscribe("test/led"); // abonnieren des Themas für die LED-Daten
} else {
Serial.println("Konnte keine Verbindung zum MQTT-Server herstellen");
}
}
if (client.connected()){
client.loop();
TempSend();
}
}
} // Ende des Hauptzyklus
// Функция отправки показаний с термодатчика
void TempSend(){
if (tm==0)
{
sensors.requestTemperatures(); // Wir erhalten den Temperaturwert vom Sensor
float temp = sensors.getTempCByIndex(0);
client.publish("test/temp",String(temp)); // senden den Temperaturwert an das Thema für den Temperatursensor
Serial.println(temp);
tm = 300; // Pause zwischen den Temperaturwertübertragungen von etwa 3 Sekunden
}
tm--;
delay(10);
}
So erhalten wir ein nützliches Werkzeug zur Fernsteuerung und Datenüberwachung, das recht einfach zu erlernen ist und auch für Anfänger machbar sein wird.
Video mit einer Demonstration der Steuerungssysteme

Detaillierte Videoanleitung zur Konfiguration des Systems

Eine der Möglichkeiten, die Steuerung des esp8266 über das MQTT-Protokoll anzuwenden

Steuerung des LED-Streifens über das Internet

Falls Sie Fragen zu diesem Material haben, empfehle ich, sich den zweiten Teil des Videos anzusehen, in dem das Material anschaulicher dargestellt ist.
Im Archiv befinden sich der Sketch und alle notwendigen Bibliotheken für die Programmierung des Mikrocontrollers mit dem Beispiel-Sketch.
Bitte beachten Sie, dass die Bibliothek ESP8266WiFi.h nicht in diesem Archiv enthalten ist, sie kann über den Boards-Manager in der Arduino-Umgebung installiert werden.
MQTT-Server —
Link zur IoT MQTT Dashboard-App —
Vielen Dank für Ihre Aufmerksamkeit.
Quelle: habr.com
