Temperatur und Luftfeuchtigkeit messen mit ESP8266

//Temperatur und Luftfeuchtigkeit messen mit ESP8266
Temperatur und Luftfeuchtigkeit messen mit ESP8266 2018-05-01T15:16:32+00:00

Der ESP8266 ist ein Ultra-low-Power-32-Bit-Mikrocontroller der chinesischen Firma espressif. Er kann wie ein Arduino per IDE programmiert werden und hat eine WLAN-Schnittstelle. Sein geringer Preis von weniger als 5,-€ und seine geringe Stromaufnahme machen ihn zur perfekten Hardware für die WLAN-basierte Temperatur- und Luftfeuchtigkeitsmessung in meinem Smarthome-Setup. Allgemeine Informationen findet man bei Wikipedia.
Kaufen kann man die Mikrocontroller gut im ebay aus Fernost im Fünferpack, wenn man die lange Lieferzeit erträgt.

Aufbau der Platine

Ich habe eine Lochrasterplatine halbiert, um den Aufbau vorzunehmen.
Die Stromversorgung wird über ein USB-Kabel gewährleistet, hiervon habe ich einfach die Adern schwarz (Masse) und rot (5V) verwendet. Alternativ betreibe ich ihn mit Akkus. Der ESP arbeitet mit einer Spannung von 3,3V, die mit einem Festspannungsregler erzeugt wird.

Stückliste:

  • 1 USB zu TTL Adapter (Amazon)
  • 1/2 Lochrasterplatine, Hartpapier, 50x100mm (Reichelt)
  • 1 ESP8266 WiFi-Modul (Reichelt oder im Fünferpack bei ebay)
  • 1 DHT22 (im Fünferpack bei ebay)
  • 1 Festspannungsregler, +3,3V, TO-220 (Reichelt)
  • 1 Elektrolytkondensator, 5x11mm, RM 2,0mm (Reichelt)
  • 1 Kurzhubtaster (Reichelt)
  • 3 Steckbrückenkabel (Reichelt)
  • Silberdraht

Deep-Sleep-Hack

Damit der ESP korrekt in den Tiefschlaf fallen kann, muss man leider eine Brücke löten. Ich habe das Kabel zuerst zugeschnitten, extrem kurz abisoliert und verlötet. Dann wurde es zuerst am Kontaktbeinchen angeltötet, mit einer Pinzette gehalten, die Drahtspitze erhitzt und heiß an den SMD-Chip gehalten. Dann habe ich die Funktionsfähigkeit geprüft und mit Heißkleber fixiert. Dann sollte man noch die rote LED entfernen, um Strom zu sparen. Beide gelang mir mir nur mit einer Lupe. Ich komme so auf einen Ruhestrom von 0,4mA ohne LED statt 0,7 mit LED. Das entspricht 0,4mAh / Stunde bzw. 9.6mAh / Tag bzw. 3504mAh / Jahr. Bei Verwendung von drei 2700mAh-Akkus im Mignon-Format erhoffe ich mir so ein Jahr Laufzeit.

Arduino für ESP8266 installieren unter Mac Os X

Die Arduino-IDE muss zur Verwendung eines ESP8266 leicht angepasst werden. Arduino runterladen und installieren. Da derzeitige MacOsXe keine unsignierten Treiber zulassen, wird der USBzuSeriell-Adapter nicht gefunden. Hier gibt es einen signierten Treiber zum Download. Den Adapter unter Werkzeuge -> Port auswählen.
Bord nach dieser Anleitung installieren und auswählen.
In der Arduino IDE unter Sketch -> Bibliothek einbinden -> Bibliothek verwalten nach der „DHT22“ suchen und die Version von Adafruit installieren. Ebenso mit „Adafruit Unified Sensor“ verfahren. Eventuell Updates einspielen und vor allem IDE neustarten.

Firmware: Arduino-Sketch

/* 
 Read temperature and humidity from a DHT22 sensor with ESP8266 and send via HTTP to a Server
 Copyright: Martin Janßen, janssen@steinhude-am-meer.de
 February 2017
*/
    #include <ESP8266WiFi.h>
    #include <WiFiClient.h>
    #include <ESP8266WebServer.h>
    #include <DHT.h>
    #include <ESP8266mDNS.h>
    #include <SPI.h>
    #define DHTTYPE DHT22
    #define DHTPIN  2
    /* Parameter */ 
    const char* ssid     = "YOURWLANSSID"; // WLAN SSID
    const char* password = "YOURWLANPASSWORD"; // WLAN Passwort
    const int pause = 300; // Wartezeit zwischen Wertuebermittlungen in Sekunden
    const char server
