
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

