# OpenVario-XCSOAR-Arduino VEGA2 https://www.volavoile.net/index.php?showtopic=12188 新兴航 ``` #include #include /* 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 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 ...