3.4 KiB
3.4 KiB
OpenVario-XCSOAR-Arduino
VEGA2
https://www.volavoile.net/index.php?showtopic=12188
新兴航
#include <Wire.h>
#include <Adafruit_BMP085.h>
/* deuxième sketch pour IAS pour LK8000 dans une forme plus rigoureuse*/
//int ptot=1013; //à supprimer quand BMP085 dispo;
Adafruit_BMP085 bmp;
void setup(){
Serial.begin (57600);
bmp.begin();
}
void loop(){
Serial.println("loop");
while (Serial.peek()!='$'){
if (Serial.available()<1){
continue;
}
Serial.print(char(Serial.read())); //penser à enlever le LN!
}
char nmea[83]={'$'};
get_nmea(nmea); //entre toute la trame dans la chaine nmea
if (get_entete(nmea)==true){ //si l'entete est celle qui donne la p_stat
Serial.println("if_loop true");
Serial.print("ptot "); Serial.print(bmp.readPressure()/100);Serial.println("hpa");
int ias=10*sqrt((2*((bmp.readPressure()/100) - get_pstat(nmea)))/1.225);
//calcul de l'IAS
Serial.print("IAS caculé est de: "); Serial.print(ias);Serial.println("dm/s");//penser à enlever le LN!
envoie_trame_ias(ias);
}else {
Serial.print("if loop false");
// Serial.print(nmea);
}
}
void get_nmea(char nmea[]){
// Serial.println("get_nmea");
for (int i=0; i<83; i++){
while (Serial.available()<1); // attente de 1 caractères dispo dans le buffer
nmea[i]=Serial.read(); //replissage de la chaine nmea avec les caratcères dispo
if (nmea[i]==10){ //si le caractère est <LF> on arrête de remplir
// Serial.print("caractere LF trouvé");
break; // et on quitte la boucle
}
}
Serial.println(nmea); // on renvoie la trame sur la sortie serie //penser à enlever le LN!
return;
}
boolean get_entete(char nmea[]){
// Serial.print(nmea);
char entete_alti[8]="$PGRMZ,";
for (int i=0;i<6;i++){
if(entete_alti[i]!=nmea[i]){
// Serial.print("condition fausse");
return false;
}
}
return true;
}
int get_pstat(char nmea[]){
char char_pstat[7]={'\0'};
int pstat;
for (int i=7 ; nmea!=',' ; i++){
char_pstat[i-7]=nmea;
}
// Serial.print(char_pstat);Serial.println("pieds");
pstat= atoi(char_pstat);
// Serial.print(pstat);Serial.println("pieds");
pstat=1013.25 * pow((288-(0.0065*pstat*0.3028))/288,5.255); //formule de conversion pieds en hpa
// Serial.print("pstat "); Serial.print(pstat); Serial.println("hPa");
return pstat;
}
void envoie_trame_ias(int ias){
// Serial.println("envoie trame ias");
char char_ias[4]={'\0'};
char char_nmea_ias[15]="$PLKAS,";
int n;
itoa (ias,char_ias,10);
// Serial.print("char_ias: "); Serial.println(char_ias);
for (int i=7; char_ias[i-7]!='\0';i++){
char_nmea_ias=char_ias[i-7];
n=i;
// Serial.print("i= "); Serial.println(i);
}
char_nmea_ias[n+1]=',';
/* char XOR=0;
for (int i=0; char_nmea_ias!='\0';i++){
XOR^=char_nmea_ias;
}*/
char_nmea_ias[n+2]=get_XOR(char_nmea_ias);
char_nmea_ias[n+3]=13;
char_nmea_ias[n+4]=10;
Serial.print (char_nmea_ias);
return;
}
char get_XOR(char trame[]){
// Serial.println("get_XOR");
char XOR='\0';
for (int i=0; trame!='\0';i++){
XOR^=trame;
}
return XOR;
}
为了准确测量空气速度,需要一个动态压力范围为 0-50mb (AMS5915) 的单向差动传感器。
对于分辨率为10cm的高度计,我们需要一个24位转换压力传感器(MS5611-01)和卡尔曼滤波降噪。
我怀疑你用 BMP085 操作的结果,被 BMP180 取代,但仍然不够精确,对于 pitot 和 alti-vario ...