Arduino Lektion 58: ESP-01S Temperatur & Luftfeuchtigkeitssensor Shield

Das ESP-01S DHT11 Sensormodul ist in Verbindung mit einem ESP-01 (ESP8266) eine sehr kleine Lösung zum Messen der Temperatur und der Luftfeuchtigkeit.

DHT11 Shield für den ESP-01S
DHT11 Shield für den ESP-01S

Leider hat der DHT11 nicht die beste Genauigkeit, jedoch reicht diese für den „Hausgebrauch“ völlig aus.

DHT11 Shield mit montiertem ESP-01S
DHT11 Shield mit montiertem ESP-01S

Bezug

Das Modul kann über ebay.de oder amazon.de für ca. 3,5 € bezogen werden. Obwohl hier ebay.de die besseren Preise hat, ist die Versandzeit bei amazon.de deutlich kürzer. Daher muss man abwägen, was einem besser passt.

Technische Daten des ESP-01S DHT11 Shields

  • Betriebsspannung 3,7V bis 12V
  • Messbereich
    • Luftfeuchtigkeit 20 % – 90 %
    • Temperatur 0 °C bis 50 °C
  • Messgenauigkeit
    • Luftfeuchtigkeit ± 5 %
    • Temperatur ± 2 °C

Montage des ESP-01 Moduls

Auf dem DHT11 Modul befindet sich ein kleiner, weißer Pfeil dieser gibt die Richtung an wie man das ESP-01S Modul aufsteckt.

Pfeil zur richtigen Montage des ESP-01S auf dem DHT11 Shield
Pfeil zur richtigen Montage des ESP-01S auf dem DHT11 Shield

Wenn beide Module verbunden sind, wird die Stromzufuhr angeschlossen. Ich wähle hier ein Universal Netzteil welches man für ca. 8 € auf ebay.de finden kann.

Bei Netzteilen achte ich besonders darauf das diese aus Deutschland kommen, denn somit hat man die Gewissheit das diese den Mindestnormen für elektrische Geräte entsprechen.

Da die Universalnetzteile jeweils über Steckeradapter verfügen muss man sich noch einen zusätzlichen Adapter besorgen damit man + & – vom Stecker bequem abgreifen kann.

Hohlstecker auf Schraubadapter
Hohlstecker auf Schraubadapter

Diesen Adapter kann man für ca. 4€ auf ebay.de erwerben.

Programmieren des ESP-01

Um den ESP-01 zu programmieren, benötigt man einen Adapter, bedingt durch den Aufbau der Pins am ESP-01 kann man diesen nicht auf ein Steckbrett stecken und von dort mit Breadboardkabeln mit einem FTDI Modul verbinden.

Adapter zum Programmieren

Es gibt 2 verschiedene Adapter für den ESP-01 einmal zum zusammenlöten und für das Steckbrett (hier wird zusätzlich ein FTDI Modul benötigt) und einmal komplett & bequem als USB Adapter.

ESP-01 Adapter und Shields
ESP-01 Adapter und Shields

Der Adapter (oben im Bild) wird leider ohne die benötige Brücke ausgeliefert. Warum dieses ist, erschließt sich mir nicht, da diese Brücke für das Programmieren des ESP-01 benötigt wird.

Erzeugen der Brücke 

Also erzeugen wir uns zuerst die Brücke damit wir den ESP-01S programmieren können.

Wir benötigen dazu:

  • einen Lötkolben,
  • Lötzinn,
  • eine Zange,
  • eine Pinzette
  • zwei Lötstifte im Rastermaß 2,54mm
  • einen Jumper

Den Jumper habe ich mir von einem alten Motherboard genommen, hier lohnt es sich immer ein kleines Lager mit alten Geräten anzulegen. 

Die Lötstifte werden an der Unterseite des USB Programmers wie im Bild zusehen angelötet.

Erzeugen einer Brücke am USB Programmer für den ESP01S
Erzeugen einer Brücke am USB Programmer für den ESP01S

Dabei muss man aufpassen das, man keine Brücke zu anderen Pins erzeugt.

Wenn dieses erfolgt ist, brauchen wir nur noch den Jumper auf die Lötstifte stecken und schon haben wir unseren USB Programmer fertig.

Jumper auf der Brücke
Jumper auf der Brücke

