Während der zwangsweisen Coronapause bin ich dem Raspperry Pi ein bisschen untreu geworden und habe mich weiter mit ESP8266 basierenden Microcontrollern beschäftigt. Im Prinzip habe ich da weiter gemacht, wo ich mit dem Adafruit Huzzah aufgehört habe. Für grundsätzliche Informationen über die Arduino-artigen Microcrontoller bitte dort nachsehen.
Das Wemos D1 Mini Node MCU WiFi Board ist supergünstig und eignet sich für allerlei lustige Experimente mit Sensoren. Es kann mit einem Micro-USB Anschluss mit dem PC bzw. dem Arduino IDE verbunden werden, läuft mit 5V oder auch mit 3V. Die Teile gibt es praktisch überall. z.B. bei AZ-Deliveries für ca. 7€ oder günstiger, wenn man mehrere kauft. Reichelt, Conrad oder zur Not auch Amazon haben die Dinger meist auch. Die Pro Version hat eine externe Antenne für größere Reichweite.
Einen tieferen und sehr gut gemachten Einblick in den D1 Mini bietet Wolles Elektronikkiste.
Inhalt
Temperatur-/Luftfeuchtigkeitssensor
Da ich einen feuchten Keller habe, wollte ich schon immer eine bezahlbare Lüftungs- und Trocknungssteuerung dafür. Was lag da näher, als einen bzw. zwei Temperatur- und Luftfeuchtigkeitssensoren auf Basis des DHT22 zu basteln und damit die Lüftung und Trocknung des Kellers zu steuern.
Hardware
Der elektrische Aufbau ist fast identisch zu dem in meinem ESP8266 Basisartikel. Die Stromversorgung und Programmierung erfolgt über den Mico-USB Anschluss am Board.
Nach dem Testen können wir das Ganze auf eine Lochplatine übertragen. Beim Verlöten darauf achten, einen Jumper (Steckbrücke) zwischen D0 und RST einzubauen (in obigem Fritzing Diagramm nicht dargestellt). Da der Controller im Dauerbetrieb relativ warm wird, lege ich ihn nach getaner Arbeit (Messen und Werte übermitteln) wieder schlafen. So wird der Controller nicht warm, die Messwerte werden nicht verfälscht. Die Brücke D0-RST sorgt für den Reset nach dem Aufwachen. Während des Programmierens ist der Kontakt offen, im Betrieb ist die Brücke gesteckt. Auf diese Weise resetted sich der Controller beim zeitgesteuerten Aufwachen.
Ferner habe ich den D1 Mini "upside down" eingebaut, d.h. der silberfarbene ESP Chip liegt unten. Das hat in Bezug auf die Leiterbahnen-Entflechtung ein paar Vorzüge. Die Verlötung ist also spiegelverkehrt zum obigen Fritzing Diagramm.
Als Gehäuse habe ich das BOPLA ET-206 Gehäuse Serie Euromas II, 65 x 50 x 37 mm, IP65 verwendet und ein paar Löcher für den Sensor gebohrt. Da der Deckel leider nur diagonal und nicht an allen 4 Ecken verschraubt wird, ist das Gehäuse nur bedingt wasserdicht und muss mit Isolierband zusätzlich abgedichtet werden, wenn man es draußen einsetzen will. Die von mir gebohrten Luftlöcher zeigen beim Außeneinsatz logischerweise nach unten damit kein Wasser eindringt!
Leider habe ich in den letzten Jahrzehnten beim Löten etwas die Übung verloren. Meine Lötarbeiten sehen nicht besonders professionell aus. Auch die Platine könnte etwas sauberer abgeschnitten sein. Den Anblick der Rückseite der von mir verlöteten Platine will ich euch deshalb ersparen. Dafür habe ich ein Layout der Lötseite auf eine Dreier Punkt-Streifen Raster Platine gezeichnet. Achtung: wie oben beschrieben ist der D1 MINI Upside-Down gesteckt.
D1-Mini – Richtig rum eingebaut
Da die Upside Down Methode immer wieder zu Verwirrungen führt, habe ich meine letzten Sensoren "richtig rum" aufgebaut.
Das sieht dann wie folgt aus – auch die Rückseite ist jetzt einigermaßen vorzeigbar:
Noch ein Hinweis, die neueren D1 Mini (wahrscheinlich ab Version 3.0.0.) sehen etwas anders aus. Anstatt der kleinen Huckepack Platine mit dem ESP8266 und dem Metallblech ist jetzt alles in einer Platine integriert – der 8266 Anteil steckt im diagonal montierten SMD Chip. Funktionalität und Pinout ist zum Glück identisch zu den Vorversionen.
Software
Jetzt liegt es an euch: Wenn ihr alles komplett selbst entwickeln wollt, also eine Logik mit Python und einer selbst gebauten Web-Oberfläche, dann haltet euch an den Beitrag WLAN fähigen Sensor bauen mit ESP8266.
Inzwischen haben sich aber einige IoT Standards etabliert, die uns eine Menge (Programmier-) Arbeit abnehmen. Ich habe meinen Sensor deshalb über das MQTT Protokoll mit meiner Steuerung verbunden.
MQTT!
Der Vorteil von MQTT (Message Queuing Telemetry Transport) ist, dass damit eine Vielzahl von unterschiedlichen Geräten Daten untereinander austauschen können – Angefangen von unserem Sensor, hin zu WiFi Schaltsteckdosen, Kameras und so weiter.
Allen, die sich (so wie ich vor Corona) damit noch nicht auskennen, empfehle ich den kostenlosen MQTT Online Videokurs von haus-automatisierung.com – Matthias Kleine hat eine ganze Reihe sehr guter und hochprofessioneller Tutorials zum Thema IoT geschrieben bzw. gedreht. Ich kann ihm dabei mit meinem kleinen Blog kaum das Wasser reichen.
Mit MQTT können wir später den zweiten Sensor, zwei WLAN Schaltsteckdosen und die Steuerungslogik basierend auf Node-Red ohne riesengroßen Programmieraufwand integrieren.
Der Arduino Sketch ist eine Kombination aus dem Sketch in meinem Huzzah Artikel und einem Sketch aus dem sehr guten und umfassenden FHEM Tutorial Wemos ESP8266 Temperatur per MQTT an FHEM senden von Mathias Kleine in haus-automatisierung.com.
Auch wenn es in dem Tutorial primär um FHEM geht, ist der MQTT und Arduino Teil wunderbar auf unseren Fall anwendbar. Das Tutorial enthält auch eine Anleitung zur Installation des MQTT Brokers auf einem Raspberry Pi.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 |
/********* Code verwendet Teile aus https://haus-automatisierung.com/hardware/fhem/2017/02/13/fhem-tutorial-reihe-part-26-esp8266-arduino-mqtt-temperatur-an-fhem.html Wemos ESP8266 Temperatur per MQTT an FHEM senden von Mathias Kleine in https://www.haus-automatisierung.com *********/ #include <ESP8266WiFi.h> #include <WiFiClient.h> #include "DHT_U.h" #include <MQTT.h> #define DHTTYPE DHT22 #define DHTPIN 12 const char* host = "192.168.178.99"; //die IP des MQTT Brokers const char* ssid = "DeineSSID"; const char* password = "DeinGeheimesRouterPasswort"; const char* mqttuser = "DeinOptionalerMQTTuser"; const char* mqttpwd = "DeinOptionalesMQTTpasswort"; WiFiClient net; MQTTClient mqtt; DHT dht(DHTPIN, DHTTYPE); void setup() { dht.begin(); delay(500); Serial.begin(115200); Serial.println(); Serial.println("Booting..."); connect(); Serial.println("Setup completed..."); mqtt.loop(); float temp = dht.readTemperature(); float humidity = dht.readHumidity(); Serial.print("Sending... "); if (!isnan(humidity) || !isnan(temp)) { mqtt.publish("/Keller/aussen/temp", String(temp)); mqtt.publish("/Keller/aussen/humidity", String(humidity)); mqtt.disconnect(); Serial.print("Temp: "); Serial.print(String(temp)); Serial.print(" Humidity: "); Serial.println(String(humidity)); } // delay(30000); Serial.println("Going into deep sleep for xx seconds"); ESP.deepSleep(1800e6); // e.g. 20e6 is 20 seconds } void connect() { WiFi.mode(WIFI_AP_STA); while(WiFi.waitForConnectResult() != WL_CONNECTED) { WiFi.begin(ssid, password); delay(500); Serial.println("WiFi connection failed. Retry."); } Serial.print("Wifi connection successful - IP-Address: "); Serial.println(WiFi.localIP()); mqtt.begin(host, net); while (!mqtt.connect(host, mqttuser, mqttpwd)) { Serial.print("*"); } Serial.println("MQTT connected!"); delay(500); } void loop(){ } |
Unser Programm läuft genau einmal durch und legt sich dann eine bestimmte Zeit schlafen um anschließend wieder von vorne anzufangen. d.h. es spielt sich alles in der Setup() Routine ab. Loop() bleibt hier leer.
Wenn ihr den MQTT Broker ohne User und Passwort aufgesetzt habt, dann anstatt
(!mqtt.connect(host, mqttuser, mqttpwd))
einfach
(!mqtt.connect(host))
verwenden.
Batteriebetrieb
Möglicherweise werden sich ein paar Elektronik Spezialisten darüber aufregen, aber ich betreibe den Außensensor (bisher) erfolgreich mit 3 Volt mit Hilfe von zwei handelsüblichen AAA Lithium Batterien. Die Laufzeit bei stündlichem Aufwachen liegt nach meinen bisherigen Erfahrungen bei 3-4 Monaten je nach Temperaturverhältnissen.
Pobieren werde ich es auch mit einer 3V CR123a Lithium Batterie und auch 4 x 1,2V NimH AA Zelllen – dann aber am 5V Eingang.
Für den Sensor innen im Keller (USB Stromversorgung) habe ich einen 10 Minuten timeout gewählt. Natürlich muss das Sleep-Intervall bei Batteriebetrieb entsprechend länger sein. Der Sensor außen wacht nur alle 30 Minuten für ein paar Sekunden auf – wenn das nicht reichen sollte, gehe ich auf 60 Minuten.
Der Batterieanschluss geschieht denkbar einfach: Das rote Pluskabel des Batteriehalters wird mit 3.3V verlötet, das schwarze Massekabel mit GND. Sicherheitshalber habe ich noch einen Jumper in die Plusleitung eingelötet, der abgezogen werden muss, wenn der Controller am USB Kabel hängt und damit gespeist bzw. programmiert wird.
Update: Ich habe den Außensensor inzwischen mit 4 AA NiMH Akkus bestückt und ein entsprechend größeres Gehäuse verwendet. Anschluss an den 5V Pin. Läuft wie geschmiert auch bei -14°C.
Was tatsächlich nicht funktioniert, ist der Betrieb mit lediglich 2 NiMH Akkus. Hier reicht die Spannung nicht. Drei Akkus reichen, sicherheitshalber am 5V Pin, da sie frisch geladen zusammen ca. 4V Spannung haben, was für den 3,3V Anschluss zuviel sein könnte.
Die Steuerungslogik erkläre ich im nächsten Beitrag.
Weiterentwicklung
Zum Schluss noch ein paar Hinweise auf meine Weiterentwicklungen für diesen Sensor. WiFi Credentials und andere Parameter ohne Programmieren, Schluss mit hingelöteten Lochrasterplatinen!
Hallo Chris,
tolle Beiträge hier bei Dir. Ich habe auch so manchen Kurs bei Matthias mitgemacht und bin auch schwer begeistert. Ich möchte mit einem ESP8266 D1 Mini verschiedene Temperaturen meiner Heizungsanlage auslesen und über MQTT an FHEM übertragen. Das Bauen und der Schaltung und WiFi ist kein Problem, ich bekomme es aber nicht hin das im Broker Temperaturwerte angezigt werden, außer 0. Könntest Du mir evtl. helfen?
VG aus dem Norden
Thomas
Hallo Thomas,
freut mich, dass dir meine Beiträge gefallen. Mit FHEM habe ich noch keine Erfahrung, da meine Anwendungen eher klein und nicht sehr vernetzt sind. Momentan läuft bei mir alles mit Mosquitto als Broker und Node-Red als Steuer- und Bedienlogik.
Egal, versuchen wir's trotzdem:
Da ich deinen Setup nicht kenne, muss ich an der einen oder anderen Stelle raten. Am besten fängst du am äußersten Ende der Kette an, dem D1 Mini.
Bekommst du die Werte in der Arduino-IDE Konsole angezeigt? Hast du die richtigen Pins definiert? Manchmal vertut man sich mit den GPIO Pins und die Messung schlägt generell fehl. Ich baue zum Debuggen viele
Serial.println
Statements einBroker: Hast du MQTT.fx zum Debuggen eingerichtet?
Kommt da irgend etwas an?
Kann sich der D1 im Broker anmelden (IP Adresse, User, Passwort)?
Kannst du überhaupt Daten an den Broker schicken? Probier mal
mqtt.publish("/Test/D1", "hello world!");
zeigt MQTTT.fx da was an wenn du das Topic "/Test/D1" abonnierst?Gerne auch genommen: der führende Schrägstrich am Topic, man kann ihn auch weglassen, wichtig ist dass sowohl publish als auch subscribe ihn entweder nutzen oder nicht. Groß- und Kleinschreibung beim Topic beachten. bei MQTT.fx das Universaltopic
#
subscriben und sehen, was da genau ankommt.Manchmal gibt es noch Typverwirrungen: Ein String "12.5" ist was anderes als float 12.5. Ich schicke nur Strings an den Broker
mqtt.publish("/Keller/aussen/temp", String(temp));
– dabei fällt mir ein, dass ich noch nie probiert habe, float Werte zu publishen.Funktioniert der Broker überhaupt, hast du andere Clients, die dort Daten hinschicken, die du mit MQTT.fx auslesen kannst?
Verbindet sich der D1 Mini sauber mit dem WLAN? Ich bekome manchmal Störungen in der Fritzbox angezeigt, wenn sie vorher im Stromsparmodus war und vom D1 Mini aufgeweckt wurde. Den Connect zum WLAN sowie zum Broker unbedingt in einer While Schleife realisieren, damit der Connect wirklich klappt.
Mehr fällt mir momentan auch nicht ein. Schreib mir, ob du damit klarkommst.
VG
Chris
Hallo Chris!
Danke für den interessanten Beitrag. Das mit dem MQTT werde ich ausprobieren.
Ich bastelle gerade auch an einer Wetterstation und weil ich diese mit Batterien betreiben möchte, habe ich herausgefunden, das der Pin 3v3 nicht als Eingang für die Spannung geeignet ist. Der Wemos hat den Spannungsregler ME6211 am Bord und der Pin 3v3 ist dabei der Ausgang. Aus diesem Grund sollte man den 5v Pin als Eingang nehmen. So ist er auch bei diesem Regler definiert.
Je nach Anzah der angeschlossenen Sensoren oder Displays lässt sich der Wemos mit der Spannung zwischen 2.5 V und 6 V betreiben – habe schon ausprobiert.
Viele Grüße
Niko
Hallo,
danke für die Info. Ich habe die mir bekannte Dokumentation durchforstet und kann nichts darüber finden, dass der 3.3V Pin nur OUTput ist. Im Prinzip liegt der Spannungswandler zwischen 5V und 3.3V. Von da aus gehts weiter in die Innereien vom ESP oder zur angeschlossenen Peripherie oder eben als Anschluss für eine 3.3V Spannungsversorgung. Bei mir funktioniert der Pin wunderbar als V-IN für die zwei AAA Lithium Batterien. Du hast natürlich recht, ich könnte die Batterie auch bei 5V anschließen.
Ich frage mich allerdings (ich habe nur eine periphere Ahnung von Elektronik) ob das nicht egal ist. Der Spannungsregler setzt ja nur das Zuviel an Spannung in Wärme um – wird dadurch die Batterie nicht schneller leer? Ich weiß jetzt nicht, ob 3.8V am 3.3V Pin (also 0.5V Überspannung bei frischer Lithium Batterie) auch in Form von Wärme abfließen oder "einfach so" toleriert werden. Käme auf einen Versuch an. Welcher Pin bringt mehr Laufzeit?
VG Chris
Hi Chris,
der Regler am Wemos soll ein "low-drop" Festspannungsregler sein, der über Transistor gesteuer wird. Es ist daher möglich, wenn am Ausgang eine Spannung anliegt, ein Rückstrom über Transistor fließt und den Transistor beschädigen kann.
Ich kenne leider die Materie nicht so gut (studierter Maschinenbauer) und den Regler noch weniger, um das beurteilen zu können.
Ich konnte bei einem ähnlichen Regler unter dem folgenden Link auf der Seit 25 einen Hinweis zum REVERSE INPUT-OUTPUT VOLTAGE finden:
https://cdn-reichelt.de/documents/datenblatt/A200/DS_LP_2985.pdf
Hier wird empfolen, eine Diode zwischen Vin und Vout einzusetzen. Diese fehlt auf dem Wemos.
Ich habe viel im Internet über Batteriebetrieb vom Wemos gelesen unf fand keine eindeutige Meinung, ob man 3v3 Pin als Eingang für die Spannng nehmen darf. Bei 5V Pin bin ich schon auf der sicheren Seite. Was den Verbrauch angeht, bin ich noch nicht dazu gekommen. Ich gebe dir recht, dass kann eine Rolle spielen.
Ich wäre froh, wenn ein Fachmann einmal die Sache klären könnte. 🙂
Grüße
Niko
Hallo,
sehr schöner Beitrag. Ich frage mich, ob der ESP nicht zu heiß wird, wenn der Chip direkt auf der Platine aufliegt? Ich habe bei meinem ESP die Stiftleiste versehentlich "upside down" angelötet, daher meine Frage.
Viele Grüße
Romeo
Hallo,
die Antwort lautet wie so oft: kommt darauf an. In meinem Anwendungsfall ist der Chip immer nur ein paar Sekunden aktiv und dann für 10 oder 60 Minuten im Deep Sleep Modus. Außerdem habe ich etwa 1 mm Luft zwischen dem Chip und der Platine gelassen. Im Dauerbetrieb ohne Sleep dazwischen kann das eventuell zu Problemen führen.
Viele Grüße
Chris
Sehr schöner Beitrag zum Einstieg in das mqtt-Thema.
Eine Sache ist mir unklar. Warum wird das Pin RST mit A0 (analog Input) und nicht mit D0 (GPIO16) verbunden ist ?
Huch!!! Du hast vollkommen recht! Natürlich ist das D0 das mit RST verbunden werden muss. Altersbedingte Fehlsichtigkeit wahrscheinlich. Danke für de Hinweis, ist bereits korrigiert. Sachen gibts….