In diesem Beitrag möchte ich dir zeigen, wie du den ESP32 Baustein mit DHT11 Sensor, kapazitiven Bodenfeuchtesensor & LiPo Batterie programmierst und betreibst.
Im letzten Beitrag Arduino Projekt – Bodenfeuchtesensor & OLED Display habe ich dir bereits gezeigt, wie du die Daten von einem solchen Bodenfeuchtesensor auf einem OLED Display anzeigen lassen kannst. Mit dem verbauten ESP32 Chip hat man nun die Möglichkeit die Sensordaten auch an ein IoT Dienst wie ThingsSpeak zu senden und dort grafisch anzeigen zu lassen.
Bezug des ESP32 Bausteins
Den mir vorliegenden Baustein habe ich über wish.com für knapp 12 € inkl. Versandkosten bestellt. Du bekommst diesen aber auch auf ebay.de jedoch zu einem Preis von knapp 16 € inkl. Versandkosten*.
Hinweis von mir: Die mit einem Sternchen (*) markierten Links sind Affiliate-Links. Wenn du über diese Links einkaufst, erhalte ich eine kleine Provision, die dazu beiträgt, diesen Blog zu unterstützen. Der Preis für dich bleibt dabei unverändert. Vielen Dank für deine Unterstützung!
Mikrocontroller ESP32
Auf dem Baustein ist der Mikrocontroller vom Typ ESP32 verbaut, dieser hat folgende technische Daten:
Kern | Xtensa Dual-Core 32-bit LX6 |
max. Taktfrequenz | 240 MHz |
Schnittstellen | CAN, I²C, I²C, SDIO, SPI, UART |
Speicher | 448 KB ROM, 520 KB SRAM 16 KB SRAM in RTC |
WiFi | 802.11b/g/n |
Bluetooth | Dual-Mode Bluetooth, BLE |
In der Arduino IDE wird dieses Modul als ESP32-D0WDQ6 erkannt.
esptool.py v3.1
Serial port COM28
Connecting.....
Chip is ESP32-D0WDQ6 (revision 1)
Features: WiFi, BT, Dual Core, 240MHz, VRef calibration in efuse, Coding Scheme None
Crystal is 40MHz
MAC: 80:7d:3a:a3:d7:78
Aufbau des ESP32 mit DHT11 & Bodenfeuchtesensor
Der Mikrocontroller ist bestückt mit:
- einem einfachen DHT11 Sensor,
- einen kapazitiven Bodenfeuchtesensor, sowie auf der Rückseite
- ein Batteriefach für eine 18560 LiPo Batterie
Sensor – Datenpin | Pin am ESP32 |
---|---|
DHT11 | GPIO22 |
kapazitiver Bodenfeuchtesensor | GPIO32 |
Zusätzlich ist auf der Platine ein Schalter angebracht, welcher mit “ON/OFF” beschriftet ist.
Einsetzen der LiPo Batterie
Auf der Rückseite des Bausteins ist eine Halterung für eine LiPo Batterie vom Typ 18650 angebracht, wobei die Pole jeweils mit + & – markiert sind.
Beim Einsetzen der LiPo Batterie muss man auf die korrekte Polung achten, ansonsten kann diese oder der Mikrocontroller einen Schaden nehmen!
Programmieren in der Arduino IDE
Da keine gesonderte Verkabelung notwendig ist, können wir fast direkt mit der Programmierung beginnen. Wir benötigen lediglich den Boardtreiber für den ESP32 und eine zusätzliche Bibliothek für den DHT11 Sensor.
Wie du den Boardtreiber für den ESP32 installierst, habe ich dir bereits im Beitrag NodeMCU – „Einer für (fast) Alles!“ erläutert.
Den DHT11 Sensor habe ich bereits in diverse Beiträge eingesetzt und dir auch gezeigt, wie man die Sensordaten an ThingSpeak sendet.
- Iot Service ThingSpeak, einrichten und betreiben
- ESP8266 DIY IoT Wetterstation mit OLED Display und DHT11 Sensor
- WEMOS D1 – WLAN Thermometer mit DHT11 Sensor
Installieren der DHT11 Bibliothek
Im Bibliotheksverwalter der Arduino IDE findest du diverse Bibliotheken für den DHT11 Sensor, jedoch habe ich sehr gute Erfahrung mit der “DHT sensor library by Adafruit” gemacht.
Einrichten des ESP32 Chips in der Arduino IDE
Der ESP32 wird wie folgt in der Arduino IDE konfiguriert:
Einzig der COM-Port kann bei dir variieren.
Besonderheiten beim Upload eines Sketches
Wenn du einen Sketch / ein Programm auf den Mikrocontroller hochladen möchtest, dann musst du, wenn die Zeile nachfolgende Zeile ausgegeben wird, die Taste “Boot” betätigen.
Der Sketch verwendet 238129 Bytes (18%) des Programmspeicherplatzes. Das Maximum sind 1310720 Bytes.
Globale Variablen verwenden 12168 Bytes (3%) des dynamischen Speichers, 315512 Bytes für lokale Variablen verbleiben. Das Maximum sind 327680 Bytes.
esptool.py v3.1
Serial port COM28
Connecting.......
Auslesen des DHT11 Sensors
Der Vollständigkeit halber möchte ich dir zunächst zeigen, wie du die Sensordaten des DHT11 Sensors ausliest.
//DHT Bibliothek #include "DHT.h" //DHT Sensor am digitalen Pin 22 #define DHTPIN 22 //Sensortyp DHT11 #define DHTTYPE DHT11 //Instanziieren eines Objektes DHT dht(DHTPIN, DHTTYPE); void setup() { Serial.begin(9600); Serial.println(F("DHTxx test!")); //beginn der Kommunikation mit dem DHT11 Sensors dht.begin(); } void loop() { //eine kleine Pause von 2 Sekunden, //der DHT11 Sensor liefert alle 2,5 Sekunden ein neuen Wert delay(2000); //lesen der rel. Luftfeuchtigkeit float h = dht.readHumidity(); //lesen der Temperatur in Grad Celsius float t = dht.readTemperature(); //lesen der Temperatur in Grad Fahrenheit float f = dht.readTemperature(true); //Wenn einer der gelesenen Werte fehlerhaft ist, //gebe eine Fehlermeldung aus. if (isnan(h) || isnan(t) || isnan(f)) { Serial.println(F("Failed to read from DHT sensor!")); return; } //Berechnen des HeatIndex //Der Hitzeindex (HI) ist eine in Einheiten der Temperatur angegebene Größe //zur Beschreibung der gefühlten Temperatur auf Basis der gemessenen //Lufttemperatur sowie vor allem der relativen Luftfeuchtigkeit. //siehe https://de.wikipedia.org/wiki/Hitzeindex#:~:text=Der%20Hitzeindex%20(HI)%20ist%20eine,vor%20allem%20der%20relativen%20Luftfeuchtigkeit. float hif = dht.computeHeatIndex(f, h); float hic = dht.computeHeatIndex(t, h, false); //Ausgeben der Daten auf der seriellen Schnittstelle Serial.print(F("Humidity: ")); Serial.print(h); Serial.print(F("% Temperature: ")); Serial.print(t); Serial.print(F("°C ")); Serial.print(f); Serial.print(F("°F Heat index: ")); Serial.print(hic); Serial.print(F("°C ")); Serial.print(hif); Serial.println(F("°F")); }
Auf der seriellen Schnittstelle werden die Daten dann Zeilenweise wie folgt ausgegeben.
Ermitteln der Bodenfeuchtigkeit mit dem Bodenfeuchtesensor
Wie du einen kapazitiven Bodenfeuchtesensor ausliest, habe ich dir auch bereits in den nachfolgenden Beiträgen gezeigt:
Hier möchte ich dir lediglich kurz der Vollständigkeitshalber ein Sketch anbieten, welches den Wert auf der seriellen Schnittstelle ausgibt.
//analoger kapazitiver Bodenfeuchtesensor am Pin 32 #define SENSOR_PIN 32 void setup() { //beginn der seriellen Kommunikation mit 9600 baud Serial.begin(9600); } void loop() { //auslesen der Sensorwertes int sensorValue = analogRead(SENSOR_PIN); //ausgeben des Sensorwertes auf der seriellen Schnittstelle Serial.println(sensorValue); //eine kleine Pause von 1,5 Sekunden delay(1500); }
Die Sensorwerte werden im oben gezeigten Sketch einfach auf der seriellen Schnittstelle ausgegeben.
Wie gehts es nun weiter?
Der ESP32 verfügt über eine WiFi sowie Bluetooth Schnittstelle, diese beiden können wir nutzen, um die Sensordaten zum Beispiel an ein Handy oder einen IoT Service wie ThingSpeak zu senden.
Im nächsten Beitrag möchte ich dir daher zeigen, wie du diesen Baustein autark über eine LiPo Batterie und die Sensordaten erstmal über eine Webseite bereitstellen kannst.
Hallo,
ich betreibe den „Stab“ nun in der 2.Saison auf der Terasse in einem größeren Topf. Er wurde von mir justiert und nun erhalte ich zuverlässig jede Stunde die Feuchte des Bodens. Dann habe ich ein Relais angeschlossen und bei Unterschreitung eines Wertes schaltet das Relais die Pumpe.
Die SV wird mit einem kleinen Faltsolarmodul unterstützt. Ich musste im Sommer nur 2 mal den Akku nachladen und nur den AKKU der Wasserpumpe/Relais regelmäßig laden.
Fazit nach der ersten Saison: trotz einer Schutzschicht mit farblosem Lack, hatte ich Korrosion an den unteren Bauteilen und am NE555.
Vielen Dank für die Anregungen
Siegfried