mirror of
https://github.com/airgradienthq/arduino.git
synced 2025-07-30 08:57:17 +02:00
@ -249,6 +249,8 @@ public:
|
|||||||
if ((retCode == 200) || (retCode == 429)) {
|
if ((retCode == 200) || (retCode == 429)) {
|
||||||
serverFailed = false;
|
serverFailed = false;
|
||||||
return true;
|
return true;
|
||||||
|
} else {
|
||||||
|
Serial.printf("Post response failed code: %d\r\n", retCode);
|
||||||
}
|
}
|
||||||
serverFailed = true;
|
serverFailed = true;
|
||||||
return false;
|
return false;
|
||||||
|
@ -338,6 +338,8 @@ public:
|
|||||||
if ((retCode == 200) || (retCode == 429)) {
|
if ((retCode == 200) || (retCode == 429)) {
|
||||||
serverFailed = false;
|
serverFailed = false;
|
||||||
return true;
|
return true;
|
||||||
|
} else {
|
||||||
|
Serial.printf("Post response failed code: %d\r\n", retCode);
|
||||||
}
|
}
|
||||||
serverFailed = true;
|
serverFailed = true;
|
||||||
return false;
|
return false;
|
||||||
@ -483,6 +485,7 @@ private:
|
|||||||
if (EEPROM.readBytes(0, &config, sizeof(config)) != sizeof(config)) {
|
if (EEPROM.readBytes(0, &config, sizeof(config)) != sizeof(config)) {
|
||||||
config.inF = false;
|
config.inF = false;
|
||||||
config.inUSAQI = false;
|
config.inUSAQI = false;
|
||||||
|
config.useRGBLedBar = UseLedBarCO2; // default use LED bar for CO2
|
||||||
memset(config.models, 0, sizeof(config.models));
|
memset(config.models, 0, sizeof(config.models));
|
||||||
memset(config.mqttBrokers, 0, sizeof(config.mqttBrokers));
|
memset(config.mqttBrokers, 0, sizeof(config.mqttBrokers));
|
||||||
|
|
||||||
@ -740,14 +743,18 @@ void setup() {
|
|||||||
|
|
||||||
/** Show boot display */
|
/** Show boot display */
|
||||||
Serial.println("Firmware Version: " + ag.getVersion());
|
Serial.println("Firmware Version: " + ag.getVersion());
|
||||||
displayShowText("One V9", "FW Ver: " + ag.getVersion(), "");
|
displayShowText("AirGradient ONE", "FW Version: ", ag.getVersion());
|
||||||
|
|
||||||
|
boardInit();
|
||||||
delay(DISPLAY_DELAY_SHOW_CONTENT_MS);
|
delay(DISPLAY_DELAY_SHOW_CONTENT_MS);
|
||||||
|
|
||||||
/** Init sensor */
|
/** Init sensor */
|
||||||
boardInit();
|
|
||||||
|
|
||||||
/** Init AirGradient server */
|
/** Init AirGradient server */
|
||||||
agServer.begin();
|
agServer.begin();
|
||||||
|
if (agServer.getLedBarMode() == UseLedBarOff) {
|
||||||
|
ag.ledBar.setEnable(false);
|
||||||
|
}
|
||||||
|
|
||||||
/** Run LED test on start up */
|
/** Run LED test on start up */
|
||||||
displayShowText("Press now for", "LED test &", "offline mode");
|
displayShowText("Press now for", "LED test &", "offline mode");
|
||||||
@ -797,6 +804,8 @@ void setup() {
|
|||||||
dispSmHandler(APP_SM_WIFI_OK_SERVER_OK_SENSOR_CONFIG_FAILED);
|
dispSmHandler(APP_SM_WIFI_OK_SERVER_OK_SENSOR_CONFIG_FAILED);
|
||||||
ledSmHandler(APP_SM_WIFI_OK_SERVER_OK_SENSOR_CONFIG_FAILED);
|
ledSmHandler(APP_SM_WIFI_OK_SERVER_OK_SENSOR_CONFIG_FAILED);
|
||||||
delay(DISPLAY_DELAY_SHOW_CONTENT_MS);
|
delay(DISPLAY_DELAY_SHOW_CONTENT_MS);
|
||||||
|
} else {
|
||||||
|
ag.ledBar.setEnable(agServer.getLedBarMode() != UseLedBarOff);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1484,7 +1493,7 @@ static void connectToWifi() {
|
|||||||
ledSmState = APP_SM_WIFI_MANAGER_STA_CONNECTING;
|
ledSmState = APP_SM_WIFI_MANAGER_STA_CONNECTING;
|
||||||
});
|
});
|
||||||
|
|
||||||
displayShowText("Connecting to", "config WiFi", "...");
|
displayShowText("Connecting to", "WiFi", "...");
|
||||||
wifiManager.autoConnect(wifiSSID.c_str(), WIFI_HOTSPOT_PASSWORD_DEFAULT);
|
wifiManager.autoConnect(wifiSSID.c_str(), WIFI_HOTSPOT_PASSWORD_DEFAULT);
|
||||||
xTaskCreate(
|
xTaskCreate(
|
||||||
[](void *obj) {
|
[](void *obj) {
|
||||||
@ -1759,21 +1768,24 @@ static void updateServerConfiguration(void) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Update LED bar
|
||||||
|
ag.ledBar.setEnable(agServer.getLedBarMode() != UseLedBarOff);
|
||||||
|
|
||||||
if (agServer.getCo2AbcDaysConfig() > 0) {
|
if (agServer.getCo2AbcDaysConfig() > 0) {
|
||||||
if (hasSensorS8) {
|
if (hasSensorS8) {
|
||||||
int newHour = agServer.getCo2AbcDaysConfig() * 24;
|
int newHour = agServer.getCo2AbcDaysConfig() * 24;
|
||||||
Serial.printf("abcDays config: %d days(%d hours)\r\n",
|
Serial.printf("Requested abcDays setting: %d days (%d hours)\r\n",
|
||||||
agServer.getCo2AbcDaysConfig(), newHour);
|
agServer.getCo2AbcDaysConfig(), newHour);
|
||||||
int curHour = ag.s8.getAbcPeriod();
|
int curHour = ag.s8.getAbcPeriod();
|
||||||
Serial.printf("Current config: %d (hours)\r\n", curHour);
|
Serial.printf("Current S8 abcDays setting: %d (hours)\r\n", curHour);
|
||||||
if (curHour == newHour) {
|
if (curHour == newHour) {
|
||||||
Serial.println("Set 'abcDays' ignored");
|
Serial.println("'abcDays' unchanged");
|
||||||
} else {
|
} else {
|
||||||
if (ag.s8.setAbcPeriod(agServer.getCo2AbcDaysConfig() * 24) ==
|
if (ag.s8.setAbcPeriod(agServer.getCo2AbcDaysConfig() * 24) ==
|
||||||
false) {
|
false) {
|
||||||
Serial.println("Set S8 abcDays period calibration failed");
|
Serial.println("Set S8 abcDays period failed");
|
||||||
} else {
|
} else {
|
||||||
Serial.println("Set S8 abcDays period calibration success");
|
Serial.println("Set S8 abcDays period success");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@ -2135,9 +2147,11 @@ static void sensorLedColorHandler(void) {
|
|||||||
case UseLedBarPM:
|
case UseLedBarPM:
|
||||||
setRGBledPMcolor(pm25);
|
setRGBledPMcolor(pm25);
|
||||||
break;
|
break;
|
||||||
|
case UseLedBarOff:
|
||||||
|
ag.ledBar.clear();
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
ag.ledBar.setColor(0, 0, 0, ag.ledBar.getNumberOfLeds() - 1);
|
ag.ledBar.clear();
|
||||||
ag.ledBar.setColor(0, 0, 0, ag.ledBar.getNumberOfLeds() - 2);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2274,6 +2288,11 @@ static void tempHumUpdate(void) {
|
|||||||
|
|
||||||
Serial.printf("Temperature in C: %0.2f\r\n", temp);
|
Serial.printf("Temperature in C: %0.2f\r\n", temp);
|
||||||
Serial.printf("Relative Humidity: %d\r\n", hum);
|
Serial.printf("Relative Humidity: %d\r\n", hum);
|
||||||
|
|
||||||
|
// Update compensation temperature and humidity for SGP41
|
||||||
|
if (hasSensorSGP) {
|
||||||
|
ag.sgp41.setCompensationTemperatureHumidity(temp, hum);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
Serial.println("SHT read failed");
|
Serial.println("SHT read failed");
|
||||||
}
|
}
|
||||||
|
@ -339,6 +339,8 @@ public:
|
|||||||
if ((retCode == 200) || (retCode == 429)) {
|
if ((retCode == 200) || (retCode == 429)) {
|
||||||
serverFailed = false;
|
serverFailed = false;
|
||||||
return true;
|
return true;
|
||||||
|
} else {
|
||||||
|
Serial.printf("Post response failed code: %d\r\n", retCode);
|
||||||
}
|
}
|
||||||
serverFailed = true;
|
serverFailed = true;
|
||||||
return false;
|
return false;
|
||||||
@ -1202,6 +1204,25 @@ static void pmUpdate(void) {
|
|||||||
pm2hum = 0;
|
pm2hum = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (hasSensorSGP) {
|
||||||
|
float temp;
|
||||||
|
float hum;
|
||||||
|
if (pmsResult_1 && pmsResult_2) {
|
||||||
|
temp = (temp_1 + temp_2) / 2.0f;
|
||||||
|
hum = (hum_1 + hum_2) / 2.0f;
|
||||||
|
} else {
|
||||||
|
if (pmsResult_1) {
|
||||||
|
temp = temp_1;
|
||||||
|
hum = hum_1;
|
||||||
|
}
|
||||||
|
if (pmsResult_2) {
|
||||||
|
temp = temp_2;
|
||||||
|
hum = hum_2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ag.sgp41.setCompensationTemperatureHumidity(temp, hum);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void co2Update(void) {
|
static void co2Update(void) {
|
||||||
@ -1234,18 +1255,18 @@ static void updateServerConfiguration(void) {
|
|||||||
if (agServer.getCo2AbcDaysConfig() > 0) {
|
if (agServer.getCo2AbcDaysConfig() > 0) {
|
||||||
if (hasSensorS8) {
|
if (hasSensorS8) {
|
||||||
int newHour = agServer.getCo2AbcDaysConfig() * 24;
|
int newHour = agServer.getCo2AbcDaysConfig() * 24;
|
||||||
Serial.printf("abcDays config: %d days(%d hours)\r\n",
|
Serial.printf("Requested abcDays setting: %d days (%d hours)\r\n",
|
||||||
agServer.getCo2AbcDaysConfig(), newHour);
|
agServer.getCo2AbcDaysConfig(), newHour);
|
||||||
int curHour = ag.s8.getAbcPeriod();
|
int curHour = ag.s8.getAbcPeriod();
|
||||||
Serial.printf("Current config: %d (hours)\r\n", curHour);
|
Serial.printf("Current S8 abcDays setting: %d (hours)\r\n", curHour);
|
||||||
if (curHour == newHour) {
|
if (curHour == newHour) {
|
||||||
Serial.println("Set 'abcDays' ignored");
|
Serial.println("'abcDays' unchanged");
|
||||||
} else {
|
} else {
|
||||||
if (ag.s8.setAbcPeriod(agServer.getCo2AbcDaysConfig() * 24) ==
|
if (ag.s8.setAbcPeriod(agServer.getCo2AbcDaysConfig() * 24) ==
|
||||||
false) {
|
false) {
|
||||||
Serial.println("Set S8 abcDays period calibration failed");
|
Serial.println("Set S8 abcDays period failed");
|
||||||
} else {
|
} else {
|
||||||
Serial.println("Set S8 abcDays period calibration success");
|
Serial.println("Set S8 abcDays period success");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1396,6 +1417,180 @@ void webServerMeasureCurrentGet(void) {
|
|||||||
webServer.send(200, "application/json", getServerSyncData(true));
|
webServer.send(200, "application/json", getServerSyncData(true));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sends metrics in Prometheus/OpenMetrics format to the currently connected
|
||||||
|
* webServer client.
|
||||||
|
*
|
||||||
|
* For background, see:
|
||||||
|
* https://prometheus.io/docs/instrumenting/exposition_formats/
|
||||||
|
*/
|
||||||
|
void webServerMetricsGet(void) {
|
||||||
|
String response;
|
||||||
|
String current_metric_name;
|
||||||
|
const auto add_metric = [&](const String &name, const String &help,
|
||||||
|
const String &type, const String &unit = "") {
|
||||||
|
current_metric_name = "airgradient_" + name;
|
||||||
|
if (!unit.isEmpty())
|
||||||
|
current_metric_name += "_" + unit;
|
||||||
|
response += "# HELP " + current_metric_name + " " + help + "\n";
|
||||||
|
response += "# TYPE " + current_metric_name + " " + type + "\n";
|
||||||
|
if (!unit.isEmpty())
|
||||||
|
response += "# UNIT " + current_metric_name + " " + unit + "\n";
|
||||||
|
};
|
||||||
|
const auto add_metric_point = [&](const String &labels, const String &value) {
|
||||||
|
response += current_metric_name + "{" + labels + "} " + value + "\n";
|
||||||
|
};
|
||||||
|
|
||||||
|
add_metric("info", "AirGradient device information", "info");
|
||||||
|
add_metric_point("airgradient_serial_number=\"" + getDevId() +
|
||||||
|
"\",airgradient_device_type=\"" + ag.getBoardName() +
|
||||||
|
"\",airgradient_library_version=\"" + ag.getVersion() +
|
||||||
|
"\"",
|
||||||
|
"1");
|
||||||
|
|
||||||
|
add_metric("config_ok",
|
||||||
|
"1 if the AirGradient device was able to successfully fetch its "
|
||||||
|
"configuration from the server",
|
||||||
|
"gauge");
|
||||||
|
add_metric_point("", agServer.isConfigFailed() ? "0" : "1");
|
||||||
|
|
||||||
|
add_metric(
|
||||||
|
"post_ok",
|
||||||
|
"1 if the AirGradient device was able to successfully send to the server",
|
||||||
|
"gauge");
|
||||||
|
add_metric_point("", agServer.isServerFailed() ? "0" : "1");
|
||||||
|
|
||||||
|
add_metric(
|
||||||
|
"wifi_rssi",
|
||||||
|
"WiFi signal strength from the AirGradient device perspective, in dBm",
|
||||||
|
"gauge", "dbm");
|
||||||
|
add_metric_point("", String(WiFi.RSSI()));
|
||||||
|
|
||||||
|
if (hasSensorS8 && co2Ppm >= 0) {
|
||||||
|
add_metric("co2",
|
||||||
|
"Carbon dioxide concentration as measured by the AirGradient S8 "
|
||||||
|
"sensor, in parts per million",
|
||||||
|
"gauge", "ppm");
|
||||||
|
add_metric_point("", String(co2Ppm));
|
||||||
|
}
|
||||||
|
|
||||||
|
float temp = -1001;
|
||||||
|
float hum = -1;
|
||||||
|
int pm01 = -1;
|
||||||
|
int pm25 = -1;
|
||||||
|
int pm10 = -1;
|
||||||
|
int pm03PCount = -1;
|
||||||
|
if (hasSensorPMS1 && hasSensorPMS2) {
|
||||||
|
temp = (temp_1 + temp_2) / 2.0f;
|
||||||
|
hum = (hum_1 + hum_2) / 2.0f;
|
||||||
|
pm01 = (pm01_1 + pm01_2) / 2;
|
||||||
|
pm25 = (pm25_1 + pm25_2) / 2;
|
||||||
|
pm10 = (pm10_1 + pm10_2) / 2;
|
||||||
|
pm03PCount = (pm03PCount_1 + pm03PCount_2) / 2;
|
||||||
|
} else {
|
||||||
|
if (hasSensorPMS1) {
|
||||||
|
temp = temp_1;
|
||||||
|
hum = hum_1;
|
||||||
|
pm01 = pm01_1;
|
||||||
|
pm25 = pm25_1;
|
||||||
|
pm10 = pm10_1;
|
||||||
|
pm03PCount = pm03PCount_1;
|
||||||
|
}
|
||||||
|
if (hasSensorPMS2) {
|
||||||
|
temp = temp_2;
|
||||||
|
hum = hum_2;
|
||||||
|
pm01 = pm01_2;
|
||||||
|
pm25 = pm25_2;
|
||||||
|
pm10 = pm10_2;
|
||||||
|
pm03PCount = pm03PCount_2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hasSensorPMS1 || hasSensorPMS2) {
|
||||||
|
if (pm01 >= 0) {
|
||||||
|
add_metric("pm1",
|
||||||
|
"PM1.0 concentration as measured by the AirGradient PMS "
|
||||||
|
"sensor, in micrograms per cubic meter",
|
||||||
|
"gauge", "ugm3");
|
||||||
|
add_metric_point("", String(pm01));
|
||||||
|
}
|
||||||
|
if (pm25 >= 0) {
|
||||||
|
add_metric("pm2d5",
|
||||||
|
"PM2.5 concentration as measured by the AirGradient PMS "
|
||||||
|
"sensor, in micrograms per cubic meter",
|
||||||
|
"gauge", "ugm3");
|
||||||
|
add_metric_point("", String(pm25));
|
||||||
|
}
|
||||||
|
if (pm10 >= 0) {
|
||||||
|
add_metric("pm10",
|
||||||
|
"PM10 concentration as measured by the AirGradient PMS "
|
||||||
|
"sensor, in micrograms per cubic meter",
|
||||||
|
"gauge", "ugm3");
|
||||||
|
add_metric_point("", String(pm10));
|
||||||
|
}
|
||||||
|
if (pm03PCount >= 0) {
|
||||||
|
add_metric("pm0d3",
|
||||||
|
"PM0.3 concentration as measured by the AirGradient PMS "
|
||||||
|
"sensor, in number of particules per 100 milliliters",
|
||||||
|
"gauge", "p100ml");
|
||||||
|
add_metric_point("", String(pm03PCount));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hasSensorSGP) {
|
||||||
|
if (tvocIndex >= 0) {
|
||||||
|
add_metric("tvoc_index",
|
||||||
|
"The processed Total Volatile Organic Compounds (TVOC) index "
|
||||||
|
"as measured by the AirGradient SGP sensor",
|
||||||
|
"gauge");
|
||||||
|
add_metric_point("", String(tvocIndex));
|
||||||
|
}
|
||||||
|
if (tvocRawIndex >= 0) {
|
||||||
|
add_metric("tvoc_raw",
|
||||||
|
"The raw input value to the Total Volatile Organic Compounds "
|
||||||
|
"(TVOC) index as measured by the AirGradient SGP sensor",
|
||||||
|
"gauge");
|
||||||
|
add_metric_point("", String(tvocRawIndex));
|
||||||
|
}
|
||||||
|
if (noxIndex >= 0) {
|
||||||
|
add_metric("nox_index",
|
||||||
|
"The processed Nitrous Oxide (NOx) index as measured by the "
|
||||||
|
"AirGradient SGP sensor",
|
||||||
|
"gauge");
|
||||||
|
add_metric_point("", String(noxIndex));
|
||||||
|
}
|
||||||
|
if (noxRawIndex >= 0) {
|
||||||
|
add_metric("nox_raw",
|
||||||
|
"The raw input value to the Nitrous Oxide (NOx) index as "
|
||||||
|
"measured by the AirGradient SGP sensor",
|
||||||
|
"gauge");
|
||||||
|
add_metric_point("", String(noxRawIndex));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hasSensorPMS1 || hasSensorPMS2) {
|
||||||
|
if (temp > -1001) {
|
||||||
|
add_metric("temperature",
|
||||||
|
"The ambient temperature as measured by the AirGradient SHT "
|
||||||
|
"sensor, in degrees Celsius",
|
||||||
|
"gauge", "celcius");
|
||||||
|
add_metric_point("", String(temp));
|
||||||
|
}
|
||||||
|
if (hum >= 0) {
|
||||||
|
add_metric(
|
||||||
|
"humidity",
|
||||||
|
"The relative humidity as measured by the AirGradient SHT sensor",
|
||||||
|
"gauge", "percent");
|
||||||
|
add_metric_point("", String(hum));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
response += "# EOF\n";
|
||||||
|
webServer.send(200,
|
||||||
|
"application/openmetrics-text; version=1.0.0; charset=utf-8",
|
||||||
|
response);
|
||||||
|
}
|
||||||
|
|
||||||
void webServerHandler(void *param) {
|
void webServerHandler(void *param) {
|
||||||
for (;;) {
|
for (;;) {
|
||||||
webServer.handleClient();
|
webServer.handleClient();
|
||||||
@ -1410,13 +1605,9 @@ static void webServerInit(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
webServer.on("/measures/current", HTTP_GET, webServerMeasureCurrentGet);
|
webServer.on("/measures/current", HTTP_GET, webServerMeasureCurrentGet);
|
||||||
|
// Make it possible to query this device from Prometheus/OpenMetrics.
|
||||||
|
webServer.on("/metrics", HTTP_GET, webServerMetricsGet);
|
||||||
webServer.begin();
|
webServer.begin();
|
||||||
MDNS.addService("http", "tcp", 80);
|
|
||||||
MDNS.addServiceTxt("http", "_tcp", "model", mdnsModelName);
|
|
||||||
MDNS.addServiceTxt("http", "_tcp", "serialno", getDevId());
|
|
||||||
MDNS.addServiceTxt("http", "_tcp", "fw_ver", ag.getVersion());
|
|
||||||
MDNS.addServiceTxt("http", "_tcp", "vendor", "AirGradient");
|
|
||||||
MDNS.addService("http", "tcp", 80);
|
|
||||||
MDNS.addService("_airgradient", "tcp", 80);
|
MDNS.addService("_airgradient", "tcp", 80);
|
||||||
MDNS.addServiceTxt("airgradient", "_tcp", "model", mdnsModelName);
|
MDNS.addServiceTxt("airgradient", "_tcp", "model", mdnsModelName);
|
||||||
MDNS.addServiceTxt("airgradient", "_tcp", "serialno", getDevId());
|
MDNS.addServiceTxt("airgradient", "_tcp", "serialno", getDevId());
|
||||||
|
@ -112,9 +112,13 @@ void LedBar::setColor(uint8_t red, uint8_t green, uint8_t blue) {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Call to turn LED on/off base on the setting color
|
* @brief Call to turn LED on/off base on the setting color
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
void LedBar::show(void) {
|
void LedBar::show(void) {
|
||||||
|
// Ignore update the LED if LED bar disabled
|
||||||
|
if (enabled == false) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (pixel()->canShow()) {
|
if (pixel()->canShow()) {
|
||||||
pixel()->show();
|
pixel()->show();
|
||||||
}
|
}
|
||||||
@ -122,6 +126,18 @@ void LedBar::show(void) {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Set all LED to off color (r,g,b) = (0,0,0)
|
* @brief Set all LED to off color (r,g,b) = (0,0,0)
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
void LedBar::clear(void) { pixel()->clear(); }
|
void LedBar::clear(void) { pixel()->clear(); }
|
||||||
|
|
||||||
|
void LedBar::setEnable(bool enable) {
|
||||||
|
if (this->enabled != enable) {
|
||||||
|
if (enable == false) {
|
||||||
|
pixel()->clear();
|
||||||
|
pixel()->show();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this->enabled = enable;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool LedBar::isEnabled(void) { return enabled; }
|
||||||
|
@ -23,8 +23,11 @@ public:
|
|||||||
int getNumberOfLeds(void);
|
int getNumberOfLeds(void);
|
||||||
void show(void);
|
void show(void);
|
||||||
void clear(void);
|
void clear(void);
|
||||||
|
void setEnable(bool enable);
|
||||||
|
bool isEnabled(void);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
bool enabled = true;
|
||||||
const BoardDef *_bsp;
|
const BoardDef *_bsp;
|
||||||
bool _isBegin = false;
|
bool _isBegin = false;
|
||||||
uint8_t _ledState = 0;
|
uint8_t _ledState = 0;
|
||||||
|
@ -253,7 +253,20 @@ int Sgp41::getTvocRaw(void) { return tvocRaw; }
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Get NOX raw value
|
* @brief Get NOX raw value
|
||||||
*
|
*
|
||||||
* @return int
|
* @return int
|
||||||
*/
|
*/
|
||||||
int Sgp41::getNoxRaw(void) { return noxRaw; }
|
int Sgp41::getNoxRaw(void) { return noxRaw; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Set compasation temperature and humidity to calculate TVOC and NOx
|
||||||
|
* index
|
||||||
|
*
|
||||||
|
* @param temp Temperature
|
||||||
|
* @param hum Humidity
|
||||||
|
*/
|
||||||
|
void Sgp41::setCompensationTemperatureHumidity(float temp, float hum) {
|
||||||
|
defaultT = static_cast<uint16_t>((temp + 45) * 65535 / 175);
|
||||||
|
defaultRh = static_cast<uint16_t>(hum * 65535 / 100);
|
||||||
|
AgLog("Update: defaultT: %d, defaultRh: %d", defaultT, defaultRh);
|
||||||
|
}
|
||||||
|
@ -25,6 +25,7 @@ public:
|
|||||||
int getNoxIndex(void);
|
int getNoxIndex(void);
|
||||||
int getTvocRaw(void);
|
int getTvocRaw(void);
|
||||||
int getNoxRaw(void);
|
int getNoxRaw(void);
|
||||||
|
void setCompensationTemperatureHumidity(float temp, float hum);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool onConditioning = true;
|
bool onConditioning = true;
|
||||||
|
Reference in New Issue
Block a user