Atmo - Home-made Wetterstation

Die aktuelle Jahreszeit ist bekannt dafür, dass es draussen etwas kälter ist und es im Haus oder Wohnung auch kälter wird.
Jedes Jahr ist es eine Kunst, die richtige Einstellung der Heizung zu finden, damit es nicht zu warm oder zu kalt ist. Noch schwieriger ist es, wenn dabei kein Thermometer zur Verfügung steht 🙈.

Anstatt einen Thermometer zu kaufen - oder eine Wetterstation wie z.B. Netatmo als Weihnachtsgeschenk 😛, dachte ich mir, dass ich selbst eine kleine Wetterstation baue. Diese soll nicht nur die Temperatur messen, sondern auch den Luftdruck, Luftfeuchtigkeit und die Luftqualität.
Später kommt eventuell noch eine Aussenkomponente dazu.

Hier möchte ich meine Schritte dazu dokumentieren, vielleicht möchte jemand auch ein Projekt dieser Art realisieren.

Atmo

Ich nenne das Projekt Atmo. Die Basis bildet dabei eine kleine Wetterstation auf Arduino Basis, die mit Sensoren ausgerüstet ist.
Die Sensoren werden periodisch ausgelesen und die Daten werden zentral Übermittelt und in eine Datenbank gespeichert. Diese können dann visualisiert werden.

Für die Übermittlung wird das MQTT-Protokoll genutzt. MQTT ist für diesen Anwendungsfall optimal, da nur wenige Daten effizient übermittelt werden. Ich verwende dafür den MQTT-Broker “Mosquitto”.

Damit die Daten vom MQTT-Broker in die Datenbank gelangt gibt es die Atmo-Bridge. Diese ist ein kleines Python Script, welches auf ankommende Nachrichten der Wetterstation wartet (subscribed) und die Daten in die InfluxDB speichert.

Die InfluxDB ist eine OpenSource Timeseries Datenbank, welche die Datenpunkte optimal speichern kann. Zusätzlich kann Grafana mit der InfluxDB verwendet werden, die Sensordaten zu visualisieren.

Atmo Übersicht

Hardware

Ich habe mich als Basis für das Adafruit ESP32 Huzzah Feather entschieden, da dieses Board mit einem ESP Wifi schon integriert hat. Zusätzlich hätte es noch Bluetooth für spätere Anwendung.
Die Sensoren werden dann über die SPI oder I2C Schnittstellen verbunden.

  • Integrated 802.11b/g/n HT40 Wi-Fi transceiver, baseband, stack and LWIP
  • Integrated dual mode Bluetooth (classic and BLE)
  • 3 x SPI
  • 2 x I2C

Ein Anschluss für einen LiPo-Akku ist auch vorhanden, falls die Station über eine Batterie versorgt werden soll. Da gibt es jedoch noch Optimierungspotential, damit möglichst wenig Strom verbraucht wird.

Sensoren

Geeignete Sensoren zu finden war nicht ganz einfach. Die gängigen Temperatur und Feuchtigkeitssensoren z.B. DHT22 oder DHT11 sind nicht sehr genau).
Auf der Suche nach einenm Luftqualitäts- (TVOC) oder CO2-Sensor bin ich auf den BME680 von Bosch aufmerksam geworden.

Dieser Chip hat einen Temperatur, Luftdruck, Luftfeuchtigkeit und Luftqualitäts-Sensor. Im Vergleich zu den anderen VOC-Sensoren berechnet er nicht die C02- oder VOC-Werte, sonderner verwendet die Messwerte des Gassensors zur Berechnung der IAQ (Indoor Air Quality). Dies ist ein Index zur bestimmung der “Luftgüte”. Dieser gibt an, wieviel Anteile der Luft Verunreinigungen enthält (z.B. organisches, Gase oder Chemikalien).

Am liebsten hätte ich noch den reinen C02 Wert, jedoch habe ich sonst keinen Chip gefunden, der so viele Werte auf einmal messen kann. Im Vergleich zu anderen Chips ist der BME680 einer der Besten, und deshalb wohl auch teurer im Vergleich zu den anderen. Der Preis des BME680 ist trotz der vielen Features im inneren des Gerätes angemessen. In den meisten Fällen schlägt er jede Sensorkombination im Preis. Leider ist der Chip nicht Open Source und Bosch ist nicht sehr offen was die Algorithmen betrifft, um den Sensor auszuwerten. Daher wird es sicher nicht ganz einfach die korrekten und kalibrierten Werte zu ermitteln.

Die Genauigkeiten der Sensoren können dem Datenblatt von Bosch entnommen werden.

  • Humidity (%) ±3
  • Pressure (kPa) ±0.12
  • Temperature (°C) ±1.0

Für mein Projekt verwende ich den BME680 auf dem Breakoutboard von Adafruit.

Zusätzlich nutze ich noch den Sensor TSL2591 für die Lichtintensität (Lux) um das Tageslicht zu bestimmen. Nicht ganz so wichtig, aber ich wollte noch einen zusätzlichen Sensor nutzen.

Im Vergleich zu kostengünstigen CdS-Zellen ist dieser Sensor präziser, erlaubt exakte Lux-Berechnungen und kann für verschiedene Verstärkungs-/Timing-Bereiche konfiguriert werden, um Lichtbereiche von 188 uLux bis zu 88.000 Lux zu erfassen.

Build & Wire

Die Pinouts von dem Feather Board sind gut auf Adafruit dokumentiert:

Der BME680 wird über SPI angeschlossen und daher an die entsprechenden Pins gelötet:

  • 3v und Gnd nach 3v und Gnd auf dem Feather Board.
  • SCK auf dem BME680 nach SCK auf dem Feather Board (Pin 5)
  • CS auf Pin 16 auf dem Feather Board. (CS1 Pin, kann auch der CS2 verwendet werden)
  • SDO nach MI(SO) (Pin 19)
  • SDI nach MO(SI) (Pin 18)

Der Lichtsensor TSL2591 kann nur I2C und wird an die entsprechenden Pins gelötet:

  • Vin und GND, Strom und Ground
  • SCL - I2C clock pin - nach SCL auf dem Feather Board (Pin 22)
  • SDA - I2C data pin - nach SDA auf dem FEather Board (Pin 23)

Ergebnis

Ich bin mit dem Ergebnis ganz zufrieden. Ich bin fasziniert wie kompakt das ganze ist. Ich habe etwas längere Kabel verwendet, dass vor allem der BME680 Chip nicht zu nahe am Feather Board ist, damit die Abwärme die Temperaturmessung nicht beeinflusst. Dieses Thema addressiere ich noch bei der Programmierung, da die Werte noch kalibriert werden müssen.

Top, nun ist die Basisstation bereit für den nächsten Schritt - das Ding zum laufen bringen :)

Atmo - Weatherstation