From 385e75592d9eb015e92fbc647ee93e9fe9fa49f8 Mon Sep 17 00:00:00 2001 From: tiberiusteng Date: Mon, 15 Jul 2024 19:47:25 +0900 Subject: [PATCH 1/3] Handle si7021 returning negative humidity `si7021_env::humidityBasisPoints` is `unsigned int`, but `SI7021::getHumidityBasisPoints` is returning a value ranged from -600 ... 11900 inclusive, where negative values will underflow to 64936 ... 65535. `struct Payload::humidity` is signed integer and we don't want to modify si7021 library, so we just pad the value when doing conversion, where calculation is done in (signed) floating point. --- firmware/emonth2.ino | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/firmware/emonth2.ino b/firmware/emonth2.ino index cdb9a51..2b95a59 100644 --- a/firmware/emonth2.ino +++ b/firmware/emonth2.ino @@ -318,7 +318,7 @@ void setup() si7021_env data = SI7021_sensor.getHumidityAndTemperature(); Serial.print("SI7021 Started, ID: "); Serial.println(deviceid); delay(100); - Serial.print("temp:"); Serial.print(data.celsiusHundredths/100.0); Serial.print(",humidity:"); Serial.println(data.humidityBasisPoints/100.0); + Serial.print("temp:"); Serial.print(data.celsiusHundredths/100.0); Serial.print(",humidity:"); Serial.println(((data.humidityBasisPoints+600)/100.0)-6); delay(100); } else @@ -493,7 +493,7 @@ void loop() #endif si7021_env data = SI7021_sensor.getHumidityAndTemperature(); emonth.temp = (data.celsiusHundredths*0.1); - emonth.humidity = (data.humidityBasisPoints*0.1); + emonth.humidity = (((data.humidityBasisPoints+600)*0.1)-60); #ifndef ATTINY power_twi_disable(); #endif From 9e45bd9700cdfb2d398ba563b8e20a73d3021872 Mon Sep 17 00:00:00 2001 From: tiberiusteng Date: Mon, 15 Jul 2024 21:38:02 +0900 Subject: [PATCH 2/3] just cast to `int` is enough --- firmware/emonth2.ino | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/firmware/emonth2.ino b/firmware/emonth2.ino index 2b95a59..f975378 100644 --- a/firmware/emonth2.ino +++ b/firmware/emonth2.ino @@ -318,7 +318,7 @@ void setup() si7021_env data = SI7021_sensor.getHumidityAndTemperature(); Serial.print("SI7021 Started, ID: "); Serial.println(deviceid); delay(100); - Serial.print("temp:"); Serial.print(data.celsiusHundredths/100.0); Serial.print(",humidity:"); Serial.println(((data.humidityBasisPoints+600)/100.0)-6); + Serial.print("temp:"); Serial.print(data.celsiusHundredths/100.0); Serial.print(",humidity:"); Serial.println((int(data.humidityBasisPoints)/100.0)); delay(100); } else @@ -493,7 +493,7 @@ void loop() #endif si7021_env data = SI7021_sensor.getHumidityAndTemperature(); emonth.temp = (data.celsiusHundredths*0.1); - emonth.humidity = (((data.humidityBasisPoints+600)*0.1)-60); + emonth.humidity = (int(data.humidityBasisPoints)*0.1); #ifndef ATTINY power_twi_disable(); #endif From cce8abe78308a551bbce87a4c5148edfb81e592b Mon Sep 17 00:00:00 2001 From: tiberiusteng Date: Tue, 16 Jul 2024 03:43:54 +0900 Subject: [PATCH 3/3] remove extra parenthesis --- firmware/emonth2.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/firmware/emonth2.ino b/firmware/emonth2.ino index f975378..d2e3fdd 100644 --- a/firmware/emonth2.ino +++ b/firmware/emonth2.ino @@ -318,7 +318,7 @@ void setup() si7021_env data = SI7021_sensor.getHumidityAndTemperature(); Serial.print("SI7021 Started, ID: "); Serial.println(deviceid); delay(100); - Serial.print("temp:"); Serial.print(data.celsiusHundredths/100.0); Serial.print(",humidity:"); Serial.println((int(data.humidityBasisPoints)/100.0)); + Serial.print("temp:"); Serial.print(data.celsiusHundredths/100.0); Serial.print(",humidity:"); Serial.println(int(data.humidityBasisPoints)/100.0); delay(100); } else