pull/191/head
Hansi, dl9rdz 2021-09-23 12:07:54 +02:00
rodzic d0c9e10a9d
commit 971a2e6d65
2 zmienionych plików z 42 dodań i 5 usunięć

Wyświetl plik

@ -554,6 +554,36 @@ static float _RS41_waterVaporSaturationPressure (float Tcelsius)
return p / 100.0f;
}
#define PM(x) calibration->value.matrixP[x]
// CALIB_P: matrixP (frames 0x25..0x2A) and type (frame 0x21)
#define CALIB_P ((0x3Fll<<0x25)|(1ll<<0x21))
float GetRAP( uint32_t m, uint32_t m1, uint32_t m2, int16_t ptraw) {
struct subframeBuffer *calibration = (struct subframeBuffer *)sonde.si()->extra;
float pt = (float)ptraw*0.01;
float pw[6];
pw[0] = PM(0) + pt*PM(7) + pt*pt*PM(11) + pt*pt*pt*PM(15);
pw[1] = PM(1) + pt*PM(8) + pt*pt*PM(12) + pt*pt*pt*PM(16);
pw[2] = PM(2) + pt*PM(9) + pt*pt*PM(13) + pt*pt*pt*PM(17);
pw[3] = PM(3) + pt*PM(10)+ pt*pt*PM(14);
pw[4] = PM(4);
pw[5] = PM(5);
float f = (float)m; //meas[9];
float f1 = (float)m1; //meas[10];
float f2 = (float)m2; //meas[11];
float r = f-f1;
if(r!=0.0) {
r = (f2-f1) * PM(6) / r;
float xx = 1.0;
float p = 0.0;
for(int i=0; i<=5; i++) {
p += pw[i] * xx;
xx = xx * r;
}
return p;
}
return NAN;
}
// taken from https://github.com/einergehtnochrein/ra-firmware
float GetRATemp( uint32_t measuredCurrent, uint32_t refMin, uint32_t refMax, float calT, float taylorT[3], float polyT[6] ) {
struct subframeBuffer *calibration = (struct subframeBuffer *)sonde.si()->extra;
@ -751,11 +781,10 @@ int RS41::decode41(byte *data, int maxlen)
uint32_t tempHumiMain = getint24(data, 560, p+18);
uint32_t tempHumiRef1 = getint24(data, 560, p+21);
uint32_t tempHumiRef2 = getint24(data, 560, p+24);
#if 0
uint32_t pressureMain = getint24(data, 560, p+27);
uint32_t pressureRef1 = getint24(data, 560, p+30);
uint32_t pressureRef2 = getint24(data, 560, p+33);
#endif
int16_t ptraw = getint16(data, 560, p+38);
#if 0
Serial.printf( "External temp: tempMeasMain = %ld, tempMeasRef1 = %ld, tempMeasRef2 = %ld\n", tempMeasMain, tempMeasRef1, tempMeasRef2 );
Serial.printf( "Rel Humidity: humidityMain = %ld, humidityRef1 = %ld, humidityRef2 = %ld\n", humidityMain, humidityRef1, humidityRef2 );
@ -767,6 +796,13 @@ int RS41::decode41(byte *data, int maxlen)
bool validExternalTemperature = calibration!=NULL && (calibration->valid & 0xF8) == 0xF8;
bool validHumidity = calibration!=NULL && (calibration->valid & 0x7FE0001FFFF8) == 0x7FE0001FFFF8;
bool validPressure = calibration!=NULL && (calibration->valid & CALIB_P)==CALIB_P && calibration->value.names.variant[7]=='P';
if ( validPressure ) {
si->pressure = GetRAP( pressureMain, pressureRef1, pressureRef2, ptraw );
Serial.printf("Pressure sensor = %f\n", si->pressure);
}
if ( validExternalTemperature ) {
si->temperature = GetRATemp( tempMeasMain, tempMeasRef1, tempMeasRef2,
calibration->value.calT, calibration->value.taylorT, calibration->value.polyT );

Wyświetl plik

@ -99,9 +99,10 @@ typedef struct st_sondedata {
uint16_t launchKT, burstKT, countKT;
uint16_t crefKT; // frame number in which countKT was last sent
// sonde specific extra data, NULL if unused or not yet initialized, currently used for RS41 subframe data (calibration)
float temperature = -300.0; // platinum resistor temperature
float tempRHSensor = -300.0; // temperature of relative humidity sensor
float relativeHumidity = -1.0; // relative humidity
float temperature; // platinum resistor temperature
float tempRHSensor; // temperature of relative humidity sensor
float relativeHumidity; // relative humidity
float pressure;
float batteryVoltage = -1;
} SondeData;