In diesem NodeMCU ESP8266 MQTT Tutorial erkläre ich dir die Grundlagen von MQTT.

ESP8266 MQTT Tutorial

Tutorial
Teile diesen Beitrag

Der Mini-Bastelcomputer ESP8266 eignet sich bestens für Projekte mit geringem Budget, bei dem verschiedenste Geräte smart gemacht werden sollen. In diesem Tutorial möchte ich dir deshalb zeigen, wie du mit dem ESP8266 MQTT-Daten versenden kannst.

Da der ESP8266 nur über wenig Rechenleistung verfügt, liegt es nahe, die gesammelten Daten an ein leistungsfähigeres Gerät, wie beispielsweise einen Raspberry Pi zu senden, der sie auswertet und die nötigen Befehle an den ESP8266 senden kann.

Mit ein bisschen Code beherrscht auch der NodeMCU ESP8266 MQTT.

Mit ein bisschen Code beherrscht auch der NodeMCU ESP8266 MQTT.


Amazon Prime6,99 €
Stand: 7. Dezember 2019 5:07 Uhr
Auf Amazon ansehen

In diesem Tutorial verwende ich einen Raspberry Pi, auf dem ein MQTT-Broker eingerichtet ist und der mit einem Python Skript auf Daten vom ESP8266 wartet.

Wie du deinen Raspberry Pi als MQTT-Broker einsetzen kannst und wie du das Skript anlegst, habe ich bereits im Beitrag MQTT Raspberry Pi Einführung erklärt.

Wie du den ESP8266 mit der Arduino IDE programmieren kannst, habe ich schon einmal in meinem ESP8266 Einführungstutorial erklärt. Falls du mit der Arduino IDE noch nicht so ganz fit bist, solltest du dir den Beitrag zuerst ansehen.

Die MQTT Bibliothek in die Arduino IDE importieren

Der ESP8266 kann von Haus aus noch kein MQTT. Deshalb muss zuerst die entsprechende Bibliothek eingebunden werden. Klicke dazu in der Arduino IDE oben in der Leiste auf Sketch und dort auf Bibliothek einbinden. Hier klickst du nun auf Bibliotheken verwalten und der Bibliotheken-Manager öffnet sich.

Im Menüpunkt "Bibliotheken verwalten" können neue Bibliotheken eingebunden werden.

Im Menüpunkt “Bibliotheken verwalten” können neue Bibliotheken eingebunden werden.

In der Bibliotheks-Verwaltung gibst du oben rechts in die Suchleiste “PubSubClient” ein. Bei den jetzt erschienenen Bibliotheken klickst du bei “PubSubClient” auf Installieren.

Hier muss die Bibliothek "PubSubClient" eingebunden werden.

Hier muss die Bibliothek “PubSubClient” eingebunden werden.

ESP8266 MQTT-Daten an Python Skript auf dem Raspberry senden

In diesem Beispiel wird die Zeit, die der ESP8266 bereits läuft in Millisekunden per MQTT an den Pi gesendet. Der folgende Code verbindet sich mit deinem WLAN-Netzwerk und deinem MQTT-Broker und sendet dann alle 5 Sekunden die aktuelle Betriebszeit an den Pi.

Dazu fügst du den folgenden Code in die Arduino IDE ein und änderst die Variablen SSIDPSK und MQTT_BROKER und setzt dort den Namen deines WLAN-Netzwerkes, das Passwort des Netzwerkes und die IP-Adresse deines Raspberry Pi ein. Anschließend kannst du den Code auf deinen ESP8266 flashen.

#include <ESP8266WiFi.h>
#include <PubSubClient.h>

const char* SSID = "NETZWERKNAME";
const char* PSK = "NETZWERKSCHLÜSSEL";
const char* MQTT_BROKER = "BROKER_IP";

WiFiClient espClient;
PubSubClient client(espClient);
long lastMsg = 0;
char msg[50];
int value = 0;

void setup() {
	Serial.begin(115200);
	setup_wifi();
	client.setServer(MQTT_BROKER, 1883);
}

void setup_wifi() {
	delay(10);
	Serial.println();
	Serial.print("Connecting to ");
	Serial.println(SSID);

	WiFi.begin(SSID, PSK);

	while (WiFi.status() != WL_CONNECTED) {
		delay(500);
		Serial.print(".");
	}

	Serial.println("");
	Serial.println("WiFi connected");
	Serial.println("IP address: ");
	Serial.println(WiFi.localIP());
}

