Drucken
Kategorie: Wetterstation
Zugriffe: 241

Bisher werkelten mehrere Mikrocontroller in der Wetterstation. Der Datenaustausch zwischen den Komponenten erfolgt mittels I²C Bus. In unregelmäßigen Abständen sind Störungen auf dem I²C Bus aufgetreten. Die Station arbeitete zwar, sendete aber nur noch unsinnige Daten. Viele Versuche habe ich unternommen, dem Problem Herr zu werden. Leider hat keiner zum erhofften Erfolg beigetragen. Die Station konnte nur durch komplettes Aus- und Wiedereinschalten zurückgesetzt werden. Das Problem traf nach einigen Stunden, manchmal Tagen oder Wochen auf.

Lösungsversuche meinerseits waren das Hinzufügen verschiedener Pullup Widerstände auf den SCL und SDA Leitungen des I²C Bus, Trennen der angeschlossenen Komponenten sowie Reset des ESP8266 Moduls. Um Probleme der Spannungsversorgung auszuschließen, wurden auch zusätzliche Keramikkondensatoren an den beiden MCP1702 Spannungswandlern angeschlossen.

Meine Vermutung ist, dass eine der Leitungen SCL oder SDA von einer Komponente dauerhaft HIGH oder LOW gehalten wird. Da keiner der vier Controller über eine Hardware I²C Schnittstelle verfügt, habe ich mich auf die Suche nach einer ganz anderen Lösung gemacht.

Die Wahl auf Kombination des ESP8266 mit mehreren zusätzlichen Controllern habe ich damals getroffen, weil der ESP8266 zu wenige analoge Eingänge und im gesamten zu wenig I/O Pins bietet.

Seit einigen Jahren gibt es den ESP-32, der manchmal als Nachfolger gehandelt wird. Dieser bietet neben weiteren Komponenten deutlich mehr Pins auch ein Hardware I²C Interface. Somit habe ich die bestehende Hard- und Software angepasst.

Der Aufbau ist nun wie folgt:

- ESP-32 zur Messung der Batterie- und Solarspannung. Ebenso Messung der Pulse vom Wind- und Regensensor
- BME280 für Temperatur, Druck und Luftfeuchtigkeit
- ATTINY24, wie bisher für die Windfahne

Der ESP-32 bietet einen Hardware Pulse Counter, mit dem quasi nebenbei Impulse an einem der Pins gezählt werden kann. Diese Funktion wäre eigentlich perfekt, leider steht der Hardware Counter nur zur Verfügung, wenn das ESP-32 Modul aktiv läuft. Da der ESP-32 detulich mehr Energie verbraucht als der ESP8266, muss dieser natürlich, wie bisher, die meiste Zeit schlafen. Der Hardware Pulse Counter steht dann aber nicht zur Verfügung.

Glücklicherweise bietet der ESP-32 aber einen ULP Coprozessor, der einfache Tätigkeiten ausführen kann, während der ESP-32 schläft. Es gibt aber zwei wesentliche Nachteile:

1. das Programm für den ULP Coprozessor muss ein Assembler Code sein und gestaltet sich somit entsprechend Aufwändig.
2. der ULP hat keine Interrupt Pins.

Der ULP kann nicht dauerhaft in einer Schleife laufen, hier stellt sich wieder das Energieproblem ein. Statt dessen läuft das Programm einmal durch, legt den ULP für eine kurze Zeit schlafen und beginnt von neuem. Der ULP und der eigentliche ESP-32 teilen sich bestimmte Speicherbereiche, so dass der Datenaustausch (Zählerstände) über den Speicher erfolgt.

Der Prozess sieht nun so aus:

1. das ESP-32 Modul lädt beim booten das Programm in den ULP Coprozessor und schläft anschließend für eine definierte Zeit
2. der ULP startet und prüft die Pins des Windmessers und des Regenmessers auf deren Level (HIGH oder LOW)
3. der ULP sichert den letzten Status und schläft für wenige Millisekunden
4. beim nächsten Lauf wird geprüft, ob der Status er Pins immer noch HIGH ist (zwecks debouncing). Falls ja, wird der Zähler erhöht
5. nach mehreren Minuten erwacht der ESP-32 aus dem Tiefschlaf, liest Daten der Windfahne und des BME und sendet alles zusammen mit den Zählerständen des ULP per MQTT.

Um weiter Energie einzusparen, wird der BME280 und der ATTINY24 der Windfahne nicht permanent mit Energie versorgt, sondern über einen I/O Pin des ESP-32 gespeist.

Da der ESP-32 deutlich mehr Energie benötigt als der ESP8266, musste der MCP1702, der 3.3V für die Wetterstation bereitstellt, durch einen leistungsfähigeren Spannungsregler MCP1826S ersetzt werden.

Den Schaltplan sowie die Software für den ULP und den ESP32 finden sich im Git Repository unter https://github.com/PaddyCube/WirelessWeather