Datenbereitstellung über MQTT mit NodeMCU ESP8266

Mit einem ESP8266 an dem ein Temperatursensor DHT11 angeschlossen ist, um Temperatur und Feuchtigkeit zu erfassen, die dann per WLAN diese Daten an einem MQTT Adapter im IOBroker zu übermitteln. Die Lösung wird in einer Arduino IDE gezeigt.

MQTT ist ein Kommunikationsprotokoll, das unter anderem auch für den Einsatz in „Internet of Things“-Systemen (IoT) eingesetzt wird. Es ermöglicht IoT-Geräten auf einfacher Art miteinander kleine Datenmengen auszutauschen. Dies geschieht über ein Veröffentlichen/Abonnieren-System.
Ein Gerät, das Daten senden möchte, nennt man Publisher (Veröffentlicher). Die Daten werden zu einem bestimmten Topic (Thema) an den MQTT-Server (Broker) gesendet. Geräte, die diese Daten empfangen möchten, nennt man Subscriber (Abonnenten). Die Abonnenten sagen dem Broker welche Themen sie interessieren und erhalten dann nur die Daten, die zu diesen Themen gehören. Zentrale und Verwaltung hierbei ist der Broker der sämtliche Daten aller Geräte aufnimmt und an die Abonnenten verteilt. Ein Publisher kann hierbei auch gleichzeitig ein Subscriber sein.
MQTT ist ein besonders effizientes Protokoll, das auch bei schlechten Netzwerkverbindungen gut funktioniert. Das macht es zu einer gängigen Wahl für IoT-Systeme, bei denen Daten von vielen Geräten zentralisiert werden müssen.

Hardware:
ESP8266 Board = NodeMCU Module WLAN WiFi Development Board
Temperatur und Feuchtigkeit Sensoren:
Typ und Modellnummer:
DHT11 = Feuchtigkeit 20% bis 90% RH, Temperatur 0 bis 50 celsius Grad
oder
DHT22 = Feuchtigkeit 1% bis 99% RH, Temperatur -40 bis 80 celsius Grad

Mir vorliegender Sensor, kann sowohl mit 3,3V als auch 5V betrieben werden. Immer vorab Herstellerdetails checken.

Verdrahtung:


Entwicklungsumgebung:
IOBroker = https://github.com/ioBroker
Arduino IDE = https://www.arduino.cc/en/main/software
BoardTyp: Generic ESP8266 Module

Die gewählten Board-Einstellungen in der Arduino IDE für die mir vorliegende NodeMCU:

Vorabtest ob Temperatursensor korrekt angeschlossen ist und Werte liefert:

//Dht11 mit NodeMCU ESP8266
#include "DHT.h"
#define DHTPIN D2     // Digital pin connected to the DHT sensor
#define DHTTYPE DHT11   // oder anderer Typ. ZB: DHT 22
DHT dht(DHTPIN, DHTTYPE);
void setup() {
  Serial.begin(115200);
  Serial.println("DHT11 Messung Startet ");
  dht.begin();
}
void loop() {
  float h = dht.readHumidity();    
  float t = dht.readTemperature();
  Serial.print("Luftfeuchtigkeit: ");
  Serial.println(h);                             
  Serial.print("Temperatur: ");
  Serial.println(t);                  
delay(5000); 
}

Wenn der Sensor im seriellen Monitor die erwarteten Werte liefert, wird nun das Script für die Übermittlung per MQTT erweitert:
Quellcode:

//Datenbereitstellung ueber MQTT mit NodeMCU ESP8266
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include "DHT.h"
#define DHTPIN D2     // Digital pin connected to the DHT sensor
#define DHTTYPE DHT11   // oder anderer Typ. ZB: DHT 22
DHT dht(DHTPIN, DHTTYPE);

const char* ssid = "AccessPoint";  // Vorort Werte Eintragen
const char* password = "xxxxx";   // Vorort Werte Eintragen
const char* mqtt_server = "10.10.10.10";   // Vorort Werte Eintragen

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

void setup_wifi() {

  delay(10);
  // We start by connecting to a WiFi network
  Serial.begin(115200);
  Serial.println();
  Serial.print("Verbindung zu ");
  Serial.println(ssid);
  
  WiFi.mode(WIFI_STA); //Arbeite nur als Station und nicht als AccessPoint
  WiFi.begin(ssid, password);

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

  randomSeed(micros());

  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("Nachricht angekommen [");
  Serial.print(topic);
  Serial.print("] ");
  for (int i = 0; i < length; i++) {
    Serial.print((char)payload[i]);
  }
  Serial.println();
}

void reconnect() {
  // Loop until we're reconnected
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    // Create a random client ID
    String clientId = "ESP8266Client-dht11";
    clientId += String(random(0xffff), HEX);
    // Attempt to connect
    //if you MQTT broker has clientID,username and password
    //please change following line to    if (client.connect(clientId,userName,passWord))
    if (client.connect(clientId.c_str())) {
      Serial.println("connected");
      // Once connected, publish an announcement...
      //client.publish("outTopic", "hello world");
      // ... and resubscribe
      //client.subscribe("outtemp"); aboniere folgendes Thema
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      // Wait 5 seconds before retrying
      delay(5000);
    }
  }
}

void setup() {
  //pinMode(BUILTIN_LED, OUTPUT);     // Initialize the BUILTIN_LED pin as an output
  
  setup_wifi();
  client.setServer(mqtt_server, 1883);
  client.setCallback(callback);
  Serial.println(F("DHTxx test!"));
  dht.begin();
}

void loop() {

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

  long now = millis();
  // read DHT11 sensor every 10 seconds
  if (now - lastMsg > 40000) {
    lastMsg = now;

    //int chk = DHT.read11(DHT11_PIN);
     String msg="";

     char MsgTemp[25];
     char MsgFeutigkeit[25];     
 
     msg= dht.readTemperature();
     //msg=msg+"°C";
     msg.toCharArray(MsgTemp,25); 
         
     msg= dht.readHumidity();
     //msg=msg+"%";
     msg.toCharArray(MsgFeutigkeit,25);  

          
     client.publish("Temp", MsgTemp);
     client.publish("Feuchtigkeit", MsgFeutigkeit);

  }
}

Gehäuse für 3D Druck = https://www.thingiverse.com/thing:285…

Zusatzinfo (nicht im Video zu sehen):

Alternative zur gezeigten IOBroker Server Lösung wäre Mosquitto von der Eclipse Foundation.
Mosquitto ist ein Open-Source-MQTT-Broker, der von der Eclipse Foundation entwickelt wurde. Es ermöglicht Geräten, miteinander zu kommunizieren, indem es als Übermittler fungiert und Nachrichten zwischen Geräten weiterleitet. Es ist einfach zu installieren/konfigurieren und es bietet eine hohe Zuverlässigkeit und Skalierbarkeit für IoT-Systeme. Die Downloads werden für Linux, Mac und Windows angeboten.

, , , ,