void reconnect() {
	while (!client.connected()) {
		Serial.print("Reconnecting...");
		if (!client.connect("ESP8266Client")) {
			Serial.print("failed, rc=");
			Serial.print(client.state());
			Serial.println(" retrying in 5 seconds");
			delay(5000);
		}
	}
}
void loop() {

	if (!client.connected()) {
		reconnect();
	}
	client.loop();

	snprintf (msg, 50, "Alive since %ld milliseconds", millis());
	Serial.print("Publish message: ");
	Serial.println(msg);
	client.publish("/home/data", "Hello World");
	delay(5000);
}

Um die Daten mit dem Python-Skript des Raspberry Pi zu empfangen startest du außerdem auf dem Pi das Skript mit dem folgenden Befehl:

sudo python mqtt_test.py

Jetz wird alle 5 Sekunden die aktuelle Betriebszeit des ESP8266 ausgegeben.

Daten empfangen und LED schalten

Im nächsten Beispiel wird eine LED an den ESP8266 angeschlossen und ein- bzw. ausgeschalten, wenn eine Nachricht, die der ESP8266 per MQTT erhalten hat, an bzw. off lautet.

Schaltung der LED-Steuerung

Als erstes musst du eine LED mit dem ESP8266 verbinden. Dazu schließt du den langen Pin der LED D7 und den kurzen Pin an GND an.

So sieht die Schaltung der WLAN-Fernbedienung aus.

So sieht die Schaltung der WLAN-Fernbedienung aus.

Code der LED-Steuerung

Jetzt fügst du den folgenden Code in die Arduino IDE ein, setzt wieder die entsprechenden Daten für die Variablen SSIDPSK und MQTT_BROKER ein und flasht den Code auf den ESP.

#include <ESP8266WiFi.h>
#include <PubSubClient.h>

const char* SSID = "NETZWERKNAME";
const char* PSK = "NETZWERKSCHLÜSSEL";
const char* MQTT_BROKER = "BROKER_IP";

WiFiClient espClient;
PubSubClient client(espClient);
long lastMsg = 0;
char msg[50];
int value = 0;

void setup() {
	pinMode(13, OUTPUT);
	Serial.begin(115200);
	setup_wifi();
	client.setServer(MQTT_BROKER, 1883);
	client.setCallback(callback);
}

void setup_wifi() {
	delay(10);
	Serial.println();
	Serial.print("Connecting to ");
	Serial.println(SSID);

	WiFi.begin(SSID, PSK);

	while (WiFi.status() != WL_CONNECTED) {
		delay(500);
		Serial.print(".");
	}

	Serial.println("");
	Serial.println("WiFi connected");
	Serial.println("IP address: ");
	Serial.println(WiFi.localIP());
}

void callback(char* topic, byte* payload, unsigned int length) {
	Serial.print("Received message [");
	Serial.print(topic);
	Serial.print("] ");
	char msg[length+1];
	for (int i = 0; i < length; i++) {
		Serial.print((char)payload[i]);
		msg[i] = (char)payload[i];
	}
	Serial.println();

	msg[length] = '\0';
	Serial.println(msg);

	if(strcmp(msg,"on")==0){
		digitalWrite(13, HIGH);
	}
	else if(strcmp(msg,"off")==0){
		digitalWrite(13, LOW);
	}
}

void reconnect() {
	while (!client.connected()) {
		Serial.println("Reconnecting MQTT...");
		if (!client.connect("ESP8266Client")) {
			Serial.print("failed, rc=");
			Serial.print(client.state());
			Serial.println(" retrying in 5 seconds");
			delay(5000);
		}
	}
	client.subscribe("/home/data");
	Serial.println("MQTT Connected...");
}

void loop() {
	if (!client.connected()) {
		reconnect();
	}
	client.loop();
}

Um die LED nun schalten zu können, gibst du auf deinem Pi im Terminal die folgenden Befehle ein:

Zum Einschalten der LED:

mosquitto_pub -d -t /home/data -m "on"

Zum Ausschalten der LED:

mosquitto_pub -d -t /home/data -m "off"

Der ESP8266 gibt die erhaltene Nachricht aus und schaltet die LED entsprechend.

Teile diesen Beitrag
,
Vorheriger Beitrag
MQTT Raspberry Pi Einführung
Nächster Beitrag
Garten bewässern mit Google Home & Alexa

Ähnliche Beiträge

Menü