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.
Lösung wird in einer Arduino IDE gezeigt.

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 im 3D Druck = https://www.thingiverse.com/thing:285…

, ,