Wenn wir den ESP01S einmal nur über USB betreiben möchten so entfernen wir den Jumper und wenn der ESP01S programmiert werden soll wird dieser wieder darauf gesteckt.

Einrichten der Arduino IDE

Soweit noch nicht geschehen muss die ESP Bibliothek der Arduino IDE hinzugefügt werden. Diese Bibliothek bringt verschiedene Features für die ESP8266 Mikrocontroller mit.

Installieren der ESP Bibliothek

Die ESP Bibliothek wird über den Boardverwalter installiert, um diesen zu öffnen, navigieren wir über das Menü „Werkzeuge“ > „Board: xyz“ > „Boardverwalter…“. Im nun geöffneten Dialog suchen wir nach dem Begriff „esp“. Hier wählen wir den Eintrag „esp8266 by ESP826 Community“ und wählen aus der Auswahlliste (1) die Version 2.4.1 (oder neuer) (2) danach nur noch auf die Schaltfläche „Installieren“ (3) klicken.

ESP8266 Bibliothek
ESP8266 Bibliothek

Nachdem die Bibliothek installiert wurde, kann der Boardverwalter über die Schaltfläche „Schließen“ geschlossen werden.

Einstellungen für den ESP01S setzen

Den ESP-01S gibt es in verschiedene Ausprägungen, d.h. ggf. musst du in den Einstellungen etwas anderes setzen, für den ESP-01S welchen ich über ebay.de bezogen haben muss ich folgende Werte setzen.

  • Board  – Generic ESP8266 Module
  • Flash Mode – QIO
  • Flash Size – 1M (no SPIFFS)
  • Debug port – Disabled
  • Debug Level – Keine
  • IwIP Variant – v2 Lower Memory
  • Reset Method – ck
  • Crystal Frequency – 26 MHz
  • VTables – Flash
  • Flash Frequency – 40 MHz
  • CPU Frequency – 80 MHz
  • Builtin Led – 2
  • Upload Speed – 115200
  • Erase Flash – Only Sketch

Hier hat mich ein Arbeitskollege Florian W. unterstützt welchen ich für den Einsatz besonders danken möchte.

Der Port muss individuell eingestellt werden, diesen siehst du erst wenn der ESP-01S über einen Programmer mit dem PC Verbunden ist. 

Upload eines Sketches

Wenn nun der ESP-01S mit einem Programmer am PC angeschlossen ist und die oben genannten Einstellungen gesetzt wurden, dann kann ein erster Sketch hochgeladen werden. Da der serielle Port des EPS-01S belegt ist, entfällt das „Hello World!“ und wir wollen einfach die „Buildin Led“ zum Blinken bringen.

Bei meinem ESP-01S liegt die Buildin Led auf dem Port 2 hier gibt es Module welche einen anderen verwenden, wenn also nix blinken sollte, einfach mal einen anderen Wert für Buildin Led setzen.

Quellcode

#define LED LED_BUILTIN
const int PAUSE = 125;

void setup() {
  pinMode(LED, OUTPUT);
}

void loop() {
  digitalWrite(LED,HIGH);
  delay(PAUSE);
  digitalWrite(LED,LOW);
  delay(PAUSE);
}

Video

ESP-01S einfaches Sketch

DHT11 Shield ansteuern

Nachdem wir also nun unseren ersten Sketch auf den ESP-01S hochgeladen und betrieben haben, wollen wir nun das DHT11 Shield verwenden. Es ist jedoch bauartbedingt nicht möglich die Daten des DHT11 auf die serielle Konsole auszugeben, daher erzeuge ich eine kleine Webseite, auf welche die Daten abgelesen werden können.

Wie man so eine Webseite erstellt habe ich bereits im Tutorial WEMOS D1 – WLAN Thermometer mit DHT11 Sensor beschrieben. Das Tutorial wurde zwar für einen WEMOS D1 entwickelt, jedoch ist dieses (fast) 1:1 auch für den ESP-01S verwendbar.  Es muss hier „nur“ der Pin für den DHT11 Sensor Shield auf 2 eingestellt. 

Die Zeilen für die Ausgabe von Daten auf der seriellen Schnittstelle können entfernt werden, da man auf diese mit dem Shield nicht zugreifen kann.

