mirror of
https://github.com/airgradienthq/arduino.git
synced 2025-07-16 10:12:09 +02:00
Merge branch 'develop' into feature/root-api
This commit is contained in:
@ -236,7 +236,7 @@ void loop() {
|
|||||||
|
|
||||||
static void co2Update(void) {
|
static void co2Update(void) {
|
||||||
int value = ag.s8.getCo2();
|
int value = ag.s8.getCo2();
|
||||||
if (value >= 0) {
|
if (utils::isValidCO2(value)) {
|
||||||
measurements.CO2 = value;
|
measurements.CO2 = value;
|
||||||
getCO2FailCount = 0;
|
getCO2FailCount = 0;
|
||||||
Serial.printf("CO2 (ppm): %d\r\n", measurements.CO2);
|
Serial.printf("CO2 (ppm): %d\r\n", measurements.CO2);
|
||||||
@ -244,7 +244,7 @@ static void co2Update(void) {
|
|||||||
getCO2FailCount++;
|
getCO2FailCount++;
|
||||||
Serial.printf("Get CO2 failed: %d\r\n", getCO2FailCount);
|
Serial.printf("Get CO2 failed: %d\r\n", getCO2FailCount);
|
||||||
if (getCO2FailCount >= 3) {
|
if (getCO2FailCount >= 3) {
|
||||||
measurements.CO2 = -1;
|
measurements.CO2 = utils::getInvalidCO2();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -519,10 +519,10 @@ static void updatePm(void) {
|
|||||||
pmFailCount++;
|
pmFailCount++;
|
||||||
Serial.printf("PMS read failed: %d\r\n", pmFailCount);
|
Serial.printf("PMS read failed: %d\r\n", pmFailCount);
|
||||||
if (pmFailCount >= 3) {
|
if (pmFailCount >= 3) {
|
||||||
measurements.pm01_1 = -1;
|
measurements.pm01_1 = utils::getInvalidPMS();
|
||||||
measurements.pm25_1 = -1;
|
measurements.pm25_1 = utils::getInvalidPMS();
|
||||||
measurements.pm10_1 = -1;
|
measurements.pm10_1 = utils::getInvalidPMS();
|
||||||
measurements.pm03PCount_1 = -1;
|
measurements.pm03PCount_1 = utils::getInvalidPMS();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -567,5 +567,7 @@ static void tempHumUpdate(void) {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
Serial.println("SHT read failed");
|
Serial.println("SHT read failed");
|
||||||
|
measurements.Temperature = utils::getInvalidTemperature();
|
||||||
|
measurements.Humidity = utils::getInvalidHumidity();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -65,14 +65,14 @@ String OpenMetrics::getPayload(void) {
|
|||||||
add_metric_point("", String(measure.CO2));
|
add_metric_point("", String(measure.CO2));
|
||||||
}
|
}
|
||||||
|
|
||||||
float _temp = -1001;
|
float _temp = utils::getInvalidTemperature();
|
||||||
float _hum = -1;
|
float _hum = utils::getInvalidHumidity();
|
||||||
int pm01 = -1;
|
int pm01 = utils::getInvalidPMS();
|
||||||
int pm25 = -1;
|
int pm25 = utils::getInvalidPMS();
|
||||||
int pm10 = -1;
|
int pm10 = utils::getInvalidPMS();
|
||||||
int pm03PCount = -1;
|
int pm03PCount = utils::getInvalidPMS();
|
||||||
int atmpCompensated = -1;
|
int atmpCompensated = utils::getInvalidTemperature();
|
||||||
int ahumCompensated = -1;
|
int ahumCompensated = utils::getInvalidHumidity();
|
||||||
|
|
||||||
if (config.hasSensorSHT) {
|
if (config.hasSensorSHT) {
|
||||||
_temp = measure.Temperature;
|
_temp = measure.Temperature;
|
||||||
@ -89,28 +89,28 @@ String OpenMetrics::getPayload(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (config.hasSensorPMS1) {
|
if (config.hasSensorPMS1) {
|
||||||
if (pm01 >= 0) {
|
if (utils::isValidPMS(pm01)) {
|
||||||
add_metric("pm1",
|
add_metric("pm1",
|
||||||
"PM1.0 concentration as measured by the AirGradient PMS "
|
"PM1.0 concentration as measured by the AirGradient PMS "
|
||||||
"sensor, in micrograms per cubic meter",
|
"sensor, in micrograms per cubic meter",
|
||||||
"gauge", "ugm3");
|
"gauge", "ugm3");
|
||||||
add_metric_point("", String(pm01));
|
add_metric_point("", String(pm01));
|
||||||
}
|
}
|
||||||
if (pm25 >= 0) {
|
if (utils::isValidPMS(pm25)) {
|
||||||
add_metric("pm2d5",
|
add_metric("pm2d5",
|
||||||
"PM2.5 concentration as measured by the AirGradient PMS "
|
"PM2.5 concentration as measured by the AirGradient PMS "
|
||||||
"sensor, in micrograms per cubic meter",
|
"sensor, in micrograms per cubic meter",
|
||||||
"gauge", "ugm3");
|
"gauge", "ugm3");
|
||||||
add_metric_point("", String(pm25));
|
add_metric_point("", String(pm25));
|
||||||
}
|
}
|
||||||
if (pm10 >= 0) {
|
if (utils::isValidPMS(pm10)) {
|
||||||
add_metric("pm10",
|
add_metric("pm10",
|
||||||
"PM10 concentration as measured by the AirGradient PMS "
|
"PM10 concentration as measured by the AirGradient PMS "
|
||||||
"sensor, in micrograms per cubic meter",
|
"sensor, in micrograms per cubic meter",
|
||||||
"gauge", "ugm3");
|
"gauge", "ugm3");
|
||||||
add_metric_point("", String(pm10));
|
add_metric_point("", String(pm10));
|
||||||
}
|
}
|
||||||
if (pm03PCount >= 0) {
|
if (utils::isValidPMS03Count(pm03PCount)) {
|
||||||
add_metric("pm0d3",
|
add_metric("pm0d3",
|
||||||
"PM0.3 concentration as measured by the AirGradient PMS "
|
"PM0.3 concentration as measured by the AirGradient PMS "
|
||||||
"sensor, in number of particules per 100 milliliters",
|
"sensor, in number of particules per 100 milliliters",
|
||||||
@ -120,28 +120,28 @@ String OpenMetrics::getPayload(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (config.hasSensorSGP) {
|
if (config.hasSensorSGP) {
|
||||||
if (measure.TVOC >= 0) {
|
if (utils::isValidVOC(measure.TVOC)) {
|
||||||
add_metric("tvoc_index",
|
add_metric("tvoc_index",
|
||||||
"The processed Total Volatile Organic Compounds (TVOC) index "
|
"The processed Total Volatile Organic Compounds (TVOC) index "
|
||||||
"as measured by the AirGradient SGP sensor",
|
"as measured by the AirGradient SGP sensor",
|
||||||
"gauge");
|
"gauge");
|
||||||
add_metric_point("", String(measure.TVOC));
|
add_metric_point("", String(measure.TVOC));
|
||||||
}
|
}
|
||||||
if (measure.TVOCRaw >= 0) {
|
if (utils::isValidVOC(measure.TVOCRaw)) {
|
||||||
add_metric("tvoc_raw",
|
add_metric("tvoc_raw",
|
||||||
"The raw input value to the Total Volatile Organic Compounds "
|
"The raw input value to the Total Volatile Organic Compounds "
|
||||||
"(TVOC) index as measured by the AirGradient SGP sensor",
|
"(TVOC) index as measured by the AirGradient SGP sensor",
|
||||||
"gauge");
|
"gauge");
|
||||||
add_metric_point("", String(measure.TVOCRaw));
|
add_metric_point("", String(measure.TVOCRaw));
|
||||||
}
|
}
|
||||||
if (measure.NOx >= 0) {
|
if (utils::isValidNOx(measure.NOx)) {
|
||||||
add_metric("nox_index",
|
add_metric("nox_index",
|
||||||
"The processed Nitrous Oxide (NOx) index as measured by the "
|
"The processed Nitrous Oxide (NOx) index as measured by the "
|
||||||
"AirGradient SGP sensor",
|
"AirGradient SGP sensor",
|
||||||
"gauge");
|
"gauge");
|
||||||
add_metric_point("", String(measure.NOx));
|
add_metric_point("", String(measure.NOx));
|
||||||
}
|
}
|
||||||
if (measure.NOxRaw >= 0) {
|
if (utils::isValidNOx(measure.NOxRaw)) {
|
||||||
add_metric("nox_raw",
|
add_metric("nox_raw",
|
||||||
"The raw input value to the Nitrous Oxide (NOx) index as "
|
"The raw input value to the Nitrous Oxide (NOx) index as "
|
||||||
"measured by the AirGradient SGP sensor",
|
"measured by the AirGradient SGP sensor",
|
||||||
@ -150,7 +150,7 @@ String OpenMetrics::getPayload(void) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_temp > -1001) {
|
if (utils::isValidTemperature(_temp)) {
|
||||||
add_metric(
|
add_metric(
|
||||||
"temperature",
|
"temperature",
|
||||||
"The ambient temperature as measured by the AirGradient SHT / PMS "
|
"The ambient temperature as measured by the AirGradient SHT / PMS "
|
||||||
@ -158,7 +158,7 @@ String OpenMetrics::getPayload(void) {
|
|||||||
"gauge", "celsius");
|
"gauge", "celsius");
|
||||||
add_metric_point("", String(_temp));
|
add_metric_point("", String(_temp));
|
||||||
}
|
}
|
||||||
if (atmpCompensated > -1001) {
|
if (utils::isValidTemperature(atmpCompensated)) {
|
||||||
add_metric("temperature_compensated",
|
add_metric("temperature_compensated",
|
||||||
"The compensated ambient temperature as measured by the "
|
"The compensated ambient temperature as measured by the "
|
||||||
"AirGradient SHT / PMS "
|
"AirGradient SHT / PMS "
|
||||||
@ -166,14 +166,14 @@ String OpenMetrics::getPayload(void) {
|
|||||||
"gauge", "celsius");
|
"gauge", "celsius");
|
||||||
add_metric_point("", String(atmpCompensated));
|
add_metric_point("", String(atmpCompensated));
|
||||||
}
|
}
|
||||||
if (_hum >= 0) {
|
if (utils::isValidHumidity(_hum)) {
|
||||||
add_metric(
|
add_metric(
|
||||||
"humidity",
|
"humidity",
|
||||||
"The relative humidity as measured by the AirGradient SHT sensor",
|
"The relative humidity as measured by the AirGradient SHT sensor",
|
||||||
"gauge", "percent");
|
"gauge", "percent");
|
||||||
add_metric_point("", String(_hum));
|
add_metric_point("", String(_hum));
|
||||||
}
|
}
|
||||||
if (ahumCompensated >= 0) {
|
if (utils::isValidHumidity(ahumCompensated)) {
|
||||||
add_metric("humidity_compensated",
|
add_metric("humidity_compensated",
|
||||||
"The compensated relative humidity as measured by the "
|
"The compensated relative humidity as measured by the "
|
||||||
"AirGradient SHT / PMS sensor",
|
"AirGradient SHT / PMS sensor",
|
||||||
|
@ -234,7 +234,7 @@ void loop() {
|
|||||||
|
|
||||||
static void co2Update(void) {
|
static void co2Update(void) {
|
||||||
int value = ag.s8.getCo2();
|
int value = ag.s8.getCo2();
|
||||||
if (value >= 0) {
|
if (utils::isValidCO2(value)) {
|
||||||
measurements.CO2 = value;
|
measurements.CO2 = value;
|
||||||
getCO2FailCount = 0;
|
getCO2FailCount = 0;
|
||||||
Serial.printf("CO2 (ppm): %d\r\n", measurements.CO2);
|
Serial.printf("CO2 (ppm): %d\r\n", measurements.CO2);
|
||||||
@ -242,7 +242,7 @@ static void co2Update(void) {
|
|||||||
getCO2FailCount++;
|
getCO2FailCount++;
|
||||||
Serial.printf("Get CO2 failed: %d\r\n", getCO2FailCount);
|
Serial.printf("Get CO2 failed: %d\r\n", getCO2FailCount);
|
||||||
if (getCO2FailCount >= 3) {
|
if (getCO2FailCount >= 3) {
|
||||||
measurements.CO2 = -1;
|
measurements.CO2 = utils::getInvalidCO2();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -571,10 +571,10 @@ static void updatePm(void) {
|
|||||||
pmFailCount++;
|
pmFailCount++;
|
||||||
Serial.printf("PMS read failed: %d\r\n", pmFailCount);
|
Serial.printf("PMS read failed: %d\r\n", pmFailCount);
|
||||||
if (pmFailCount >= 3) {
|
if (pmFailCount >= 3) {
|
||||||
measurements.pm01_1 = -1;
|
measurements.pm01_1 = utils::getInvalidPMS();
|
||||||
measurements.pm25_1 = -1;
|
measurements.pm25_1 = utils::getInvalidPMS();
|
||||||
measurements.pm10_1 = -1;
|
measurements.pm10_1 = utils::getInvalidPMS();
|
||||||
measurements.pm03PCount_1 = -1;
|
measurements.pm03PCount_1 = utils::getInvalidPMS();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -619,5 +619,7 @@ static void tempHumUpdate(void) {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
Serial.println("SHT read failed");
|
Serial.println("SHT read failed");
|
||||||
|
measurements.Temperature = utils::getInvalidTemperature();
|
||||||
|
measurements.Humidity = utils::getInvalidHumidity();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -65,14 +65,14 @@ String OpenMetrics::getPayload(void) {
|
|||||||
add_metric_point("", String(measure.CO2));
|
add_metric_point("", String(measure.CO2));
|
||||||
}
|
}
|
||||||
|
|
||||||
float _temp = -1001;
|
float _temp = utils::getInvalidTemperature();
|
||||||
float _hum = -1;
|
float _hum = utils::getInvalidHumidity();
|
||||||
int pm01 = -1;
|
int pm01 = utils::getInvalidPMS();
|
||||||
int pm25 = -1;
|
int pm25 = utils::getInvalidPMS();
|
||||||
int pm10 = -1;
|
int pm10 = utils::getInvalidPMS();
|
||||||
int pm03PCount = -1;
|
int pm03PCount = utils::getInvalidPMS();
|
||||||
int atmpCompensated = -1;
|
int atmpCompensated = utils::getInvalidTemperature();
|
||||||
int ahumCompensated = -1;
|
int ahumCompensated = utils::getInvalidHumidity();
|
||||||
|
|
||||||
if (config.hasSensorSHT) {
|
if (config.hasSensorSHT) {
|
||||||
_temp = measure.Temperature;
|
_temp = measure.Temperature;
|
||||||
@ -89,28 +89,28 @@ String OpenMetrics::getPayload(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (config.hasSensorPMS1) {
|
if (config.hasSensorPMS1) {
|
||||||
if (pm01 >= 0) {
|
if (utils::isValidPMS(pm01)) {
|
||||||
add_metric("pm1",
|
add_metric("pm1",
|
||||||
"PM1.0 concentration as measured by the AirGradient PMS "
|
"PM1.0 concentration as measured by the AirGradient PMS "
|
||||||
"sensor, in micrograms per cubic meter",
|
"sensor, in micrograms per cubic meter",
|
||||||
"gauge", "ugm3");
|
"gauge", "ugm3");
|
||||||
add_metric_point("", String(pm01));
|
add_metric_point("", String(pm01));
|
||||||
}
|
}
|
||||||
if (pm25 >= 0) {
|
if (utils::isValidPMS(pm25)) {
|
||||||
add_metric("pm2d5",
|
add_metric("pm2d5",
|
||||||
"PM2.5 concentration as measured by the AirGradient PMS "
|
"PM2.5 concentration as measured by the AirGradient PMS "
|
||||||
"sensor, in micrograms per cubic meter",
|
"sensor, in micrograms per cubic meter",
|
||||||
"gauge", "ugm3");
|
"gauge", "ugm3");
|
||||||
add_metric_point("", String(pm25));
|
add_metric_point("", String(pm25));
|
||||||
}
|
}
|
||||||
if (pm10 >= 0) {
|
if (utils::isValidPMS(pm10)) {
|
||||||
add_metric("pm10",
|
add_metric("pm10",
|
||||||
"PM10 concentration as measured by the AirGradient PMS "
|
"PM10 concentration as measured by the AirGradient PMS "
|
||||||
"sensor, in micrograms per cubic meter",
|
"sensor, in micrograms per cubic meter",
|
||||||
"gauge", "ugm3");
|
"gauge", "ugm3");
|
||||||
add_metric_point("", String(pm10));
|
add_metric_point("", String(pm10));
|
||||||
}
|
}
|
||||||
if (pm03PCount >= 0) {
|
if (utils::isValidPMS03Count(pm03PCount)) {
|
||||||
add_metric("pm0d3",
|
add_metric("pm0d3",
|
||||||
"PM0.3 concentration as measured by the AirGradient PMS "
|
"PM0.3 concentration as measured by the AirGradient PMS "
|
||||||
"sensor, in number of particules per 100 milliliters",
|
"sensor, in number of particules per 100 milliliters",
|
||||||
@ -120,28 +120,28 @@ String OpenMetrics::getPayload(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (config.hasSensorSGP) {
|
if (config.hasSensorSGP) {
|
||||||
if (measure.TVOC >= 0) {
|
if (utils::isValidVOC(measure.TVOC)) {
|
||||||
add_metric("tvoc_index",
|
add_metric("tvoc_index",
|
||||||
"The processed Total Volatile Organic Compounds (TVOC) index "
|
"The processed Total Volatile Organic Compounds (TVOC) index "
|
||||||
"as measured by the AirGradient SGP sensor",
|
"as measured by the AirGradient SGP sensor",
|
||||||
"gauge");
|
"gauge");
|
||||||
add_metric_point("", String(measure.TVOC));
|
add_metric_point("", String(measure.TVOC));
|
||||||
}
|
}
|
||||||
if (measure.TVOCRaw >= 0) {
|
if (utils::isValidVOC(measure.TVOCRaw)) {
|
||||||
add_metric("tvoc_raw",
|
add_metric("tvoc_raw",
|
||||||
"The raw input value to the Total Volatile Organic Compounds "
|
"The raw input value to the Total Volatile Organic Compounds "
|
||||||
"(TVOC) index as measured by the AirGradient SGP sensor",
|
"(TVOC) index as measured by the AirGradient SGP sensor",
|
||||||
"gauge");
|
"gauge");
|
||||||
add_metric_point("", String(measure.TVOCRaw));
|
add_metric_point("", String(measure.TVOCRaw));
|
||||||
}
|
}
|
||||||
if (measure.NOx >= 0) {
|
if (utils::isValidNOx(measure.NOx)) {
|
||||||
add_metric("nox_index",
|
add_metric("nox_index",
|
||||||
"The processed Nitrous Oxide (NOx) index as measured by the "
|
"The processed Nitrous Oxide (NOx) index as measured by the "
|
||||||
"AirGradient SGP sensor",
|
"AirGradient SGP sensor",
|
||||||
"gauge");
|
"gauge");
|
||||||
add_metric_point("", String(measure.NOx));
|
add_metric_point("", String(measure.NOx));
|
||||||
}
|
}
|
||||||
if (measure.NOxRaw >= 0) {
|
if (utils::isValidNOx(measure.NOxRaw)) {
|
||||||
add_metric("nox_raw",
|
add_metric("nox_raw",
|
||||||
"The raw input value to the Nitrous Oxide (NOx) index as "
|
"The raw input value to the Nitrous Oxide (NOx) index as "
|
||||||
"measured by the AirGradient SGP sensor",
|
"measured by the AirGradient SGP sensor",
|
||||||
@ -150,7 +150,7 @@ String OpenMetrics::getPayload(void) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_temp > -1001) {
|
if (utils::isValidTemperature(_temp)) {
|
||||||
add_metric(
|
add_metric(
|
||||||
"temperature",
|
"temperature",
|
||||||
"The ambient temperature as measured by the AirGradient SHT / PMS "
|
"The ambient temperature as measured by the AirGradient SHT / PMS "
|
||||||
@ -158,7 +158,7 @@ String OpenMetrics::getPayload(void) {
|
|||||||
"gauge", "celsius");
|
"gauge", "celsius");
|
||||||
add_metric_point("", String(_temp));
|
add_metric_point("", String(_temp));
|
||||||
}
|
}
|
||||||
if (atmpCompensated > -1001) {
|
if (utils::isValidTemperature(atmpCompensated)) {
|
||||||
add_metric("temperature_compensated",
|
add_metric("temperature_compensated",
|
||||||
"The compensated ambient temperature as measured by the "
|
"The compensated ambient temperature as measured by the "
|
||||||
"AirGradient SHT / PMS "
|
"AirGradient SHT / PMS "
|
||||||
@ -166,14 +166,14 @@ String OpenMetrics::getPayload(void) {
|
|||||||
"gauge", "celsius");
|
"gauge", "celsius");
|
||||||
add_metric_point("", String(atmpCompensated));
|
add_metric_point("", String(atmpCompensated));
|
||||||
}
|
}
|
||||||
if (_hum >= 0) {
|
if (utils::isValidHumidity(_hum)) {
|
||||||
add_metric(
|
add_metric(
|
||||||
"humidity",
|
"humidity",
|
||||||
"The relative humidity as measured by the AirGradient SHT sensor",
|
"The relative humidity as measured by the AirGradient SHT sensor",
|
||||||
"gauge", "percent");
|
"gauge", "percent");
|
||||||
add_metric_point("", String(_hum));
|
add_metric_point("", String(_hum));
|
||||||
}
|
}
|
||||||
if (ahumCompensated >= 0) {
|
if (utils::isValidHumidity(ahumCompensated)) {
|
||||||
add_metric("humidity_compensated",
|
add_metric("humidity_compensated",
|
||||||
"The compensated relative humidity as measured by the "
|
"The compensated relative humidity as measured by the "
|
||||||
"AirGradient SHT / PMS sensor",
|
"AirGradient SHT / PMS sensor",
|
||||||
|
@ -261,7 +261,7 @@ void loop() {
|
|||||||
|
|
||||||
static void co2Update(void) {
|
static void co2Update(void) {
|
||||||
int value = ag.s8.getCo2();
|
int value = ag.s8.getCo2();
|
||||||
if (value >= 0) {
|
if (utils::isValidCO2(value)) {
|
||||||
measurements.CO2 = value;
|
measurements.CO2 = value;
|
||||||
getCO2FailCount = 0;
|
getCO2FailCount = 0;
|
||||||
Serial.printf("CO2 (ppm): %d\r\n", measurements.CO2);
|
Serial.printf("CO2 (ppm): %d\r\n", measurements.CO2);
|
||||||
@ -269,7 +269,7 @@ static void co2Update(void) {
|
|||||||
getCO2FailCount++;
|
getCO2FailCount++;
|
||||||
Serial.printf("Get CO2 failed: %d\r\n", getCO2FailCount);
|
Serial.printf("Get CO2 failed: %d\r\n", getCO2FailCount);
|
||||||
if (getCO2FailCount >= 3) {
|
if (getCO2FailCount >= 3) {
|
||||||
measurements.CO2 = -1;
|
measurements.CO2 = utils::getInvalidCO2();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -614,10 +614,10 @@ static void updatePm(void) {
|
|||||||
pmFailCount++;
|
pmFailCount++;
|
||||||
Serial.printf("PMS read failed: %d\r\n", pmFailCount);
|
Serial.printf("PMS read failed: %d\r\n", pmFailCount);
|
||||||
if (pmFailCount >= 3) {
|
if (pmFailCount >= 3) {
|
||||||
measurements.pm01_1 = -1;
|
measurements.pm01_1 = utils::getInvalidPMS();
|
||||||
measurements.pm25_1 = -1;
|
measurements.pm25_1 = utils::getInvalidPMS();
|
||||||
measurements.pm10_1 = -1;
|
measurements.pm10_1 = utils::getInvalidPMS();
|
||||||
measurements.pm03PCount_1 = -1;
|
measurements.pm03PCount_1 = utils::getInvalidPMS();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -662,5 +662,7 @@ static void tempHumUpdate(void) {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
Serial.println("SHT read failed");
|
Serial.println("SHT read failed");
|
||||||
|
measurements.Temperature = utils::getInvalidTemperature();
|
||||||
|
measurements.Humidity = utils::getInvalidHumidity();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -65,14 +65,14 @@ String OpenMetrics::getPayload(void) {
|
|||||||
add_metric_point("", String(measure.CO2));
|
add_metric_point("", String(measure.CO2));
|
||||||
}
|
}
|
||||||
|
|
||||||
float _temp = -1001;
|
float _temp = utils::getInvalidTemperature();
|
||||||
float _hum = -1;
|
float _hum = utils::getInvalidHumidity();
|
||||||
int pm01 = -1;
|
int pm01 = utils::getInvalidPMS();
|
||||||
int pm25 = -1;
|
int pm25 = utils::getInvalidPMS();
|
||||||
int pm10 = -1;
|
int pm10 = utils::getInvalidPMS();
|
||||||
int pm03PCount = -1;
|
int pm03PCount = utils::getInvalidPMS();
|
||||||
int atmpCompensated = -1;
|
int atmpCompensated = utils::getInvalidTemperature();
|
||||||
int ahumCompensated = -1;
|
int ahumCompensated = utils::getInvalidHumidity();
|
||||||
|
|
||||||
if (config.hasSensorSHT) {
|
if (config.hasSensorSHT) {
|
||||||
_temp = measure.Temperature;
|
_temp = measure.Temperature;
|
||||||
@ -89,28 +89,28 @@ String OpenMetrics::getPayload(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (config.hasSensorPMS1) {
|
if (config.hasSensorPMS1) {
|
||||||
if (pm01 >= 0) {
|
if (utils::isValidPMS(pm01)) {
|
||||||
add_metric("pm1",
|
add_metric("pm1",
|
||||||
"PM1.0 concentration as measured by the AirGradient PMS "
|
"PM1.0 concentration as measured by the AirGradient PMS "
|
||||||
"sensor, in micrograms per cubic meter",
|
"sensor, in micrograms per cubic meter",
|
||||||
"gauge", "ugm3");
|
"gauge", "ugm3");
|
||||||
add_metric_point("", String(pm01));
|
add_metric_point("", String(pm01));
|
||||||
}
|
}
|
||||||
if (pm25 >= 0) {
|
if (utils::isValidPMS(pm25)) {
|
||||||
add_metric("pm2d5",
|
add_metric("pm2d5",
|
||||||
"PM2.5 concentration as measured by the AirGradient PMS "
|
"PM2.5 concentration as measured by the AirGradient PMS "
|
||||||
"sensor, in micrograms per cubic meter",
|
"sensor, in micrograms per cubic meter",
|
||||||
"gauge", "ugm3");
|
"gauge", "ugm3");
|
||||||
add_metric_point("", String(pm25));
|
add_metric_point("", String(pm25));
|
||||||
}
|
}
|
||||||
if (pm10 >= 0) {
|
if (utils::isValidPMS(pm10)) {
|
||||||
add_metric("pm10",
|
add_metric("pm10",
|
||||||
"PM10 concentration as measured by the AirGradient PMS "
|
"PM10 concentration as measured by the AirGradient PMS "
|
||||||
"sensor, in micrograms per cubic meter",
|
"sensor, in micrograms per cubic meter",
|
||||||
"gauge", "ugm3");
|
"gauge", "ugm3");
|
||||||
add_metric_point("", String(pm10));
|
add_metric_point("", String(pm10));
|
||||||
}
|
}
|
||||||
if (pm03PCount >= 0) {
|
if (utils::isValidPMS03Count(pm03PCount)) {
|
||||||
add_metric("pm0d3",
|
add_metric("pm0d3",
|
||||||
"PM0.3 concentration as measured by the AirGradient PMS "
|
"PM0.3 concentration as measured by the AirGradient PMS "
|
||||||
"sensor, in number of particules per 100 milliliters",
|
"sensor, in number of particules per 100 milliliters",
|
||||||
@ -120,28 +120,28 @@ String OpenMetrics::getPayload(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (config.hasSensorSGP) {
|
if (config.hasSensorSGP) {
|
||||||
if (measure.TVOC >= 0) {
|
if (utils::isValidVOC(measure.TVOC)) {
|
||||||
add_metric("tvoc_index",
|
add_metric("tvoc_index",
|
||||||
"The processed Total Volatile Organic Compounds (TVOC) index "
|
"The processed Total Volatile Organic Compounds (TVOC) index "
|
||||||
"as measured by the AirGradient SGP sensor",
|
"as measured by the AirGradient SGP sensor",
|
||||||
"gauge");
|
"gauge");
|
||||||
add_metric_point("", String(measure.TVOC));
|
add_metric_point("", String(measure.TVOC));
|
||||||
}
|
}
|
||||||
if (measure.TVOCRaw >= 0) {
|
if (utils::isValidVOC(measure.TVOCRaw)) {
|
||||||
add_metric("tvoc_raw",
|
add_metric("tvoc_raw",
|
||||||
"The raw input value to the Total Volatile Organic Compounds "
|
"The raw input value to the Total Volatile Organic Compounds "
|
||||||
"(TVOC) index as measured by the AirGradient SGP sensor",
|
"(TVOC) index as measured by the AirGradient SGP sensor",
|
||||||
"gauge");
|
"gauge");
|
||||||
add_metric_point("", String(measure.TVOCRaw));
|
add_metric_point("", String(measure.TVOCRaw));
|
||||||
}
|
}
|
||||||
if (measure.NOx >= 0) {
|
if (utils::isValidNOx(measure.NOx)) {
|
||||||
add_metric("nox_index",
|
add_metric("nox_index",
|
||||||
"The processed Nitrous Oxide (NOx) index as measured by the "
|
"The processed Nitrous Oxide (NOx) index as measured by the "
|
||||||
"AirGradient SGP sensor",
|
"AirGradient SGP sensor",
|
||||||
"gauge");
|
"gauge");
|
||||||
add_metric_point("", String(measure.NOx));
|
add_metric_point("", String(measure.NOx));
|
||||||
}
|
}
|
||||||
if (measure.NOxRaw >= 0) {
|
if (utils::isValidNOx(measure.NOxRaw)) {
|
||||||
add_metric("nox_raw",
|
add_metric("nox_raw",
|
||||||
"The raw input value to the Nitrous Oxide (NOx) index as "
|
"The raw input value to the Nitrous Oxide (NOx) index as "
|
||||||
"measured by the AirGradient SGP sensor",
|
"measured by the AirGradient SGP sensor",
|
||||||
@ -150,7 +150,7 @@ String OpenMetrics::getPayload(void) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_temp > -1001) {
|
if (utils::isValidTemperature(_temp)) {
|
||||||
add_metric(
|
add_metric(
|
||||||
"temperature",
|
"temperature",
|
||||||
"The ambient temperature as measured by the AirGradient SHT / PMS "
|
"The ambient temperature as measured by the AirGradient SHT / PMS "
|
||||||
@ -158,7 +158,7 @@ String OpenMetrics::getPayload(void) {
|
|||||||
"gauge", "celsius");
|
"gauge", "celsius");
|
||||||
add_metric_point("", String(_temp));
|
add_metric_point("", String(_temp));
|
||||||
}
|
}
|
||||||
if (atmpCompensated > -1001) {
|
if (utils::isValidTemperature(atmpCompensated)) {
|
||||||
add_metric("temperature_compensated",
|
add_metric("temperature_compensated",
|
||||||
"The compensated ambient temperature as measured by the "
|
"The compensated ambient temperature as measured by the "
|
||||||
"AirGradient SHT / PMS "
|
"AirGradient SHT / PMS "
|
||||||
@ -166,14 +166,14 @@ String OpenMetrics::getPayload(void) {
|
|||||||
"gauge", "celsius");
|
"gauge", "celsius");
|
||||||
add_metric_point("", String(atmpCompensated));
|
add_metric_point("", String(atmpCompensated));
|
||||||
}
|
}
|
||||||
if (_hum >= 0) {
|
if (utils::isValidHumidity(_hum)) {
|
||||||
add_metric(
|
add_metric(
|
||||||
"humidity",
|
"humidity",
|
||||||
"The relative humidity as measured by the AirGradient SHT sensor",
|
"The relative humidity as measured by the AirGradient SHT sensor",
|
||||||
"gauge", "percent");
|
"gauge", "percent");
|
||||||
add_metric_point("", String(_hum));
|
add_metric_point("", String(_hum));
|
||||||
}
|
}
|
||||||
if (ahumCompensated >= 0) {
|
if (utils::isValidHumidity(ahumCompensated)) {
|
||||||
add_metric("humidity_compensated",
|
add_metric("humidity_compensated",
|
||||||
"The compensated relative humidity as measured by the "
|
"The compensated relative humidity as measured by the "
|
||||||
"AirGradient SHT / PMS sensor",
|
"AirGradient SHT / PMS sensor",
|
||||||
|
@ -320,7 +320,7 @@ void loop() {
|
|||||||
|
|
||||||
static void co2Update(void) {
|
static void co2Update(void) {
|
||||||
int value = ag->s8.getCo2();
|
int value = ag->s8.getCo2();
|
||||||
if (value >= 0) {
|
if (utils::isValidCO2(value)) {
|
||||||
measurements.CO2 = value;
|
measurements.CO2 = value;
|
||||||
getCO2FailCount = 0;
|
getCO2FailCount = 0;
|
||||||
Serial.printf("CO2 (ppm): %d\r\n", measurements.CO2);
|
Serial.printf("CO2 (ppm): %d\r\n", measurements.CO2);
|
||||||
@ -328,7 +328,7 @@ static void co2Update(void) {
|
|||||||
getCO2FailCount++;
|
getCO2FailCount++;
|
||||||
Serial.printf("Get CO2 failed: %d\r\n", getCO2FailCount);
|
Serial.printf("Get CO2 failed: %d\r\n", getCO2FailCount);
|
||||||
if (getCO2FailCount >= 3) {
|
if (getCO2FailCount >= 3) {
|
||||||
measurements.CO2 = -1;
|
measurements.CO2 = utils::getInvalidCO2();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -424,12 +424,8 @@ static void factoryConfigReset(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** Reset WIFI */
|
/** Reset WIFI */
|
||||||
WiFi.enableSTA(true); // Incase offline mode
|
Serial.println("Set wifi connect to 'airgradient' as default");
|
||||||
WiFi.disconnect(true, true);
|
WiFi.begin("airgradient", "cleanair");
|
||||||
if (ag->isOne() == false) {
|
|
||||||
WiFi.begin("airgradient", "cleanair");
|
|
||||||
Serial.println("Set WiFi connect to \"airgradient\"");
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Reset local config */
|
/** Reset local config */
|
||||||
configuration.reset();
|
configuration.reset();
|
||||||
@ -1027,10 +1023,10 @@ static void updatePm(void) {
|
|||||||
pmFailCount++;
|
pmFailCount++;
|
||||||
Serial.printf("PMS read failed: %d\r\n", pmFailCount);
|
Serial.printf("PMS read failed: %d\r\n", pmFailCount);
|
||||||
if (pmFailCount >= 3) {
|
if (pmFailCount >= 3) {
|
||||||
measurements.pm01_1 = -1;
|
measurements.pm01_1 = utils::getInvalidPMS();
|
||||||
measurements.pm25_1 = -1;
|
measurements.pm25_1 = utils::getInvalidPMS();
|
||||||
measurements.pm10_1 = -1;
|
measurements.pm10_1 = utils::getInvalidPMS();
|
||||||
measurements.pm03PCount_1 = -1;
|
measurements.pm03PCount_1 = utils::getInvalidPMS();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@ -1058,12 +1054,12 @@ static void updatePm(void) {
|
|||||||
Serial.printf("[1] Relative Humidity compensated: %f\r\n",
|
Serial.printf("[1] Relative Humidity compensated: %f\r\n",
|
||||||
ag->pms5003t_1.humidityCompensated(measurements.hum_1));
|
ag->pms5003t_1.humidityCompensated(measurements.hum_1));
|
||||||
} else {
|
} else {
|
||||||
measurements.pm01_1 = -1;
|
measurements.pm01_1 = utils::getInvalidPMS();
|
||||||
measurements.pm25_1 = -1;
|
measurements.pm25_1 = utils::getInvalidPMS();
|
||||||
measurements.pm10_1 = -1;
|
measurements.pm10_1 = utils::getInvalidPMS();
|
||||||
measurements.pm03PCount_1 = -1;
|
measurements.pm03PCount_1 = utils::getInvalidPMS();
|
||||||
measurements.temp_1 = -1001;
|
measurements.temp_1 = utils::getInvalidTemperature();
|
||||||
measurements.hum_1 = -1;
|
measurements.hum_1 = utils::getInvalidHumidity();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (configuration.hasSensorPMS2 && (ag->pms5003t_2.isFailed() == false)) {
|
if (configuration.hasSensorPMS2 && (ag->pms5003t_2.isFailed() == false)) {
|
||||||
@ -1088,12 +1084,12 @@ static void updatePm(void) {
|
|||||||
Serial.printf("[2] Relative Humidity compensated: %d\r\n",
|
Serial.printf("[2] Relative Humidity compensated: %d\r\n",
|
||||||
ag->pms5003t_1.humidityCompensated(measurements.hum_2));
|
ag->pms5003t_1.humidityCompensated(measurements.hum_2));
|
||||||
} else {
|
} else {
|
||||||
measurements.pm01_2 = -1;
|
measurements.pm01_2 = utils::getInvalidPMS();
|
||||||
measurements.pm25_2 = -1;
|
measurements.pm25_2 = utils::getInvalidPMS();
|
||||||
measurements.pm10_2 = -1;
|
measurements.pm10_2 = utils::getInvalidPMS();
|
||||||
measurements.pm03PCount_2 = -1;
|
measurements.pm03PCount_2 = utils::getInvalidPMS();
|
||||||
measurements.temp_2 = -1001;
|
measurements.temp_2 = utils::getInvalidTemperature();
|
||||||
measurements.hum_2 = -1;
|
measurements.hum_2 = utils::getInvalidHumidity();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (configuration.hasSensorPMS1 && configuration.hasSensorPMS2 &&
|
if (configuration.hasSensorPMS1 && configuration.hasSensorPMS2 &&
|
||||||
@ -1233,6 +1229,8 @@ static void tempHumUpdate(void) {
|
|||||||
measurements.Humidity);
|
measurements.Humidity);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
measurements.Temperature = utils::getInvalidTemperature();
|
||||||
|
measurements.Humidity = utils::getInvalidHumidity();
|
||||||
Serial.println("SHT read failed");
|
Serial.println("SHT read failed");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -65,14 +65,14 @@ String OpenMetrics::getPayload(void) {
|
|||||||
add_metric_point("", String(measure.CO2));
|
add_metric_point("", String(measure.CO2));
|
||||||
}
|
}
|
||||||
|
|
||||||
float _temp = -1001;
|
float _temp = utils::getInvalidTemperature();
|
||||||
float _hum = -1;
|
float _hum = utils::getInvalidHumidity();
|
||||||
int pm01 = -1;
|
int pm01 = utils::getInvalidPMS();
|
||||||
int pm25 = -1;
|
int pm25 = utils::getInvalidPMS();
|
||||||
int pm10 = -1;
|
int pm10 = utils::getInvalidPMS();
|
||||||
int pm03PCount = -1;
|
int pm03PCount = utils::getInvalidPMS();
|
||||||
int atmpCompensated = -1;
|
int atmpCompensated = utils::getInvalidTemperature();
|
||||||
int ahumCompensated = -1;
|
int ahumCompensated = utils::getInvalidHumidity();
|
||||||
if (config.hasSensorPMS1 && config.hasSensorPMS2) {
|
if (config.hasSensorPMS1 && config.hasSensorPMS2) {
|
||||||
_temp = (measure.temp_1 + measure.temp_2) / 2.0f;
|
_temp = (measure.temp_1 + measure.temp_2) / 2.0f;
|
||||||
_hum = (measure.hum_1 + measure.hum_2) / 2.0f;
|
_hum = (measure.hum_1 + measure.hum_2) / 2.0f;
|
||||||
@ -123,28 +123,28 @@ String OpenMetrics::getPayload(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (config.hasSensorPMS1 || config.hasSensorPMS2) {
|
if (config.hasSensorPMS1 || config.hasSensorPMS2) {
|
||||||
if (pm01 >= 0) {
|
if (utils::isValidPMS(pm01)) {
|
||||||
add_metric("pm1",
|
add_metric("pm1",
|
||||||
"PM1.0 concentration as measured by the AirGradient PMS "
|
"PM1.0 concentration as measured by the AirGradient PMS "
|
||||||
"sensor, in micrograms per cubic meter",
|
"sensor, in micrograms per cubic meter",
|
||||||
"gauge", "ugm3");
|
"gauge", "ugm3");
|
||||||
add_metric_point("", String(pm01));
|
add_metric_point("", String(pm01));
|
||||||
}
|
}
|
||||||
if (pm25 >= 0) {
|
if (utils::isValidPMS(pm25)) {
|
||||||
add_metric("pm2d5",
|
add_metric("pm2d5",
|
||||||
"PM2.5 concentration as measured by the AirGradient PMS "
|
"PM2.5 concentration as measured by the AirGradient PMS "
|
||||||
"sensor, in micrograms per cubic meter",
|
"sensor, in micrograms per cubic meter",
|
||||||
"gauge", "ugm3");
|
"gauge", "ugm3");
|
||||||
add_metric_point("", String(pm25));
|
add_metric_point("", String(pm25));
|
||||||
}
|
}
|
||||||
if (pm10 >= 0) {
|
if (utils::isValidPMS(pm10)) {
|
||||||
add_metric("pm10",
|
add_metric("pm10",
|
||||||
"PM10 concentration as measured by the AirGradient PMS "
|
"PM10 concentration as measured by the AirGradient PMS "
|
||||||
"sensor, in micrograms per cubic meter",
|
"sensor, in micrograms per cubic meter",
|
||||||
"gauge", "ugm3");
|
"gauge", "ugm3");
|
||||||
add_metric_point("", String(pm10));
|
add_metric_point("", String(pm10));
|
||||||
}
|
}
|
||||||
if (pm03PCount >= 0) {
|
if (utils::isValidPMS03Count(pm03PCount)) {
|
||||||
add_metric("pm0d3",
|
add_metric("pm0d3",
|
||||||
"PM0.3 concentration as measured by the AirGradient PMS "
|
"PM0.3 concentration as measured by the AirGradient PMS "
|
||||||
"sensor, in number of particules per 100 milliliters",
|
"sensor, in number of particules per 100 milliliters",
|
||||||
@ -154,28 +154,28 @@ String OpenMetrics::getPayload(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (config.hasSensorSGP) {
|
if (config.hasSensorSGP) {
|
||||||
if (measure.TVOC >= 0) {
|
if (utils::isValidVOC(measure.TVOC)) {
|
||||||
add_metric("tvoc_index",
|
add_metric("tvoc_index",
|
||||||
"The processed Total Volatile Organic Compounds (TVOC) index "
|
"The processed Total Volatile Organic Compounds (TVOC) index "
|
||||||
"as measured by the AirGradient SGP sensor",
|
"as measured by the AirGradient SGP sensor",
|
||||||
"gauge");
|
"gauge");
|
||||||
add_metric_point("", String(measure.TVOC));
|
add_metric_point("", String(measure.TVOC));
|
||||||
}
|
}
|
||||||
if (measure.TVOCRaw >= 0) {
|
if (utils::isValidVOC(measure.TVOCRaw)) {
|
||||||
add_metric("tvoc_raw",
|
add_metric("tvoc_raw",
|
||||||
"The raw input value to the Total Volatile Organic Compounds "
|
"The raw input value to the Total Volatile Organic Compounds "
|
||||||
"(TVOC) index as measured by the AirGradient SGP sensor",
|
"(TVOC) index as measured by the AirGradient SGP sensor",
|
||||||
"gauge");
|
"gauge");
|
||||||
add_metric_point("", String(measure.TVOCRaw));
|
add_metric_point("", String(measure.TVOCRaw));
|
||||||
}
|
}
|
||||||
if (measure.NOx >= 0) {
|
if (utils::isValidNOx(measure.NOx)) {
|
||||||
add_metric("nox_index",
|
add_metric("nox_index",
|
||||||
"The processed Nitrous Oxide (NOx) index as measured by the "
|
"The processed Nitrous Oxide (NOx) index as measured by the "
|
||||||
"AirGradient SGP sensor",
|
"AirGradient SGP sensor",
|
||||||
"gauge");
|
"gauge");
|
||||||
add_metric_point("", String(measure.NOx));
|
add_metric_point("", String(measure.NOx));
|
||||||
}
|
}
|
||||||
if (measure.NOxRaw >= 0) {
|
if (utils::isValidNOx(measure.NOxRaw)) {
|
||||||
add_metric("nox_raw",
|
add_metric("nox_raw",
|
||||||
"The raw input value to the Nitrous Oxide (NOx) index as "
|
"The raw input value to the Nitrous Oxide (NOx) index as "
|
||||||
"measured by the AirGradient SGP sensor",
|
"measured by the AirGradient SGP sensor",
|
||||||
@ -184,14 +184,14 @@ String OpenMetrics::getPayload(void) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_temp > -1001) {
|
if (utils::isValidTemperature(_temp)) {
|
||||||
add_metric("temperature",
|
add_metric("temperature",
|
||||||
"The ambient temperature as measured by the AirGradient SHT / PMS "
|
"The ambient temperature as measured by the AirGradient SHT / PMS "
|
||||||
"sensor, in degrees Celsius",
|
"sensor, in degrees Celsius",
|
||||||
"gauge", "celsius");
|
"gauge", "celsius");
|
||||||
add_metric_point("", String(_temp));
|
add_metric_point("", String(_temp));
|
||||||
}
|
}
|
||||||
if (atmpCompensated > -1001) {
|
if (utils::isValidTemperature(atmpCompensated)) {
|
||||||
add_metric(
|
add_metric(
|
||||||
"temperature_compensated",
|
"temperature_compensated",
|
||||||
"The compensated ambient temperature as measured by the AirGradient SHT / PMS "
|
"The compensated ambient temperature as measured by the AirGradient SHT / PMS "
|
||||||
@ -199,14 +199,14 @@ String OpenMetrics::getPayload(void) {
|
|||||||
"gauge", "celsius");
|
"gauge", "celsius");
|
||||||
add_metric_point("", String(atmpCompensated));
|
add_metric_point("", String(atmpCompensated));
|
||||||
}
|
}
|
||||||
if (_hum >= 0) {
|
if (utils::isValidHumidity(_hum)) {
|
||||||
add_metric(
|
add_metric(
|
||||||
"humidity",
|
"humidity",
|
||||||
"The relative humidity as measured by the AirGradient SHT sensor",
|
"The relative humidity as measured by the AirGradient SHT sensor",
|
||||||
"gauge", "percent");
|
"gauge", "percent");
|
||||||
add_metric_point("", String(_hum));
|
add_metric_point("", String(_hum));
|
||||||
}
|
}
|
||||||
if (ahumCompensated >= 0) {
|
if (utils::isValidHumidity(ahumCompensated)) {
|
||||||
add_metric(
|
add_metric(
|
||||||
"humidity_compensated",
|
"humidity_compensated",
|
||||||
"The compensated relative humidity as measured by the AirGradient SHT / PMS sensor",
|
"The compensated relative humidity as measured by the AirGradient SHT / PMS sensor",
|
||||||
|
@ -66,6 +66,10 @@ bool AgApiClient::fetchServerConfiguration(void) {
|
|||||||
|
|
||||||
/** Get data */
|
/** Get data */
|
||||||
int retCode = client.GET();
|
int retCode = client.GET();
|
||||||
|
|
||||||
|
logInfo(String("GET: ") + uri);
|
||||||
|
logInfo(String("Return code: ") + String(retCode));
|
||||||
|
|
||||||
if (retCode != 200) {
|
if (retCode != 200) {
|
||||||
client.end();
|
client.end();
|
||||||
getConfigFailed = true;
|
getConfigFailed = true;
|
||||||
@ -109,20 +113,25 @@ bool AgApiClient::postToServer(String data) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
String uri = apiRoot + "/sensors/airgradient:" +
|
String uri =
|
||||||
ag->deviceId() + "/measures";
|
"http://hw.airgradient.com/sensors/airgradient:" + ag->deviceId() +
|
||||||
logInfo("Post uri: " + uri);
|
"/measures";
|
||||||
logInfo("Post data: " + data);
|
// logInfo("Post uri: " + uri);
|
||||||
|
// logInfo("Post data: " + data);
|
||||||
|
|
||||||
WiFiClient wifiClient;
|
WiFiClient wifiClient;
|
||||||
HTTPClient client;
|
HTTPClient client;
|
||||||
if (client.begin(wifiClient, uri.c_str()) == false) {
|
if (client.begin(wifiClient, uri.c_str()) == false) {
|
||||||
|
logError("Init client failed");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
client.addHeader("content-type", "application/json");
|
client.addHeader("content-type", "application/json");
|
||||||
int retCode = client.POST(data);
|
int retCode = client.POST(data);
|
||||||
client.end();
|
client.end();
|
||||||
|
|
||||||
|
logInfo(String("POST: ") + uri);
|
||||||
|
logInfo(String("Return code: ") + String(retCode));
|
||||||
|
|
||||||
if ((retCode == 200) || (retCode == 429)) {
|
if ((retCode == 200) || (retCode == 429)) {
|
||||||
postToServerFailed = false;
|
postToServerFailed = false;
|
||||||
return true;
|
return true;
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
#include "AgOledDisplay.h"
|
#include "AgOledDisplay.h"
|
||||||
#include "Libraries/U8g2/src/U8g2lib.h"
|
#include "Libraries/U8g2/src/U8g2lib.h"
|
||||||
|
#include "Main/utils.h"
|
||||||
|
|
||||||
/** Cast U8G2 */
|
/** Cast U8G2 */
|
||||||
#define DISP() ((U8G2_SH1106_128X64_NONAME_F_HW_I2C *)(this->u8g2))
|
#define DISP() ((U8G2_SH1106_128X64_NONAME_F_HW_I2C *)(this->u8g2))
|
||||||
@ -10,8 +11,8 @@
|
|||||||
* @param hasStatus
|
* @param hasStatus
|
||||||
*/
|
*/
|
||||||
void OledDisplay::showTempHum(bool hasStatus) {
|
void OledDisplay::showTempHum(bool hasStatus) {
|
||||||
char buf[10];
|
char buf[16];
|
||||||
if (value.Temperature > -1001) {
|
if (utils::isValidTemperature(value.Temperature)) {
|
||||||
if (config.isTemperatureUnitInF()) {
|
if (config.isTemperatureUnitInF()) {
|
||||||
float tempF = (value.Temperature * 9) / 5 + 32;
|
float tempF = (value.Temperature * 9) / 5 + 32;
|
||||||
if (hasStatus) {
|
if (hasStatus) {
|
||||||
@ -36,10 +37,10 @@ void OledDisplay::showTempHum(bool hasStatus) {
|
|||||||
DISP()->drawUTF8(1, 10, buf);
|
DISP()->drawUTF8(1, 10, buf);
|
||||||
|
|
||||||
/** Show humidty */
|
/** Show humidty */
|
||||||
if (value.Humidity >= 0) {
|
if (utils::isValidHumidity(value.Humidity)) {
|
||||||
snprintf(buf, sizeof(buf), "%d%%", value.Humidity);
|
snprintf(buf, sizeof(buf), "%d%%", value.Humidity);
|
||||||
} else {
|
} else {
|
||||||
snprintf(buf, sizeof(buf), "%-%%");
|
snprintf(buf, sizeof(buf), "-%%");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (value.Humidity > 99) {
|
if (value.Humidity > 99) {
|
||||||
@ -283,12 +284,8 @@ void OledDisplay::showDashboard(const char *status) {
|
|||||||
DISP()->drawUTF8(1, 27, "CO2");
|
DISP()->drawUTF8(1, 27, "CO2");
|
||||||
|
|
||||||
DISP()->setFont(u8g2_font_t0_22b_tf);
|
DISP()->setFont(u8g2_font_t0_22b_tf);
|
||||||
if (value.CO2 > 0) {
|
if (utils::isValidCO2(value.CO2)) {
|
||||||
int val = 9999;
|
sprintf(strBuf, "%d", value.CO2);
|
||||||
if (value.CO2 < 10000) {
|
|
||||||
val = value.CO2;
|
|
||||||
}
|
|
||||||
sprintf(strBuf, "%d", val);
|
|
||||||
} else {
|
} else {
|
||||||
sprintf(strBuf, "%s", "-");
|
sprintf(strBuf, "%s", "-");
|
||||||
}
|
}
|
||||||
@ -299,88 +296,111 @@ void OledDisplay::showDashboard(const char *status) {
|
|||||||
DISP()->drawStr(1, 61, "ppm");
|
DISP()->drawStr(1, 61, "ppm");
|
||||||
|
|
||||||
/** Draw vertical line */
|
/** Draw vertical line */
|
||||||
DISP()->drawLine(45, 14, 45, 64);
|
DISP()->drawLine(52, 14, 52, 64);
|
||||||
DISP()->drawLine(82, 14, 82, 64);
|
DISP()->drawLine(97, 14, 97, 64);
|
||||||
|
|
||||||
/** Draw PM2.5 label */
|
/** Draw PM2.5 label */
|
||||||
DISP()->setFont(u8g2_font_t0_12_tf);
|
DISP()->setFont(u8g2_font_t0_12_tf);
|
||||||
DISP()->drawStr(48, 27, "PM2.5");
|
DISP()->drawStr(55, 27, "PM2.5");
|
||||||
|
|
||||||
/** Draw PM2.5 value */
|
/** Draw PM2.5 value */
|
||||||
|
int pm25 = value.pm25_1;
|
||||||
|
if (config.hasSensorSHT) {
|
||||||
|
pm25 = ag->pms5003.compensated(pm25, value.Humidity);
|
||||||
|
}
|
||||||
DISP()->setFont(u8g2_font_t0_22b_tf);
|
DISP()->setFont(u8g2_font_t0_22b_tf);
|
||||||
if (config.isPmStandardInUSAQI()) {
|
if (config.isPmStandardInUSAQI()) {
|
||||||
if (value.pm25_1 >= 0) {
|
if (utils::isValidPMS(value.pm25_1)) {
|
||||||
sprintf(strBuf, "%d", ag->pms5003.convertPm25ToUsAqi(value.pm25_1));
|
sprintf(strBuf, "%d", ag->pms5003.convertPm25ToUsAqi(value.pm25_1));
|
||||||
} else {
|
} else {
|
||||||
sprintf(strBuf, "%s", "-");
|
sprintf(strBuf, "%s", "-");
|
||||||
}
|
}
|
||||||
DISP()->drawStr(48, 48, strBuf);
|
DISP()->drawStr(55, 48, strBuf);
|
||||||
DISP()->setFont(u8g2_font_t0_12_tf);
|
DISP()->setFont(u8g2_font_t0_12_tf);
|
||||||
DISP()->drawUTF8(48, 61, "AQI");
|
DISP()->drawUTF8(55, 61, "AQI");
|
||||||
} else {
|
} else {
|
||||||
if (value.pm25_1 >= 0) {
|
if (utils::isValidPMS(value.pm25_1)) {
|
||||||
sprintf(strBuf, "%d", value.pm25_1);
|
sprintf(strBuf, "%d", value.pm25_1);
|
||||||
} else {
|
} else {
|
||||||
sprintf(strBuf, "%s", "-");
|
sprintf(strBuf, "%s", "-");
|
||||||
}
|
}
|
||||||
DISP()->drawStr(48, 48, strBuf);
|
DISP()->drawStr(55, 48, strBuf);
|
||||||
DISP()->setFont(u8g2_font_t0_12_tf);
|
DISP()->setFont(u8g2_font_t0_12_tf);
|
||||||
DISP()->drawUTF8(48, 61, "ug/m³");
|
DISP()->drawUTF8(55, 61, "ug/m³");
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Draw tvocIndexlabel */
|
/** Draw tvocIndexlabel */
|
||||||
DISP()->setFont(u8g2_font_t0_12_tf);
|
DISP()->setFont(u8g2_font_t0_12_tf);
|
||||||
DISP()->drawStr(85, 27, "tvoc:");
|
DISP()->drawStr(100, 27, "VOC:");
|
||||||
|
|
||||||
/** Draw tvocIndexvalue */
|
/** Draw tvocIndexvalue */
|
||||||
if (value.TVOC >= 0) {
|
if (utils::isValidVOC(value.TVOC)) {
|
||||||
sprintf(strBuf, "%d", value.TVOC);
|
sprintf(strBuf, "%d", value.TVOC);
|
||||||
} else {
|
} else {
|
||||||
sprintf(strBuf, "%s", "-");
|
sprintf(strBuf, "%s", "-");
|
||||||
}
|
}
|
||||||
DISP()->drawStr(85, 39, strBuf);
|
DISP()->drawStr(100, 39, strBuf);
|
||||||
|
|
||||||
/** Draw NOx label */
|
/** Draw NOx label */
|
||||||
DISP()->drawStr(85, 53, "NOx:");
|
DISP()->drawStr(100, 53, "NOx:");
|
||||||
if (value.NOx >= 0) {
|
if (utils::isValidNOx(value.NOx)) {
|
||||||
sprintf(strBuf, "%d", value.NOx);
|
sprintf(strBuf, "%d", value.NOx);
|
||||||
} else {
|
} else {
|
||||||
sprintf(strBuf, "%s", "-");
|
sprintf(strBuf, "%s", "-");
|
||||||
}
|
}
|
||||||
DISP()->drawStr(85, 63, strBuf);
|
DISP()->drawStr(100, 63, strBuf);
|
||||||
} while (DISP()->nextPage());
|
} while (DISP()->nextPage());
|
||||||
} else if (ag->isBasic()) {
|
} else if (ag->isBasic()) {
|
||||||
ag->display.clear();
|
ag->display.clear();
|
||||||
|
|
||||||
/** Set CO2 */
|
/** Set CO2 */
|
||||||
snprintf(strBuf, sizeof(strBuf), "CO2:%d", value.CO2);
|
if(utils::isValidCO2(value.CO2)) {
|
||||||
|
snprintf(strBuf, sizeof(strBuf), "CO2:%d", value.CO2);
|
||||||
|
} else {
|
||||||
|
snprintf(strBuf, sizeof(strBuf), "CO2:-");
|
||||||
|
}
|
||||||
|
|
||||||
ag->display.setCursor(0, 0);
|
ag->display.setCursor(0, 0);
|
||||||
ag->display.setText(strBuf);
|
ag->display.setText(strBuf);
|
||||||
|
|
||||||
/** Set PM */
|
/** Set PM */
|
||||||
|
int pm25 = value.pm25_1;
|
||||||
|
if(config.hasSensorSHT) {
|
||||||
|
pm25 = (int)ag->pms5003.compensated(pm25, value.Humidity);
|
||||||
|
}
|
||||||
ag->display.setCursor(0, 12);
|
ag->display.setCursor(0, 12);
|
||||||
snprintf(strBuf, sizeof(strBuf), "PM2.5:%d", value.pm25_1);
|
if (utils::isValidPMS(value.pm25_1)) {
|
||||||
|
snprintf(strBuf, sizeof(strBuf), "PM2.5:%d", value.pm25_1);
|
||||||
|
} else {
|
||||||
|
snprintf(strBuf, sizeof(strBuf), "PM2.5:-");
|
||||||
|
}
|
||||||
ag->display.setText(strBuf);
|
ag->display.setText(strBuf);
|
||||||
|
|
||||||
/** Set temperature and humidity */
|
/** Set temperature and humidity */
|
||||||
if (value.Temperature <= -1001.0f) {
|
if (utils::isValidTemperature(value.Temperature)) {
|
||||||
|
if (config.isTemperatureUnitInF()) {
|
||||||
|
float tempF = (value.Temperature * 9) / 5 + 32;
|
||||||
|
snprintf(strBuf, sizeof(strBuf), "T:%0.1f F", tempF);
|
||||||
|
} else {
|
||||||
|
snprintf(strBuf, sizeof(strBuf), "T:%0.f1 C", value.Temperature);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
if (config.isTemperatureUnitInF()) {
|
if (config.isTemperatureUnitInF()) {
|
||||||
snprintf(strBuf, sizeof(strBuf), "T:-F");
|
snprintf(strBuf, sizeof(strBuf), "T:-F");
|
||||||
} else {
|
} else {
|
||||||
snprintf(strBuf, sizeof(strBuf), "T:-C");
|
snprintf(strBuf, sizeof(strBuf), "T:-C");
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
if (config.isTemperatureUnitInF()) {
|
|
||||||
float tempF = (value.Temperature * 9) / 5 + 32;
|
|
||||||
snprintf(strBuf, sizeof(strBuf), "T:%d F", (int)tempF);
|
|
||||||
} else {
|
|
||||||
snprintf(strBuf, sizeof(strBuf), "T:%d C", (int)value.Temperature);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ag->display.setCursor(0, 24);
|
ag->display.setCursor(0, 24);
|
||||||
ag->display.setText(strBuf);
|
ag->display.setText(strBuf);
|
||||||
|
|
||||||
snprintf(strBuf, sizeof(strBuf), "H:%d %%", (int)value.Humidity);
|
if (utils::isValidHumidity(value.Humidity)) {
|
||||||
|
snprintf(strBuf, sizeof(strBuf), "H:%d %%", (int)value.Humidity);
|
||||||
|
} else {
|
||||||
|
snprintf(strBuf, sizeof(strBuf), "H:- %%");
|
||||||
|
}
|
||||||
|
|
||||||
ag->display.setCursor(0, 36);
|
ag->display.setCursor(0, 36);
|
||||||
ag->display.setText(strBuf);
|
ag->display.setText(strBuf);
|
||||||
|
|
||||||
|
@ -9,9 +9,9 @@
|
|||||||
|
|
||||||
#define RGB_COLOR_R 255, 0, 0 /** Red */
|
#define RGB_COLOR_R 255, 0, 0 /** Red */
|
||||||
#define RGB_COLOR_G 0, 255, 0 /** Green */
|
#define RGB_COLOR_G 0, 255, 0 /** Green */
|
||||||
#define RGB_COLOR_Y 255, 255, 0 /** Yellow */
|
#define RGB_COLOR_Y 255, 150, 0 /** Yellow */
|
||||||
#define RGB_COLOR_O 255, 165, 0 /** Organge */
|
#define RGB_COLOR_O 255, 40, 0 /** Orange */
|
||||||
#define RGB_COLOR_P 160, 32, 240 /** Purple */
|
#define RGB_COLOR_P 180, 0, 255 /** Purple */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Animation LED bar with color
|
* @brief Animation LED bar with color
|
||||||
@ -573,7 +573,7 @@ void StateMachine::handleLeds(AgStateMachineState state) {
|
|||||||
case AgStateMachineWiFiManagerMode: {
|
case AgStateMachineWiFiManagerMode: {
|
||||||
/** In WiFi Manager Mode */
|
/** In WiFi Manager Mode */
|
||||||
/** Turn LED OFF */
|
/** Turn LED OFF */
|
||||||
/** Turn midle LED Color */
|
/** Turn middle LED Color */
|
||||||
if (ag->isOne()) {
|
if (ag->isOne()) {
|
||||||
ag->ledBar.setColor(0, 0, 255, ag->ledBar.getNumberOfLeds() / 2);
|
ag->ledBar.setColor(0, 0, 255, ag->ledBar.getNumberOfLeds() / 2);
|
||||||
} else {
|
} else {
|
||||||
@ -713,7 +713,7 @@ void StateMachine::handleLeds(AgStateMachineState state) {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case AgStateMachineSensorConfigFailed: {
|
case AgStateMachineSensorConfigFailed: {
|
||||||
/** Server is reachable but there is some configuration issue to be fixed on
|
/** Server is reachable but there is some configuration issue to be fixed on
|
||||||
* the server side */
|
* the server side */
|
||||||
if (ag->isOne()) {
|
if (ag->isOne()) {
|
||||||
ag->ledBar.setColor(139, 24, 248, 0);
|
ag->ledBar.setColor(139, 24, 248, 0);
|
||||||
|
353
src/AgValue.cpp
353
src/AgValue.cpp
@ -1,6 +1,7 @@
|
|||||||
#include "AgValue.h"
|
#include "AgValue.h"
|
||||||
#include "AgConfigure.h"
|
#include "AgConfigure.h"
|
||||||
#include "AirGradient.h"
|
#include "AirGradient.h"
|
||||||
|
#include "Main/utils.h"
|
||||||
#include "Libraries/Arduino_JSON/src/Arduino_JSON.h"
|
#include "Libraries/Arduino_JSON/src/Arduino_JSON.h"
|
||||||
|
|
||||||
String Measurements::toString(bool localServer, AgFirmwareMode fwMode, int rssi,
|
String Measurements::toString(bool localServer, AgFirmwareMode fwMode, int rssi,
|
||||||
@ -13,36 +14,35 @@ String Measurements::toString(bool localServer, AgFirmwareMode fwMode, int rssi,
|
|||||||
if (localServer) {
|
if (localServer) {
|
||||||
root["serialno"] = ag->deviceId();
|
root["serialno"] = ag->deviceId();
|
||||||
}
|
}
|
||||||
if (config->hasSensorS8) {
|
|
||||||
if (this->CO2 >= 0) {
|
if (config->hasSensorS8 && utils::isValidCO2(this->CO2)) {
|
||||||
root["rco2"] = this->CO2;
|
root["rco2"] = this->CO2;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ag->isOne() || (ag->isPro4_2()) || ag->isPro3_3() || ag->isBasic()) {
|
if (ag->isOne() || (ag->isPro4_2()) || ag->isPro3_3() || ag->isBasic()) {
|
||||||
if (config->hasSensorPMS1) {
|
if (config->hasSensorPMS1) {
|
||||||
if (this->pm01_1 >= 0) {
|
if (utils::isValidPMS(this->pm01_1)) {
|
||||||
root["pm01"] = this->pm01_1;
|
root["pm01"] = this->pm01_1;
|
||||||
}
|
}
|
||||||
if (this->pm25_1 >= 0) {
|
if (utils::isValidPMS(this->pm25_1)) {
|
||||||
root["pm02"] = this->pm25_1;
|
root["pm02"] = this->pm25_1;
|
||||||
}
|
}
|
||||||
if (this->pm10_1 >= 0) {
|
if (utils::isValidPMS(this->pm10_1)) {
|
||||||
root["pm10"] = this->pm10_1;
|
root["pm10"] = this->pm10_1;
|
||||||
}
|
}
|
||||||
if (this->pm03PCount_1 >= 0) {
|
if (utils::isValidPMS03Count(this->pm03PCount_1)) {
|
||||||
root["pm003Count"] = this->pm03PCount_1;
|
root["pm003Count"] = this->pm03PCount_1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (config->hasSensorSHT) {
|
if (config->hasSensorSHT) {
|
||||||
if (this->Temperature > -1001) {
|
if (utils::isValidTemperature(this->Temperature)) {
|
||||||
root["atmp"] = ag->round2(this->Temperature);
|
root["atmp"] = ag->round2(this->Temperature);
|
||||||
if (localServer) {
|
if (localServer) {
|
||||||
root["atmpCompensated"] = ag->round2(this->Temperature);
|
root["atmpCompensated"] = ag->round2(this->Temperature);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (this->Humidity >= 0) {
|
if (utils::isValidHumidity(this->Humidity)) {
|
||||||
root["rhum"] = this->Humidity;
|
root["rhum"] = this->Humidity;
|
||||||
if (localServer) {
|
if (localServer) {
|
||||||
root["rhumCompensated"] = this->Humidity;
|
root["rhumCompensated"] = this->Humidity;
|
||||||
@ -50,126 +50,287 @@ String Measurements::toString(bool localServer, AgFirmwareMode fwMode, int rssi,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
if (config->hasSensorSHT && config->hasSensorPMS1) {
|
||||||
if (config->hasSensorPMS1 && config->hasSensorPMS2) {
|
int pm25 = ag->pms5003.compensated(this->pm25_1, this->Humidity);
|
||||||
root["pm01"] = ag->round2((this->pm01_1 + this->pm01_2) / 2.0);
|
if (pm25 >= 0) {
|
||||||
root["pm02"] = ag->round2((this->pm25_1 + this->pm25_2) / 2.0);
|
root["pm02Compensated"] = pm25;
|
||||||
root["pm10"] = ag->round2((this->pm10_1 + this->pm10_2) / 2.0);
|
|
||||||
root["pm003Count"] =
|
|
||||||
ag->round2((this->pm03PCount_1 + this->pm03PCount_2) / 2.0);
|
|
||||||
root["atmp"] = ag->round2((this->temp_1 + this->temp_2) / 2.0f);
|
|
||||||
root["rhum"] = ag->round2((this->hum_1 + this->hum_2) / 2.0f);
|
|
||||||
if (localServer) {
|
|
||||||
root["atmpCompensated"] =
|
|
||||||
ag->round2(ag->pms5003t_2.temperatureCompensated(
|
|
||||||
(this->temp_1 + this->temp_2) / 2.0f));
|
|
||||||
root["rhumCompensated"] = (int)ag->pms5003t_2.humidityCompensated(
|
|
||||||
(this->hum_1 + this->hum_2) / 2.0f);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fwMode == FW_MODE_O_1PS || fwMode == FW_MODE_O_1PST) {
|
} else {
|
||||||
if (config->hasSensorPMS1) {
|
if (config->hasSensorPMS1 && config->hasSensorPMS2) {
|
||||||
root["pm01"] = this->pm01_1;
|
if (utils::isValidPMS(this->pm01_1) && utils::isValidPMS(this->pm01_2)) {
|
||||||
root["pm02"] = this->pm25_1;
|
root["pm01"] = ag->round2((this->pm01_1 + this->pm01_2) / 2.0f);
|
||||||
root["pm10"] = this->pm10_1;
|
}
|
||||||
root["pm003Count"] = this->pm03PCount_1;
|
if (utils::isValidPMS(this->pm25_1) && utils::isValidPMS(this->pm25_2)) {
|
||||||
root["atmp"] = ag->round2(this->temp_1);
|
root["pm02"] = ag->round2((this->pm25_1 + this->pm25_2) / 2.0f);
|
||||||
root["rhum"] = this->hum_1;
|
}
|
||||||
|
if (utils::isValidPMS(this->pm10_1) && utils::isValidPMS(this->pm10_2)) {
|
||||||
|
root["pm10"] = ag->round2((this->pm10_1 + this->pm10_2) / 2.0f);
|
||||||
|
}
|
||||||
|
if (utils::isValidPMS(this->pm03PCount_1) && utils::isValidPMS(this->pm03PCount_2)) {
|
||||||
|
root["pm003Count"] = ag->round2((this->pm03PCount_1 + this->pm03PCount_2) / 2.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
float val;
|
||||||
|
if (utils::isValidTemperature(this->temp_1) && utils::isValidTemperature(this->temp_1)) {
|
||||||
|
root["atmp"] = ag->round2((this->temp_1 + this->temp_2) / 2.0f);
|
||||||
if (localServer) {
|
if (localServer) {
|
||||||
root["atmpCompensated"] =
|
val = ag->pms5003t_2.temperatureCompensated((this->temp_1 + this->temp_2) / 2.0f);
|
||||||
ag->round2(ag->pms5003t_1.temperatureCompensated(this->temp_1));
|
if (utils::isValidTemperature(val)) {
|
||||||
root["rhumCompensated"] =
|
root["atmpCompensated"] = ag->round2(val);
|
||||||
(int)ag->pms5003t_1.humidityCompensated(this->hum_1);
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (config->hasSensorPMS2) {
|
if (utils::isValidHumidity(this->hum_1) && utils::isValidHumidity(this->hum_1)) {
|
||||||
root["pm01"] = this->pm01_2;
|
root["rhum"] = ag->round2((this->hum_1 + this->hum_2) / 2.0f);
|
||||||
root["pm02"] = this->pm25_2;
|
|
||||||
root["pm10"] = this->pm10_2;
|
|
||||||
root["pm003Count"] = this->pm03PCount_2;
|
|
||||||
root["atmp"] = ag->round2(this->temp_2);
|
|
||||||
root["rhum"] = this->hum_2;
|
|
||||||
if (localServer) {
|
if (localServer) {
|
||||||
root["atmpCompensated"] =
|
val = ag->pms5003t_2.humidityCompensated((this->hum_1 + this->hum_2) / 2.0f);
|
||||||
ag->round2(ag->pms5003t_2.temperatureCompensated(this->temp_2));
|
if (utils::isValidHumidity(val)) {
|
||||||
root["rhumCompensated"] =
|
root["rhumCompensated"] = (int)val;
|
||||||
(int)ag->pms5003t_2.humidityCompensated(this->hum_2);
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int pm25 = (ag->pms5003t_1.compensated(this->pm25_1, this->temp_1) +
|
||||||
|
ag->pms5003t_2.compensated(this->pm25_2, this->temp_2)) /
|
||||||
|
2;
|
||||||
|
root["pm02Compensated"] = pm25;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fwMode == FW_MODE_O_1PS || fwMode == FW_MODE_O_1PST) {
|
||||||
|
float val;
|
||||||
|
if (config->hasSensorPMS1) {
|
||||||
|
if (utils::isValidPMS(this->pm01_1)) {
|
||||||
|
root["pm01"] = this->pm01_1;
|
||||||
|
}
|
||||||
|
if (utils::isValidPMS(this->pm25_1)) {
|
||||||
|
root["pm02"] = this->pm25_1;
|
||||||
|
}
|
||||||
|
if (utils::isValidPMS(this->pm10_1)) {
|
||||||
|
root["pm10"] = this->pm10_1;
|
||||||
|
}
|
||||||
|
if (utils::isValidPMS03Count(this->pm03PCount_1)) {
|
||||||
|
root["pm003Count"] = this->pm03PCount_1;
|
||||||
|
}
|
||||||
|
if (utils::isValidTemperature(this->temp_1)) {
|
||||||
|
root["atmp"] = ag->round2(this->temp_1);
|
||||||
|
|
||||||
|
if (localServer) {
|
||||||
|
val = ag->pms5003t_1.temperatureCompensated(this->temp_1);
|
||||||
|
if (utils::isValidTemperature(val)) {
|
||||||
|
root["atmpCompensated"] = ag->round2(val);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (utils::isValidHumidity(this->hum_1)) {
|
||||||
|
root["rhum"] = this->hum_1;
|
||||||
|
|
||||||
|
if (localServer) {
|
||||||
|
val = ag->pms5003t_1.humidityCompensated(this->hum_1);
|
||||||
|
if (utils::isValidHumidity(val)) {
|
||||||
|
root["rhumCompensated"] = (int)val;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
root["pm02Compensated"] = ag->pms5003t_1.compensated(this->pm25_1, this->temp_1);
|
||||||
|
}
|
||||||
|
if (config->hasSensorPMS2) {
|
||||||
|
if(utils::isValidPMS(this->pm01_2)) {
|
||||||
|
root["pm01"] = this->pm01_2;
|
||||||
|
}
|
||||||
|
if(utils::isValidPMS(this->pm25_2)) {
|
||||||
|
root["pm02"] = this->pm25_2;
|
||||||
|
}
|
||||||
|
if(utils::isValidPMS(this->pm10_2)) {
|
||||||
|
root["pm10"] = this->pm10_2;
|
||||||
|
}
|
||||||
|
if(utils::isValidPMS03Count(this->pm03PCount_2)) {
|
||||||
|
root["pm003Count"] = this->pm03PCount_2;
|
||||||
|
}
|
||||||
|
|
||||||
|
float val;
|
||||||
|
if (utils::isValidTemperature(this->temp_2)) {
|
||||||
|
root["atmp"] = ag->round2(this->temp_2);
|
||||||
|
|
||||||
|
if (localServer) {
|
||||||
|
val = ag->pms5003t_2.temperatureCompensated(this->temp_2);
|
||||||
|
if (utils::isValidTemperature(val)) {
|
||||||
|
root["atmpCompensated"] = ag->round2(val);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(utils::isValidHumidity(this->hum_2)) {
|
||||||
|
root["rhum"] = this->hum_2;
|
||||||
|
|
||||||
|
if (localServer) {
|
||||||
|
val = ag->pms5003t_2.humidityCompensated(this->hum_2);
|
||||||
|
if (utils::isValidHumidity(val)) {
|
||||||
|
root["rhumCompensated"] = (int)val;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
root["pm02Compensated"] = ag->pms5003t_2.compensated(this->pm25_2, this->temp_2);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
if (fwMode == FW_MODE_O_1P) {
|
if (fwMode == FW_MODE_O_1P) {
|
||||||
|
float val;
|
||||||
if (config->hasSensorPMS1) {
|
if (config->hasSensorPMS1) {
|
||||||
root["pm01"] = this->pm01_1;
|
if (utils::isValidPMS(this->pm01_1)) {
|
||||||
root["pm02"] = this->pm25_1;
|
root["pm01"] = this->pm01_1;
|
||||||
root["pm10"] = this->pm10_1;
|
|
||||||
root["pm003Count"] = this->pm03PCount_1;
|
|
||||||
root["atmp"] = ag->round2(this->temp_1);
|
|
||||||
root["rhum"] = this->hum_1;
|
|
||||||
if (localServer) {
|
|
||||||
root["atmpCompensated"] =
|
|
||||||
ag->round2(ag->pms5003t_1.temperatureCompensated(this->temp_1));
|
|
||||||
root["rhumCompensated"] =
|
|
||||||
(int)ag->pms5003t_1.humidityCompensated(this->hum_1);
|
|
||||||
}
|
}
|
||||||
|
if (utils::isValidPMS(this->pm25_1)) {
|
||||||
|
root["pm02"] = this->pm25_1;
|
||||||
|
}
|
||||||
|
if (utils::isValidPMS(this->pm10_1)) {
|
||||||
|
root["pm10"] = this->pm10_1;
|
||||||
|
}
|
||||||
|
if (utils::isValidPMS03Count(this->pm03PCount_1)) {
|
||||||
|
root["pm003Count"] = this->pm03PCount_1;
|
||||||
|
}
|
||||||
|
if (utils::isValidTemperature(this->temp_1)) {
|
||||||
|
root["atmp"] = ag->round2(this->temp_1);
|
||||||
|
|
||||||
|
if (localServer) {
|
||||||
|
val = ag->pms5003t_1.temperatureCompensated(this->temp_1);
|
||||||
|
if (utils::isValidTemperature(val)) {
|
||||||
|
root["atmpCompensated"] = ag->round2(val);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (utils::isValidHumidity(this->hum_1)) {
|
||||||
|
root["rhum"] = this->hum_1;
|
||||||
|
if(localServer) {
|
||||||
|
val = ag->pms5003t_1.humidityCompensated(this->hum_1);
|
||||||
|
if(utils::isValidHumidity(val)) {
|
||||||
|
root["rhumCompensated"] = (int)val;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
root["pm02Compensated"] = ag->pms5003t_1.compensated(this->pm25_1, this->temp_1);
|
||||||
} else if (config->hasSensorPMS2) {
|
} else if (config->hasSensorPMS2) {
|
||||||
root["pm01"] = this->pm01_2;
|
if(utils::isValidPMS(this->pm01_2)) {
|
||||||
root["pm02"] = this->pm25_2;
|
root["pm01"] = this->pm01_2;
|
||||||
root["pm10"] = this->pm10_2;
|
|
||||||
root["pm003Count"] = this->pm03PCount_2;
|
|
||||||
root["atmp"] = ag->round2(this->temp_2);
|
|
||||||
root["rhum"] = this->hum_2;
|
|
||||||
if (localServer) {
|
|
||||||
root["atmpCompensated"] =
|
|
||||||
ag->round2(ag->pms5003t_1.temperatureCompensated(this->temp_2));
|
|
||||||
root["rhumCompensated"] =
|
|
||||||
(int)ag->pms5003t_1.humidityCompensated(this->hum_2);
|
|
||||||
}
|
}
|
||||||
|
if(utils::isValidPMS(this->pm25_2)) {
|
||||||
|
root["pm02"] = this->pm25_2;
|
||||||
|
}
|
||||||
|
if(utils::isValidPMS(this->pm10_2)) {
|
||||||
|
root["pm10"] = this->pm10_2;
|
||||||
|
}
|
||||||
|
if(utils::isValidPMS03Count(this->pm03PCount_2)) {
|
||||||
|
root["pm003Count"] = this->pm03PCount_2;
|
||||||
|
}
|
||||||
|
if (utils::isValidTemperature(this->temp_2)) {
|
||||||
|
root["atmp"] = ag->round2(this->temp_2);
|
||||||
|
if (localServer) {
|
||||||
|
|
||||||
|
val = ag->pms5003t_1.temperatureCompensated(this->temp_2);
|
||||||
|
if (utils::isValidTemperature(val)) {
|
||||||
|
root["atmpCompensated"] = ag->round2(val);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (utils::isValidHumidity(this->hum_2)) {
|
||||||
|
root["rhum"] = this->hum_2;
|
||||||
|
|
||||||
|
if(localServer) {
|
||||||
|
val = ag->pms5003t_1.humidityCompensated(this->hum_2);
|
||||||
|
if(utils::isValidHumidity(val)) {
|
||||||
|
root["rhumCompensated"] = (int)val;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
root["pm02Compensated"] = ag->pms5003t_1.compensated(this->pm25_1, this->temp_1);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
float val;
|
||||||
if (config->hasSensorPMS1) {
|
if (config->hasSensorPMS1) {
|
||||||
root["channels"]["1"]["pm01"] = this->pm01_1;
|
if(utils::isValidPMS(this->pm01_1)) {
|
||||||
root["channels"]["1"]["pm02"] = this->pm25_1;
|
root["channels"]["1"]["pm01"] = this->pm01_1;
|
||||||
root["channels"]["1"]["pm10"] = this->pm10_1;
|
|
||||||
root["channels"]["1"]["pm003Count"] = this->pm03PCount_1;
|
|
||||||
root["channels"]["1"]["atmp"] = ag->round2(this->temp_1);
|
|
||||||
root["channels"]["1"]["rhum"] = this->hum_1;
|
|
||||||
if (localServer) {
|
|
||||||
root["channels"]["1"]["atmpCompensated"] =
|
|
||||||
ag->round2(ag->pms5003t_1.temperatureCompensated(this->temp_1));
|
|
||||||
root["channels"]["1"]["rhumCompensated"] =
|
|
||||||
(int)ag->pms5003t_1.humidityCompensated(this->hum_1);
|
|
||||||
}
|
}
|
||||||
|
if(utils::isValidPMS(this->pm25_1)) {
|
||||||
|
root["channels"]["1"]["pm02"] = this->pm25_1;
|
||||||
|
}
|
||||||
|
if(utils::isValidPMS(this->pm10_1)) {
|
||||||
|
root["channels"]["1"]["pm10"] = this->pm10_1;
|
||||||
|
}
|
||||||
|
if (utils::isValidPMS03Count(this->pm03PCount_1)) {
|
||||||
|
root["channels"]["1"]["pm003Count"] = this->pm03PCount_1;
|
||||||
|
}
|
||||||
|
if(utils::isValidTemperature(this->temp_1)) {
|
||||||
|
root["channels"]["1"]["atmp"] = ag->round2(this->temp_1);
|
||||||
|
|
||||||
|
if (localServer) {
|
||||||
|
val = ag->pms5003t_1.temperatureCompensated(this->temp_1);
|
||||||
|
if (utils::isValidTemperature(val)) {
|
||||||
|
root["channels"]["1"]["atmpCompensated"] = ag->round2(val);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (utils::isValidHumidity(this->hum_1)) {
|
||||||
|
root["channels"]["1"]["rhum"] = this->hum_1;
|
||||||
|
|
||||||
|
if (localServer) {
|
||||||
|
val = ag->pms5003t_1.humidityCompensated(this->hum_1);
|
||||||
|
if (utils::isValidHumidity(val)) {
|
||||||
|
root["channels"]["1"]["rhumCompensated"] = (int)val;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
root["channels"]["1"]["pm02Compensated"] = ag->pms5003t_1.compensated(this->pm25_1, this->temp_1);
|
||||||
}
|
}
|
||||||
if (config->hasSensorPMS2) {
|
if (config->hasSensorPMS2) {
|
||||||
root["channels"]["2"]["pm01"] = this->pm01_2;
|
float val;
|
||||||
root["channels"]["2"]["pm02"] = this->pm25_2;
|
if (utils::isValidPMS(this->pm01_2)) {
|
||||||
root["channels"]["2"]["pm10"] = this->pm10_2;
|
root["channels"]["2"]["pm01"] = this->pm01_2;
|
||||||
root["channels"]["2"]["pm003Count"] = this->pm03PCount_2;
|
|
||||||
root["channels"]["2"]["atmp"] = ag->round2(this->temp_2);
|
|
||||||
root["channels"]["2"]["rhum"] = this->hum_2;
|
|
||||||
if (localServer) {
|
|
||||||
root["channels"]["2"]["atmpCompensated"] =
|
|
||||||
ag->round2(ag->pms5003t_1.temperatureCompensated(this->temp_2));
|
|
||||||
root["channels"]["2"]["rhumCompensated"] =
|
|
||||||
(int)ag->pms5003t_1.humidityCompensated(this->hum_2);
|
|
||||||
}
|
}
|
||||||
|
if (utils::isValidPMS(this->pm25_2)) {
|
||||||
|
root["channels"]["2"]["pm02"] = this->pm25_2;
|
||||||
|
}
|
||||||
|
if (utils::isValidPMS(this->pm10_2)) {
|
||||||
|
root["channels"]["2"]["pm10"] = this->pm10_2;
|
||||||
|
}
|
||||||
|
if (utils::isValidPMS03Count(this->pm03PCount_2)) {
|
||||||
|
root["channels"]["2"]["pm003Count"] = this->pm03PCount_2;
|
||||||
|
}
|
||||||
|
if (utils::isValidTemperature(this->temp_2)) {
|
||||||
|
root["channels"]["2"]["atmp"] = ag->round2(this->temp_2);
|
||||||
|
|
||||||
|
if (localServer) {
|
||||||
|
val = ag->pms5003t_1.temperatureCompensated(this->temp_2);
|
||||||
|
if (utils::isValidTemperature(val)) {
|
||||||
|
root["channels"]["2"]["atmpCompensated"] = ag->round2(val);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (utils::isValidHumidity(this->hum_2)) {
|
||||||
|
root["channels"]["2"]["rhum"] = this->hum_2;
|
||||||
|
|
||||||
|
if (localServer) {
|
||||||
|
val = ag->pms5003t_1.humidityCompensated(this->hum_2);
|
||||||
|
if (utils::isValidHumidity(val)) {
|
||||||
|
root["channels"]["2"]["rhumCompensated"] = (int)val;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
root["channels"]["2"]["pm02Compensated"] = ag->pms5003t_2.compensated(this->pm25_2, this->temp_2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (config->hasSensorSGP) {
|
if (config->hasSensorSGP) {
|
||||||
if (this->TVOC >= 0) {
|
if (utils::isValidVOC(this->TVOC)) {
|
||||||
root["tvocIndex"] = this->TVOC;
|
root["tvocIndex"] = this->TVOC;
|
||||||
}
|
}
|
||||||
if (this->TVOCRaw >= 0) {
|
if (utils::isValidVOC(this->TVOCRaw)) {
|
||||||
root["tvocRaw"] = this->TVOCRaw;
|
root["tvocRaw"] = this->TVOCRaw;
|
||||||
}
|
}
|
||||||
if (this->NOx >= 0) {
|
if (utils::isValidNOx(this->NOx)) {
|
||||||
root["noxIndex"] = this->NOx;
|
root["noxIndex"] = this->NOx;
|
||||||
}
|
}
|
||||||
if (this->NOxRaw >= 0) {
|
if (utils::isValidNOx(this->NOxRaw)) {
|
||||||
root["noxRaw"] = this->NOxRaw;
|
root["noxRaw"] = this->NOxRaw;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -41,7 +41,14 @@ String AirGradient::getVersion(void) { return GIT_VERSION; }
|
|||||||
BoardType AirGradient::getBoardType(void) { return boardType; }
|
BoardType AirGradient::getBoardType(void) { return boardType; }
|
||||||
|
|
||||||
double AirGradient::round2(double value) {
|
double AirGradient::round2(double value) {
|
||||||
return (int)(value * 100 + 0.5) / 100.0;
|
double ret;
|
||||||
|
if (value >= 0) {
|
||||||
|
ret = (int)(value * 100 + 0.5f);
|
||||||
|
} else {
|
||||||
|
ret = (int)(value * 100 - 0.5f);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret / 100;
|
||||||
}
|
}
|
||||||
|
|
||||||
String AirGradient::getBoardName(void) {
|
String AirGradient::getBoardName(void) {
|
||||||
|
@ -12,6 +12,7 @@
|
|||||||
#include "S8/S8.h"
|
#include "S8/S8.h"
|
||||||
#include "Sgp41/Sgp41.h"
|
#include "Sgp41/Sgp41.h"
|
||||||
#include "Sht/Sht.h"
|
#include "Sht/Sht.h"
|
||||||
|
#include "Main/utils.h"
|
||||||
|
|
||||||
#ifndef GIT_VERSION
|
#ifndef GIT_VERSION
|
||||||
#define GIT_VERSION "snapshot"
|
#define GIT_VERSION "snapshot"
|
||||||
|
89
src/Main/utils.cpp
Normal file
89
src/Main/utils.cpp
Normal file
@ -0,0 +1,89 @@
|
|||||||
|
#include "utils.h"
|
||||||
|
|
||||||
|
#define VALID_TEMPERATURE_MAX (125)
|
||||||
|
#define VALID_TEMPERATURE_MIN (-40)
|
||||||
|
#define INVALID_TEMPERATURE (-1000)
|
||||||
|
|
||||||
|
#define VALID_HUMIDITY_MAX (100)
|
||||||
|
#define VALID_HUMIDITY_MIN (0)
|
||||||
|
#define INVALID_HUMIDITY (-1)
|
||||||
|
|
||||||
|
#define VALID_PMS_MAX (1000)
|
||||||
|
#define VALID_PMS_MIN (0)
|
||||||
|
#define INVALID_PMS (-1)
|
||||||
|
|
||||||
|
#define VALID_PMS03COUNT_MIN (0)
|
||||||
|
|
||||||
|
#define VALID_CO2_MAX (10000)
|
||||||
|
#define VALID_CO2_MIN (0)
|
||||||
|
#define INVALID_CO2 (-1)
|
||||||
|
|
||||||
|
#define VALID_NOX_MIN (0)
|
||||||
|
#define VALID_VOC_MIN (0)
|
||||||
|
#define INVALID_NOX (-1)
|
||||||
|
#define INVALID_VOC (-1)
|
||||||
|
|
||||||
|
utils::utils(/* args */) {}
|
||||||
|
|
||||||
|
utils::~utils() {}
|
||||||
|
|
||||||
|
bool utils::isValidTemperature(float value) {
|
||||||
|
if ((value >= VALID_TEMPERATURE_MIN) && (value <= VALID_TEMPERATURE_MAX)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool utils::isValidHumidity(float value) {
|
||||||
|
if ((value >= VALID_HUMIDITY_MIN) && (value <= VALID_HUMIDITY_MAX)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool utils::isValidCO2(int16_t value) {
|
||||||
|
if ((value >= VALID_CO2_MIN) && (value <= VALID_CO2_MAX)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool utils::isValidPMS(int value) {
|
||||||
|
if ((value >= VALID_PMS_MIN) && (value <= VALID_PMS_MAX)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool utils::isValidPMS03Count(int value) {
|
||||||
|
if (value >= VALID_PMS03COUNT_MIN) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool utils::isValidNOx(int value) {
|
||||||
|
if (value >= VALID_NOX_MIN) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool utils::isValidVOC(int value) {
|
||||||
|
if (value >= VALID_VOC_MIN) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
float utils::getInvalidTemperature(void) { return INVALID_TEMPERATURE; }
|
||||||
|
|
||||||
|
float utils::getInvalidHumidity(void) { return INVALID_HUMIDITY; }
|
||||||
|
|
||||||
|
int utils::getInvalidCO2(void) { return INVALID_CO2; }
|
||||||
|
|
||||||
|
int utils::getInvalidPMS(void) { return INVALID_PMS; }
|
||||||
|
|
||||||
|
int utils::getInvalidNOx(void) { return INVALID_NOX; }
|
||||||
|
|
||||||
|
int utils::getInvalidVOC(void) { return INVALID_VOC; }
|
30
src/Main/utils.h
Normal file
30
src/Main/utils.h
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
#ifndef _UTILS_H_
|
||||||
|
#define _UTILS_H_
|
||||||
|
|
||||||
|
#include <Arduino.h>
|
||||||
|
|
||||||
|
class utils
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
/* data */
|
||||||
|
public:
|
||||||
|
utils(/* args */);
|
||||||
|
~utils();
|
||||||
|
|
||||||
|
static bool isValidTemperature(float value);
|
||||||
|
static bool isValidHumidity(float value);
|
||||||
|
static bool isValidCO2(int16_t value);
|
||||||
|
static bool isValidPMS(int value);
|
||||||
|
static bool isValidPMS03Count(int value);
|
||||||
|
static bool isValidNOx(int value);
|
||||||
|
static bool isValidVOC(int value);
|
||||||
|
static float getInvalidTemperature(void);
|
||||||
|
static float getInvalidHumidity(void);
|
||||||
|
static int getInvalidCO2(void);
|
||||||
|
static int getInvalidPMS(void);
|
||||||
|
static int getInvalidNOx(void);
|
||||||
|
static int getInvalidVOC(void);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif /** _UTILS_H_ */
|
@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Init and check that sensor has connected
|
* @brief Init and check that sensor has connected
|
||||||
*
|
*
|
||||||
* @param stream UART stream
|
* @param stream UART stream
|
||||||
* @return true Sucecss
|
* @return true Sucecss
|
||||||
* @return false Failure
|
* @return false Failure
|
||||||
@ -86,7 +86,7 @@ void PMSBase::handle() {
|
|||||||
case 2: {
|
case 2: {
|
||||||
buf[bufIndex++] = value;
|
buf[bufIndex++] = value;
|
||||||
if (bufIndex >= 4) {
|
if (bufIndex >= 4) {
|
||||||
len = toValue(&buf[2]);
|
len = toI16(&buf[2]);
|
||||||
if (len != 28) {
|
if (len != 28) {
|
||||||
// Serial.printf("Got good bad len %d\r\n", len);
|
// Serial.printf("Got good bad len %d\r\n", len);
|
||||||
len += 4;
|
len += 4;
|
||||||
@ -152,98 +152,98 @@ bool PMSBase::isFailed(void) { return failed; }
|
|||||||
*
|
*
|
||||||
* @return uint16_t
|
* @return uint16_t
|
||||||
*/
|
*/
|
||||||
uint16_t PMSBase::getRaw0_1(void) { return toValue(&package[4]); }
|
uint16_t PMSBase::getRaw0_1(void) { return toU16(&package[4]); }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Read PMS 2.5 ug/m3 with CF = 1 PM estimates
|
* @brief Read PMS 2.5 ug/m3 with CF = 1 PM estimates
|
||||||
*
|
*
|
||||||
* @return uint16_t
|
* @return uint16_t
|
||||||
*/
|
*/
|
||||||
uint16_t PMSBase::getRaw2_5(void) { return toValue(&package[6]); }
|
uint16_t PMSBase::getRaw2_5(void) { return toU16(&package[6]); }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Read PMS 10 ug/m3 with CF = 1 PM estimates
|
* @brief Read PMS 10 ug/m3 with CF = 1 PM estimates
|
||||||
*
|
*
|
||||||
* @return uint16_t
|
* @return uint16_t
|
||||||
*/
|
*/
|
||||||
uint16_t PMSBase::getRaw10(void) { return toValue(&package[8]); }
|
uint16_t PMSBase::getRaw10(void) { return toU16(&package[8]); }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Read PMS 0.1 ug/m3
|
* @brief Read PMS 0.1 ug/m3
|
||||||
*
|
*
|
||||||
* @return uint16_t
|
* @return uint16_t
|
||||||
*/
|
*/
|
||||||
uint16_t PMSBase::getPM0_1(void) { return toValue(&package[10]); }
|
uint16_t PMSBase::getPM0_1(void) { return toU16(&package[10]); }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Read PMS 2.5 ug/m3
|
* @brief Read PMS 2.5 ug/m3
|
||||||
*
|
*
|
||||||
* @return uint16_t
|
* @return uint16_t
|
||||||
*/
|
*/
|
||||||
uint16_t PMSBase::getPM2_5(void) { return toValue(&package[12]); }
|
uint16_t PMSBase::getPM2_5(void) { return toU16(&package[12]); }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Read PMS 10 ug/m3
|
* @brief Read PMS 10 ug/m3
|
||||||
*
|
*
|
||||||
* @return uint16_t
|
* @return uint16_t
|
||||||
*/
|
*/
|
||||||
uint16_t PMSBase::getPM10(void) { return toValue(&package[14]); }
|
uint16_t PMSBase::getPM10(void) { return toU16(&package[14]); }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Get numnber concentrations over 0.3 um/0.1L
|
* @brief Get numnber concentrations over 0.3 um/0.1L
|
||||||
*
|
*
|
||||||
* @return uint16_t
|
* @return uint16_t
|
||||||
*/
|
*/
|
||||||
uint16_t PMSBase::getCount0_3(void) { return toValue(&package[16]); }
|
uint16_t PMSBase::getCount0_3(void) { return toU16(&package[16]); }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Get numnber concentrations over 0.5 um/0.1L
|
* @brief Get numnber concentrations over 0.5 um/0.1L
|
||||||
*
|
*
|
||||||
* @return uint16_t
|
* @return uint16_t
|
||||||
*/
|
*/
|
||||||
uint16_t PMSBase::getCount0_5(void) { return toValue(&package[18]); }
|
uint16_t PMSBase::getCount0_5(void) { return toU16(&package[18]); }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Get numnber concentrations over 1.0 um/0.1L
|
* @brief Get numnber concentrations over 1.0 um/0.1L
|
||||||
*
|
*
|
||||||
* @return uint16_t
|
* @return uint16_t
|
||||||
*/
|
*/
|
||||||
uint16_t PMSBase::getCount1_0(void) { return toValue(&package[20]); }
|
uint16_t PMSBase::getCount1_0(void) { return toU16(&package[20]); }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Get numnber concentrations over 2.5 um/0.1L
|
* @brief Get numnber concentrations over 2.5 um/0.1L
|
||||||
*
|
*
|
||||||
* @return uint16_t
|
* @return uint16_t
|
||||||
*/
|
*/
|
||||||
uint16_t PMSBase::getCount2_5(void) { return toValue(&package[22]); }
|
uint16_t PMSBase::getCount2_5(void) { return toU16(&package[22]); }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Get numnber concentrations over 5.0 um/0.1L (only PMS5003)
|
* @brief Get numnber concentrations over 5.0 um/0.1L (only PMS5003)
|
||||||
*
|
*
|
||||||
* @return uint16_t
|
* @return uint16_t
|
||||||
*/
|
*/
|
||||||
uint16_t PMSBase::getCount5_0(void) { return toValue(&package[24]); }
|
uint16_t PMSBase::getCount5_0(void) { return toU16(&package[24]); }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Get numnber concentrations over 10.0 um/0.1L (only PMS5003)
|
* @brief Get numnber concentrations over 10.0 um/0.1L (only PMS5003)
|
||||||
*
|
*
|
||||||
* @return uint16_t
|
* @return uint16_t
|
||||||
*/
|
*/
|
||||||
uint16_t PMSBase::getCount10(void) { return toValue(&package[26]); }
|
uint16_t PMSBase::getCount10(void) { return toU16(&package[26]); }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Get temperature (only PMS5003T)
|
* @brief Get temperature (only PMS5003T)
|
||||||
*
|
*
|
||||||
* @return uint16_t
|
* @return uint16_t
|
||||||
*/
|
*/
|
||||||
uint16_t PMSBase::getTemp(void) { return toValue(&package[24]); }
|
int16_t PMSBase::getTemp(void) { return toI16(&package[24]); }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Get humidity (only PMS5003T)
|
* @brief Get humidity (only PMS5003T)
|
||||||
*
|
*
|
||||||
* @return uint16_t
|
* @return uint16_t
|
||||||
*/
|
*/
|
||||||
uint16_t PMSBase::getHum(void) { return toValue(&package[26]); }
|
uint16_t PMSBase::getHum(void) { return toU16(&package[26]); }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Convert PMS2.5 to US AQI unit
|
* @brief Convert PMS2.5 to US AQI unit
|
||||||
@ -270,13 +270,58 @@ int PMSBase::pm25ToAQI(int pm02) {
|
|||||||
return 500;
|
return 500;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Correction PM2.5
|
||||||
|
*
|
||||||
|
* @param pm25 Raw PM2.5 value
|
||||||
|
* @param humidity Humidity value (%)
|
||||||
|
* @return int
|
||||||
|
*/
|
||||||
|
int PMSBase::compensated(int pm25, float humidity) {
|
||||||
|
float value;
|
||||||
|
if (humidity < 0) {
|
||||||
|
humidity = 0;
|
||||||
|
}
|
||||||
|
if (humidity > 100) {
|
||||||
|
humidity = 100;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(pm25 < 30) {
|
||||||
|
value = (pm25 * 0.524f) - (humidity * 0.0862f) + 5.75f;
|
||||||
|
} else if(pm25 < 50) {
|
||||||
|
value = (0.786f * (pm25 / 20 - 3 / 2) + 0.524f * (1 - (pm25 / 20 - 3 / 2))) * pm25 - (0.0862f * humidity) + 5.75f;
|
||||||
|
} else if(pm25 < 210) {
|
||||||
|
value = (0.786f * pm25) - (0.0862f * humidity) + 5.75f;
|
||||||
|
} else if(pm25 < 260) {
|
||||||
|
value = (0.69f * (pm25/50 - 21/5) + 0.786f * (1 - (pm25/50 - 21/5))) * pm25 - (0.0862f * humidity * (1 - (pm25/50 - 21/5))) + (2.966f * (pm25/50 -21/5)) + (5.75f * (1 - (pm25/50 - 21/5))) + (8.84f * (1.e-4) * pm25* (pm25/50 - 21/5));
|
||||||
|
} else {
|
||||||
|
value = 2.966f + (0.69f * pm25) + (8.84f * (1.e-4) * pm25);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(value < 0) {
|
||||||
|
value = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (int)value;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Convert two byte value to uint16_t value
|
* @brief Convert two byte value to uint16_t value
|
||||||
*
|
*
|
||||||
* @param buf bytes array (must be >= 2)
|
* @param buf bytes array (must be >= 2)
|
||||||
* @return uint16_t
|
* @return int16_t
|
||||||
*/
|
*/
|
||||||
uint16_t PMSBase::toValue(char *buf) { return (buf[0] << 8) | buf[1]; }
|
int16_t PMSBase::toI16(char *buf) {
|
||||||
|
int16_t value = buf[0];
|
||||||
|
value = (value << 8) | buf[1];
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t PMSBase::toU16(char *buf) {
|
||||||
|
uint16_t value = buf[0];
|
||||||
|
value = (value << 8) | buf[1];
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Validate package data
|
* @brief Validate package data
|
||||||
@ -290,7 +335,7 @@ bool PMSBase::validate(char *buf) {
|
|||||||
for (int i = 0; i < 30; i++) {
|
for (int i = 0; i < 30; i++) {
|
||||||
sum += buf[i];
|
sum += buf[i];
|
||||||
}
|
}
|
||||||
if (sum == toValue(&buf[30])) {
|
if (sum == toU16(&buf[30])) {
|
||||||
for (int i = 0; i < 32; i++) {
|
for (int i = 0; i < 32; i++) {
|
||||||
package[i] = buf[i];
|
package[i] = buf[i];
|
||||||
}
|
}
|
||||||
|
@ -24,10 +24,11 @@ public:
|
|||||||
uint16_t getCount10(void);
|
uint16_t getCount10(void);
|
||||||
|
|
||||||
/** For PMS5003T*/
|
/** For PMS5003T*/
|
||||||
uint16_t getTemp(void);
|
int16_t getTemp(void);
|
||||||
uint16_t getHum(void);
|
uint16_t getHum(void);
|
||||||
|
|
||||||
int pm25ToAQI(int pm02);
|
int pm25ToAQI(int pm02);
|
||||||
|
int compensated(int pm25, float humidity);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Stream *stream;
|
Stream *stream;
|
||||||
@ -36,7 +37,8 @@ private:
|
|||||||
bool failed = false;
|
bool failed = false;
|
||||||
uint32_t lastRead;
|
uint32_t lastRead;
|
||||||
|
|
||||||
uint16_t toValue(char *buf);
|
int16_t toI16(char *buf);
|
||||||
|
uint16_t toU16(char* buf);
|
||||||
bool validate(char *buf);
|
bool validate(char *buf);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
#include "PMS5003.h"
|
#include "PMS5003.h"
|
||||||
#include "Arduino.h"
|
#include "Arduino.h"
|
||||||
|
#include "../Main/utils.h"
|
||||||
|
|
||||||
#if defined(ESP8266)
|
#if defined(ESP8266)
|
||||||
#include <SoftwareSerial.h>
|
#include <SoftwareSerial.h>
|
||||||
@ -108,7 +109,9 @@ int PMS5003::getPm10Ae(void) { return pms.getPM10(); }
|
|||||||
*
|
*
|
||||||
* @return int PM0.3 index
|
* @return int PM0.3 index
|
||||||
*/
|
*/
|
||||||
int PMS5003::getPm03ParticleCount(void) { return pms.getCount0_3(); }
|
int PMS5003::getPm03ParticleCount(void) {
|
||||||
|
return pms.getCount0_3();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Convert PM2.5 to US AQI
|
* @brief Convert PM2.5 to US AQI
|
||||||
@ -118,6 +121,17 @@ int PMS5003::getPm03ParticleCount(void) { return pms.getCount0_3(); }
|
|||||||
*/
|
*/
|
||||||
int PMS5003::convertPm25ToUsAqi(int pm25) { return pms.pm25ToAQI(pm25); }
|
int PMS5003::convertPm25ToUsAqi(int pm25) { return pms.pm25ToAQI(pm25); }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Correct PM2.5
|
||||||
|
*
|
||||||
|
* @param pm25 PM2.5 raw value
|
||||||
|
* @param humidity Humidity value
|
||||||
|
* @return float
|
||||||
|
*/
|
||||||
|
int PMS5003::compensated(int pm25, float humidity) {
|
||||||
|
return pms.compensated(pm25, humidity);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Check device initialized or not
|
* @brief Check device initialized or not
|
||||||
*
|
*
|
||||||
|
@ -24,6 +24,7 @@ public:
|
|||||||
int getPm10Ae(void);
|
int getPm10Ae(void);
|
||||||
int getPm03ParticleCount(void);
|
int getPm03ParticleCount(void);
|
||||||
int convertPm25ToUsAqi(int pm25);
|
int convertPm25ToUsAqi(int pm25);
|
||||||
|
int compensated(int pm25, float humidity);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool _isBegin = false;
|
bool _isBegin = false;
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
#include "PMS5003T.h"
|
#include "PMS5003T.h"
|
||||||
#include "Arduino.h"
|
#include "Arduino.h"
|
||||||
|
#include "../Main/utils.h"
|
||||||
|
|
||||||
#if defined(ESP8266)
|
#if defined(ESP8266)
|
||||||
#include <SoftwareSerial.h>
|
#include <SoftwareSerial.h>
|
||||||
@ -133,7 +134,9 @@ int PMS5003T::getPm10Ae(void) { return pms.getPM10(); }
|
|||||||
*
|
*
|
||||||
* @return int PM 0.3 Count index
|
* @return int PM 0.3 Count index
|
||||||
*/
|
*/
|
||||||
int PMS5003T::getPm03ParticleCount(void) { return pms.getCount0_3(); }
|
int PMS5003T::getPm03ParticleCount(void) {
|
||||||
|
return pms.getCount0_3();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Convert PM2.5 to US AQI
|
* @brief Convert PM2.5 to US AQI
|
||||||
@ -149,7 +152,7 @@ int PMS5003T::convertPm25ToUsAqi(int pm25) { return pms.pm25ToAQI(pm25); }
|
|||||||
* @return float Degree Celcius
|
* @return float Degree Celcius
|
||||||
*/
|
*/
|
||||||
float PMS5003T::getTemperature(void) {
|
float PMS5003T::getTemperature(void) {
|
||||||
return pms.getTemp()/10.0f;
|
return pms.getTemp() / 10.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -158,7 +161,18 @@ float PMS5003T::getTemperature(void) {
|
|||||||
* @return float Percent (%)
|
* @return float Percent (%)
|
||||||
*/
|
*/
|
||||||
float PMS5003T::getRelativeHumidity(void) {
|
float PMS5003T::getRelativeHumidity(void) {
|
||||||
return pms.getHum()/10.0f;
|
return pms.getHum() / 10.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Correct PM2.5
|
||||||
|
*
|
||||||
|
* @param pm25 PM2.5 raw value
|
||||||
|
* @param humidity Humidity value
|
||||||
|
* @return float
|
||||||
|
*/
|
||||||
|
float PMS5003T::compensated(int pm25, float humidity) {
|
||||||
|
return pms.compensated(pm25, humidity);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -29,6 +29,7 @@ public:
|
|||||||
int convertPm25ToUsAqi(int pm25);
|
int convertPm25ToUsAqi(int pm25);
|
||||||
float getTemperature(void);
|
float getTemperature(void);
|
||||||
float getRelativeHumidity(void);
|
float getRelativeHumidity(void);
|
||||||
|
float compensated(int pm25, float humidity);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool _isBegin = false;
|
bool _isBegin = false;
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
#include "S8.h"
|
#include "S8.h"
|
||||||
#include "mb_crc.h"
|
#include "mb_crc.h"
|
||||||
|
#include "../Main/utils.h"
|
||||||
#if defined(ESP8266)
|
#if defined(ESP8266)
|
||||||
#include <SoftwareSerial.h>
|
#include <SoftwareSerial.h>
|
||||||
#else
|
#else
|
||||||
@ -103,7 +104,7 @@ void S8::getFirmwareVersion(char firmver[]) {
|
|||||||
*/
|
*/
|
||||||
int32_t S8::getSensorTypeId(void) {
|
int32_t S8::getSensorTypeId(void) {
|
||||||
if (this->isBegin() == false) {
|
if (this->isBegin() == false) {
|
||||||
return -1;
|
return utils::getInvalidCO2();
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t sensorType = 0;
|
int32_t sensorType = 0;
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
#include "../Libraries/SensirionSGP41/src/SensirionI2CSgp41.h"
|
#include "../Libraries/SensirionSGP41/src/SensirionI2CSgp41.h"
|
||||||
#include "../Libraries/Sensirion_Gas_Index_Algorithm/src/NOxGasIndexAlgorithm.h"
|
#include "../Libraries/Sensirion_Gas_Index_Algorithm/src/NOxGasIndexAlgorithm.h"
|
||||||
#include "../Libraries/Sensirion_Gas_Index_Algorithm/src/VOCGasIndexAlgorithm.h"
|
#include "../Libraries/Sensirion_Gas_Index_Algorithm/src/VOCGasIndexAlgorithm.h"
|
||||||
|
#include "../Main/utils.h"
|
||||||
|
|
||||||
#define sgpSensor() ((SensirionI2CSgp41 *)(this->_sensor))
|
#define sgpSensor() ((SensirionI2CSgp41 *)(this->_sensor))
|
||||||
#define vocAlgorithm() ((VOCGasIndexAlgorithm *)(this->_vocAlgorithm))
|
#define vocAlgorithm() ((VOCGasIndexAlgorithm *)(this->_vocAlgorithm))
|
||||||
@ -66,6 +67,7 @@ bool Sgp41::begin(TwoWire &wire) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
onConditioning = true;
|
onConditioning = true;
|
||||||
|
_handleFailCount = 0;
|
||||||
#ifdef ESP32
|
#ifdef ESP32
|
||||||
/** Create task */
|
/** Create task */
|
||||||
xTaskCreate(
|
xTaskCreate(
|
||||||
@ -108,7 +110,21 @@ void Sgp41::handle(void) {
|
|||||||
noxRaw = srawNox;
|
noxRaw = srawNox;
|
||||||
nox = noxAlgorithm()->process(srawNox);
|
nox = noxAlgorithm()->process(srawNox);
|
||||||
tvoc = vocAlgorithm()->process(srawVoc);
|
tvoc = vocAlgorithm()->process(srawVoc);
|
||||||
|
|
||||||
|
_handleFailCount = 0;
|
||||||
// AgLog("Polling SGP41 success: tvoc: %d, nox: %d", tvoc, nox);
|
// AgLog("Polling SGP41 success: tvoc: %d, nox: %d", tvoc, nox);
|
||||||
|
} else {
|
||||||
|
if(_handleFailCount < 5) {
|
||||||
|
_handleFailCount++;
|
||||||
|
AgLog("Polling SGP41 failed: %d", _handleFailCount);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_handleFailCount >= 5) {
|
||||||
|
tvocRaw = utils::getInvalidVOC();
|
||||||
|
tvoc = utils::getInvalidVOC();
|
||||||
|
noxRaw = utils::getInvalidNOx();
|
||||||
|
nox = utils::getInvalidNOx();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -141,7 +157,21 @@ void Sgp41::_handle(void) {
|
|||||||
noxRaw = srawNox;
|
noxRaw = srawNox;
|
||||||
nox = noxAlgorithm()->process(srawNox);
|
nox = noxAlgorithm()->process(srawNox);
|
||||||
tvoc = vocAlgorithm()->process(srawVoc);
|
tvoc = vocAlgorithm()->process(srawVoc);
|
||||||
|
|
||||||
|
_handleFailCount = 0;
|
||||||
// AgLog("Polling SGP41 success: tvoc: %d, nox: %d", tvoc, nox);
|
// AgLog("Polling SGP41 success: tvoc: %d, nox: %d", tvoc, nox);
|
||||||
|
} else {
|
||||||
|
if(_handleFailCount < 5) {
|
||||||
|
_handleFailCount++;
|
||||||
|
AgLog("Polling SGP41 failed: %d", _handleFailCount);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_handleFailCount >= 5) {
|
||||||
|
tvocRaw = utils::getInvalidVOC();
|
||||||
|
tvoc = utils::getInvalidVOC();
|
||||||
|
noxRaw = utils::getInvalidNOx();
|
||||||
|
nox = utils::getInvalidNOx();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -176,7 +206,7 @@ void Sgp41::end(void) {
|
|||||||
*/
|
*/
|
||||||
int Sgp41::getTvocIndex(void) {
|
int Sgp41::getTvocIndex(void) {
|
||||||
if (onConditioning) {
|
if (onConditioning) {
|
||||||
return -1;
|
return utils::getInvalidVOC();
|
||||||
}
|
}
|
||||||
return tvoc;
|
return tvoc;
|
||||||
}
|
}
|
||||||
@ -188,7 +218,7 @@ int Sgp41::getTvocIndex(void) {
|
|||||||
*/
|
*/
|
||||||
int Sgp41::getNoxIndex(void) {
|
int Sgp41::getNoxIndex(void) {
|
||||||
if (onConditioning) {
|
if (onConditioning) {
|
||||||
return -1;
|
return utils::getInvalidNOx();
|
||||||
}
|
}
|
||||||
return nox;
|
return nox;
|
||||||
}
|
}
|
||||||
|
@ -35,6 +35,7 @@ private:
|
|||||||
bool onConditioning = true;
|
bool onConditioning = true;
|
||||||
bool ready = false;
|
bool ready = false;
|
||||||
bool _isBegin = false;
|
bool _isBegin = false;
|
||||||
|
uint8_t _handleFailCount = 0;
|
||||||
void *_sensor;
|
void *_sensor;
|
||||||
void *_vocAlgorithm;
|
void *_vocAlgorithm;
|
||||||
void *_noxAlgorithm;
|
void *_noxAlgorithm;
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
#include "Sht.h"
|
#include "Sht.h"
|
||||||
|
|
||||||
#include "../Libraries/arduino-sht/SHTSensor.h"
|
#include "../Libraries/arduino-sht/SHTSensor.h"
|
||||||
|
#include "../Main/utils.h"
|
||||||
|
|
||||||
/** Cast _sensor to SHTSensor */
|
/** Cast _sensor to SHTSensor */
|
||||||
#define shtSensor() ((SHTSensor *)(this->_sensor))
|
#define shtSensor() ((SHTSensor *)(this->_sensor))
|
||||||
@ -131,14 +132,18 @@ void Sht::end(void) {
|
|||||||
*
|
*
|
||||||
* @return float
|
* @return float
|
||||||
*/
|
*/
|
||||||
float Sht::getTemperature(void) { return shtSensor()->getTemperature(); }
|
float Sht::getTemperature(void) {
|
||||||
|
return shtSensor()->getTemperature();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Get humidity
|
* @brief Get humidity
|
||||||
*
|
*
|
||||||
* @return float
|
* @return float
|
||||||
*/
|
*/
|
||||||
float Sht::getRelativeHumidity(void) { return shtSensor()->getHumidity(); }
|
float Sht::getRelativeHumidity(void) {
|
||||||
|
return shtSensor()->getHumidity();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Measure temperature and humidity
|
* @brief Measure temperature and humidity
|
||||||
|
Reference in New Issue
Block a user