You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

130 lines
3.4 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 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 ...