OpenVario-XCSOAR-Arduino/README.md
2021-06-28 12:14:51 +08:00

3.4 KiB
Raw Blame History

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