From 5ba162ce6f9bdfd3debe73c3650d9a80b9e0217e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=92=9F=E8=BF=9B?= Date: Mon, 28 Jun 2021 11:57:04 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20'OpenVario-XCSOAR-Arduino.?= =?UTF-8?q?ino'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- OpenVario-XCSOAR-Arduino.ino | 171 +++++++++++++++++++++++++++++++++++ 1 file changed, 171 insertions(+) create mode 100644 OpenVario-XCSOAR-Arduino.ino diff --git a/OpenVario-XCSOAR-Arduino.ino b/OpenVario-XCSOAR-Arduino.ino new file mode 100644 index 0000000..86ebf59 --- /dev/null +++ b/OpenVario-XCSOAR-Arduino.ino @@ -0,0 +1,171 @@ +#include "Wire.h" +#include +MS5611 ms5611; +#include +KalmanFilter a_filter; //altitude filter +#include +#include "DHT.h" +#define DHTPIN 2 +#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321 +DHT dht(DHTPIN, DHTTYPE); +const int key = 12; +SoftwareSerial PDV(10, 11); +const byte buff_len = 90; +char CRCbuffer[buff_len]; +float a1,a2;//Altitudes + +void setup() +{ + pinMode(key, OUTPUT); + Serial.begin(9600); + Wire.begin(); + PDV.begin(9600); + dht.begin(); + while(!ms5611.begin()) + { + Serial.println("Erreur MS5611 sensor"); + return; + } + checkSettings(); +} + +void loop() +{ + digitalWrite(key, LOW); + int crc; + String CRC; + byte buf[4]; +//Température en °C + float h = dht.readHumidity(); + float t = dht.readTemperature(); + if (isnan(h) || isnan(t)) + { + Serial.println("Erreur DHT"); + return; + } + Serial.print("Temperature C: "); + Serial.println(t); +//Humidité en % + Serial.print("Humidity %: "); + Serial.println(h); +//Pression en Pa + uint32_t rawPressure = ms5611.readRawPressure(); + long p = ms5611.readPressure(); + float Pa = p; + Serial.print("Pression Pa: "); + Serial.println(Pa); +//Altitude en m + float a = ms5611.getAltitude(p); + float a1 = a_filter.Filter(a); + Serial.print("Altitude m: "); + if (a1 >= 0.0) Serial.print(" "); + Serial.println(a1,2); +//Vario en m/s + float va = a1-a2; + a2 = a1; + Serial.print("Vario m/s: "); + if (a1 >= 0.0) Serial.print(" "); + Serial.println(va,2); +// Calcul de la pression de vapeur d'eau saturante dans l'air en Pascal + float Psat = (611.213*exp((17.5043*t)/(241.02+t))); +// Calcul de la constante de l'air humide + float Rh = (287.06/(1-(((h/100)/Pa)*(1-(287.06/461))))); +// Calcul de la masse volumique de l'air humide en kg/m3 + float rho = (Pa/(Rh*(t+273.15))); +// Calcul de densityratio + int dsr = 1024*sqrt (1.22/rho); + Serial.print("Rho kg/m3: "); + Serial.println(rho); + Serial.print("Dsr : "); + Serial.println(dsr); + //Lecture Pitot + int n = Wire.requestFrom(0x28, 4); + if (n == 4) + { + Wire.readBytes( buf, 4); + } + else + { + Serial.println("Erreur,pas de MS5915"); + return; + } + unsigned int rawP = word( buf[0], buf[1]); + rawP &= 0x3FFF; + float x =((float) rawP - 1638)*10000/(1.293*13107); + if (x < 0) + { + x =0 ; + } +//Vitesse Propre en 0,1 m/s + int vp=10*sqrt(x); + String msg = "$PDVDV,"; + int ps = Pa/10; + int vz = 10*va; + int al = a1; + msg = msg + vz + "," + vp + "," + dsr +"," + al + "," + ps +",1*" ; + msg.toCharArray(CRCbuffer,sizeof(CRCbuffer)); + crc = convertToCRC(CRCbuffer); + if (crc < 16) Serial.println("Erreur CRC"); + CRC = String (crc, HEX); + msg = msg + CRC; + Serial.println(msg); + PDV.println(msg); +//Température en 10x°K + int T = (t + 273)*10; + int H = h; + msg = "$PDVVT,"; + msg = msg + T + "," + H +"*"; + msg.toCharArray(CRCbuffer,sizeof(CRCbuffer)); + crc = convertToCRC(CRCbuffer); + if (crc < 16) Serial.println("Erreur CRC"); + CRC = String (crc, HEX); + msg = msg + CRC; + Serial.println(msg); + PDV.println(msg); + delay(1000); +} +//Fin de boucle +//Fonctions +void checkSettings() + { + Serial.print("Oversampling: "); + Serial.println(ms5611.getOversampling()); + } + +byte convertToCRC(char *buff) + { +// CRC: XOR each byte with previous for all chars between '$' and '*' + char c; + byte i; + byte start_with = 0; + byte end_with = 0; + byte CRC = 0; + for (i = 0; i < buff_len; i++) + { + c = buff[i]; + if(c == '$') + { + start_with = i; + } + if(c == '*') + { + end_with = i; + } + } + if (end_with > start_with) + { + for (i = start_with+1; i < end_with; i++) + { +// XOR every character between '$' and '*' + CRC = CRC ^ buff[i] ; +// Compute CRC + } + } + else + { + Serial.println("CRC ERROR"); + } + return CRC; + } +//Fin +