#include <ESP8266WiFi.h>
#include "DHT.h"
 
const char* ssid = ""; //SSID aus dem Router
const char* password = ""; //Passwort für den Zugang zum WLAN
 
WiFiServer server(80); //Port auf welchem der Server laufen soll.
 
#define DHT11PIN 2 
#define DHT11TYPE DHT11
DHT dht11(DHT11PIN, DHT11TYPE);
 
void setup() {
  delay(10); //10ms. Warten damit die Seriele Kommunikation aufgebaut wurde.
 
  WiFi.begin(ssid, password); //Initialisieren der Wifi Verbindung.
 
  while (WiFi.status() != WL_CONNECTED) { //Warten bis die Verbindung aufgebaut wurde.
    delay(500);
  }
 
  dht11.begin();
  
  server.begin(); // Starten des Servers.
}
 
/**
 * Die Funktion gibt den HTML Kopf auf dem Client aus.
 * Dieses wird für jeden Respond verwendet.
 **/
void writeResponse(WiFiClient client, float tempValue, float humidityValue){  
  client.println("HTTP/1.1 200 OK");
  client.println("Content-Type: text/html");
  client.println("");
  client.println("<!DOCTYPE HTML>");
  client.println("<html>"); 
  client.println("<head>"); 
  client.println("<script type='text/javascript' src='https://www.gstatic.com/charts/loader.js'></script>"); 
  client.println("<script type='text/javascript' src='http://progs.draeger-it.blog/wemosd1/dht11/gauges.js'></script>"); 
  client.println("<link rel='stylesheet' href='http://progs.draeger-it.blog/wemosd1/dht11/styles.css'/>");   
  client.println("</head>"); 
  client.println("<body>"); 
  client.println("<div id='tempChart' class='chartContainer'></div>"); 
  client.println("<div id='pressChart' class='chartContainer'></div>"); 
  client.println("<script>"); 
  client.println("google.charts.load('current', {'packages':['gauge']});"); 
  client.println("google.charts.setOnLoadCallback(drawCharts);"); 
  client.println("function drawCharts() {"); 
  client.print("drawTempChart(");
  client.print(tempValue); 
  client.print(");");
  client.print("drawPressChart(");
  client.print(humidityValue); 
  client.print(");");
  client.println("}"); 
  client.println("</script>"); 
  client.println("</body>"); 
  client.println("</html>"); 
}
 
void loop() {
  //Prüfen ob sich ein Client verbunden hat, wenn nicht die Loop "verlassen"
  WiFiClient client = server.available();
  if (!client) {
    return;
  }
 
  // Wenn sich ein Client verbunden hat solange warten bis Daten gesendet werden.
  Serial.println("Neuer Client verbunden.");
  while(!client.available()){
    delay(1);
  }
 
  String request = client.readStringUntil('\r');
  client.flush(); 
 
  float tempValue = dht11.readTemperature(); //Temperatur vom Sensor DHT11 lesen
  float humidityValue = dht11.readHumidity(); //relative Luftfeuchtigkeit vom Sensor DHT11 lesen
 
 if (isnan(tempValue) || isnan(humidityValue)) {
     Serial.println("DHT11 konnte nicht ausgelesen werden");
     tempValue = 0;
     humidityValue = 0;
 }
 
  writeResponse(client, tempValue, humidityValue);
  
  delay(1); //1ms. Pause
}

Nachdem der Sketch hochgeladen wurde, muss man das ESP-01S Modul auf das DHT11 Sensor Shield stecken (hier ist auf den kleinen, weißen Pfeil zu achten).

Das DHT11 Sensor Shield muss nun noch mit Spannung versorgt werden, dazu kann man eine Quelle von 3,7V bis 12 V wählen, ich nutze hier ein Modul, welches auf ein Breadboard gesteckt wird, auf diesem kann man mit einem Jumper wählen welche Spannung anliegen soll. Betrieben wird dieses Modul über ein Universal Netzteil welches 9V liefern muss. 

ESP-01S mit DHT11 Sensor Shield, Spannungsversorgung über ein Breadboard Powersupply
ESP-01S mit DHT11 Sensor Shield, Spannungsversorgung über ein Breadboard Powersupply

