Der Grundstein für dieses Projekt wurde gelegt durch eine kleine Nebenbemerkung der Besten aller Ehefrauen: „Wäre doch schön, wenn wir die Temperatur auf der Terrasse wüssten?“. Nun hat Papa seine Abneigung gegen gekaufte Hardware ja schon einmal unter Beweis gestellt und entscheidet sich auch in diesem Fall — mit Einverständnis der Besten aller Ehefrauen — für die Bastellösung.
Dieser Artikel ist Teil einer vierteiligen Serie:
- Wetterstation — der Prototyp
- Wetterstation
- Wetterstation — die Auswertung
- Wetterstation — das erste Jahr
Die tatsächliche Umsetzung der Wetterstation unterscheidet sich in einigen Punkten von diesem Prototyp. Wer gleich das finale Ergebnis sehen möchte, kann über diesen Artikel auch hinwegsehen. Wer aber den Weg zur finalen Wetterstation nachvollziehen will, sollte hier weiterlesen.
Klar ist uns zunächst nur, dass die Temperatur erfasst werden soll. Des Weiteren fallen uns noch die möglichen Messwerte Luftfeuchte, Luftdruck, Windrichtung, Windstärke, Niederschlagsmenge, Helligkeit, Ultraviolettstrahlung, Infrarotstrahlung, Feinstaub, Ozon Konzentration, CO2 Konzentration, NOx Konzentration ein. Für den Anfang beschliesse ich auf Windrichtung, Windstärke und Niederschlagsmenge zu verzichten. Messgeräte für diese Werte sind Anemoskop, Anemometer und Pluviometer und allesamt nicht leicht selbst zu bauen. Für die restlichen Messwerte lege ich eine Reihenfolge fest in der ich die Wetterstation ausbauen möchte:
- Temperatur, Luftfeuchte, Luftdruck
- Helligkeit
- Ultraviolettstrahlung
- Feinstaub
- Ozon Konzentration
- CO2 Konzentration
- NOx Konzentration
- Infrarotstrahlung
Im Folgenden beschreibe ich den prototypischen Aufbau einer elektronischen Wetterstation für die Messwerte der ersten drei Schritte. Die Umsetzung der Erfassung der Luftqualität und weiterer Strahlung folgen dann später.
Sensoren
Als elektronische Sensoren für die gewünschten Werte kommen in Betracht:
- DHT22 — Temperatur, Luftfeuchte
- BMP280 — Temperatur, Luftdruck
- BME280 — Temperatur, Luftdruck, Luftfeuchte
- DS18B20 — Temperatur
- TSL2561 — Helligkeit
- ML8511 — Ultraviolettstrahlung
- VEML6090 — Ultraviolettstrahlung
Natürlich gibt es noch jede Menge alternative Sensoren um die gewünschten Messwerte zu erfassen. Die Ausgewählten haben den Vorteil, dass sie einfach und günstig zu bekommen sind. Auch sind nicht alle diese Sensoren gleichzeitig notwendig, da sich ihre Einsatzgebiete überschneiden. Welche Sensoren ich für die Wetterstation tatsächlich einsetze erläutere ich im Abschnitt Schaltplan. Da die eigentlichen Sensoren mit üblichem Hobbywerkzeug kaum zu benutzen sind, verwende ich Sensoren, die schon vormontiert auf Sensorplatinen, sogenannten Breakout-Boards, angeboten werden.
Für die Ansteuerung der Sensoren und die Abfrage der Messwerte wird ein Mikrocontroller benötigt. Der Anschluß der meisten dieser Sensoren an einen Controller erfolgt über den seriellen I²C Datenbus. Notwendig sind dafür zwei Signalleitungen und die Spannungsversorgung. Die Sensoren DHT22 und DS18B20 werden über eine eigene Datenleitung angebunden. Die Anbindung des Sensors ML8511 ist etwas komplizierter, da hierfür ein Analogeingang notwendig ist.
I²C wird hauptsächlich geräteintern für die Kommunikation zwischen verschiedenen Schaltungsteilen benutzt, beispielsweise wie hier zwischen Controller und Sensoren. I²C ist als Master-Slave-Bus konzipiert. Ein Datentransfer wird immer durch einen Master initiiert; der über eine Adresse angesprochene Slave reagiert darauf. Jeder Sensor hat eine eindeutige festgelegte Adresse.
Controller
Die Erfassung der Messwerte der Sensoren übernimmt ein ESP8266 Mikrocontroller. Hierbei handelt es sich um einen stromsparenden Controller mit integriertem WLAN.
ESP8266 ist ein Mikrocontroller, der eine RISC CPU mit 64 KiB Befehlsspeicher und 96 KiB Dataspeicher und Wi-Fi kombiniert. Als Schnittstellen zur Außenwelt stehen 16 GPIO, SPI, I²C, I²S, UART und ein ADC zur Verfügung.
Für die Anbindung dieses Mikrocontrollers kommt bei mir ein NodeMCU Modul mit folgender Anschlußbelegung zum Einsatz.
Der Controller hat neben der Erfassung der Messwerte die Aufgabe die Werte über WLAN an einen Server zu übertragen.
Steckplatine
Der Test der Sensoren und des Controllers erfolgt auf einer Steckplatine.
Sensor | Anbindung an den Controller | Anschluß an den Controller |
DHT22 | Single-bus data | D3 |
BMP280 | I²C | D1/D2 |
BME280 | I²C | D1/D2 |
DS18B20 | 1-Wire interface | D5 |
TSL2561 | I²C | D1/D2 |
ML8511 | Analog output | ADS (siehe Abschnitt zu ML8511) |
Enable input | D4 (siehe Abschnitt zu ML8511) | |
VEML6090 | I²C | D1/D2 |
- Die Taktleitung des I²C-Bus (SCL) ist hier blau.
- Die Datenleitung des I²C-Bus (SDA) ist hier grün.
- Die Verbindung zwischen D0 und RST ist notwendig damit die Wetterstation aus dem Deep Sleep mode wieder startet. Für den Testbetrieb ohne Deep Sleep mode kann diese Verbindung entfallen.
- Die LED mit 100 Ω Widerstand an D6 wird von der Wetterstation verwendet um verschiedene Betriebszustände anzuzeigen. Im Testbetrieb ohne Deep Sleep mode kann stattdessen auch die interne LED an D0 verwendet werden.
- Tatsächlich habe ich nie alle Sensoren gleichzeitig auf der Steckplatine getestet! Wegen der unten beschriebenen Problematik mit dem I²C-Bus ist es fraglich, ob die Testschaltung mit allen Sensoren gleichzeitig funktioniert.
- Auf der Steckplatine ist eine Echtzeituhr dargestellt (angebunden ebenfalls über den I²C-Bus), die ich aktuell aber nicht verwende.
I²C
Die Spezifikation des I²C-Bus erfordert zwischen den Datenleitungen und Vcc jeweils einen Pull-up-Widerstand. Ob dies bei den gegeben Bauteilen und der gegebene Schaltung stabil funktioniert, hängt vor allem von der genauen Bauart der Sensorplatinen ab. Zum einen besitzt der Controller interne (sehr groß dimensionierte) Pull-up-Widerständen, die von der Software für den I²C-Bus auch aktiviert werden, zum anderen haben einige der Platinen für die Sensoren ebenfalls (meist unterschiedlich dimensionierte) Pull-up-Widerstände.
In meinem Fall funktioniert die Messschaltung mit denen von den Bauteilen vorgegebenen Pull-up-Widerständen. Für eine wirklich korrekte Schaltung ist es aber notwendig die internen Pull-ups des Controllers zu deaktivieren, mögliche Pull-ups auf sämtlichen Sensorplatinen zu entfernen und anschliessend richtig dimensionierte separate Pull-ups zu verwenden.
DHT22
Zusätzlich zur Betriebsspannung benötigt dieser Sensor nur einen digitalen Signaleingang am Controller. Messwerte werden als serielle Bitfolge übertragen.
BMP280 und BME280
Beide Sensoren werden über den I²C-Bus an den Controller angeschlossen. Meine Sensorplatinen enthalten bereits jeweils 10 kΩ Pull-up-Widerstände an den Busleitungen.
DS18B20
Zusätzlich zur Betriebsspannung benötigt dieser Sensor nur einen digitalen Signaleingang am Controller. Messwerte werden über die 1-Wire-Schnittstelle übertragen. Der Sensor benötigt einen 4,7 kΩ Pull-up-Widerstand an seiner Datenleitung für eine korrekte Übertragung der Messwerte.
TSL2561
Der Sensor wird über den I²C-Bus an den Controller angeschlossen. Meine Sensorplatine enthält bereits 10 kΩ Pull-up-Widerstände an den Busleitungen.
ML8511
Der Sensor gibt den Messwert der Ultraviolettstrahlung als Spannung zwischen 1,0 V und 2,8 V aus. Diese Spannung wird von einem externen Analog-Digital-Wandler ausgewertet. Ich verwende einen externen Wandler um eine höhere Genauigkeit gegenüber dem internen Wandler des Controllers zu erreichen.
Damit der Sensor überhaupt eine Messung durchführt muss an seinem EN-Eingang ein HI-Signal anliegen. Diesen Betriebsmodus steuere ich über einen Digitalausgang des Controllers.
VEML6090
Der Sensor wird über den I²C-Bus an den Controller angeschlossen. Meine Sensorplatine enthält bereits 10 kΩ Pull-up-Widerstände an den Busleitungen.
ADS1115
Der Analog-Digital-Wandler wird über den I²C-Bus an den Controller angeschlossen. Meine Sensorplatine enthält bereits 10 kΩ Pull-up-Widerstände an den Busleitungen.
Der Wandler kann bis zu vier Spannungen auf getrennten Kanälen messen. Um die zu messende Spannung möglichst korrekt ermitteln zu können, verwende ich einen Kanal um die Betriebsspannung als Referenzwert zu erfassen.
DS3231
Die batteriegepufferte Echtzeituhr ermöglicht es den Messwerten den genauen Zeitpunkt ihrer Erfassung zuzuordnen.
Die Uhr wird über den I²C-Bus an den Controller angeschlossen. Meine Platine enthält bereits 4,7 kΩ Pull-up-Widerstände an den Busleitungen.
Test
Da ich kein Referenzmessgerät für die verschiedenen Kenngrößen besitze, müssen für die Bewertung der Messergebnisse einfache Messgeräte (Zimmerthermometer, Zimmerbarometer, Luftdruckmessung im Handy usw.) herhalten. Außerdem vergleiche ich die Messwerte mit den Werten einer öffentlichen Messstation in etwa einem Kilometer Entfernung.
Damit ist natürlich weder eine exakte Kalibrierung der Wetterstation noch eine korrekte Einschätzung der Sensoren möglich. Für dieses Projekt ist mein Erkenntnisgewinn dahingehend aber ausreichend.
DHT22
Der Sensor liefert recht gute Werte für die Luftfeuchtigkeit und etwas zu hohe Werte für die Temperatur.
BMP280
Der Sensor liefert sehr gute Werte für den Luftdruck und deutlich zu hohe Werte für die Temperatur. Eventuell sorgt der Spannungsregler auf der Rückseite der Sensorplatine für eine zusätzliche Erwärmung.
BME280
Der Sensor liefert für den Luftdruck und die Temperatur dieselben Werte wie der Sensor BMP280 und recht gute Werte für die Luftfeuchtigkeit.
DS18B20
Der Sensor liefert sehr gute Werte für die Temperatur. Nach einer Kalibrierung sind die Werte hervorragend nahe an den mir zur Verfügung stehenden Referenzwerten.
Zur Kalibrierung habe ich eine 2-Punkt-Kalibrierung mit Eiswasser und kochendem Wasser durchgeführt.
TSL2561
Der Sensor liefert stabile Werte. Für die Kenngröße der Helligkeit habe ich allerdings keine Referenzwerte zur Verfügung und muss daher auf die Werte des Sensors vertrauen.
ML8511
Der Sensor liefert stabile Werte. Für die Kenngröße der Ultraviolettstrahlung habe ich allerdings keine Referenzwerte zur Verfügung und muss daher auf die Werte des Sensors vertrauen. Die Messwerte sind abhängig von der Umgebungstemperatur. Da die Abweichung im normalen Temperaturbereich aber sehr klein ist, verzichte ich auf eine temperaturabhängige Korrektur.
Die notwendige Wandlung der Messspannung mit dem externen Analog-Digital-Wandler liefert dank der zusätzlichen Messung der Betriebsspannung und der daraus folgenden Kalibrierung der ermittelten Messspannung sehr genaue Ergebnisse.
VEML6090
Der Sensor liefert stabile Werte. Für die Kenngröße der Ultraviolettstrahlung habe ich allerdings keine Referenzwerte zur Verfügung und muss daher auf die Werte des Sensors vertrauen.
Schaltplan des Prototyps
Der Controller ist
- NodeMCU 1.0 ESP8266
Verwendet habe ich die Sensoren
- DS18B20 — Temperatur
- BMP280 — Luftdruck
- DHT22 — Luftfeuchte
- TSL2561 — Helligkeit
- ML8511 — Ultraviolettstrahlung
Außerdem kommt noch eine Echtzeituhr DS3231 und eine Status-LED zum Einsatz.
- R1 — 100 Ω
- R2 — 4,7 kΩ
- R3 — 4,7 kΩ
- R4 — 4,7 kΩ
- Die zwei Pull-up-Widerstände mit 4,7 kΩ für den I²C-Bus im Schaltplan sind notwendig unter der Annahme, dass kein weiterer Busteilnehmer Pull-up-Widerstände mitbringt. Mit meinen Bauteilen ergibt sich durch die Widerstände der Sensoren, des Analog-Digital-Wandlers und der Echtzeituhr ohne die konkreten Widerstände ein Gesamtwert von 1,8 kΩ pro Datenleitung als Pull-up-Widerstand. Das ist sehr wenig, liegt aber innerhalb der Spezifikation und funktioniert hier. Deshalb habe ich die eingezeichneten Pull-up-Widerstände weggelassen.
- Der Strom durch die Status-LED wird durch den 100 Ω Vorwiderstand bei einer Vorwärtsspannung von 2,2 V auf etwa 10 Milliampere begrenzt. Damit leuchtet die LED erkennbar hell genug. Die LED wird nur im Fall eines Fehlers geschaltet, so daß im normalen Funktionszustand kein zusätzlicher Stromverbrauch anfällt.
Dieser Prototyp hat im Testzeitraum von einen Monat alle fünf Minuten zuverlässig Messwerte geliefert.
Die tatsächliche Umsetzung der Wetterstation für unsere Terrasse beschreibe ich in einem weiteren Beitrag.