esp8266-dht22-board

NodeMCU ESP8266 mit DHT22 und JSON zum smarten Temperaturfühler

In diesem Tutorial wollen wir einen smarten Temperaturfühler mit einem NodeMCU ESP8266 und DHT22 verwirklichen. Das Ziel ist es, am Ende in jedem Raum einen Fühler zu platzieren und zentral die Daten mit einem Raspberry Pi (Python) zu speichern. Da wir keine Daten an den NodeMCU ESP8266 senden, sondern nur Daten vom Fühler haben möchten, setzen wir auf das einfachere JSON Protokoll und nicht auf MQTT. Ein weiterer Vorteil von JSON ist, dass wir die Daten auch im Browser sehen können und mit Js oder PHP auslesen können.

Folgende Bauteile werden benötigt:

  • NodeMCU Lua Lolin V3 Module ESP8266 ESP-12F
  • DHT22 AM2302 mit Platine
  • Micro USB-Kabel
  • Jumper Wire Kabel

01. Arduino IDE einrichten

Um diese Anleitung möglichst kurz zu halten, überspringen wir den Schritt, wie man den NodeMCU ESP8266 am Computer einrichtet und legen gleich los. Die ausfühliche Anleitung zu diesem Thema findet ihr hier.

Bevor wir unseren smarten Temperaturfühler starten lassen, müssen wir erst noch zusätzliche Bibliotheken installieren.

Wir klicken oben im Menü auf “Sketch” -> “Bibliothek einbinden” und wählen dort „Bibliotheken verwalten…“, jetzt öffnet sich der “Library-Manager”.

Als Erstes suchen und installieren wir “ArduinoJson” in der Version 5.13.5. Die richtige Version ist dabei sehr wichtig, da sich die Bibliothek ab Version 6 grundlegend verändert hat.

Weiter geht es mit der Bibliothek “Adafruit Unified Sensor”, hier installiert in Version 1.1.4.

Zum Schluss benötigen wir noch die Bibliothek “DHT sensor library” hier in Version 1.4.0. Um den Eintrag zu finden, geben wir einfach “dht22” in das Suchfeld ein.

02. Sketch

Alle Vorbereitungen sollten nun abgeschlossen sein und jetzt können wir den Sketch anpassen und auf unseren NodeMCU ESP8266 übertragen.

#include <ArduinoJson.h>
#include <ESP8266WiFi.h>
#include "DHT.h"

#define DHTPIN 5 // D1 = 5

// Uncomment whatever type you're using!
//#define DHTTYPE DHT11   // DHT 11
#define DHTTYPE DHT22   // DHT 22  (AM2302)
//#define DHTTYPE DHT21   // DHT 21 (AM2301)

DHT dht(DHTPIN, DHTTYPE,12);

// needed to avoid link error on ram check
extern "C"
{
#include "user_interface.h"
}
ADC_MODE(ADC_VCC);

WiFiServer server(80);
WiFiClient client;
const char* ssid = "YOUR-WLAN-NAME";
const char* password = "YOUR-WLAN-PASSWORD";
float pfDew,pfHum,pfTemp,pfVcc;
bool readRequest(WiFiClient& client) {
  bool currentLineIsBlank = true;
  while (client.connected()) {
    if (client.available()) {
      char c = client.read();
      if (c == '\n' && currentLineIsBlank) {
        return true;
      } else if (c == '\n') {
        currentLineIsBlank = true;
      } else if (c != '\r') {
        currentLineIsBlank = false;
      }
    }
  }
  return false;
}

JsonObject& prepareResponse(JsonBuffer& jsonBuffer) {
  JsonObject& root = jsonBuffer.createObject();
    JsonArray& nameValues = root.createNestedArray("room"); // Edit your room here
    nameValues.add("kitchen");
  JsonArray& tempValues = root.createNestedArray("temperature");
    tempValues.add(pfTemp);
  JsonArray& humiValues = root.createNestedArray("humidity");
    humiValues.add(pfHum);
  JsonArray& dewpValues = root.createNestedArray("dewpoint");
    dewpValues.add(pfDew);
  JsonArray& EsPvValues = root.createNestedArray("Systemv");
    EsPvValues.add(pfVcc/1000, 3);   
  return root;
}

void writeResponse(WiFiClient& client, JsonObject& json) {
  client.println("HTTP/1.1 200 OK");
  client.println("Content-Type: application/json");
  client.println("Access-Control-Allow-Origin: *");   
  client.println("Access-Control-Allow-Methods: GET");
  client.println("Connection: close");
  client.println();

  json.prettyPrintTo(client);
}

void setup() {
delay(2000);
  dht.begin();
  // inital connect
  WiFi.mode(WIFI_STA);
  delay(1000);
    // Connect to WiFi network
  WiFi.begin(ssid, password); 
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
  }
  server.begin();
}

void loop() {
  WiFiClient client = server.available();
  if (client) {
    bool success = readRequest(client);
    if (success) {
         delay(1000);
   pfTemp = dht.readTemperature();   
   pfHum = dht.readHumidity();
   float a = 17.67;
   float b = 243.5;
   float alpha = (a * pfTemp)/(b + pfTemp) + log(pfHum/100);
   pfDew = (b * alpha)/(a - alpha);
   delay(500);
   pfVcc = ESP.getVcc();
      StaticJsonBuffer<500> jsonBuffer;
      JsonObject& json = prepareResponse(jsonBuffer);
      writeResponse(client, json);
    }
    delay(1);
    client.stop();
  }
}

Im Browser können wir nun die Werte unseres Fühlers sehen, wenn wir die IP-Adresse unseres ESP8266 im Adressfeld eingeben. Im nächsten Beitrag wollen wir mit einem Raspberry Pi die Werte auslesen, viel Spaß beim Nachbauen und bis zum nächsten Mal.

Weiterlesen:

Gehäuse für NodeMCU ESP8266 mit DHT22

Mit Raspberry Pi und Python Json auslesen

Related Posts