Schaltung
Ich habe mich mal mit I2C beschäftigt. Tolle Sache. I2C Belegt nur zwei Ports am Controller und funktioniert sehr zuverlässig. I2C-Module gibt es für alles Mögliche, für die Wetterstation habe ich mich für den Sensor BME280 entschieden. Der misst Luftdruck, Feuchtigkeit und Temperatur. Dabei gibt es eine Besonderheit mit der Temperatur, auf die weise ich weiter unten hin. Gesteuert wird der Sensor von einem ESP8266-Controller.
Hier ist der Schaltplan:
Der ESP8266 besitzt eine WLAN- und eine I2C-Schnittstelle. D1 (SCL) ist der I2C-Takt (Clock), D2 (SDA) ist die I2C-Datenleitung. Da der ESP8266 mit 3,3V betrieben wird, das LCD-Display und der zugehörige I2C-Displaytreiber aber 5V benötigen, brauche ich einen Level-Shifter, der SCL und SDA von 3,3V auf 5V anpasst. Dieser Level-Shifter arbeitet bidirektional. Der Sensor ist auf 3,3V ausgelegt, er kann direkt am 3,3V-I2C-Bus des Controllers betrieben werden. Rot und schwarz sind die Versorgungsleitungen, blau ist SCL, grün SDA.
Der ESP8266 befindet sich auf einer kleinen Platine, die die Kopplung zum PC herstellt und sowohl 5V als auch 3,3V zur Verfügung stellen kann (reicht leider nicht für einen Lüfter). Hier nochmal die einzelnen Komponenten in groß. Fast alle sind bei Amazon bestellt, die meisten stammen von "Az-Delivery":
ESP8266-Modul "D1 mini" (ca 5€)
4 x Level-Shifter (1€):
Umweltsensor BMP280 (5€):
I2C-Modul für LCD-Displays (3€ inkl. 2 x 16 LCD):
Nach der Inbetriebnahme fiel mir auf, dass die Temperatur rund zwei Grad höher war, wie die eines Referenzthermometers. Im Internet ist man auch schon auf die vermeintliche Ungenauigkeit des Sensors aufmerksam geworden. Zu Unrecht: Im Datenblatt des BMP280 steht es - der Temperatursensor dient lediglich dazu, die Temperatur der Elektronik zu überwachen, er ist nicht dazu konstruiert worden, Lufttemperaturen zu messen. Weil sich die kleine Platine durch die aufgelötete Elektronik erwärmt, wird die Messung der Lufttemperatur ungenau. Also habe ich einen kleinen Lüfter über dem Sensor angebracht, der die Wärme der Elektronik abführt und siehe da - die Temperatur ist jetzt korrekt.
Programmierung
Die Programmierung erfolgt in C++ in der Arduino-Umgebung. Arduinos sind keine ESP-8266 Microcontroller sondern Atmel-Typen. Es gibt aber Bibliotheken und Werkzeuge, die eine Programmierung von ESP-Controllern in der Arduino-Umgebung ermöglichen. Bei mir sind dies die Einstellungen für meine ESP8266-Module:
C++ ist eigentlich nicht meine bevorzugte Programmiersprache, darum ist das Programm mangels Erfahrung etwas holprig - aber es funktioniert. Das Programm misst alle paar Sekunden die drei Umweltdaten Druck, Temperatur, Feuchtigkeit und sendet diese ans I2C-LCD (die I2C-Adressen der jeweiligen Bausteine sind im Quelltext dokumentiert). Alle etwa 15 Minuten sendet das Programm die drei Werte auch per MQTT-Protokoll an einen MQTT-Broker. Bei mir läuft der Broker "Mosquitto" auf einem Raspberry Pi. Man kann auch einen öffentlichen Broker im Internet nehmen, dann muss man lediglich die Broker-Adresse ändern.
Damit kann man schon einiges machen. Bei mir schreibt ein Python-Script auf dem Raspberry die MQTT-empfangenen Daten in eine SQLite-Datenbank. So kommen pro Stunde vier Werte zusammen. Die Datenbank wird von einem Webserver ausgewertet und der jeweils jüngste Datensatz wird angezeigt:
Präzisionstest
Zeit, das alles einmal auf Präzision zu testen. Hier ein Foto von der Vergleichsmessung mit einem relativ genauen Temperatur/Feuchtemessgerät. Durch den Lüfter überm Sensor ist die Eigenerwärmung weitgehend kompensiert, die gemessene Temperatur ist exakt gleich, auch die Luftfeuchtigkeit weicht nur wenige Prozent ab. Solch eine Qualität hätte ich von einem 5€-Sensor nicht erwartet.
Next Steps
Mein Ziel war es, mit I2C Erfahrungen zu sammeln für mein Projekt "Gießanlage", das ich demnächst in Angriff nehme. Das Ziel habe ich erreicht. Für dieses Projekt wird eine Platine entworfen, ein Gehäuse ausgedruckt und eine schöne Website gestaltet. 2021: Dies ist zwischenzeitlich erfolgt: Umweltsensor