Zum Inhalt springen

Wetterstation

Was braucht man ?

  • Eine laufende openHAB installation (2.5 oder neuer)
  • nodeMCU 32 (ESP-32)
  • AS3935
  • Tinkerforge Master Brick
  • Tinkerforge Master Extension WiFi 2.0
  • Tinkerforge Humidity 2.0 Bricklet
  • Tinkerforge UV-Licht 2. Bricklet
  • Tinkerforge Barometer 2.0
  • Tinkerforge Particular Matter Bricklet
  • Tinkerforge Outdoor Weather Bricklet
  • Tinkerforge Outdoor Wetterstation
  • Diverse Kabel
  • Stromversorgung

Was kann das alles ?

  • Luftdruck
  • Luftfeuchte
  • Lufttemperatur
  • UV-Index
  • UV-A Strahlung
  • UV-B Strahlung
  • Feinstaub (PM 1,0  /  2,5  / 10,0)
  • Windrichtung
  • Windgeschwindigkeit
  • Böengeschwindigkeit
  • Niederschlag (Regen)
  • Blitze

Generelles zu openHAB

Genrell werde ich nicht darauf eingehen, wie man openHAB installiert, was man dafür braucht und was man damit machen kann. Lediglich auf das Tinkerforge Binding werde ich etwas näher eingehen.

openHAB Wetterstation auf Basis Tinkerforge

on work

AS3935 mit ESP-32 per MQTT an openHAB

Ihr braucht natürlich den AS3935 und einen ESP-32, ich nehme wieder meine nodeMCU ESP32 da ich davon noch einen habe. Vom Franklich AS3935 gibt es Diverse schon vorgefertigte Boards, ich habe mich für das DFRobot Lightning Sensor V1.0 entschieden. Da ist schon direkt (fast) alles dran und mann muss so gut wie nichts löten. Zum programmieren des AS3935 benötigt man noch Ardudiono IDE (oder ein Programm seiner wahl). Und natürlich einen funktionsfähigen MQTT Broker (bei mir Mosquito auf einem Raspberry Pi 4).

Zu nächst löten wir auf dem Lighting Detector Board ein zusätzliches Kabel an (bei mir WEISS), dass kommt an den IRQ PIN. Am ESP-32 kommt das weisse Kabel an GPIO 4. Das blaue Kabel kommt an GPIO 22 und das grüne Kabel an GPIO 21 (Das ist die I²C Schnittstelle). Das schwarze Kabel an GND und das Rote Kabel an 3V3, beides ist die Spannungsversorgung.

In der Arudino IDE fehlt noch die Bibliothek PubSubClient.h (für MQTT) und die SparkFun_AS3935.h (für den Blitzsensor).

Im Sketch muss man eigentlich nur noch für die WiFi-Verbindung SSID und Passwort eingeben. Dann noch für die MQTT Verbindung, den Server, Benutzername, Passwort, sketch auf den ESP übertragen und das war es.

Der Sketch überprüft ob eine WiFi verbindung besteht, stellt diese bei bedarf wieder her, gleiches gilt für die MQTT verbindung. Darüber hinaus schickt der Sketch alle 5minuten eine Alivemeldung an den MQTT-Broker. Sollte es Blitzen, schickt der ESP eine Meldung an den Broker, dass es geblitzt hat und natürlich auch, wie weit der Blitz weg war. Letzteres passiert in "Schritten" und nicht beliebig. Angeblich kann der Sensor Blitze in bis zu 40km Entfernung erkennen.....

 

 

 

Der Code

Hinweise zum Sketch

Also, um es vorweg mal klar zu sagen: Eigentlich habe ich von dem Thema keine Ahnung und habe auch nur sehr aufwendig probiert und im Netz gesucht. Die Reconnect (WiFi & MQTT) progammierung geht in so ziemlich allem auf einen Post und dem User  urs_eppenberger zurück.Hier der Link zum POST.

#include <WiFiClientSecure.h>
#include <PubSubClient.h>
#include <Wire.h>
#include <SparkFun_AS3935.h>

String WiFi_SSID = „WIFI-SSID„;
String WiFi_PW = „WIFI PASSWORT„;
const char* mqttServer = „IP ADRESSE MQTT SERVER„;
const int mqttPort = 1883;
const char* mqttUser = „MQTT BENUTZERNAME„;
const char* mqttPassword = „MQTT PASSWORT„;

unsigned long waitCount = 0;
uint8_t conn_stat = 0;
unsigned long lastStatus = 0;
unsigned long lastTask = 0;

const char* Status = „{\“Message\“:\“ich laufe\“}“;
const int lightningInt = 4;
int noiseFloor = 2;
int intVal = 0;

#define AS3935_ADDR 0x03
#define INDOOR 0x12
#define OUTDOOR 0xE
#define LIGHTNING_INT 0x08
#define DISTURBER_INT 0x04
#define NOISE_INT 0x01

WiFiClientSecure TCP; // TCP client object, uses SSL/TLS
WiFiClient espClient;
PubSubClient client(espClient);
SparkFun_AS3935 lightning(AS3935_ADDR);

void setup() {
Serial.begin(115200);
WiFi.mode(WIFI_STA);
pinMode(lightningInt, INPUT);
lightning.begin();
lightning.setIndoorOutdoor(OUTDOOR);
}

void loop() { // with current code runs roughly 400 times per second
if ((WiFi.status() != WL_CONNECTED) && (conn_stat != 1)) { conn_stat = 0; }
if ((WiFi.status() == WL_CONNECTED) && !client.connected() && (conn_stat != 3)) { conn_stat = 2; }
if ((WiFi.status() == WL_CONNECTED) && client.connected() && (conn_stat != 5)) { conn_stat = 4;}
switch (conn_stat) {
case 0: // MQTT and WiFi down: start WiFi
Serial.println(„MQTT and WiFi down: start WiFi“);
WiFi.begin(WiFi_SSID.c_str(), WiFi_PW.c_str());
conn_stat = 1;
break;
case 1: // WiFi starting, do nothing here
Serial.println(„WiFi starting, wait : „+ String(waitCount));
waitCount++;
break;
case 2: // WiFi up, MQTT down: start MQTT
Serial.println(„WiFi up, MQTT down: start MQTT“);
client.setServer(mqttServer, mqttPort);
client.connect(„ESP32Client“, mqttUser, mqttPassword );
conn_stat = 3;
waitCount = 0;
break;
case 3: // WiFi up, MQTT starting, do nothing here
Serial.println(„WiFi up, MQTT starting, wait since: „+ String(waitCount));
waitCount++;
break;
case 4: // WiFi up, MQTT up: finish MQTT configuration
Serial.println(„WiFi up, MQTT up: finish MQTT configuration“);
client.publish(„esp321/ESP32-1_Status“, „MQTT Verbunden“);

conn_stat = 5;
break;
}

if (conn_stat == 5) {
if (millis() – lastStatus > 300000) {
Serial.println(Status);
client.publish(„esp321/ESP32-1_Status“, „MQTT Alive“);
client.publish(„esp321/Disturber“, „-„);
client.publish(„esp321/Noise“, „-„);
client.loop();
lastStatus = millis();
}
client.loop();

if(digitalRead(lightningInt) == HIGH){
intVal = lightning.readInterruptReg();
if(intVal == NOISE_INT){
client.publish(„esp321/Noise“, „Rauschen empfangen“);

}
else if(intVal == DISTURBER_INT){
client.publish(„esp321/Disturber“, „Störung empfangen“);

}
else if(intVal == LIGHTNING_INT){
client.publish(„esp321/Blitzerkennung“, „Blitz erkannt“);
byte distance = lightning.distanceToStorm();
char s [20];
sprintf (s, „%d“, lightning.distanceToStorm());
client.publish(„esp321/Blitzentfernung“, (const char*) s);
}
}
}
}