Zum Inhalt springen

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 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 (bzw. daraus abgeleitet den Bedeckungsgrad)
  • 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. MQTT an einen anderen Ort zu schicken.

Was braucht man ?

  • ESP32
  • DHT22 (Lufttemperatur u Feuchtigkeit)
  • 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

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.

Von viel Kram zu einer fertigen Station

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();
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