Hallo zusammen.
Ich messe mithilfe eines Barometers die Höhe und ich möchte eine Anweisung implementieren, dass, sobald die Höhe nach einem steigenden Verhalten wieder abnimmt, eine andere Anweisung ausgelöst wird. Dabei sollte die aktuell gemessene Höhe um mindestens 2 Meter niedriger als die im vorherigen Messzeitpunkt gemessene sein, um etwaige Ungenauigkeiten des Sensors auszumerzen und ein falsches Auslösen zu verhindern.
zeige was du hast. </> formatierung nich vergessen.
Nennt sich Hysterese.
Suchst Du sowas?
Hinweis: Das ist Ohne Nachkomma. Also 2 Stellen hinter dem Komma für Deinenn Meter einrechenn.
const uint32_t highPoint = 106000;
const uint32_t lowPoint = 98700;
const uint32_t hysterese = 200;
bool ausloeser = false;
uint32_t hoehe = lowPoint;
uint32_t lasthoehe = 0;
void setup()
{
Serial.begin(115200);
Serial.println(F("Start...."));
randomSeed(A0);
}
void loop() {
delay(1000);
hoehe = random(lowPoint, highPoint + 1);
if (ausloeser == true)
{
if (hoehe<lasthoehe && (lasthoehe-hoehe > hysterese) && ausloeser)
{
Serial.print(F("letzte Hoehe: "));
Serial.print(lasthoehe);
Serial.print(F(" neue Hoehe: "));
Serial.print(hoehe);
Serial.println(F(" ausgelöst!"));
// Hier mach jetzt was
lasthoehe = lowPoint;
ausloeser = false;
}
}
if (hoehe > lasthoehe)
{
Serial.print(F("Steige nach oben: "));
Serial.println(hoehe - lasthoehe);
lasthoehe = hoehe;
}
if (hoehe < lasthoehe)
{
Serial.print(F("Steige nach unten: "));
Serial.println(lasthoehe - hoehe);
ausloeser = true;
}
}
Ich hab das jetzt mal für meine Sensorwerte adaptiert aber irgendwie will es nicht funktionieren
#include <Wire.h>
#include <SPI.h>
#include <Servo.h>
#include <Adafruit_BMP280.h>
#define BMP_SCK (13)
#define BMP_MISO (12)
#define BMP_MOSI (11)
#define BMP_CS (10)
Adafruit_BMP280 bmp;
float h_0, h_last, h_now, h;
const int hysterese = 2;
bool trigger = false;
void setup()
{
Serial.begin(115200);
Serial.println("BMP280 Relative Height");
if (!bmp.begin()) {
Serial.println("Could not find a valid BMP280 sensor, check wiring or try a different address!");
}
bmp.setSampling(Adafruit_BMP280::MODE_NORMAL,
Adafruit_BMP280::SAMPLING_X2,
Adafruit_BMP280::SAMPLING_X16,
Adafruit_BMP280::FILTER_X16,
Adafruit_BMP280::STANDBY_MS_1);
h_0 = bmp.readAltitude(1013.25); //start height
Serial.print("Start height (absolute) = ");
Serial.print(h_0);
Serial.println(" m");
}
void loop() {
h_last=bmp.readAltitude(1013.25); //(absolute height)
h=h_last-h_0; //relative height
Serial.print("relative height: ");
Serial.print(h_last);
Serial.println(" m");
delay(10);
h_now = bmp.readAltitude(1013.25);
if(trigger==true)
{
if (h_now < h_last && (h_last - h_now) > hysterese && trigger)
{
Serial.println("TRIGGER");
digitalWrite(4,HIGH);
delay(100);
digitalWrite(4,LOW);
trigger = false;
}
}
if (h_now > h_last)
{
Serial.print("Increase: ");
Serial.println(h);
h_last = h_now;
}
if (h_now < h_last)
{
Serial.print("Decrease: ");
Serial.println(h);
trigger = true;
}
}
Was gibt denn der SerMon aus?
MEIN Teilchen gibt auf dem SerMon was aus und geht.
Ich habe den Sensor nicht. Also brauche ich die Ausgaben.
Und da fällt auf, das Du Dich ggfls. selbst rauskickst.
Ersetze
void loop() {
h_last = bmp.readAltitude(1013.25); //(absolute height)
h = h_last - h_0; //relative height
Serial.print("relative height: ");
Serial.print(h_last);
Serial.println(" m");
durch:
void loop() {
h_last = bmp.readAltitude(1013.25); //(absolute height)
h = h_last - h_0; //relative height
Serial.print("errechnet: ");
Serial.print(h);
Serial.println(" m");
Was kommt bei rum?
Ich will die Ausgaben in Gänze sehen - sonst wird das nüscht.
Ich hab das Problem gefunden: Ich hab die Höhenaktualisierungen viel zu schnell (mit 1000 Hz) berechnet, damit kam die Differenz niemals über die Hysterese von 2 Meter pro Messintervall. Ich hab den Sensor jetzt mit 10 Hz laufen lassen und die Mindestdifferenz auf 15cm gesetzt - dann hats geklappt!
Ich weis ja nicht, was Du da vor hast, aber das Messintervall würde ich nicht als Maß benutzen.
Logisch wäre für mich
Ist aktueller Wert > letzter Wert wird letzter Wert=aktueller Wert.
Ist aktueller Wert < letzter Wert gibt es zwei Möglichkeiten:
entweder der Wert liegt ausserhalb der Hysterese oder es ist eine bestimmte Zeit seit maximal abgelaufen.
In beiden Fällen würde dann letzter Weert ebenfalls aktueller Wert werden.
Damit ist es egal ob 1 Messung pro Sekunde oder 100. Den Abstieg bekommst in jedem Fall mit.
This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.