Wetterstation

DERZEIT IN ÜBERARBEITUNG

Was kann das alles ?

Generell mal zuerst. Das Ding hat hier nicht den Anspruch die beste Wetterstation aller Zeiten zu werden und auch nicht alles perfekt zu messen oder irgendwie eine Referenz zu sein. Das Ding ist halt Hobby. Viele Dinge die hier hinterher als "so geht es" stehen, wusste ich vorher nicht und sind auch garantiert nicht das Ende der Weisheit. Und vieles - gerade was die Programmierung angeht - konnte ich vorher auch nicht. Verbesserungsvorschläge sind immer herzlich Willkommen!

Ich möchte bei uns im Garten gerne folgendes Messen:

  • Lufttemperatur in 2m höhe
  • Luftdruck
  • Bodentemperatur
  • Lufteuchtigkeit
  • Feinstaubkonzentration von PM 1,0 / 2,5 / 10,0
  • Windgeschwindigkeit
  • Windrichtung
  • UV Strahlung (A & B)
  • Himmelstemperatur
  • Bedeckungsgrad, abgeleitet aus Himmelstemperatur
  • Niederschlagsmenge (Regen)

Dabei sollen die Messwerte irgendwo auflaufen, dort gespeichert werden und für einen späteren Abruf bereitstehen. D.h. die Sensoren an sich sollen lediglich messen und die Daten an einen anderen Ort senden und dann passiert dort irgendwas mit. Der Plan ist also, Sensoren an einen Microcontroller anzuschließen und das ganze per WiFi bzw. genauer gesagt per MQTT an einen anderen Ort zu schicken.

Was braucht man ?

  • ESP32
  • DHT22 (Lufttemperatur u Feuchtigkeit)  SHT31-D
  • DSB18B20 mit langen Kabel (z.B.3m) (Bodentemperatur)
  • DPS310 (Luftdruck)
  • SPS30 von Sensirion (Feinstaub)
  • MLX90614 (IR Temperatur)
  • UV (fehlt noch)
  • Diverse Kabel
  • LiPo Akkus
  • Spannungsversorgung (TP4056, MCP1725)

Bei der Windrichtung und Windgeschwindigkeit ist der Plan, dies mit einem Messgerät ohne Bewegliche Teile zu messen. Das Ding heißt dann Ultraschall-Anemometer. Da ich das selbst nicht entwickeln kann, habe ich mich an diese Anleitung gehalten:

https://soldernerd.com/arduino-ultrasonic-anemometer/

Genereller vorgehensweise

Der Plan ist also, dass ganze Gedöns irgendwie zusammen zu bauen und dann die Daten kabellos per MQTT-Telegramm an einen anderen Ort zu schicken.

Jetzt ist es aber so, dass man die ganzen Daten in anderen Intervallen misst. Die Lufttemperatur zum Beispiel wird sich nicht sekündlich ändern. Also schon. Aber die Frage ist, ob die 0,0001°C zum einen Messbar sind, oder das jemand interessiert. Hinzu kommt, dass die Messplätze unterschiedlich sind. Die Windgeschwindigkeit und die Bodentemperatur sind nun mal zwei Unterschiedliche Orte. D.h. man braucht schon mal mindestens 2 Microcontroller - ich habe mich für den ESP32 entschieden.

ESP 32 - 1

Soll die Bodentemperatur, Luftdruck/Luftfeuchte/Lufttemperatur sowie den Feinstaub messen.

ESP 32 -2

Wird die Windgeschwindigkeit, die Windrichtung, UV Strahlung sowie die IR Temperatur vom Himmel (Himmelstemperatur messen).

Im ersten Anflug von Wahnsinn habe ich überlegt es wäre schön wenn die Wetterstation dass als Energie nutzen kann, was die Umwelt zur Verfügung stellt. D.h. Stromversorgung über Solarzellen und Batterien. Wir werden gemeinsam rausfinden ob das klappt.

 