Um die Daten vom ESP-01S zu sehen, müssen wir die IP-Adresse im Browser eingeben. Aber wie kommt man an diese, wenn es keine Serielle Ausgabe gibt? Hier kann man im Router prüfen welche WLAN-Geräte sich verbunden haben, bei mir wird das ESP-01S Shield als ESP-184B20 angezeigt. 

ESP-01S Eintrag in der Fritz!Box
ESP-01S Eintrag in der Fritz!Box

Nehmen wir also nun die IP-Adresse  „192.168.178.48“ und geben diese in einem Browser ein und betätigen die Enter Taste. 

einfache Webseite mit den Werten Temperatur & Luftfeuchtigkeit
einfache Webseite mit den Werten Temperatur & Luftfeuchtigkeit

Zum aktualisieren muss die Seite aktualisiert werden, hier bietet der Browser eine Schaltfläche oder man tippt in die Adressleiste und betätigt die Enter Taste.

Fazit

Als Fazit ziehe ich, dass der ESP-01S nur bedingt einfach in der Handhabung ist. Wer es gewohnt ist einen Mikrocontroller einfach einzustecken und loszulegen, der wird erstmal etwas herumspielen und vor allem löten müssen. Aber, wenn man sich nach dieser Anleitung richtet sollte das alles kein Problem sein. (Sollten trotz des Problems auftauchen, so bitte ich um eine Rückmeldung über das Kontaktformular.)

