HI,
Diese beiden bekannten Libraries wurden verwendet.
sourceforge.net/projects/jetiexsensorcpp..._V1.0.5.zip/download
github.com/jarzebski/Arduino-MS5611/archive/master.zip
An dem Vario gibt es nichts für den User einzustellen. Es wurde bereits der optimale Kompromiss zwischen Rauschunterdrückung und Reaktionszeit eingestellt.
Der Algorithmus basiert auf einem Code von Rolf R Bakke.
Dabei werden zwei digitale Tiefpassfilter 1. Ordnung, die einem simplen RC Glied entsprechen, parallel geschaltet.
Die Differenz der Ausgänge ist proportional der ersten Ableitung des Eingangssignals. In diesem Fall der Höhenänderungsgeschwindigkeit.
Die Tiefpasscharakteristik bleibt aber erhalten. D.h. das Signal nähert sich rasch aber in endlicher Zeit einer horizontalen Linie, wenn das
Eingangssignal (die Höhe) linear ansteigt. Die schnell erreichte Signalgröße (Vario) ist dabei stets proportional zur Steilheit eines linearen Anstiegs
des Eingangssignals. Die Verstärkung resp. Abschwächung des Nutzsignals ist abhängig von den eingestellten Zeitkonstanten und ihrem Verhältnis.
Ich habe den Algorithmus als Analogschaltung in LTSpice simuliert.
//#define DEBUG
#include <Wire.h>
#include <MS5611.h> // from https://github.com/jarzebski/Arduino-MS5611/archive/master.zip
#ifndef DEBUG
#include "JetiExProtocol.h" // from https://sourceforge.net/projects/jetiexsensorcpplib/files/JetiExSensor_V1.0.5.zip/download
JetiExProtocol jetiEx;
#endif
MS5611 ms5611;
enum
{
ID_CLIMB = 1,
ID_ALTITUDE,
};
#ifndef DEBUG
JETISENSOR_CONST sensors[] PROGMEM =
{
// id name unit data type precision 0->0, 1->0.0, 2->0.00
{ ID_CLIMB, "Climb", "m/s", JetiSensor::TYPE_14b, 2 },
{ ID_ALTITUDE, "Altitude", "m", JetiSensor::TYPE_14b, 0 },
0 // end of array
};
#endif
double referencePressure;
float r_altitudes[50];
float r_altitude = 0, r_altitude0 = 0;
int j;
float climb = 0;
unsigned long time=0;
void setup()
{
#ifdef DEBUG
Serial.begin(9600);
//Serial.println("Initialize MS5611 Sensor");
#endif
// Initialize MS5611 sensor
while(!ms5611.begin(MS5611_ULTRA_HIGH_RES))
{
#ifdef DEBUG
Serial.println("Could not find a valid MS5611 sensor, check wiring!");
#endif
delay(500);
}
// Get reference pressure for relative altitude
referencePressure = 0;
for ( j=0; j<50; j++) {
referencePressure += ms5611.readPressure();
delay(20);
}
referencePressure = referencePressure / 50;
// Check settings
//checkSettings();
#ifndef DEBUG
jetiEx.Start( "mini_vario", sensors );
#endif
}
void checkSettings()
{
#ifdef DEBUG
Serial.print("Oversampling: ");
Serial.println(ms5611.getOversampling());
#endif
}
void loop()
{
long realPressure = ms5611.readPressure();
float relativeAltitude = ms5611.getAltitude(realPressure, referencePressure);
r_altitude0 = r_altitude0 - 0.15 * (r_altitude0 - relativeAltitude);
r_altitude = r_altitude - 0.05 * (r_altitude - relativeAltitude);
climb = (r_altitude0 - r_altitude) * 3;
#ifdef DEBUG
Serial.print( r_altitude0);
Serial.print( "\t" );
Serial.println(climb);
#else
jetiEx.SetSensorValue( ID_CLIMB, round(climb * 100) );
jetiEx.SetSensorValue( ID_ALTITUDE, round(r_altitude0) );
jetiEx.DoJetiSend();
#endif
// loop frequency timer
while (millis() < time) {
//Serial.print("H"); // check going arround at given "time"
}
//Serial.println(time);
time += 40;
}
Da der Mini Pro nur eine serielle Schnittstelle hat muss man das Programm für die Ausgabe auf der Konsole (Plotter oder Monitor)
mit einkommentiertem "#define DEBUG" laufen lassen. Zum Betrieb am Empfänger dann diese Zeile wieder auskommentieren.
Die beiden Platinen müssen ein gasdichtes Volumen umschließen. Man kann zum Testen das Röhrchen am Ende zulöten.
Dann darf keine Höhenänderung mehr angezeigt werden.
Das Vario wiegt ohne Kabel 4,8 g
Gruß
Dieter