Es wird also so sein, dass man erst die Hardware zusammenbaut, diese dann programmiert und anschließend werden die Daten von den ESP´s per MQTT verschickt. Leider wird das nicht ohne zu löten gehen. Vor Bits & Bites sollte man auch keine Angst haben. Aber wir schaffen das! Was ich hier nicht erklären will ist, wie man den notwendingen MQTT Broker einrichtet. D.h. die Software die die MQTT Telegramme empfängt. Wer hier jedoch fragen hat, kann sich gerne melden. Ansonsten gibt es wunderbare Erklärungen im Netz. Vielleicht als Hintegrund, bei mir läuft Mosquitto auf einem Raspberry Pi.

Von viel Kram zu einer fertigen Station

Auf gehts!

Ich fange mal in der Mitte an. Bei vielen Dingen die hier stehen, seht ihr den Endstand dessen, was bei mir funktioniert. Bei einigen Dingen - die findet ihr unter Fails - habe ich ganz unten mal aufgeschrieben, was da warum nicht ging. So here we go.

Im ersten Schritt werden wir den ersten ESP verkabeln, programmieren und dann in eine Gehäuse einbauen. Im zweiten Schritt kommt dann der zweite ESP mit Kabeln, Programm....

Aber warum eigentlich zwei ESP ? Wenn man die UV-Strahlung, den Wind mit Geschwindigkeit und Richtung messen möchte und einen dazu noch die Himmelstemperatur interessiert, dann muss man auf eine andere Höhe als bei der Lufttemperatur. Die Lufttemperatur misst man idealerweise 2m über Grund über eine kurz gemähten Wiese. Bei uns sind es 2m über dem Gemüsebeet geworden. Dort hängt ebenfalls der Feinstaubsensor und auch das Barometer.

Auf einem Fahnenmast hängt dann ganz oben der Windmesser, der UV-Sensor und das IR-Thermometer. Das IR Thermometer kann man genau wie das Bauteil zur UV Messung auch tiefer hängen, aber bei mir ist da immer der Mast im weg.

Ich habe den ESP´s auch unterschiedliche Namen gegeben, einfach nur um sie zu unterscheiden. Hängen geblieben bin ich bei Erich und Fritz, hier kann man aber auch etwas nehmen was einem gefällt.

ESP 32 - Erich

ESP 32 - Fritz

Fritz soll also in 6m Höhe die Himmelstemperatur, die UV-Strahlung und Windrichtung und Stärke messen. Fritz soll per Akku mit Strom versorgt werden der mit Solarzellen geladen werden soll.

Angefangen habe ich mal ganz einfach. Und zwar habe ich den ESP auf einem Board mit ein paar Kabeln am MCP1725 verdrahtet und den TP4056 und den Akku verbunden. Als Test war erst mal nur der IR-Sensor dran. Sketch dazu siehe unten. Verwendet habe ich einen 3700mA LiOn Akku dessen Spannung gemessen und als Batterystand ebenfalls per MQTT übertragen wird. Da der ESP misst und dann für 5 Minuten schlafen geht, scheint der Akku bis zur undendlichkeit und noch viel weiter zu reichen. Meine anfänglichen Bedenken das man beim Laden des Akku dann die 4,2V Ladespannung angezeigt bekommt, hat sich auch nicht bewarheitet.

 

Hier mal ein paar Details und Hintergründe zum Code und der Vorgehensweise:

void Batterie() {

analogRead(33);
float batteryLevel = map(analogRead(33), 0.0f, 4095.0f, 0, 100);      //Mapping from 4,2V/3V auf 100/0
delay(200);
client.publish("Wetterstation/Status/Fritz_Batterylevel", String(batteryLevel).c_str(), true);

}

Der ESP32 hat ein Logik-Level von 3,3 V, der Akku eine Ladeschlusspannung von 4,2V (obwohl die Nennspannung 3,7V beträgt. Zu tief sollte man den Akku auch nicht entladen, das mögen die nicht so gerne. Hier ist mein unterstes Level 3,0V. Jetzt könnte man die 4,2V direkt an einen PIN vom ESP hängen, sollte man aber besser lassen. Wir reduzieren also mit einem Widerstand bzw. genauer gesagt 2 Stück, die Spannung von maximal 4,2V auf 3,3V. U=R*I lässt grüßen 😉    So, mit analogRead kann man dann den PIN (33) auslesen und bekommt dann die Spannung angezeigt. O.k. da kommen also 3,3V Maximal an, was dann ja eigentlich 4,2V wären und somit die 100%. Kurz um, wir müssen das Mappen! Siehe oben im Code, eigentlich ganz einfach. Und schon schickt der ESP per MQTT erst die IR Temperatur und direkt danach den Ladezustand der Batterie. Ein hoch auf Strg + C/V !

Der Code

Damit das ganz funktioniert, benötigt man einen "Sketch", also die Programmierung für den ESP32.

Ich habe dazu die Arudino IDE benutzt, da auch hier die Installation bzw. vorgehensweise immer etwas variiert, erspare ich mir hier etwas aufzuschreiben das dann in 2 Wochen wieder nicht funktioniert.

Generelle Vorgehensweise:

  • Arduino IDE Installieren
  • Im Boardmanager das Expressif ESP32 hinzufügen (bitte hier die Anleitung der Expressif Seite beachten!)
  • Unter "Werkzeuge" -->  "Bibliotheken verwalten" alle Bibliotheken installieren die notwendig sind. Sollte da eine fehlen ist das erstmal nicht tragisch, die IDE meckert dann beim kompilieren und man installiert einfach nach
  • In Windows muss noch ein COM Port eingerichtet werden damit die IDE z.B. an COM3 dann auch den ESP findet

Wenn man das alles hat, kann man den Sketch dann einfach kompilieren und übertragen.

WICHTIG:

Im Sketch müssen noch ein paar Dinge ergänzt werden:

  • WiFi SSID
  • WiFi Passwort
  • MQTT Zugangsdaten usw.

 

ESP 32 -1 CODE

FOLGT

ESP 32 -2 CODE

#include <WiFi.h>
#include <PubSubClient.h>
#include <Adafruit_MLX90614.h> //IR Temp
#include <wire.h>

#define wifi_ssid "SSID" //wifi ssid
#define wifi_password "PASSWORD" //wifi password
#define mqtt_server "IP-ADRESS" // server name or IP
#define mqtt_user "USER" // username
#define mqtt_password "PASSWORD" // password

/* definitions for deepsleep */
#define uS_TO_S_FACTOR 1000000 /* Conversion factor for micro seconds to seconds */
#define TIME_TO_SLEEP 300 /* Time ESP32 will go to sleep for 5 minutes (in seconds) */
#define TIME_TO_SLEEP_ERROR 3600 /* Time to sleep in case of error (1 hour) */

Adafruit_MLX90614 mlx = Adafruit_MLX90614();

WiFiClient espClient;
PubSubClient client(espClient);

//Setup

void setup() {
Serial.begin(115200);
delay(500);
setup_wifi();
client.setServer(mqtt_server, 1883); // Configure MQTT connection, change port if needed.
if (!client.connected()) {
reconnect();
}

IRTemperatur();

Batterie();
esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR); //go to sleep
Serial.println("Setup ESP32 to sleep for every " + String(TIME_TO_SLEEP) + " Seconds");
Serial.println("Going to sleep as normal now.");
client.publish("Wetterstation/Status_IR", "IR Sensor SLEEPs");
esp_deep_sleep_start();

}

 

 

//Setup connection to wifi
void setup_wifi() {
Serial.println();
Serial.print("Connecting to ");
Serial.println(wifi_ssid);

WiFi.begin(wifi_ssid, wifi_password);

while (WiFi.status() != WL_CONNECTED) {
delay(100);
Serial.print(".");
}

Serial.println("");
Serial.println("WiFi is UP ");
Serial.print("=> ESP32 new IP address is: ");
Serial.print(WiFi.localIP());
Serial.println("");
}

//Reconnect to wifi if connection is lost
void reconnect() {

while (!client.connected()) {
Serial.print("Connecting to MQTT broker ...");
if (client.connect("ESP32Client", mqtt_user, mqtt_password)) {
Serial.println("OK");
client.publish("Wetterstation/Status_IR", "IR Sensor ONLINE");
} else {
Serial.print("[Error] Not connected: ");
Serial.print(client.state());
Serial.println("Wait 5 seconds before retry.");
delay(5000);
}
}
}