15 Kommentare

  1. Hallo Herr Stefan Draeger,
    beim kompilieren des Sketches für das DHT11 Shield und dem ESP8266 Modul kommt es immer zu folgender
    Ausgabe und Fehlermeldungen:

    Arduino: 1.8.8 (Windows Store 1.8.19.0) (Windows 10), Board: „Generic ESP8266 Module, 80 MHz, Flash, ck, 26 MHz, 40MHz, QIO, 1M (no SPIFFS), 2, v2 Lower Memory, Disabled, None, Only Sketch, 115200“
    C:\Users\Georg\Documents\Arduino\DHT11_ESP8266_Server\DHT11_ESP8266_Server.ino: In function ‚void setup()‘:
    DHT11_ESP8266_Server:16:11: error: ‚ledPin‘ was not declared in this scope
    pinMode(ledPin, OUTPUT); //Den LEDPin als ausgang setzen.
    ^
    DHT11_ESP8266_Server:17:24: error: ‚ledStatus‘ was not declared in this scope
    digitalWrite(ledPin, ledStatus); //Die LED initial auf den Status „AUS“ setzen. ^
    Mehrere Bibliotheken wurden für „DHT.h“ gefunden
    Benutzt: C:\Users\Georg\Documents\Arduino\libraries\DHT_sensor_library
    Nicht benutzt: C:\Users\Georg\Documents\Arduino\libraries\DHT-sensor-library-master
    exit status 1
    ‚ledPin‘ was not declared in this scope

    Was kann ich tun, um diese Fehler zu beheben?
    Mit großem Dank im voraus und Grüßen aus Frechen
    Georg Dotten

  2. Hallo Herr Dräger,
    bei mir hat das Hochladen des Sketches soweit funktioniert, ich musste lediglich diese Einstellungen setzen:
    Board – Generic ESP8266 Module
    -> Flash Mode – DIO
    -> Flash Size – 512K (no SPIFFS)
    Debug port – Disabled
    Debug Level – Keine
    IwIP Variant – v2 Lower Memory
    Reset Method – ck
    Crystal Frequency – 26 MHz
    VTables – Flash
    Flash Frequency – 40 MHz
    CPU Frequency – 80 MHz
    Builtin Led – 2
    Upload Speed – 115200
    Erase Flash – Only Sketch

    Die Charts werden mir auch angezeigt, allerdings mit 0°C und 0%.
    Wenn ich am DHT Shield den ResetButton betätige, werden mir manchmal bei 1~2 Seitenaktualisierungen ([F5] oder auch [Strg]+[F5]) dann auch Werte dargestellt (etwa 5°C zuviel, aber darum kümmere ich mich später), dann aber wieder 0°C und 0%.

    Irgendeine Idee?

    Gruß, Toni

    1. Hi,

      diesen Fehler habe ich auch schon mitbekommen.
      Ich werde mich diesem einmal annehmen und (versuchen) eine Lösung anzubieten.

      Gruß,

      Stefan Draeger

      1. Ich habe das selbe Problem, die Werte von DHT11 Sensor kommen als `nan`, ich habe mit unteschiedlichen Libraries bereits ausprobiert. Leider ohne Erfolg, deswegen diese Post

        1. ’nan‘ könnte sein das read veraltet ist, sollte mit get gehen …
          alt:
          float tempValue = dht11.readTemperature(); //Temperatur vom Sensor DHT11 lesen
          float humidityValue = dht11.readHumidity(); //relative Luftfeuchtigkeit vom Sensor DHT11 lesen
          neu:
          float tempValue = dht11.getTemperature(); //Temperatur vom Sensor DHT11 lesen
          float humidityValue = dht11.getHumidity(); //relative Luftfeuchtigkeit vom Sensor DHT11 lesen

  3. Super Projekt! Bei mir funktioniert es.
    Ich nutze das als „Start“, versuche das MQTT-Fähig zu machen und so in meinem IoT-Projekt auf die Werte zurückgreifen zu können. Danke für den guten Start 🙂

  4. Corona bedingt habe ich als Rentner mit dürftigen Soft- und Hardware Kenntnissen so einige kleiner Projekte mit dem Arduiono realisiert. Weihnachten kam ein EESP-01S für meinen 10 jährigen Enkel dazu. Zu Beginn sind wir fast verzweifelt. Es gibt viele Anleitungen im Internet, aber mit keiner bekamen wir das Modul zum funktionieren.
    Unser größtest Problem war der fehlende Adapters zum Programmieren. Nach Weihnachten haben wir es mit einem Arduiono Uno probiert, was leider nicht zum erhofften Erfolg führte. Nach einigen lehrreichen Versuchen sind wir auf diese Seite (Anleitung) gestoßen. Zugegeben, hatten wir durch unsere Versuche schon etwas „schlechte“ Erfahrung und kannten ein paar Fallstricke.
    Mit deiner sehr guten und sehr verständlichen Anleitung fassten wir neuen Mut und kamen recht schnell (schon fast zu schnell -halbe Stunde vor dem Abendessen) zum gewünschten Ziel. Also tolle Anleitung und vielen vielen Dank, auch von meinem Enkel !

    1. Hallo Peter,

      vielen Dank für dein positiven Kommentar, falls du Fragen, Anmerkungen oder Wünsche hast so kannst du mich jederzeit per E-Mail oder Kontaktformular erreichen.

      Gruß

      Stefan Draeger

  5. Hallo Herr Draeger,
    vielen Dank für Ihre Mühe. Ich habe meinen ESP-01 mit dem DHT11 Modul zum Laufen gebracht.
    Leider habe ich 1 Tag vergeblich, mit dem auf dem Modul befindlichen ESP, gearbeitet und es passiert nichts (kein Datenempfang). Dann kurzentschlossen noch einen 2. bestellt (anderer Lieferant) und nach sec. hatte ich Daten .
    Leider sind sowohl Temp als auch Luftfeuchte doch sehr ungenau. 5 Grad und mehr liegt die Temperatur daneben. Aber eine Ursache ist das Modul mit der LED, denn dies wird im Betrieb warm.

    Siegfried

  6. Hallo Zusammen,

    ich will dieses Setup so für eine solarbetriebene Wetterstation im Gartenbeet nutzen.
    Danke für den Sketch – ich kann das soweit alles übernehmen.

    Nun zu meinem Problem: Wenn ich den ESP über einen Akku (3,7V) oder über eine 9V Blockbatterie versorge, bootet er nicht. Die LED am ESP bleibt dauerhaft an. Er bootet erst, wenn ich manuell den Reset-Knopf am DHT-Board drücke bootet der ESP richtig. Das ist für eine Wetterstation denkbar ungünstig.

    Kann mir jemand einen Tipp geben woher der Fehler kommt und was ich dagegen unternehmen kann?

    Viele Grüße

  7. Tolles Beispiel genau was ich brauche!

    Leider ist die Ausgabe auf der HTML Seite bei mir nur:
    „HTTP/1.1 200 OK Content-Type: text/html“
    Sehe keine Grafiken und angezeigten Werte des DHT Sensors 🙁

    Bitte um Hilfestellung

Kommentar hinterlassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert