Hallo!
Mein zweites Arduino Projekt will nicht so recht.
Ich möchte ein BAROMETER mit einem BMP180 (GY-68 Board) bauen.
Auslesen des Luftdruckes und der Temperatur funktioniert wunderbar, die Werte stimmen sogar mit denen aus dem Internet überein.
Nun möchte ich aber eine Meldung haben, wenn der Akt.Luftdruck mit dem vor einer Stunde vergleichen und mit dem vor 2h verglichen eine Grenze überschreitet.
Differenz1h= (Akt LuftDruck0m) - (Luftdruck vor einer Stunde "LDruck1h")
Differenz2h= (Akt LuftDruck0m) - (Luftdruck vor zwei Stunden "LDruck2h")
Laut einer Wetterseite kommt nämlich bei einer Luftdruckänderung von ..
+1.3hPa /h => ein Sturm mit 6-7 Bft
+2.. +3hPa/h => ein Sturm mit 8-9 Bft
+3.3 hPa/h => ein Sturm mit 10 und mehr Bft
-1 ... -2 hPa/h => ein Sturm mit 6-7 Bft
-2 hPa => ein Sturm mit 8-12 Bft
Eine Rote LED oder Summer soll dann angesteuert werden wenn Sturm kommt.
Aber so recht funktioniert das nicht.
Wie könnte ich das machen?
Auch, dass nach sagen wir mal 3h die Werte wieder neu angepasst werden und Hinten rausfallen, wie bei einem Schieberegister oder so und durch die neuen 1 Stunden / 2Stunden / 3 Stunden Werte überschrieben werden?
Mfg Hans
///////////////////////////////////////////////////////////////////////////////
// FUNKTION: -LuftDruck, Temp, Höhe mit BMP-180(GY-68) Drucksensor messen => OK
// HARDWARE: -Arduino NANO
// -GY-68 Board
// -LOP: - Meldung, LED, Piezo, wenn Sturm in Anmarsch
/////////////////////////////////////////////////////////////////////////////////
///### INCLUDES #################################################################
#include <Wire.h>
#include <Adafruit_BMP085.h>
///### VARIABLEN ... ############################################################
Adafruit_BMP085 bmp;
float LuftDruck; // in hPa
float LuftDruck0m; // Meereshöhe
float Ta; // Aussentemperatur
float Hoehe;
// Variablen für Luftdruckvergleiche
int i=0;
float LDruck1h= 0; // besser den ersten LDruck abspeichern damit nicht gleich eine Diff vorhanden
float LDruck2h= 0;
float LDruck3h= 0;
int DiffDruck1h; // DifferenzDruck1h= Aktueller Druck - (vor einer Stunde)
int DiffDruck2h; // DifferenzDruck2h= Aktueller Druck - (vor 2h)
int DiffDruck3h; // DifferenzDruck2h= Aktueller Druck - (vor 3hh)
///### SETUP #####################################################################
void setup()
{
Serial.begin(9600);
if (!bmp.begin())
{
Serial.println("Keinen BMP-180 Sensor gefunden");
while (1) {}
}
}
///### LOOP ######################################################################
void loop()
{
//### 5s Zeitscheibe ###############################################################
// Zeitscheibe_1
static unsigned long Zeitscheibe_1 = 0;
if (millis() > Zeitscheibe_1 )
{
// zum Test 5s//
Zeitscheibe_1 = millis() + 5000; // 5000ms
//////* Ab hier die Befehle //////////////////////////
UPLuftDruck(); // Abs. Luftdruck aus Sensor BMP180 lesen
UPLuftDruck0m(); // Auf SeeLevel umgerechneter Luftdruck
UPAnzeige();
;
} // Zeitscheibe_1 Ende ###//
//### 1h Zeitscheibe ###############################################################
// Zeitscheibe_1
static unsigned long Zeitscheibe_2 = 0;
if (millis() > Zeitscheibe_2 )
{
// zum Test 20s, sonst 3600000//
Zeitscheibe_2 = millis() + 20000; // 3600s x 1000ms
//////* Ab hier die Befehle //////////////////////////
UPLuftDruckSpeicherUndVergleich();
;
} // Zeitscheibe_2 Ende ###//
} // Ende MAIN LOOP
///### UNTERPROGRAMME #############################################################
// LuftDruck (PH) absolut in 270m Höhe --------------------------------------------
void UPLuftDruck()
{
LuftDruck= bmp.readPressure(); // Liest den LuftDruck aus
LuftDruck= (LuftDruck/100); // Pascal in hPa => /100
}
/// UP Luftdruck Seehöhe////////////////////////////////////////////////////////////
void UPLuftDruck0m()
{
LuftDruck0m= (LuftDruck/0.967135); // Umrechnung auf Seelevel von meinem Standort
}
///--- UP_Luftdruck Werte speichern und auswerte----------------------------------
// - Aufruf von Zeitschleife jede Stunde einmal
// -Lufdruckwert jede Stunde abspeichern
// -Nachsehen, ob Druck innerhalb der letzten Stunde gestiegen oder gefallen ist, Wert in LDruck1h speichern
// -Nachsehen, ob Druck innerhalb der letzten 2 h gestiegen oder gefallen ist, Wert in LDruck2h speichern
// -Nachsehen, ob Druck innerhalb der letzten 3 h gestiegen oder gefallen ist, Wert in LDruck3h speichern
//
void UPLuftDruckSpeicherUndVergleich()
{
i=i+1; // Laufvariable um die Werte der Reihe nach abzuspeichern
if (i=1)
{
LDruck1h = LuftDruck0m; // Druck vor 1h
Serial.print("Druck1h= ");
Serial.print(LDruck1h);
Serial.println();
Serial.print("Differenz= ");
Serial.print(DiffDruck1h);
Serial.println();
}
if (i=2)
{
LDruck2h = LuftDruck0m; // Druck vor 2h
Serial.print("Druck2h= ");
Serial.print(LDruck2h);
Serial.println();
Serial.print("Differenz= ");
Serial.print(DiffDruck2h);
Serial.println();
}
if (i=3)
{
LDruck3h = LuftDruck0m; // Druck vor 3h
Serial.print("Druck3h= ");
Serial.print(LDruck3h);
Serial.println();
Serial.print("Differenz= ");
Serial.print(DiffDruck3h);
Serial.println();
}
// 1h- Vergleich ob gestiegen oder gefallen
// ----------------------------------------------
// Diff pos und > 1.3hPa => Starkwind 6-7Bft => Rote LED blinken
// Diff pos und > 2-3hPa => Sturm 8-9Bft => Rote LED blinken
// Diff pos und > 3.3hPa => Orkan 10 und mehr Bft => Rote LED blinken
// Diff neg und > -1 bis -2hPa => Starkwind 6-7Bft => Rote LED blinken
// Diff neg und > -2hPa => Sturm 8-12Bft => Rote LED blinken
// Bei starkem Druckabfall bei geringem Wind oder keinem
// => plötzlich starker Wind/Sturm ohne Vorwanung
// Front mit Regen vor dem Wind => Wind nimmt zu
// Front mit Wind vor dem Regen => Wind nimmt ab
DiffDruck1h= (LuftDruck0m - LDruck1h); // Differenz= akt. Luftdruck - LuftDruck vor 1h.
if (DiffDruck1h > 1.3)
{
Serial.print("Starkwind=");
Serial.print(DiffDruck1h);
Serial.println(" hPa");
}
if (DiffDruck1h > 2)
{
Serial.print("Sturm=");
Serial.print(DiffDruck1h);
Serial.println(" hPa");
}
if (DiffDruck1h < -1.3)
{
Serial.print("Starkwind");
Serial.print(DiffDruck1h);
Serial.println(" hPa");
}
if (DiffDruck1h < -2)
{
Serial.print("Sturm");
Serial.print(DiffDruck1h);
Serial.println(" hPa");
}
// Damit Laufvariable Reset, damit alles von vorne beginnt
if (i=3) i=0;
}
/// UP Anzeige ------------------------------------------------------------
void UPAnzeige()
{
#if 1
Serial.print("LuftDruck0m=");
Serial.print(LuftDruck0m);
Serial.println(" hPa");
#endif
}