Der Umweltsensor basiert auf den Grundlagen meiner "Wetterstation mit ESP8266". Das Funktionsprinzip ist gleich: ein BMP280 - Sensor misst Temperatur, Luftfeuchte und Luftdruck. Er wird von einem ESP8266 Microcontroller angesteuert. Die Werte werden diesmal nicht direkt in einem LCD-Display angezeigt, sondern per MQTT-Protokoll (vgl. "MQTT-Broker auf Raspberry Pi installieren") an eine SQL - Datenbank übertragen. Der neueste Datensatz wird von einer Website am Handy angezeigt:

Vier mal stündlich werden Wetterdaten an die Datenbank gesendet, diese kann man anschließend über längere Zeiträume auswerten. Wie das mit MQTT funktioniert erläutere ich später, zunächst zur Elektronik.

Alle Bausteine, der Controller, der Sensor und der A/D-Wandler sind direkt mit der 3,3V-Versorgung verbunden (rote Leitungen). Bei mir sind das in der Regel Lithiumeisenphosphatakkkus (LiFePo4) in AA-Bauform mit rund 600mAh Kapazität, warum habe ich hier erläutert.

Warum T1? T1 ist ein N-Mosfet der durchschält, wenn die GS-Spannung > etwa 1V wird. Nur im durchgeschalteten Zustand werden der A/D-Wandler und der Sensor eingeschaltet. Der ILRU3410 hat eine Threshold-Spannung von etwa 1V und einen DS-Widerstand von 0,105 Ohm - ein echter Schalter, der bei 3,3V satt durchschält, die Messung durch seinen äußerst geringen DS-Widerstand praktisch nicht beeinflusst. Warum werden die zwei Module überhaupt geschaltet? Einmal wegen dem Stromverbrauch: Der ADS1115 sowie der BMP280 sind zwar keine Großverbraucher, aber wenn sie permanent betrieben werden ist ein Akku sehr rasch leer. Hier wird nur viermal in der Stunde für rund eine Sekunde gemessen. Danach wird abgeschaltet und der ESP1 schläft ebenfalls für 15 Minuten. In dieser Zeit benötigt die gesamte Schaltung wenige µA Strom (etwa 1/900stel gegenüber Dauerbetrieb). Ein anderer Grund betrifft den BMP280. Wie hier beschrieben heizt die auf dem Sensor befindliche Elektronik den Sensor ein wenig auf, dessen Temperaturwerte werden dadurch signifikant verändert und ungenau. Wenn man ihn nur im Sekundenbereich einschaltet fällt das nicht ins Gewicht. Beim Luftdruck muss man daran denken, die Höhe des Messorts zu berücksichtigen. Alles steht im Datenblatt des BMP280. Im Arduino-Code ist das für meinen Wohnort

p = bme.readPressure()/100.0+35; //+Hochdorf 295m *0,12 hPa/m lt. Datenblatt

Arduino-Code für ESP8266-Controller

Zur Funktionsweise der Schaltung. Der Controller verbindet sich mit einem WLAN, misst die Umweltdaten, steuert den A/D-Wandler an, welcher die Batteriespannung misst. Sowohl der A/D-Wander als auch der Umweltsensor werden per I2C-Bus angesteuert (grüne und blaue Verbindungsleitungen). Alle Werte werden per MQTT an einen MQTT-Broker gesendet.

Die Batteriespannung wird nicht im Controller überwacht. Sie wird von ihm lediglich per MQTT an einen Broker auf einem RaspberryPi gesendet. Dort wertet ein Python-Script die ankommenden Werte aus. Wenn die Akkuspannung zu niedrig wird, verändert sich die unterste Zeile im Handy. Sie weist auf den nötigen Akkuwechsel hin und wird gelb/rot. Reagieren muss der User darauf. Tut er das nicht, wird der Akku tiefentladen.

Die Platine und andere Impressionen

Den Kondensator braucht es nicht:

Mit einem Akku (600mAh) kann man im Winter etwa 1 Monat lang messen. Bei extrem niedrigen Temperaturen (< -10°C) verlieren LiFePo4-Akkus schnell an Kapazität. Wenn die Spannung unter 3V fällt, muss der Akku ausgetauscht werden, sonst nimmt er Schaden.

Das Senden von Daten über MQTT an eine Datenbank

Im Quelltext des Python-Scripts (weiter unten) findet man die Sendesequenz der Umweltdaten und der Akkuspannung:

für MQTT sind das die Topics

  • wetter/temperatur
  • wetter/luftfeuchtigkeit
  • wetter/luftdruck
  • wetter/batterie

vier Sendungen gehen an den MQTT-Broker "mosquitto" auf einem RaspberryPi.

Auf dem Raspberry läuft ein Python-Script, das sich auf diese Topics per Subscribe angemeldet hat:

Das Script meldet sich am MQTT-Broker mit den Topics an und erhält entsprechende Nachrichten. Die Nachrichten schreibt das Script in eine SQL Datenbank (bei mir SQLite3). Immer wenn eine Nachricht an ein Topic eingeht wird sie vom Script mitgelesen und ggf. verarbeitet. Die Funktion on_message holt die Message mit payload und schreibt diese in ein Array dataTuple. Da die Informationen in der Reihenfolge Temperatur, Feuchte, Druck, Batteriespannung gesendet wurden werden sie auch in dieser Reihenfolge empfangen. Der Zeitstempel wird vorher vom Script generiert (das geht in SQLite3 zwar eleganter, war mir aber beim Programmieren nicht bekannt). Insgesamt dient die Funktion zur Vorbereitung des Schreibens in die Datenbank:

Wenn alle Felder des Arrays gefüllt sind (nicht "-1") wird die Funktion writeToDb aufgerufen welche die Daten in die Datenbank schreibt:

In der Datenbank findet man dann den Eintrag nach Datum absteigend sortiert und limitiert auf 1 = den neuesten Datensatz:

Die Website umwelt2.php fürs Anzeigen am Handy nutzt genau diese SQL-Abfrage um den aktuellsten Datensatz anzuzeigen:

Smart.css für die Optik:

Linux-Splitter

Um die Python-Scripte ausführbar zu machen musst du im Quelltext mit folgender Zeile beginnen:

#!/usr/bin/python

 Dann muss deren Ausführung in Linux noch gestattet werden. Das geschieht mit dem chmod - Befehl:

chmod a+x /home/pi/bin/mqttsql.py

Change Mode a+x heißt: (A)llemann dürfen das Script starten (eXecute). ich schreibe meine Scripte immer ins Verzeichnis /home/pi/bin.

Sinnvoll ist es wenn mqttsql.py gleich mit Linux mitstartet. Es gibt eine Art Autostart in Linux - /etc/rc.local. Wenn man die Scripte dort einträgt werden sie automatisch gestartet. Dazu die Datei als Superuser editieren:

sudo pico /etc/rc.local

Vor "exit 0" schreiben wir nun den Pfad unseres Scripts gefolgt von einem "&". "&" startet das Script im Hintergrund. mqttsql.py startet ab sofort beim nächsten Systemstart automatisch:

/home/pi/bin/mqttsql.py &

Fertig!