raspberry.tips
raspberry.tips - Raspberry Pi Projekte und Tutorials
Durch Zufall bin ich auf das IoT Entwickler-Board NodeMCU gestoßen der für IoT-Maker entwickelt wurde. Das kleine NodeMCU Board hat den großen Vorteil eine WLAN und eine USB Schnittstelle zum programmieren zu haben was die Entwicklung extrem beschleunigt, Grund genug für mich mir diesen kleinen Micro Controller etwas genauer anzusehen und direkt ein IoT Projekt mit diesem umzusetzen. Ich Baue auf Basis eines Lolin NodeMCU V3 ESP8266 Board einen WLAN Temperatur- und Luftfeuchtigkeitsmesser mit einem DHT22 Sensor und Batteriebetrieb.
Warum der NodeMCU V3 ESP8266?
Vor einer ganzen Weile hatte ich Temperatursensoren auf Basis der RFM69CW 433MHz Module und Atmel ATTiny ATTINY84A Micro Controller gebaut, der Aufwand für das Zusammenbauen und die Programmierung ist allerdings recht hoch und setzt hohe Hürden für Anfänger. Da einer meiner 433MHz Sensoren einem Wasserschaden zum Opfer gefallen ist hätte ich wieder PCBs bestellen müssen und habe mich daher für die unkomplizierte WLAN Alternative entschieden. Die NodeMCU Boards sind zwar Entwickler- und Prototypen-Boards die ehr nicht in ihrem vollen Umfang für eine finale Lösung geeignet sind, das stört mich bei dem Preis aber nicht weiter. Ein Problem ist allerdings der hohe Stromverbrauch den den „aufgeblasenen“ Entwicklerboards im Produktionseinsatz.
Wohin werden werden Messdaten gesendet?
Als Empfänger für meine bisherige 433MHz Lösung habe ich bereits einen Raspberry Pi mit einem 433MHz Empfänger am laufen der bisher über ein Script (emonhub) die Daten an meine Emoncms Installation weitergeleitet hat. Da wir die Daten direkt ins Internet senden können verzichte ich auf den zwischenschritt und versende die Daten im JSON-Format direkt an mein EmonCMS. Wer keinen eigenen Server betreiben möchte kann sich ein Konto auf https://emoncms.org/ anlegen oder nach Modifikation des Sketches einen anderen Cloud Service verwenden.
Hardware
Sensoren:
- NodeMCU V3 ESP8266 ESP-12 E – 6€
- Batterie halter 2x AA – 1€
- DHT22 Sensor + 4,7kOhm Widerstand- 5€
- Vier Female / Female Jumper-Kabel -0,50€
- 2x AA Batterien – 0,50€
- Zum programmieren einmalig: MicroUSB Kabel – 3€
Mit ~13,00€ (ohne Versand) sind die Kosten für einen Sensor sehr sehr gering, in dieser Preisklasse bekommt man auf 433MHz Basis nicht viel, auf IP/WLAN Basis nichts (brauchbares).
Batterien
Um ein NodeMCU Projekt mit Batterien oder Akkus zu betreiben gibt es verschiedene Möglichkeiten, ich habe mich für zwei AA Alkaline Batterien entschieden, das ist definitiv nicht optimal, ich benötige aber keinen Spannungsregler (LDO) wie zum Beispiel bei 3,7V LiPo Zellen und kein spezielles Ladegerät wie z.B. für 14500 LiFePo4 Akkus. Hierbei kann es sein das bei 2x AA 1,5V Alkaline nicht jedes NodeMCU Board ordentlich funktioniert (3V). Eine sichere, günstige und einfache Lösung wäre daher 3x Alkaline 1,5V mit einem HT7333 LDO Spannungsregler, ich wollte mir unnötiges Löten aber sparen.
Software einrichten – Arduino IDE
Zum Programmieren benutze ich die Arduino IDE auf meinem Windows 10 Rechner.
- Download Arduino IDE für Windows
Nach der Installation müssen noch ein Einrichtungen erledigt werden.
Das Board muss zur Liste der unterstützen Geräte hinzugefügt werden um es programieren (flashen) zu können. Hierzu über das Menü Datei die Voreinstellungen öffnen und folgende URL unter „Zusätzliche Boardverwalter URLS“ eintragen.
http://arduino.esp8266.com/stable/package_esp8266com_index.json
Dann über Werkzeuge > Boardverwaltung das ESP8266 Paket suchen und Installieren
Dann wählt ihr über Werkzeuge folgende Einstellungen:
- Board -> NodeMCU v9
- CPU Frequenz -> 80MHz
- Flash Size 4M
- UploadSeed 115200
- Port COM3 (kann ggf. auch COM1 oder 2 sein, probiert es aus falls mehrere zur Auswahl stehen)
Wir benötigen auch noch die Libraries für den DHT22 Sensor um ihn einfach ansprechen zu können. Hierzu installieren wir über das Menu Sketch > Bibliothek einbinden > Bibliotheken verwalten
die Bibliothek „DHT sensor library“ von „Adafruit“ und installieren diese.
DHT22 Verkabeln
Als nächstes verkabeln wir unsere NodeMCU, das Setup ist recht einfach, ich benötige lediglich vier Female Jumperkabel, den DHT22 und einen 4,7kOhm wiederstand.
- Ein Kumper Kabel zwischen D0 und RST um den DeepSleep zu ermöglichen – Blau
- DHT22 Pin 1 ( VCC) auf 3,3V – Rot
- DHT22 Pin2 (Data) auf D1 – Gelb
- DHT22 Pin3 bleibt leer
- DHT22 Pin4 (GND) auf GND – schwarz
- Ein Widerstand 4,7kOhm zwischen DHT22 Pin1 und Pin 2
Ohne Breadboard nur mit Jumperkabel sieht das ganze bei mir so aus. Da der Node später in einem Gehäuse sitzt macht die lose Verkabelung keine Probleme.
Wichtig!
Die Batterie schließen wir erst später an wenn alles getestet und programmiert wurde.
Programmieren – DHT22 Sketch für NodeMCU mit DeepSleep
Folgenden Code verwende ich um die Sensordaten an mein EmonCMS zu versenden. Um Ausführungszeit und somit Strom zu sparen verwendet das Sketch eine feste IP-Adresse und verzichtet auf jegliche Debug Ausgabe via Serial. Das Sketch läuft alle 5 Minuten und dazwischen ist die NodeMCU im den Tiefschlaf (deep sleep).
Die Daten für das Heim-WLAN, die IP-Adresse und Details eurer EmonCMS Installation müssen entsprechend geändert werden. Achtet darauf das die NodeIDs einmalig sind und der korrekte API Key (Write API Key) verwendet wird.
Auf GitHUB gibts den Code auch noch mit Serial Ausgabe für eure Tests.
/** Send DHT22 Sensor Data to EmonCMS and go to deep sleep - Without Serial Debug Output Philipp Schweizer - http://raspberry.tips 08.10.2017 - Inital Version */ // Including the Libraries for WiFi Connection, HTTP Send and DHT22 Sensor #include <ESP8266WiFi.h> #include <WiFiClient.h> #include "DHT.h" // Replace with your network details const char* ssid = "fritzbox"; const char* password = "xxxxx"; //Provide IP Adresse, Gateway, Subnet and DNS matching your network IPAddress ip(192, 168, 178, 211); // I use fixed IP-Adress IPAddress gateway(192, 168, 178, 1); // set gateway to match your network IPAddress subnet(255, 255, 255, 0); // set subnet mask to match your IPAddress dns(192, 168, 178, 1); //DNS Server = Router IP // DHT Sensor settings #define DHTTYPE DHT22 const int DHTPin = 5; DHT dht(DHTPin, DHTTYPE); //emoncoms settings, change node ID for every node const char* host = "emoncms.org"; const char* nodeId = "31"; const char* privateKey = "xxx"; const int httpPort = 80; //Seconds to deep sleep 300 = 5Min const int sleepTimeInSec = 300; //Variables to store values float h = 0; float t = 0; int vcc; ADC_MODE(ADC_VCC); // ============================================== // only runs once on boot then go deep sleep again // ============================================== void setup() { //Start sensor dht.begin(); // Sensor readings may also be up to 2 seconds 'old', so we read twice h = dht.readHumidity(); t = dht.readTemperature(); delay(3000); h = dht.readHumidity(); t = dht.readTemperature(); vcc = ESP.getVcc(); //Connect WiFi //Fix https://github.com/esp8266/Arduino/issues/2186 WiFi.config(ip, gateway, subnet, dns); delay(100); WiFi.persistent(false); WiFi.mode(WIFI_OFF); WiFi.mode(WIFI_STA); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); } //Send data to emoncms sendData(); //go to deep sleep ESP.deepSleep(sleepTimeInSec * 1000000); } // ============================================== // Send Data to emoncms // ============================================== void sendData() { WiFiClient emonHTTPClient; //Connect by http const int httpPort = 80; if (!emonHTTPClient.connect(host, httpPort)) { return; } //Build the JSON for emoncms to send data String json = "{temperature:"; json += t; json += ",humidity:"; json += h; json += ",vcc:"; json += vcc; json += "}"; //Build emoncms URL for sending data to String url = "/input/post.json?node="; url += nodeId; url += "&apikey="; url += privateKey; url += "&json="; url += json; // Send the HTTP Request to the emoncms server emonHTTPClient.print(String("GET ") + url + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Connection: close\r\n\r\n"); delay(500); emonHTTPClient.stop(); } void loop(void) { }
Programmiert wird über die USB-Schnittstelle. Zum programmieren eures NodeMCU steckt ihr das Board vom Rechner ab, drückt den FLASH Button und steckt während dieser gedrückt ist das USB Kabel wieder an. Der Flash Butto befindet sich direkt oberhalb des MicroUSB Ports.
Danach drückt ihr den Upload Button in der Arduino IDE und wartet bis der Vorgang abgeschlossen ist.
Wenn alles funktioniert hat sollte direkt eine neue Node (31 im Default) in eurem EmonCMS auftauchen die ihr dann entsprechend einem Feed zuordnen und dann z.B. in einem Dashboard visualisieren könnt. Ich habe mit meiner privaten EmonCMS 9.3 Installation ein einfaches Diagramm erstellt. Da sich mit EmonCMS recht intuitiv verhält verzichte ich an dieser Stelle auf weitere Details zur Einrichtung. Als alternative zur online Variante könnt ihr auch ein EmonCMS auf eurem Raspberry Pi installieren in eurem Heimnetz installieren (am einfachsten ist EmonPI Image).
NodeMCU mit Batterie betreiben
Das NodeMCU V3 Board ist mit 3,0 – 3,6V Input spezifiziert.
Da ich den Temepratursensor natürlich unabhängig von einer Stromquelle betreiben möchte verwende ich einen 2x AA Batterie-Träger zur Stromversorgung. Um flexibel zu bleiben habe ich zwei Jumperkabel Female Buchsen an die Kabel gefummelt, alternativ könnt ihr den Batterie-träger auch direkt an die PINS löten oder die Buchsen anlöten und die Verbindungen mit etwas Schrumpfschlauch schützen.
Ich benutze die Pins 3,3V und G nahe des Reset Schalter, es können alle 3V / GND Pins benutzt werden.
Wichtig! Da wir den Spannungsregler umgehen möchten (benötigt zusätzlich Strom) wird die Batterie in meinem Fall direkt an 3Vund GND angeschlossen. Wer mit anderen Batterien arbeitet muss ggf. über VIN oder 5V und GND gehen, je nach Setup / Batterie. Der Code “ ESP.getVcc()“ gibt leider nicht den korrekten Wert wieder bis jetzt habe ich keine Möglichkeit gefunden ohne Multimeter den Batterie Status auszulesen. Die Spannung der Batterie nimmt sehr schnell ab und ich denke das die zwei AA Batterien innerhalb weniger Tage unter die Minimum geforderten 3V fallen.
Fazit
Mit AA oder AAA Batterien ist der WLAN Temperatur Sensor auf der NodeMCU aktuell keine Alternative für die 433MHz Variante da einfach der Stromverbrauch ohne größere Eingriffe (z.B. Auslöten des LDO und des USB UART Port) viel zu hoch ist. Ein Zusammenbau aus einzelnen Kompnenten (ESP-12 WLAN Modul und ESP8266 SoC) ist mir zu aufwändig. Wer allerdings entweder kurzzeitig oder Stationär eine Lösung sucht oder einfach nur Programmieren und Basteln möchte ist mit der NodeMCU Variante zwecks der Einfachheit gut beraten.
Low-Cost WLAN Temperatursensoren mit NodeMCU ESP8266 im Selbstbau
raspberry.tips