void IRTemperatur(){
float tempir = 0;
char chartempir[] ="0,00";
Serial.print("IR Temperatur starten\n");
if (!mlx.begin()) {
Serial.println("Error connecting to MLX sensor. Check wiring.");
while (1);
};
Serial.print("Emissivity = "); Serial.println(mlx.readEmissivity());
delay(500);
tempir = mlx.readObjectTempC();
dtostrf(tempir, 4, 1, chartempir);
client.publish("Wetterstation/Sensoren/Himmelstemperatur", chartempir);
Serial.print("Ambient = "); Serial.print(mlx.readAmbientTempC());
Serial.print("*C\tObject = "); chartempir; Serial.println("*C");
Serial.println();
}

void Batterie() {

analogRead(33);
float batteryLevel = map(analogRead(33), 0.0f, 4095.0f, 0, 100); //Mapping from 4,2V/3V auf 100/0
delay(200);
client.publish("Wetterstation/Battlvl_IR", String(batteryLevel).c_str(), true);

}

void loop() {
}


Gehäuse + 3D-Druckdaten

Die Fails!

DHT 22 - Messung von Luftfeuchte und Lufttemperatur

Also an sich ist da Ding gar nicht so schlecht, Anzusteuern über One-Wire, also nur 3 Kabel. Soll Robust sein, ist günstig, es gibt viele Beispiele.

Also die Linie ist ein Auszug aus einem Diagramm. Und zwar der Luftfeuchtigkeit über 48 Stunden. Die DHT22 haben leider die Angewohnheit, bei Luftfeuchtigkeiten über 80% zu sättigen. Was ja im Herbst/Winter - wir schreiben den 30.11.  - doch mal gerne vorkommt. Wir haben in den letzten Tagen sehr viel Nebel gehabt und der Sensor ist zumindest was die relative Luftfeuchtigkeit angeht, hinüber. Es gibt zwar noch eine angebliche Rettungsmethode mit Backofen usw. aber ich habe mich nach einem neuen Sensor umgesehen. Der SHT31-D hat eine Teflon Membrane über dem Sensor und ist von Hause aus schon mal bis 100% Rh vom Hersteller freigegeben. Aber mit dem Hinweis, dass auch dieser aufsättigen kann, sich aber dann alleine wieder erholt. Wir werden sehen ob das klappt.

 

MCP1700-3302E als Lineare Spannungsquelle für den EPS32

Ich habe im Netz eine Anleitung gefunden die eigentlich für einen Laien wie mich beschreibt, wie man einen ESP32 an einen Akku (z.B. LiPO) hängt und mittels eines TP4056 auflädt. Eigentlich. Wenn man jetzt das Glück hat, dass noch mal zu hinterfragen, kommt man auf eine Foren-Seite bei der recht weit unten jemand der offensichtlich Ahnung hat erläutert, warum das eine Bastellösung ist und Fachlich Falsch. Kurz zusammengefasst hat da jemand geschrieben, dass da Leute die keine Ahnung haben, dass nicht Kundtun, dafür aber von Websiten Dinge einfach so kopieren, die sie nie ausprobiert haben und es dann wieder Leute gibt das das nochmal kopieren und nicht ausprobieren... Ich habe mich entschlossen das einfach mal so zu glauben was er geschrieben hat und anstatt des MCP1700 einen MCP1725 zu kaufen. So, dass Problem ist, der ESP zieht bis zu 400mA Strom in Spitzen. Der 1700er kann aber nur 100mA. Das puffern dann einige mit doch sehr viel Kapazität in Kondensatoren nach, was dann recht instabil läuft. Der 1725er kann bis zu 500mA und wird nur mit sehr wenig Kondensator-Kapazität gepuffert. Kosten tun die Dinger die so aussehen wie Transistoren gleich viel, also kann man auch direkt den größeren nehmen. Läuft bisher einwandfrei.