Hallo Freunde des Thermikfluges
ich habe den Code etwas optimiert:
Code:
//Roll Values in array one down. Last value is discarded (Rolling Average)
for (byte i = ALTITUDE_SAMPLES - 1; i > 0; i--){
Altitude[i] = Altitude[i-1];
}
//read altitude
Altitude[0] = bmp.readAltitude(1013.25);
//calculate average from samples
for (byte i = 0; i < ALTITUDE_SAMPLES; i++){
Altitude_average += Altitude[i];
}
Altitude_average = Altitude_average / ALTITUDE_SAMPLES;
//Feed altitude average to filter
altitude_filter.input(Altitude_average);
//Save maximum altitude
if (altitude_filter.output() > Altitude_max){
Altitude_max = altitude_filter.output();
}
//Update Vario
if ((millis() - last_vario_update) >= VARIO_UPDATE){
last_vario_update = millis();
//Roll values in array one down. Last value is discarded
for (byte i = 12; i > 0; i--){
Altitude_History[i] = Altitude_History[i-1];
Altitude_History_millis[i] = Altitude_History_millis[i-1];
}
Altitude_History[0] = altitude_filter.output();
Altitude_History_millis[0] = millis();
//Set altitude offset
if (Altitude_offset == 0){
//Check if alitude reading is available
if (bmp.readAltitude(1013.25) != 0){
//Use 10 readings as average for offset
for (byte i = 0; i < 10; i++){
Altitude_offset += bmp.readAltitude(1013.25);
}
Altitude_offset = Altitude_offset / 10;
}
//Initialize Altitude Array to have correct Vario reading from beginning on.
for (byte i = 1; i < (1000/VARIO_UPDATE); i++){
Altitude_History[i] = Altitude_offset;
Altitude_History_millis[i] = millis();
}
}
}
//Feed vario values to vario filters
vario_filter_1s.input((Altitude_History[0] - Altitude_History[300/VARIO_UPDATE]) * (1000/ (Altitude_History_millis[0] - Altitude_History_millis[300/VARIO_UPDATE])));
vario_filter_3s.input((Altitude_History[0] - Altitude_History[1500/VARIO_UPDATE]) * (3000/ (Altitude_History_millis[0] - Altitude_History_millis[1500/VARIO_UPDATE])));
//Update Temperature
if ((millis() - last_tmp_update) > TMP_UPDATE) {
BMP_Temp = bmp.readTemperature();
last_tmp_update = millis();
}
Größter Unterschied ist, dass ich die Vario-Filter mit dem Delta von nur 300ms (Vario_1s) bzw. 1500ms (Vario_3s) füttere. Zudem werden die Werte alle 100ms aktualisiert. Dadurch spricht das Vario recht gut an.
Das ganze habe ich mal mit einer Dummy-Höhe, welche mit 1m/s anteigt, simuliert um mir das Ansprechverhalten des Varios anzusehen. Für das Vario habe ich eine Hysterese von 0.25 gesetzt, heißt Steig- bzw. Sinkraten < 0.25 m/s werden als 0 ausgegeben. Dadurch ist der Sender ruhig, wenn der Höhensensor (BMP280) nicht bewegt wird.
Das Ergebnis sieht so aus:
Durch den gleitenden Mittelwert und den Tiefpassfilter auf dem Höhensignal, habe ich einen Versatz von ca. 375ms zwischen "echtem" Höhensignal (hier natürlich nur simuliert) und dem Output des Tiefpassfilters für das Höhensignal.
Das Vario_1s Signal "springt" nach 440ms von 0 auf 25cm/s (Hysteresewert) und erreicht nach 812ms 66%.
Hier ein Sprung von 1m/s Steigen auf 2m/s Sinken. Hier vergehen ca. 580ms bis das Vario den ersten negativen Wert ausspuckt. Nach ca. 1000ms ist das Vario bei 66% (bzw. -1,33m/s).
Da ich mich noch nie mit Ansprechverhalten von Variometern beschäftigt habe: Sind das gute Werte?? Oder sollte das Vario schneller reagieren?
Grüße
Niko