[] = "192.168.1.10"; // Webserver const int sensors_id_Temp = 11; // sensors_id Temperatur in Smarthome APP const int sensors_id_Hum = 12; // sensors_id Luftfeuchtigkeit in Smarthome APP /* initialize WifiClient */ int status = WL_IDLE_STATUS; WiFiClient client; // Initialize DHT sensor DHT dht(DHTPIN, DHTTYPE, 11); // 11 works fine for ESP8266 // Werte als Pointer definieren, damit sie global lesbar werden float DHThumidity; float DHTtemperature; float humidity, temp_f; // Values read from sensor // Generally, you should use "unsigned long" for variables that hold time unsigned long previousMillis = 0; // will store last temp was read const long interval = 2000; // interval at which to read sensor /* SETUP -> wird beim Start ausgefuehrt*/ void setup(void) { Serial.begin(115200); // Seriellen Monitor starten mit 115200 Baud Serial.println ("\n\rStarte..."); connectWLAN(); // Temperatur und Luftfeuchtigkeit vom DHT 22 holen dht.begin(); // initialize temperature sensor getValues(&DHThumidity, &DHTtemperature); // Pointer-Werte übergeben send2smarthome(&DHThumidity, &DHTtemperature); // Schlafen legen Serial.println("ESP8266 geht schlafen"); ESP.deepSleep(pause * 1000000); } /* LOOP -> wird zur Laufzeit wiederholt, will man wegen shutdown nicht erreichen */ void loop(void) { } /* FUNCTIONS werden hier definiert */ // function WLAN aufbauen void connectWLAN(){ // Connect to WiFi network WiFi.begin(ssid, password); Serial.println("\n\rWLAN-Verbindung aufbauen"); // Wait for connection while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } printWifiStatus(); delay(500); } // function WLAN Status ausgeben void printWifiStatus() { //Ausgabe des WLan Netzwerks Serial.print("\n\rSSID: "); Serial.println(WiFi.SSID()); //Ausgabe IP Adresse IPAddress ip = WiFi.localIP(); Serial.print("IP Address: "); Serial.println(ip); } // function Messdaten an Smarthome senden void send2smarthome(float* DHThumidity, float* DHTtemperature){ // Serial.print("Hum "); // Serial.println(*DHThumidity); // Serial.print("Temp "); // Serial.println(*DHTtemperature); Serial.println("Daten an Smarthome senden"); String urlpath = String("/smarthome/?a=set_sensor&"); urlpath += sensors_id_Temp; // sensors_id Temperatur ESP urlpath += "="; urlpath += *DHTtemperature; urlpath += "&"; urlpath += sensors_id_Hum; // sensors_id Luftfeuchtigkeit ESP urlpath += "="; urlpath += *DHThumidity; Serial.println(urlpath); WiFiClient client; if (client.connect(server, 80)) { // Ausgabe an seriellen Monitor Serial.print("Verbunden mit Smarthome-Server "); Serial.println(server); //Verbindung mit Server aufbauen und HTTP Anfrage senden client.print("GET "); client.print(urlpath); client.println(" HTTP/1.1"); client.print("Host: "); client.println(server); //Adresse des Webservers client.println("Connection: close"); client.println(); //Verbindung mit Server aufbauen und HTTP Anfrage senden } } // NEU function Temperatur und Luftfeuchtigkeit vom DSP22 holen void getValues(float* DHThumidity, float* DHTtemperature){ // Wait at least 2 seconds seconds between measurements. // if the difference between the current time and last time you read // the sensor is bigger than the interval you set, read the sensor // Works better than delay for things happening elsewhere also unsigned long currentMillis = millis(); if(currentMillis - previousMillis >= interval) { // save the last time you read the sensor previousMillis = currentMillis; // Reading temperature for humidity takes about 250 milliseconds! // Sensor readings may also be up to 2 seconds 'old' (it's a very slow sensor) Serial.println("DHT auslesen"); *DHThumidity = dht.readHumidity(); *DHTtemperature = dht.readTemperature(); // Check if any reads failed and exit early (to try again). if (isnan(humidity) || isnan(temp_f)) { Serial.println("Failed to read from DHT sensor!"); // return 0; } // return temp_f; Serial.print("Hum "); Serial.println(*DHThumidity); Serial.print("Temp "); Serial.println(*DHTtemperature); } }

Firmware aufspielen

Zum Einspielen des Codes muss beim Einschalten des ESP der GPIO2 auf 0 gezogen (z.B. per Button auf der Platine auf die der ESP gelötet wird) und dann der ESP eingeschaltet werden. Nach ein bis zwei Sekunden kann der Button losgelassen werden. Danach in der IDE auf „Hochladen“ klicken.
Um die Debug-Ausgabe sehen zu können, muss man oben rechts in der IDE den seriellen Monitor anschalten. Während des Uploads blinkt die blaue LED des ESP8266 schnell.
Nach dem Upload wird die neue Firmware des ESP8266 dann automatisch gestartet.

 

Toggle Sliding Bar Area