Korekta temperatury we wsadzie https://github.com/richonguzman/LoRa_APRS_iGate, jest czymś co mi sie przydażyło i wynika z wadliwego sensora BME280 a nie wsadu.
Po uruchomieniu stacji M0IQF-13 LoRa WX wskazania temperatury nie pasowały mi od samego poczatku, ale uznałem że niech sobie trochę wisi na maszcie zobaczymy co z tego wyjdzie.
Dane z M0IQF-13 wskazują temperaturę szczytową prawie 24.4st C,
A dla porównania sensory z HomeAssistant ledwie w szczycie przekroczyły 20st. C. ( 3 sensory bedące na ogrodzie pokrywają się z tym wykresem )
Ja wiem że te "termometry" a raczej wskaźniki temperatury to zabawki ale jednak różnica prawie 4st C to jednak trochę za duża rozbieżność. Gdyby to był 1 stopień no może dwa to bym nic z tym nie robił ale 4 stopnie to już może być decydujące aby uznać jest lub nie jest ciepło.
A tak na serio to jeśli już się decydować na wystawienie stacji WX t oniech jej wskazania będą realnym odzwierciedleniem stany pogodowego, oczywiście z jakimś marginesem błedu bo to wskazanie a nie pomiar.
Aby wybrnąć z tego problemu postanowiłem zmodyfikować kod wsadu LoRa https://github.com/richonguzman/LoRa_APRS_iGate i dać tam możliwość naniesienia korekty wskazań temperatury, tak jak jest taka możliwość w przypadku ciśnienia atmosferycznego.
* Aby tego dokonać trzeba edytować plik bme_utils.cpp wykasować jego zawartość i wkleić to co poniżej
#include "bme_utils.h"
#include "configuration.h"
#include "gps_utils.h"
#include "display.h"
#define SEALEVELPRESSURE_HPA (1013.25)
#define HEIGHT_CORRECTION 128 // in meters
#define CORRECTION_FACTOR (8.2296) // for meters
#define TEMPERATURE_CORRECTION -5.0 // Temperature correction value (in degrees Celsius)
extern Configuration Config;
extern String fifthLine;
extern uint32_t bmeLastReading;
float newHum, newTemp, newPress, newGas;
namespace BME_Utils {
#ifdef BME280Sensor
Adafruit_BME280 bme;
#endif
#ifdef BMP280Sensor
Adafruit_BMP280 bme;
#endif
#ifdef BME680Sensor
Adafruit_BME680 bme;
#endif
void setup() {
if (Config.bme.active) {
bool status;
status = bme.begin(0x76); // Don't forget to join pins for righ direction on BME280!
if (!status) {
Serial.println("Could not find a valid BME280 or BMP280 sensor, check wiring!");
show_display("ERROR", "", "BME/BMP sensor active", "but no sensor found...");
while (1); // sacar esto para que quede pegado si no encuentra BME280
} else {
#ifdef BME280Sensor
bme.setSampling(Adafruit_BME280::MODE_FORCED,
Adafruit_BME280::SAMPLING_X1,
Adafruit_BME280::SAMPLING_X1,
Adafruit_BME280::SAMPLING_X1,
Adafruit_BME280::FILTER_OFF
);
Serial.println("init : BME280 Module ... done!");
#endif
#ifdef BMP280Sensor
bme.setSampling(Adafruit_BMP280::MODE_FORCED,
Adafruit_BMP280::SAMPLING_X1,
Adafruit_BMP280::SAMPLING_X1,
Adafruit_BMP280::FILTER_OFF
);
Serial.println("init : BMP280 Module ... done!");
#endif
#ifdef BME680Sensor
bme.setTemperatureOversampling(BME680_OS_1X);
bme.setHumidityOversampling(BME680_OS_1X);
bme.setPressureOversampling(BME680_OS_1X);
bme.setIIRFilterSize(BME680_FILTER_SIZE_0);
Serial.println("init : BME680 Module ... done!");
#endif
}
} else {
Serial.println("(BME/BMP sensor not 'active' in 'igate_conf.json')");
}
}
String generateTempString(float bmeTemp) {
String strTemp;
strTemp = String((int)bmeTemp);
switch (strTemp.length()) {
case 1:
return "00" + strTemp;
break;
case 2:
return "0" + strTemp;
break;
case 3:
return strTemp;
break;
default:
return "-999";
}
}
String generateHumString(float bmeHum) {
String strHum;
strHum = String((int)bmeHum);
switch (strHum.length()) {
case 1:
return "0" + strHum;
break;
case 2:
return strHum;
break;
case 3:
if ((int)bmeHum == 100) {
return "00";
} else {
return "-99";
}
break;
default:
return "-99";
}
}
String generatePresString(float bmePress) {
String strPress;
strPress = String((int)bmePress);
switch (strPress.length()) {
case 1:
return "000" + strPress + "0";
break;
case 2:
return "00" + strPress + "0";
break;
case 3:
return "0" + strPress + "0";
break;
case 4:
return strPress + "0";
break;
case 5:
return strPress;
break;
default:
return "-99999";
}
}
String readDataSensor() {
String wx, tempStr, humStr, presStr;
uint32_t lastReading = millis() - bmeLastReading;
if (lastReading > 60*1000) {
#ifdef BME280Sensor
bme.takeForcedMeasurement();
newTemp = bme.readTemperature() + TEMPERATURE_CORRECTION; // Applying temperature correction
newPress = (bme.readPressure() / 100.0F);
#ifdef BME280Sensor
newHum = bme.readHumidity();
#endif
#ifdef BMP280Sensor
newHum = 0;
#endif
#endif
#ifdef BME680Sensor
bme.performReading();
delay(50);
if (bme.endReading()) {
newTemp = bme.temperature + TEMPERATURE_CORRECTION; // Applying temperature correction
newPress = (bme.pressure / 100.0F);
newHum = bme.humidity;
newGas = bme.gas_resistance / 1000.0; // in Kilo ohms
}
#endif
bmeLastReading = millis();
}
if (isnan(newTemp) || isnan(newHum) || isnan(newPress)) {
Serial.println("BME/BMP Module data failed");
wx = ".../...g...t...r...p...P...h..b.....";
fifthLine = "";
return wx;
} else {
tempStr = generateTempString((newTemp * 1.8) + 32);
#ifdef BME280Sensor
humStr = generateHumString(newHum);
#endif
#ifdef BME680Sensor
humStr = generateHumString(newHum);
#endif
#ifdef BMP280Sensor
humStr = "..";
#endif
presStr = generatePresString(newPress + (HEIGHT_CORRECTION/CORRECTION_FACTOR));
fifthLine = "BME-> " + String(int(newTemp))+"C " + humStr + "% " + presStr.substring(0,4) + "hPa";
wx = ".../...g...t" + tempStr + "r...p...P...h" + humStr + "b" + presStr;
#ifdef BME680Sensor
wx += "Gas: " + String(newGas) + "Kohms ";
#endif
return wx;
}
}
} // End of namespace BME_Utils
* W kodzie tym mamy pozycję TEMPRATURE_CORRECTION -5.0 gdzie wartość -5.0 to ilość stopni o jakie ma pomniejszyć wskazania. Oczywiście wartośc moze być także na plusie.
Następnie BUILD i UPLOAD i możemy cieszyć się z w miarę poprawnego wskazania temperatury.
Oczywiście zanim naniesiemi korektę trzema najpierw monitorować i wiedzieć o ile stopni taka korekta ma mieć miejsca.
Plik do pobrania : https://d4a.uk/index.php/pobieranie/category/8-lora?download=70:bme-utils-cpp