diff --git a/airrohr-firmware/airrohr-cfg.h b/airrohr-firmware/airrohr-cfg.h index 74806dad..ff7907fe 100644 --- a/airrohr-firmware/airrohr-cfg.h +++ b/airrohr-firmware/airrohr-cfg.h @@ -42,6 +42,7 @@ enum ConfigShapeId { Config_npm_read, Config_npm_fulltime, Config_ips_read, + Config_sen5x_read, Config_sps30_read, Config_bmp_read, Config_bmx280_read, @@ -114,6 +115,7 @@ static constexpr char CFG_KEY_HPM_READ[] PROGMEM = "hpm_read"; static constexpr char CFG_KEY_NPM_READ[] PROGMEM = "npm_read"; static constexpr char CFG_KEY_NPM_FULLTIME[] PROGMEM = "npm_fulltime"; static constexpr char CFG_KEY_IPS_READ[] PROGMEM = "ips_read"; +static constexpr char CFG_KEY_SEN5X_READ[] PROGMEM = "sen5x_read"; static constexpr char CFG_KEY_SPS30_READ[] PROGMEM = "sps30_read"; static constexpr char CFG_KEY_BMP_READ[] PROGMEM = "bmp_read"; static constexpr char CFG_KEY_BMX280_READ[] PROGMEM = "bmx280_read"; @@ -186,6 +188,7 @@ static constexpr ConfigShapeEntry configShape[] PROGMEM = { { Config_Type_Bool, 0, CFG_KEY_NPM_READ, &cfg::npm_read }, { Config_Type_Bool, 0, CFG_KEY_NPM_FULLTIME, &cfg::npm_fulltime }, { Config_Type_Bool, 0, CFG_KEY_IPS_READ, &cfg::ips_read }, + { Config_Type_Bool, 0, CFG_KEY_SEN5X_READ, &cfg::sen5x_read }, { Config_Type_Bool, 0, CFG_KEY_SPS30_READ, &cfg::sps30_read }, { Config_Type_Bool, 0, CFG_KEY_BMP_READ, &cfg::bmp_read }, { Config_Type_Bool, 0, CFG_KEY_BMX280_READ, &cfg::bmx280_read }, diff --git a/airrohr-firmware/airrohr-cfg.h.py b/airrohr-firmware/airrohr-cfg.h.py index e68e3b2b..a5afd39c 100755 --- a/airrohr-firmware/airrohr-cfg.h.py +++ b/airrohr-firmware/airrohr-cfg.h.py @@ -18,6 +18,7 @@ Bool npm_read Bool npm_fulltime Bool ips_read +Bool sen5x_read Bool sps30_read Bool bmp_read Bool bmx280_read diff --git a/airrohr-firmware/airrohr-firmware.ino b/airrohr-firmware/airrohr-firmware.ino index 640462da..0ee7fd1f 100644 --- a/airrohr-firmware/airrohr-firmware.ino +++ b/airrohr-firmware/airrohr-firmware.ino @@ -108,10 +108,12 @@ String SOFTWARE_VERSION(SOFTWARE_VERSION_STR); #include #include #include +#include #include #include "./bmx280_i2c.h" #include "./sps30_i2c.h" #include "./dnms_i2c.h" +// #include "./SensirionI2CSen5x.h" #include "./intl.h" @@ -167,6 +169,7 @@ namespace cfg bool npm_read = NPM_READ; bool npm_fulltime = NPM_FULLTIME; bool ips_read = IPS_READ; + bool sen5x_read = SEN5X_READ; bool sps30_read = SPS30_READ; bool bmp_read = BMP_READ; bool bmx280_read = BMX280_READ; @@ -346,6 +349,11 @@ Adafruit_SHT31 sht3x; OneWire oneWire; DallasTemperature ds18b20(&oneWire); +/***************************************************************** + * SEN5X declaration * + *****************************************************************/ +SensirionI2CSen5x sen5x; + /***************************************************************** * SCD30 declaration * *****************************************************************/ @@ -552,6 +560,41 @@ unsigned long ips_pm5_min_pcs = 4000000000; unsigned long ips_pm10_max_pcs = 0; unsigned long ips_pm10_min_pcs = 4000000000; +float last_value_SEN5X_P0 = -1.0; +float last_value_SEN5X_P1 = -1.0; +float last_value_SEN5X_P2 = -1.0; +float last_value_SEN5X_P4 = -1.0; +float last_value_SEN5X_N05 = -1.0; +float last_value_SEN5X_N1 = -1.0; +float last_value_SEN5X_N25 = -1.0; +float last_value_SEN5X_N4 = -1.0; +float last_value_SEN5X_N10 = -1.0; +float last_value_SEN5X_TS = -1.0; +float last_value_SEN5X_T = -128.0; +float last_value_SEN5X_H = -1.0; +float last_value_SEN5X_VOC = -1.0; +float last_value_SEN5X_NOX = -1.0; +float value_SEN5X_P0 = 0.0; +float value_SEN5X_P1 = 0.0; +float value_SEN5X_P2 = 0.0; +float value_SEN5X_P4 = 0.0; +float value_SEN5X_N05 = 0.0; +float value_SEN5X_N1 = 0.0; +float value_SEN5X_N25 = 0.0; +float value_SEN5X_N4 = 0.0; +float value_SEN5X_N10 = 0.0; +float value_SEN5X_TS = 0.0; +float value_SEN5X_T = 0.0; +float value_SEN5X_H = 0.0; +float value_SEN5X_VOC = 0.0; +float value_SEN5X_NOX = 0.0; + +uint16_t SEN5X_measurement_count = 0; +unsigned long SEN5X_read_counter = 0; +unsigned long SEN5X_read_error_counter = 0; +unsigned long SEN5X_read_timer = 0; +bool sen5x_init_failed = false; + float last_value_SPS30_P0 = -1.0; float last_value_SPS30_P1 = -1.0; float last_value_SPS30_P2 = -1.0; @@ -1065,6 +1108,89 @@ static String IPS_version_date() return last_value_IPS_version; } + +/***************************************************************** + * read SEN5X sensor serial and firmware date * + *****************************************************************/ + + +unsigned char SEN5X_type[6]; + +#define MAXBUF_REQUIREMENT 48 + +#if (defined(I2C_BUFFER_LENGTH) && \ + (I2C_BUFFER_LENGTH >= MAXBUF_REQUIREMENT)) || \ + (defined(BUFFER_LENGTH) && BUFFER_LENGTH >= MAXBUF_REQUIREMENT) +#define USE_PRODUCT_INFO +#endif + +void printModuleVersions() { + uint16_t error; + char errorMessage[256]; + + unsigned char productName[32]; + uint8_t productNameSize = 32; + + error = sen5x.getProductName(productName, productNameSize); + + if (error) { + Debug.print("Error trying to execute getProductName(): "); + errorToString(error, errorMessage, 256); + Debug.println(errorMessage); + } else { + Debug.print("ProductName:"); + Debug.println((char*)productName); + memcpy(SEN5X_type, productName, 6); + //Debug.println((char*)SEN5X_type); + } + + uint8_t firmwareMajor; + uint8_t firmwareMinor; + bool firmwareDebug; + uint8_t hardwareMajor; + uint8_t hardwareMinor; + uint8_t protocolMajor; + uint8_t protocolMinor; + + error = sen5x.getVersion(firmwareMajor, firmwareMinor, firmwareDebug, + hardwareMajor, hardwareMinor, protocolMajor, + protocolMinor); + if (error) { + Debug.print("Error trying to execute getVersion(): "); + errorToString(error, errorMessage, 256); + Debug.println(errorMessage); + } else { + Debug.print("Firmware: "); + Debug.print(firmwareMajor); + Debug.print("."); + Debug.print(firmwareMinor); + Debug.print(", "); + + Debug.print("Hardware: "); + Debug.print(hardwareMajor); + Debug.print("."); + Debug.println(hardwareMinor); + } +} + +void printSerialNumber() { + uint16_t error; + char errorMessage[256]; + unsigned char serialNumber[32]; + uint8_t serialNumberSize = 32; + + error = sen5x.getSerialNumber(serialNumber, serialNumberSize); + if (error) { + Debug.print("Error trying to execute getSerialNumber(): "); + errorToString(error, errorMessage, 256); + Debug.println(errorMessage); + } else { + Debug.print("SerialNumber:"); + Debug.println((char*)serialNumber); + } +} + + /***************************************************************** * disable unneeded NMEA sentences, TinyGPS++ needs GGA, RMC * *****************************************************************/ @@ -1769,6 +1895,7 @@ static void webserver_config_send_body_get(String &page_content) add_form_checkbox_sensor(Config_npm_read, FPSTR(INTL_NPM)); add_form_checkbox_sensor(Config_npm_fulltime, FPSTR(INTL_NPM_FULLTIME)); add_form_checkbox_sensor(Config_ips_read, FPSTR(INTL_IPS)); + add_form_checkbox_sensor(Config_sen5x_read, FPSTR(INTL_SEN5X)); add_form_checkbox_sensor(Config_bmp_read, FPSTR(INTL_BMP180)); add_form_checkbox(Config_gps_read, FPSTR(INTL_NEO6M)); @@ -2155,6 +2282,66 @@ static void webserver_values() add_table_nc_value(FPSTR(SENSORS_IPS), FPSTR(WEB_NC10), last_value_IPS_N10); page_content += FPSTR(EMPTY_ROW); } + + if (cfg::sen5x_read) + { + + // Debug.println((char*)SEN5X_type); + // Debug.println(memcmp(SEN5X_type,"SEN50",6)); + + if(memcmp(SEN5X_type,"SEN50",6) == 0) + { + add_table_pm_value(FPSTR(SENSORS_SEN50), FPSTR(WEB_PM1), last_value_SEN5X_P0); + add_table_pm_value(FPSTR(SENSORS_SEN50), FPSTR(WEB_PM25), last_value_SEN5X_P2); + add_table_pm_value(FPSTR(SENSORS_SEN50), FPSTR(WEB_PM4), last_value_SEN5X_P4); + add_table_pm_value(FPSTR(SENSORS_SEN50), FPSTR(WEB_PM10), last_value_SEN5X_P1); + add_table_nc_value(FPSTR(SENSORS_SEN50), FPSTR(WEB_NC0k5), last_value_SEN5X_N05); + add_table_nc_value(FPSTR(SENSORS_SEN50), FPSTR(WEB_NC1k0), last_value_SEN5X_N1); + add_table_nc_value(FPSTR(SENSORS_SEN50), FPSTR(WEB_NC2k5), last_value_SEN5X_N25); + add_table_nc_value(FPSTR(SENSORS_SEN50), FPSTR(WEB_NC4k0), last_value_SEN5X_N4); + add_table_nc_value(FPSTR(SENSORS_SEN50), FPSTR(WEB_NC10), last_value_SEN5X_N10); + add_table_value(FPSTR(SENSORS_SEN50), FPSTR(WEB_TPS), check_display_value(last_value_SEN5X_TS, -1, 1, 0), "µm"); + page_content += FPSTR(EMPTY_ROW); + } + + if(memcmp(SEN5X_type,"SEN54",6)== 0) + { + add_table_pm_value(FPSTR(SENSORS_SEN54), FPSTR(WEB_PM1), last_value_SEN5X_P0); + add_table_pm_value(FPSTR(SENSORS_SEN54), FPSTR(WEB_PM25), last_value_SEN5X_P2); + add_table_pm_value(FPSTR(SENSORS_SEN54), FPSTR(WEB_PM4), last_value_SEN5X_P4); + add_table_pm_value(FPSTR(SENSORS_SEN54), FPSTR(WEB_PM10), last_value_SEN5X_P1); + add_table_nc_value(FPSTR(SENSORS_SEN54), FPSTR(WEB_NC0k5), last_value_SEN5X_N05); + add_table_nc_value(FPSTR(SENSORS_SEN54), FPSTR(WEB_NC1k0), last_value_SEN5X_N1); + add_table_nc_value(FPSTR(SENSORS_SEN54), FPSTR(WEB_NC2k5), last_value_SEN5X_N25); + add_table_nc_value(FPSTR(SENSORS_SEN54), FPSTR(WEB_NC4k0), last_value_SEN5X_N4); + add_table_nc_value(FPSTR(SENSORS_SEN54), FPSTR(WEB_NC10), last_value_SEN5X_N10); + add_table_value(FPSTR(SENSORS_SEN54), FPSTR(WEB_TPS), check_display_value(last_value_SEN5X_TS, -1, 1, 0), "µm"); + add_table_t_value(FPSTR(SENSORS_SEN54), FPSTR(INTL_TEMPERATURE), last_value_SEN5X_T); + add_table_h_value(FPSTR(SENSORS_SEN54), FPSTR(INTL_HUMIDITY), last_value_SEN5X_H); + add_table_value(FPSTR(SENSORS_SEN54), FPSTR(INTL_VOC), check_display_value(last_value_SEN5X_VOC, 0, 0, 0), "(index)"); + page_content += FPSTR(EMPTY_ROW); + } + + if(memcmp(SEN5X_type,"SEN55",6)== 0) + { + add_table_pm_value(FPSTR(SENSORS_SEN55), FPSTR(WEB_PM1), last_value_SEN5X_P0); + add_table_pm_value(FPSTR(SENSORS_SEN55), FPSTR(WEB_PM25), last_value_SEN5X_P2); + add_table_pm_value(FPSTR(SENSORS_SEN55), FPSTR(WEB_PM4), last_value_SEN5X_P4); + add_table_pm_value(FPSTR(SENSORS_SEN55), FPSTR(WEB_PM10), last_value_SEN5X_P1); + add_table_nc_value(FPSTR(SENSORS_SEN55), FPSTR(WEB_NC0k5), last_value_SEN5X_N05); + add_table_nc_value(FPSTR(SENSORS_SEN55), FPSTR(WEB_NC1k0), last_value_SEN5X_N1); + add_table_nc_value(FPSTR(SENSORS_SEN55), FPSTR(WEB_NC2k5), last_value_SEN5X_N25); + add_table_nc_value(FPSTR(SENSORS_SEN55), FPSTR(WEB_NC4k0), last_value_SEN5X_N4); + add_table_nc_value(FPSTR(SENSORS_SEN55), FPSTR(WEB_NC10), last_value_SEN5X_N10); + add_table_value(FPSTR(SENSORS_SEN55), FPSTR(WEB_TPS), check_display_value(last_value_SEN5X_TS, -1, 1, 0), "µm"); + add_table_t_value(FPSTR(SENSORS_SEN55), FPSTR(INTL_TEMPERATURE), last_value_SEN5X_T); + add_table_h_value(FPSTR(SENSORS_SEN55), FPSTR(INTL_HUMIDITY), last_value_SEN5X_H); + add_table_value(FPSTR(SENSORS_SEN55), FPSTR(INTL_VOC), check_display_value(last_value_SEN5X_VOC, 0, 0, 0), "(index)"); + add_table_value(FPSTR(SENSORS_SEN55), FPSTR(INTL_NOX), check_display_value(last_value_SEN5X_NOX, 0, 0, 0), "ppm"); + page_content += FPSTR(EMPTY_ROW); + } + } + if (cfg::sps30_read) { add_table_pm_value(FPSTR(SENSORS_SPS30), FPSTR(WEB_PM1), last_value_SPS30_P0); @@ -2377,6 +2564,27 @@ static void webserver_status() { add_table_row_from_value(page_content, FPSTR(SENSORS_NPM), String(NPM_error_count)); } + if (cfg::ips_read) + { + add_table_row_from_value(page_content, FPSTR(SENSORS_IPS), String(IPS_error_count)); + } + if (cfg::sen5x_read) + { + if(memcmp(SEN5X_type,"SEN50",6) == 0) + { + add_table_row_from_value(page_content, FPSTR(SENSORS_SEN50), String(SEN5X_read_error_counter)); + } + + if(memcmp(SEN5X_type,"SEN54",6)== 0) + { + add_table_row_from_value(page_content, FPSTR(SENSORS_SEN54), String(SEN5X_read_error_counter)); + } + + if(memcmp(SEN5X_type,"SEN55",6)== 0) + { + add_table_row_from_value(page_content, FPSTR(SENSORS_SEN55), String(SEN5X_read_error_counter)); + } + } if (cfg::sps30_read) { add_table_row_from_value(page_content, FPSTR(SENSORS_SPS30), String(SPS30_read_error_counter)); @@ -4377,6 +4585,100 @@ static void fetchSensorIPS(String &s) debug_outln_verbose(FPSTR(DBG_TXT_END_READING), FPSTR(SENSORS_IPS)); } + + + +/***************************************************************** + read SEN5X PM sensor values + *****************************************************************/ +static void fetchSensorSEN5X(String &s) +{ + if(memcmp(SEN5X_type,"SEN50",6) == 0) + { + debug_outln_verbose(FPSTR(DBG_TXT_START_READING), FPSTR(SENSORS_SEN50)); + } + + if(memcmp(SEN5X_type,"SEN54",6)== 0) + { + debug_outln_verbose(FPSTR(DBG_TXT_START_READING), FPSTR(SENSORS_SEN54)); + } + if(memcmp(SEN5X_type,"SEN55",6)== 0) + { + debug_outln_verbose(FPSTR(DBG_TXT_START_READING), FPSTR(SENSORS_SEN55)); + } + + + last_value_SEN5X_P0 = value_SEN5X_P0 / SEN5X_measurement_count; + last_value_SEN5X_P2 = value_SEN5X_P2 / SEN5X_measurement_count; + last_value_SEN5X_P4 = value_SEN5X_P4 / SEN5X_measurement_count; + last_value_SEN5X_P1 = value_SEN5X_P1 / SEN5X_measurement_count; + last_value_SEN5X_N05 = value_SEN5X_N05 / SEN5X_measurement_count; + last_value_SEN5X_N1 = value_SEN5X_N1 / SEN5X_measurement_count; + last_value_SEN5X_N25 = value_SEN5X_N25 / SEN5X_measurement_count; + last_value_SEN5X_N4 = value_SEN5X_N4 / SEN5X_measurement_count; + last_value_SEN5X_N10 = value_SEN5X_N10 / SEN5X_measurement_count; + last_value_SEN5X_TS = value_SEN5X_TS / SEN5X_measurement_count; + last_value_SEN5X_T = value_SEN5X_T / SEN5X_measurement_count; + last_value_SEN5X_H = value_SEN5X_H / SEN5X_measurement_count; + last_value_SEN5X_VOC = value_SEN5X_VOC / SEN5X_measurement_count; + last_value_SEN5X_NOX = value_SEN5X_NOX / SEN5X_measurement_count; + + + add_Value2Json(s, F("SEN5X_P0"), F("PM1.0: "), last_value_SEN5X_P0); + add_Value2Json(s, F("SEN5X_P2"), F("PM2.5: "), last_value_SEN5X_P2); + add_Value2Json(s, F("SEN5X_P4"), F("PM4.0: "), last_value_SEN5X_P4); + add_Value2Json(s, F("SEN5X_P1"), F("PM 10: "), last_value_SEN5X_P1); + add_Value2Json(s, F("SEN5X_N05"), F("NC0.5: "), last_value_SEN5X_N05); + add_Value2Json(s, F("SEN5X_N1"), F("NC1.0: "), last_value_SEN5X_N1); + add_Value2Json(s, F("SEN5X_N25"), F("NC2.5: "), last_value_SEN5X_N25); + add_Value2Json(s, F("SEN5X_N4"), F("NC4.0: "), last_value_SEN5X_N4); + add_Value2Json(s, F("SEN5X_N10"), F("NC10: "), last_value_SEN5X_N10); + add_Value2Json(s, F("SEN5X_TS"), F("TPS: "), last_value_SEN5X_TS); + +if(memcmp(SEN5X_type,"SEN50",6)!= 0) +{ + add_Value2Json(s, F("SEN5X_temperature"), FPSTR(DBG_TXT_TEMPERATURE), last_value_SEN5X_T); + add_Value2Json(s, F("SEN5X_humidity"), FPSTR(DBG_TXT_HUMIDITY), last_value_SEN5X_H); +} + +if(memcmp(SEN5X_type,"SEN54",6)!= 0 || memcmp(SEN5X_type,"SEN55",6)!= 0) +{ + add_Value2Json(s, F("SEN5X_voc"), FPSTR(DBG_TXT_VOCINDEX), last_value_SEN5X_VOC); +} + +if(memcmp(SEN5X_type,"SEN55",6)!= 0) +{ + add_Value2Json(s, F("SEN5X_nox"), FPSTR(DBG_TXT_NOX), last_value_SEN5X_NOX); +} + debug_outln_info(F("SEN5X read counter: "), String(SEN5X_read_counter)); + debug_outln_info(F("SEN5X read error counter: "), String(SEN5X_read_error_counter)); + + SEN5X_measurement_count = 0; + SEN5X_read_counter = 0; + SEN5X_read_error_counter = 0; + value_SEN5X_P0 = value_SEN5X_P1 = value_SEN5X_P2 = value_SEN5X_P4 = 0.0; + value_SEN5X_N05 = value_SEN5X_N1 = value_SEN5X_N25 = value_SEN5X_N10 = value_SEN5X_N4 = 0.0; + value_SEN5X_TS = 0.0; + value_SEN5X_H = value_SEN5X_T = value_SEN5X_VOC = value_SEN5X_NOX = 0.0; + + debug_outln_info(FPSTR(DBG_TXT_SEP)); + + if(memcmp(SEN5X_type,"SEN50",6) == 0) + { + debug_outln_verbose(FPSTR(DBG_TXT_END_READING), FPSTR(SENSORS_SEN50)); + } + + if(memcmp(SEN5X_type,"SEN54",6)== 0) + { + debug_outln_verbose(FPSTR(DBG_TXT_END_READING), FPSTR(SENSORS_SEN54)); + } + if(memcmp(SEN5X_type,"SEN55",6)== 0) + { + debug_outln_verbose(FPSTR(DBG_TXT_END_READING), FPSTR(SENSORS_SEN55)); + } +} + + /***************************************************************** * read PPD42NS sensor values * *****************************************************************/ @@ -4850,7 +5152,9 @@ static void display_values() float t_value = -128.0; float h_value = -1.0; float p_value = -1.0; - String t_sensor, h_sensor, p_sensor; + float voc_value = -1.0; + float nox_value = -1.0; + String t_sensor, h_sensor, p_sensor, voc_sensor, nox_sensor; float pm001_value = -1.0; float pm003_value = -1.0; float pm005_value = -1.0; @@ -4885,7 +5189,7 @@ static void display_values() String display_header; String display_lines[3] = {"", "", ""}; uint8_t screen_count = 0; - uint8_t screens[8]; + uint8_t screens[13]; int line_count = 0; debug_outln_info(F("output values to display...")); if (cfg::ppd_read) @@ -4944,6 +5248,45 @@ static void display_values() nc003_value = last_value_IPS_N03; nc005_value = last_value_IPS_N05; nc050_value = last_value_IPS_N5; + } + if (cfg::sen5x_read) + { + if(memcmp(SEN5X_type,"SEN50",6) == 0) + { + + } + + if(memcmp(SEN5X_type,"SEN54",6)== 0) + { + pm01_sensor = FPSTR(SENSORS_SEN54); + pm10_sensor = FPSTR(SENSORS_SEN54); + pm25_sensor = FPSTR(SENSORS_SEN54); + t_sensor = h_sensor = voc_sensor = FPSTR(SENSORS_SEN54); + } + if(memcmp(SEN5X_type,"SEN55",6)== 0) + { + pm01_sensor = FPSTR(SENSORS_SEN54); + pm10_sensor = FPSTR(SENSORS_SEN54); + pm25_sensor = FPSTR(SENSORS_SEN54); + t_sensor = h_sensor = voc_sensor = nox_sensor = FPSTR(SENSORS_SEN54); + } + + + + pm01_value = last_value_SEN5X_P0; + pm25_value = last_value_SEN5X_P2; + pm04_value = last_value_SEN5X_P4; + pm10_value = last_value_SEN5X_P1; + nc005_value = last_value_SEN5X_N05; + nc010_value = last_value_SEN5X_N1; + nc025_value = last_value_SEN5X_N25; + nc040_value = last_value_SEN5X_N4; + nc100_value = last_value_SEN5X_N10; + tps_value = last_value_SEN5X_TS; + t_value = last_value_SEN5X_T; + h_value = last_value_SEN5X_H; + voc_value = last_value_SEN5X_VOC; + nox_value = last_value_SEN5X_NOX; } if (cfg::sps30_read) { @@ -5032,6 +5375,11 @@ static void display_values() { screens[screen_count++] = 11; //A VOIR POUR AJOUTER DES ÈCRANS } + if (cfg::sen5x_read) + { + screens[screen_count++] = 12; + screens[screen_count++] = 13; + } if (cfg::sps30_read) { screens[screen_count++] = 2; @@ -5175,6 +5523,33 @@ static void display_values() display_lines[0] = std::move(tmpl(F("PM1: {v} µg/m³"), check_display_value(pm01_value, -1, 1, 6))); display_lines[1] = std::move(tmpl(F("PM2.5: {v} µg/m³"), check_display_value(pm25_value, -1, 1, 6))); display_lines[2] = std::move(tmpl(F("PM10: {v} µg/m³"), check_display_value(pm10_value, -1, 1, 6))); + break; + case 12: + display_header = F("Sensirion SEN5X"); + display_lines[0] = std::move(tmpl(F("PM1: {v} µg/m³"), check_display_value(pm01_value, -1, 1, 6))); + display_lines[1] = std::move(tmpl(F("PM2.5: {v} µg/m³"), check_display_value(pm25_value, -1, 1, 6))); + display_lines[2] = std::move(tmpl(F("PM10: {v} µg/m³"), check_display_value(pm10_value, -1, 1, 6))); + break; + case 13: + display_header = F("Sensirion SEN5X"); + if(memcmp(SEN5X_type,"SEN50",6) == 0) + { + + } + if(memcmp(SEN5X_type,"SEN54",6)== 0) + { + display_lines[0] = std::move(tmpl(F("Temp.: {v} °C"), check_display_value(t_value, -128, 1, 6))); + display_lines[1] = std::move(tmpl(F("Humi: {v} %"), check_display_value(h_value, -1, 1, 6))); + display_lines[2] = std::move(tmpl(F("VOC: {v} (index)"), check_display_value(voc_value, -1, 1, 6))); + } + if(memcmp(SEN5X_type,"SEN55",6)== 0) + { + //display_lines[0] = std::move(tmpl(F("Temp.: {v} °C"), check_display_value(t_value, -128, 1, 6))); + display_lines[0] = std::move(tmpl(F("Humi: {v} %"), check_display_value(h_value, -1, 1, 6))); + display_lines[1] = std::move(tmpl(F("VOC: {v} (index)"), check_display_value(voc_value, -1, 1, 6))); + display_lines[2] = std::move(tmpl(F("NO2: {v} (ppm)"), check_display_value(nox_value, -1, 1, 6))); + } + break; } @@ -5290,6 +5665,18 @@ static void display_values() display_lines[1] = "PM2.5: "; display_lines[1] += check_display_value(pm25_value, -1, 1, 6); break; + case 12: + display_lines[0] = "PM1: "; + display_lines[0] += check_display_value(pm01_value, -1, 1, 6); + display_lines[1] = "PM2.5: "; + display_lines[1] += check_display_value(pm25_value, -1, 1, 6); + break; + case 13: + display_lines[0] = "Temp.: "; + display_lines[0] += check_display_value(pm01_value, -1, 1, 6); + display_lines[1] = "Humi.: "; + display_lines[1] += check_display_value(pm25_value, -1, 1, 6); + break; } display_lines[0].replace("°", String(char(223))); @@ -5391,6 +5778,48 @@ static bool initBMX280(char addr) } } +/***************************************************************** + Init SEN5X Sensor + *****************************************************************/ +static void initSEN5X() +{ + debug_out(F("Trying SEN5X sensor"), DEBUG_MIN_INFO); + + sen5x.begin(Wire); + + uint16_t error; + char errorMessage[256]; + error = sen5x.deviceReset(); + if (error) { + Debug.print("Error trying to execute deviceReset(): "); + errorToString(error, errorMessage, 256); + Debug.println(errorMessage); + sen5x_init_failed = true; + return; + } + +#ifdef USE_PRODUCT_INFO + printSerialNumber(); + printModuleVersions(); +#endif + + if (sen5x.setFanAutoCleaningInterval(SEN5X_AUTO_CLEANING_INTERVAL) != 0) + { + debug_outln_error(F("setting of Auto Cleaning Intervall SEN5X failed!")); + sen5x_init_failed = true; + return; + } + + error = sen5x.startMeasurement(); + if (error) { + Debug.print("Error trying to execute startMeasurement(): "); + errorToString(error, errorMessage, 256); + Debug.println(errorMessage); + sen5x_init_failed = true; + return; + } +} + /***************************************************************** Init SPS30 PM Sensor *****************************************************************/ @@ -5589,6 +6018,13 @@ static void powerOnTestSensors() is_IPS_running = false; } + + if (cfg::sen5x_read) + { + debug_outln_info(F("Read SEN5X...")); + initSEN5X(); + } + if (cfg::sps30_read) { debug_outln_info(F("Read SPS30...")); @@ -6019,6 +6455,70 @@ void loop(void) } } + + + if (cfg::sen5x_read && (!sen5x_init_failed)) + { + if ((msSince(starttime) - SEN5X_read_timer) > SEN5X_WAITING_AFTER_LAST_READ) + { + + uint16_t error; + char errorMessage[256]; + + float massConcentrationPm1p0; + float massConcentrationPm2p5; + float massConcentrationPm4p0; + float massConcentrationPm10p0; + float numberConcentrationPm0p5; + float numberConcentrationPm1p0; + float numberConcentrationPm2p5; + float numberConcentrationPm4p0; + float numberConcentrationPm10p0; + float typicalParticleSize; + float ambientHumidity; + float ambientTemperature; + float vocIndex; + float noxIndex; + + + SEN5X_read_timer = msSince(starttime); + + error = sen5x.readMeasuredPmValues(massConcentrationPm1p0, massConcentrationPm2p5, massConcentrationPm4p0, massConcentrationPm10p0, numberConcentrationPm0p5, numberConcentrationPm1p0,numberConcentrationPm2p5, numberConcentrationPm4p0,numberConcentrationPm10p0, typicalParticleSize); + ++SEN5X_read_counter; + + if (error) { + Debug.print("Error trying to execute readMeasuredPmValues(): "); + errorToString(error, errorMessage, 256); + Debug.println(errorMessage); + }else{ + value_SEN5X_P0 += massConcentrationPm1p0; + value_SEN5X_P1 += massConcentrationPm10p0; + value_SEN5X_P2 += massConcentrationPm2p5; + value_SEN5X_P4 += massConcentrationPm4p0; + value_SEN5X_N05 += numberConcentrationPm0p5; + value_SEN5X_N1 += numberConcentrationPm1p0; + value_SEN5X_N25 += numberConcentrationPm2p5; + value_SEN5X_N4 += numberConcentrationPm4p0; + value_SEN5X_N10 += numberConcentrationPm10p0; + value_SEN5X_TS += typicalParticleSize; + } + + error = sen5x.readMeasuredValues(massConcentrationPm1p0, massConcentrationPm2p5, massConcentrationPm4p0, massConcentrationPm10p0,ambientHumidity, ambientTemperature, vocIndex, noxIndex); + + if (error) { + Debug.print("Error trying to execute readMeasuredValues(): "); + errorToString(error, errorMessage, 256); + Debug.println(errorMessage); + }else{ + value_SEN5X_T += ambientTemperature; + value_SEN5X_H += ambientHumidity; + value_SEN5X_VOC += vocIndex; + value_SEN5X_NOX += noxIndex; + } + ++SEN5X_measurement_count; + } + } + if (cfg::ppd_read) { fetchSensorPPD(result_PPD); @@ -6124,6 +6624,26 @@ void loop(void) data += result_IPS; sum_send_time += sendSensorCommunity(result_IPS, IPS_API_PIN, FPSTR(SENSORS_IPS), "IPS_"); } + if (cfg::sen5x_read && (!sen5x_init_failed)) + { + fetchSensorSEN5X(result); + data += result; + + if(memcmp(SEN5X_type,"SEN50",6) == 0) + { + sum_send_time += sendSensorCommunity(result, SEN5X_API_PIN, FPSTR(SENSORS_SEN50), "SEN50_"); + } + + if(memcmp(SEN5X_type,"SEN54",6)== 0) + { + sum_send_time += sendSensorCommunity(result, SEN5X_API_PIN, FPSTR(SENSORS_SEN54), "SEN54_"); + } + if(memcmp(SEN5X_type,"SEN55",6)== 0) + { + sum_send_time += sendSensorCommunity(result, SEN5X_API_PIN, FPSTR(SENSORS_SEN55), "SEN55_"); + } + result = emptyString; + } if (cfg::sps30_read && (!sps30_init_failed)) { fetchSensorSPS30(result); diff --git a/airrohr-firmware/ext_def.h b/airrohr-firmware/ext_def.h index 0a715e4f..a9be6777 100644 --- a/airrohr-firmware/ext_def.h +++ b/airrohr-firmware/ext_def.h @@ -257,6 +257,13 @@ static const char MEASUREMENT_NAME_INFLUX[] PROGMEM = "feinstaub"; #define IPS_READ 0 #define IPS_API_PIN 1 +// Sensirion Sensirion I2C SEN5X +#define SEN5X_READ 0 +#define SEN5X_API_PIN 16 // New pin n°! 1 for PM, 7 for the rest? +#define SEN5X_WAITING_AFTER_LAST_READ 11000 // waiting time after last reading mesurement data in ms +#define SEN5X_AUTO_CLEANING_INTERVAL 7200 // time in seconds + + // Sensirion SPS30, the more expensive version of the particle sensor #define SPS30_READ 0 #define SPS30_API_PIN 1 diff --git a/airrohr-firmware/html-content.h b/airrohr-firmware/html-content.h index 1130cc08..140f7794 100644 --- a/airrohr-firmware/html-content.h +++ b/airrohr-firmware/html-content.h @@ -9,6 +9,8 @@ const char DBG_TXT_TEMPERATURE[] PROGMEM = "Temperature (°C): "; const char DBG_TXT_HUMIDITY[] PROGMEM = "Humidity (%): "; const char DBG_TXT_PRESSURE[] PROGMEM = "Pressure (hPa): "; const char DBG_TXT_CO2PPM[] PROGMEM = "CO₂ (ppm): "; +const char DBG_TXT_VOCINDEX[] PROGMEM = "VOC index : "; +const char DBG_TXT_NOX[] PROGMEM = "NOx index: "; const char DBG_TXT_START_READING[] PROGMEM = "R/ "; const char DBG_TXT_END_READING[] PROGMEM = "/R "; const char DBG_TXT_CHECKSUM_IS[] PROGMEM = "Checksum is: "; @@ -32,6 +34,9 @@ const char SENSORS_HPM[] PROGMEM = "Honeywell PM"; const char SENSORS_NPM[] PROGMEM = "Tera Sensor Next PM"; const char SENSORS_IPS[] PROGMEM = "Piera Systems IPS-7100"; const char SENSORS_SPS30[] PROGMEM = "Sensirion SPS30"; +const char SENSORS_SEN50[] PROGMEM = "Sensirion SEN50"; +const char SENSORS_SEN54[] PROGMEM = "Sensirion SEN54"; +const char SENSORS_SEN55[] PROGMEM = "Sensirion SEN55"; const char SENSORS_DHT22[] PROGMEM = "DHT22"; const char SENSORS_DS18B20[] PROGMEM = "DS18B20"; const char SENSORS_HTU21D[] PROGMEM = "HTU21D"; diff --git a/airrohr-firmware/intl_bg.h b/airrohr-firmware/intl_bg.h index 0ed101b9..eec81992 100644 --- a/airrohr-firmware/intl_bg.h +++ b/airrohr-firmware/intl_bg.h @@ -25,6 +25,7 @@ const char INTL_HPM[] PROGMEM = "Honeywell сензора за прахови ч const char INTL_NPM[] PROGMEM = "Tera Sensor Next PM ({pm})"; const char INTL_NPM_FULLTIME[] PROGMEM = "Next PM fulltime"; const char INTL_IPS[] PROGMEM = "Piera Systems IPS-7100 ({pm})"; +const char INTL_SEN5X[] PROGMEM = "Sensirion I2C SEN5X ({pm}, {t}, {h}, {voc}, {nox})"; const char INTL_SPS30[] PROGMEM = "Sensirion SPS30 ({pm})"; const char INTL_PPD42NS[] PROGMEM = "PPD42NS ({pm})"; const char INTL_DHT22[] PROGMEM = "DHT22 ({t}, {h})"; @@ -112,6 +113,8 @@ const char INTL_PARTICULATE_MATTER[] PROGMEM = "Прахови частици"; const char INTL_TEMPERATURE[] PROGMEM = "Температура"; const char INTL_HUMIDITY[] PROGMEM = "Влажност на въздуха"; const char INTL_PRESSURE[] PROGMEM = "Атмосферно налягане"; +const char INTL_VOC[] PROGMEM = ""; +const char INTL_NOX[] PROGMEM = ""; const char INTL_DEW_POINT[] PROGMEM = "Точка на оросяване"; const char INTL_CO2_PPM[] PROGMEM = "ppm CO₂"; const char INTL_LEQ_A[] PROGMEM = "LAeq"; diff --git a/airrohr-firmware/intl_cn.h b/airrohr-firmware/intl_cn.h index a79eccd7..698e6134 100644 --- a/airrohr-firmware/intl_cn.h +++ b/airrohr-firmware/intl_cn.h @@ -25,6 +25,7 @@ const char INTL_HPM[] PROGMEM = "Honeywell PM ({pm})"; const char INTL_NPM[] PROGMEM = "Tera传感器下一个PM({pm})"; const char INTL_NPM_FULLTIME[] PROGMEM = "Next PM fulltime"; const char INTL_IPS[] PROGMEM = "Piera Systems IPS-7100 ({pm})"; +const char INTL_SEN5X[] PROGMEM = "Sensirion I2C SEN5X ({pm}, {t}, {h}, {voc}, {nox})"; const char INTL_SPS30[] PROGMEM = "Sensirion SPS30 ({pm})"; const char INTL_PPD42NS[] PROGMEM = "PPD42NS({pm})"; const char INTL_DHT22[] PROGMEM = "DHT22 ({t}, {h})"; @@ -112,6 +113,8 @@ const char INTL_PARTICULATE_MATTER[] PROGMEM = "颗粒物"; const char INTL_TEMPERATURE[] PROGMEM = "温度"; const char INTL_HUMIDITY[] PROGMEM = "湿度"; const char INTL_PRESSURE[] PROGMEM = "气压"; +const char INTL_VOC[] PROGMEM = ""; +const char INTL_NOX[] PROGMEM = ""; const char INTL_DEW_POINT[] PROGMEM = ""; const char INTL_CO2_PPM[] PROGMEM = "ppm CO₂"; const char INTL_LEQ_A[] PROGMEM = "LAeq"; diff --git a/airrohr-firmware/intl_cz.h b/airrohr-firmware/intl_cz.h index 421a58d5..ca635d6f 100644 --- a/airrohr-firmware/intl_cz.h +++ b/airrohr-firmware/intl_cz.h @@ -25,6 +25,7 @@ const char INTL_HPM[] PROGMEM = "Honeywell PM ({pm})"; const char INTL_NPM[] PROGMEM = "Tera Sensor Next PM ({pm})"; const char INTL_NPM_FULLTIME[] PROGMEM = "Next PM fulltime"; const char INTL_IPS[] PROGMEM = "Piera Systems IPS-7100 ({pm})"; +const char INTL_SEN5X[] PROGMEM = "Sensirion I2C SEN5X ({pm}, {t}, {h}, {voc}, {nox})"; const char INTL_SPS30[] PROGMEM = "Sensirion SPS30 ({pm})"; const char INTL_PPD42NS[] PROGMEM = "PPD42NS ({pm})"; const char INTL_DHT22[] PROGMEM = "DHT22 ({t}, {h})"; @@ -112,6 +113,8 @@ const char INTL_PARTICULATE_MATTER[] PROGMEM = "prachových èástic"; const char INTL_TEMPERATURE[] PROGMEM = "teplota"; const char INTL_HUMIDITY[] PROGMEM = "rel. vlhkost"; const char INTL_PRESSURE[] PROGMEM = "tlak vzduchu"; +const char INTL_VOC[] PROGMEM = ""; +const char INTL_NOX[] PROGMEM = ""; const char INTL_DEW_POINT[] PROGMEM = ""; const char INTL_CO2_PPM[] PROGMEM = "ppm CO₂"; const char INTL_LEQ_A[] PROGMEM = "LAeq"; diff --git a/airrohr-firmware/intl_de.h b/airrohr-firmware/intl_de.h index 15159dec..919ea3f1 100644 --- a/airrohr-firmware/intl_de.h +++ b/airrohr-firmware/intl_de.h @@ -25,6 +25,8 @@ const char INTL_HPM[] PROGMEM = "Honeywell PM ({pm})"; const char INTL_NPM[] PROGMEM = "Tera Sensor Next PM ({pm})"; const char INTL_NPM_FULLTIME[] PROGMEM = "Next PM fulltime"; const char INTL_IPS[] PROGMEM = "Piera Systems IPS-7100 ({pm})"; +const char INTL_SEN5X[] PROGMEM = "Sensirion I2C SEN5X ({pm}, {t}, {h}, {voc}, {nox})"; +//const char INTL_SEN5X[] PROGMEM = "Sensirion I2C SEN5X ({pm}, {t}, {h}, {voc})"; const char INTL_SPS30[] PROGMEM = "Sensirion SPS30 ({pm})"; const char INTL_PPD42NS[] PROGMEM = "PPD42NS ({pm})"; const char INTL_DHT22[] PROGMEM = "DHT22 ({t}, {h})"; @@ -67,7 +69,7 @@ const char INTL_STATIC_DNS[] PROGMEM = "DNS Server"; const char INTL_DEBUG_LEVEL[] PROGMEM = "Debug Level"; const char INTL_MEASUREMENT_INTERVAL[] PROGMEM = "Messintervall"; const char INTL_DURATION_ROUTER_MODE[] PROGMEM = "Dauer Routermodus"; -const char INTL_POWERSAVE[] PROGMEM = "Energie sparen"; +const char INTL_POWERSAVE[] PROGMEM = "Energiesparen"; const char INTL_MORE_APIS[] PROGMEM = "Weitere APIs"; const char INTL_SEND_TO_OWN_API[] PROGMEM = "An eigene API senden"; const char INTL_SERVER[] PROGMEM = "Server"; @@ -112,6 +114,8 @@ const char INTL_PARTICULATE_MATTER[] PROGMEM = "Feinstaub"; const char INTL_TEMPERATURE[] PROGMEM = "Temperatur"; const char INTL_HUMIDITY[] PROGMEM = "rel. Luftfeuchte"; const char INTL_PRESSURE[] PROGMEM = "Luftdruck"; +const char INTL_VOC[] PROGMEM = "flüchtige organische Stoffe VOC"; +const char INTL_NOX[] PROGMEM = "Stickoxide NOx"; const char INTL_DEW_POINT[] PROGMEM = "Taupunkt"; const char INTL_CO2_PPM[] PROGMEM = "ppm CO₂"; const char INTL_LEQ_A[] PROGMEM = "LAeq"; diff --git a/airrohr-firmware/intl_dk.h b/airrohr-firmware/intl_dk.h index 747e452e..5c12a855 100644 --- a/airrohr-firmware/intl_dk.h +++ b/airrohr-firmware/intl_dk.h @@ -25,6 +25,7 @@ const char INTL_HPM[] PROGMEM = "Honeywell PM ({pm})"; const char INTL_NPM[] PROGMEM = "Tera Sensor Next PM ({pm})"; const char INTL_NPM_FULLTIME[] PROGMEM = "Next PM fulltime"; const char INTL_IPS[] PROGMEM = "Piera Systems IPS-7100 ({pm})"; +const char INTL_SEN5X[] PROGMEM = "Sensirion I2C SEN5X ({pm}, {t}, {h}, {voc}, {nox})"; const char INTL_SPS30[] PROGMEM = "Sensirion SPS30 ({pm})"; const char INTL_PPD42NS[] PROGMEM = "PPD42NS ({pm})"; const char INTL_DHT22[] PROGMEM = "DHT22 ({t}, {h})"; @@ -112,6 +113,8 @@ const char INTL_PARTICULATE_MATTER[] PROGMEM = "Partikelsensor"; const char INTL_TEMPERATURE[] PROGMEM = "Temperatur"; const char INTL_HUMIDITY[] PROGMEM = "Rel. Fugtighed"; const char INTL_PRESSURE[] PROGMEM = "Lufttryk"; +const char INTL_VOC[] PROGMEM = ""; +const char INTL_NOX[] PROGMEM = ""; const char INTL_DEW_POINT[] PROGMEM = "Dugpunkt"; const char INTL_CO2_PPM[] PROGMEM = "ppm CO₂"; const char INTL_LEQ_A[] PROGMEM = "LAeq"; diff --git a/airrohr-firmware/intl_ee.h b/airrohr-firmware/intl_ee.h index ed4280c1..f0319a39 100644 --- a/airrohr-firmware/intl_ee.h +++ b/airrohr-firmware/intl_ee.h @@ -25,6 +25,7 @@ const char INTL_HPM[] PROGMEM = "Honeywell PM ({pm})"; const char INTL_NPM[] PROGMEM = "Tera Sensor Järgmine PM ({pm})"; const char INTL_NPM_FULLTIME[] PROGMEM = "Next PM fulltime"; const char INTL_IPS[] PROGMEM = "Piera Systems IPS-7100 ({pm})"; +const char INTL_SEN5X[] PROGMEM = "Sensirion I2C SEN5X ({pm}, {t}, {h}, {voc}, {nox})"; const char INTL_SPS30[] PROGMEM = "Sensirion SPS30 ({pm})"; const char INTL_PPD42NS[] PROGMEM = "PPD42NS ({pm})"; const char INTL_DHT22[] PROGMEM = "DHT22 ({t}, {h})"; @@ -112,6 +113,8 @@ const char INTL_PARTICULATE_MATTER[] PROGMEM = "tahked osakesed"; const char INTL_TEMPERATURE[] PROGMEM = "temperatuur"; const char INTL_HUMIDITY[] PROGMEM = "niiskus"; const char INTL_PRESSURE[] PROGMEM = "õhurõhk"; +const char INTL_VOC[] PROGMEM = ""; +const char INTL_NOX[] PROGMEM = ""; const char INTL_DEW_POINT[] PROGMEM = ""; const char INTL_CO2_PPM[] PROGMEM = "ppm CO₂"; const char INTL_LEQ_A[] PROGMEM = "LAeq"; diff --git a/airrohr-firmware/intl_en.h b/airrohr-firmware/intl_en.h index 617b828e..f009a09b 100644 --- a/airrohr-firmware/intl_en.h +++ b/airrohr-firmware/intl_en.h @@ -25,6 +25,8 @@ const char INTL_HPM[] PROGMEM = "Honeywell PM ({pm})"; const char INTL_NPM[] PROGMEM = "Tera Sensor Next PM ({pm})"; const char INTL_NPM_FULLTIME[] PROGMEM = "Next PM fulltime"; const char INTL_IPS[] PROGMEM = "Piera Systems IPS-7100 ({pm})"; +const char INTL_SEN5X[] PROGMEM = "Sensirion I2C SEN5X ({pm}, {t}, {h}, {voc}, {nox})"; +//const char INTL_SEN5X[] PROGMEM = "Sensirion I2C SEN5X ({pm}, {t}, {h}, {voc})"; const char INTL_SPS30[] PROGMEM = "Sensirion SPS30 ({pm})"; const char INTL_PPD42NS[] PROGMEM = "PPD42NS ({pm})"; const char INTL_DHT22[] PROGMEM = "DHT22 ({t}, {h})"; @@ -112,6 +114,8 @@ const char INTL_PARTICULATE_MATTER[] PROGMEM = "particulate matter"; const char INTL_TEMPERATURE[] PROGMEM = "temperature"; const char INTL_HUMIDITY[] PROGMEM = "humidity"; const char INTL_PRESSURE[] PROGMEM = "air pressure"; +const char INTL_VOC[] PROGMEM = "Volatile organic compound"; +const char INTL_NOX[] PROGMEM = "Nitrogen oxides"; const char INTL_DEW_POINT[] PROGMEM = "dew point"; const char INTL_CO2_PPM[] PROGMEM = "ppm CO₂"; const char INTL_LEQ_A[] PROGMEM = "LAeq"; diff --git a/airrohr-firmware/intl_es.h b/airrohr-firmware/intl_es.h index 525824dc..8277de59 100644 --- a/airrohr-firmware/intl_es.h +++ b/airrohr-firmware/intl_es.h @@ -25,6 +25,7 @@ const char INTL_HPM[] PROGMEM = "Honeywell sensor de partículas finas"; const char INTL_NPM[] PROGMEM = "Tera Sensor Next PM ({pm})"; const char INTL_NPM_FULLTIME[] PROGMEM = "Next PM fulltime"; const char INTL_IPS[] PROGMEM = "Piera Systems IPS-7100 ({pm})"; +const char INTL_SEN5X[] PROGMEM = "Sensirion I2C SEN5X ({pm}, {t}, {h}, {voc}, {nox})"; const char INTL_SPS30[] PROGMEM = "Sensirion SPS30 ({pm})"; const char INTL_PPD42NS[] PROGMEM = "PPD42NS ({pm})"; const char INTL_DHT22[] PROGMEM = "DHT22 ({t}, {h})"; @@ -112,6 +113,8 @@ const char INTL_PARTICULATE_MATTER[] PROGMEM = "partículas finas"; const char INTL_TEMPERATURE[] PROGMEM = "Temperatura"; const char INTL_HUMIDITY[] PROGMEM = "Humedad"; const char INTL_PRESSURE[] PROGMEM = "Presión atmosférica"; +const char INTL_VOC[] PROGMEM = ""; +const char INTL_NOX[] PROGMEM = ""; const char INTL_DEW_POINT[] PROGMEM = "Punto de rocío"; const char INTL_CO2_PPM[] PROGMEM = "ppm CO₂"; const char INTL_LEQ_A[] PROGMEM = "LAeq"; diff --git a/airrohr-firmware/intl_fi.h b/airrohr-firmware/intl_fi.h index 6a75dd6a..0e6a3fd8 100644 --- a/airrohr-firmware/intl_fi.h +++ b/airrohr-firmware/intl_fi.h @@ -25,6 +25,7 @@ const char INTL_HPM[] PROGMEM = "Honeywell PM ({pm})"; const char INTL_NPM[] PROGMEM = "Tera Sensor Seuraava PM ({pm})"; const char INTL_NPM_FULLTIME[] PROGMEM = "Next PM fulltime"; const char INTL_IPS[] PROGMEM = "Piera Systems IPS-7100 ({pm})"; +const char INTL_SEN5X[] PROGMEM = "Sensirion I2C SEN5X ({pm}, {t}, {h}, {voc}, {nox})"; const char INTL_SPS30[] PROGMEM = "Sensirion SPS30 ({pm})"; const char INTL_PPD42NS[] PROGMEM = "PPD42NS ({pm})"; const char INTL_DHT22[] PROGMEM = "DHT22 ({t}, {h})"; @@ -112,6 +113,8 @@ const char INTL_PARTICULATE_MATTER[] PROGMEM = "hiukkaset"; const char INTL_TEMPERATURE[] PROGMEM = "lämpötila"; const char INTL_HUMIDITY[] PROGMEM = "kosteus"; const char INTL_PRESSURE[] PROGMEM = "ilmanpaine"; +const char INTL_VOC[] PROGMEM = ""; +const char INTL_NOX[] PROGMEM = ""; const char INTL_DEW_POINT[] PROGMEM = ""; const char INTL_CO2_PPM[] PROGMEM = "ppm CO₂"; const char INTL_LEQ_A[] PROGMEM = "LAeq"; diff --git a/airrohr-firmware/intl_fr.h b/airrohr-firmware/intl_fr.h index ab64ef59..b0a90bcd 100644 --- a/airrohr-firmware/intl_fr.h +++ b/airrohr-firmware/intl_fr.h @@ -25,6 +25,8 @@ const char INTL_HPM[] PROGMEM = "Honeywell détecteur de particules fines"; const char INTL_NPM[] PROGMEM = "Tera Sensor Next PM ({pm})"; const char INTL_NPM_FULLTIME[] PROGMEM = "Next PM permanent"; const char INTL_IPS[] PROGMEM = "Piera Systems IPS-7100 ({pm})"; +const char INTL_SEN5X[] PROGMEM = "Sensirion I2C SEN5X ({pm}, {t}, {h}, {voc}, {nox})"; +//const char INTL_SEN5X[] PROGMEM = "Sensirion I2C SEN5X ({pm}, {t}, {h}, {voc})"; const char INTL_SPS30[] PROGMEM = "Sensirion SPS30 ({pm})"; const char INTL_PPD42NS[] PROGMEM = "PPD42NS ({pm})"; const char INTL_DHT22[] PROGMEM = "DHT22 ({t}, {h})"; @@ -67,7 +69,7 @@ const char INTL_STATIC_DNS[] PROGMEM = "Serveur DNS"; const char INTL_DEBUG_LEVEL[] PROGMEM = "Niveau de débogage"; const char INTL_MEASUREMENT_INTERVAL[] PROGMEM = "Intervalle de mesure"; const char INTL_DURATION_ROUTER_MODE[] PROGMEM = "Durée mode routeur"; -const char INTL_POWERSAVE[] PROGMEM = ""; +const char INTL_POWERSAVE[] PROGMEM = "Sauvegarde énergie"; const char INTL_MORE_APIS[] PROGMEM = "Autres API"; const char INTL_SEND_TO_OWN_API[] PROGMEM = "Envoyer les données vers l'API personnelle"; const char INTL_SERVER[] PROGMEM = "Serveur"; @@ -112,6 +114,8 @@ const char INTL_PARTICULATE_MATTER[] PROGMEM = "particules fines"; const char INTL_TEMPERATURE[] PROGMEM = "Température"; const char INTL_HUMIDITY[] PROGMEM = "Humidité relative"; const char INTL_PRESSURE[] PROGMEM = "Pression atmosphérique"; +const char INTL_VOC[] PROGMEM = "Composés organiques volatiles"; +const char INTL_NOX[] PROGMEM = "Oxydes d'azote"; const char INTL_DEW_POINT[] PROGMEM = "Point de rosée"; const char INTL_CO2_PPM[] PROGMEM = "ppm CO₂"; const char INTL_LEQ_A[] PROGMEM = "LAeq"; diff --git a/airrohr-firmware/intl_gr.h b/airrohr-firmware/intl_gr.h index 452656b4..7c11b1a4 100644 --- a/airrohr-firmware/intl_gr.h +++ b/airrohr-firmware/intl_gr.h @@ -25,6 +25,7 @@ const char INTL_HPM[] PROGMEM = "Honeywell PM ({pm})"; const char INTL_NPM[] PROGMEM = "Αισθητήρας Tera Next PM ({pm})"; const char INTL_NPM_FULLTIME[] PROGMEM = "Next PM fulltime"; const char INTL_IPS[] PROGMEM = "Piera Systems IPS-7100 ({pm})"; +const char INTL_SEN5X[] PROGMEM = "Sensirion I2C SEN5X ({pm}, {t}, {h}, {voc}, {nox})"; const char INTL_SPS30[] PROGMEM = "Sensirion SPS30 ({pm})"; const char INTL_PPD42NS[] PROGMEM = "PPD42NS ({pm})"; const char INTL_DHT22[] PROGMEM = "DHT22 ({t}, {h})"; @@ -112,6 +113,8 @@ const char INTL_PARTICULATE_MATTER[] PROGMEM = "σωματιδιακή ύλη"; const char INTL_TEMPERATURE[] PROGMEM = "θερμοκρασία"; const char INTL_HUMIDITY[] PROGMEM = "υγρασία"; const char INTL_PRESSURE[] PROGMEM = "πίεση του αέρα"; +const char INTL_VOC[] PROGMEM = ""; +const char INTL_NOX[] PROGMEM = ""; const char INTL_DEW_POINT[] PROGMEM = ""; const char INTL_CO2_PPM[] PROGMEM = "ppm CO₂"; const char INTL_LEQ_A[] PROGMEM = "LAeq"; diff --git a/airrohr-firmware/intl_hu.h b/airrohr-firmware/intl_hu.h index edb753f7..db1f26f6 100644 --- a/airrohr-firmware/intl_hu.h +++ b/airrohr-firmware/intl_hu.h @@ -25,6 +25,7 @@ const char INTL_HPM[] PROGMEM = "Honeywell PM szenzor"; const char INTL_NPM[] PROGMEM = "Tera Sensor Next PM ({pm})"; const char INTL_NPM_FULLTIME[] PROGMEM = "Next PM fulltime"; const char INTL_IPS[] PROGMEM = "Piera Systems IPS-7100 ({pm})"; +const char INTL_SEN5X[] PROGMEM = "Sensirion I2C SEN5X ({pm}, {t}, {h}, {voc}, {nox})"; const char INTL_SPS30[] PROGMEM = "Sensirion SPS30 ({pm})"; const char INTL_PPD42NS[] PROGMEM = "PPD42NS ({pm})"; const char INTL_DHT22[] PROGMEM = "DHT22 ({t}, {h})"; @@ -112,6 +113,8 @@ const char INTL_PARTICULATE_MATTER[] PROGMEM = "szálló por"; const char INTL_TEMPERATURE[] PROGMEM = "hőmérséklet"; const char INTL_HUMIDITY[] PROGMEM = "relatív páratartalom"; const char INTL_PRESSURE[] PROGMEM = "légnyomás"; +const char INTL_VOC[] PROGMEM = ""; +const char INTL_NOX[] PROGMEM = ""; const char INTL_DEW_POINT[] PROGMEM = ""; const char INTL_CO2_PPM[] PROGMEM = "ppm CO₂"; const char INTL_LEQ_A[] PROGMEM = "LAeq"; diff --git a/airrohr-firmware/intl_it.h b/airrohr-firmware/intl_it.h index bad235ba..debba85a 100644 --- a/airrohr-firmware/intl_it.h +++ b/airrohr-firmware/intl_it.h @@ -25,6 +25,7 @@ const char INTL_HPM[] PROGMEM = "Honeywell sensore polveri sottili"; const char INTL_NPM[] PROGMEM = "Tera Sensor Next PM ({pm})"; const char INTL_NPM_FULLTIME[] PROGMEM = "Next PM fulltime"; const char INTL_IPS[] PROGMEM = "Piera Systems IPS-7100 ({pm})"; +const char INTL_SEN5X[] PROGMEM = "Sensirion I2C SEN5X ({pm}, {t}, {h}, {voc}, {nox})"; const char INTL_SPS30[] PROGMEM = "Sensirion SPS30 ({pm})"; const char INTL_PPD42NS[] PROGMEM = "PPD42NS ({pm})"; const char INTL_DHT22[] PROGMEM = "DHT22 ({t}, {h})"; @@ -112,6 +113,8 @@ const char INTL_PARTICULATE_MATTER[] PROGMEM = "polveri sottili"; const char INTL_TEMPERATURE[] PROGMEM = "Temperatura"; const char INTL_HUMIDITY[] PROGMEM = "Umidità"; const char INTL_PRESSURE[] PROGMEM = "Pressione dell'aria"; +const char INTL_VOC[] PROGMEM = ""; +const char INTL_NOX[] PROGMEM = ""; const char INTL_DEW_POINT[] PROGMEM = "Punto di rugiada"; const char INTL_CO2_PPM[] PROGMEM = "ppm CO₂"; const char INTL_LEQ_A[] PROGMEM = "LAeq"; diff --git a/airrohr-firmware/intl_jp.h b/airrohr-firmware/intl_jp.h index 4244f939..8ab6ac32 100644 --- a/airrohr-firmware/intl_jp.h +++ b/airrohr-firmware/intl_jp.h @@ -25,6 +25,7 @@ const char INTL_HPM[] PROGMEM = "Honeywell PM ({pm})"; const char INTL_NPM[] PROGMEM = "Tera Sensor Next PM ({pm})"; const char INTL_NPM_FULLTIME[] PROGMEM = "Next PM fulltime"; const char INTL_IPS[] PROGMEM = "Piera Systems IPS-7100 ({pm})"; +const char INTL_SEN5X[] PROGMEM = "Sensirion I2C SEN5X ({pm}, {t}, {h}, {voc}, {nox})"; const char INTL_SPS30[] PROGMEM = "Sensirion SPS30 ({pm})"; const char INTL_PPD42NS[] PROGMEM = "PPD42NS ({pm})"; const char INTL_DHT22[] PROGMEM = "DHT22 ({t}, {h})"; @@ -112,6 +113,8 @@ const char INTL_PARTICULATE_MATTER[] PROGMEM = "粒子状物質"; const char INTL_TEMPERATURE[] PROGMEM = "温度"; const char INTL_HUMIDITY[] PROGMEM = "湿度"; const char INTL_PRESSURE[] PROGMEM = "空気圧"; +const char INTL_VOC[] PROGMEM = ""; +const char INTL_NOX[] PROGMEM = ""; const char INTL_DEW_POINT[] PROGMEM = ""; const char INTL_CO2_PPM[] PROGMEM = "ppm CO₂"; const char INTL_LEQ_A[] PROGMEM = "LAeq"; diff --git a/airrohr-firmware/intl_lt.h b/airrohr-firmware/intl_lt.h index cb9b80c1..10aff804 100644 --- a/airrohr-firmware/intl_lt.h +++ b/airrohr-firmware/intl_lt.h @@ -25,6 +25,7 @@ const char INTL_HPM[] PROGMEM = "Honeywell PM ({pm})"; const char INTL_NPM[] PROGMEM = "Tera Sensor Next PM ({pm})"; const char INTL_NPM_FULLTIME[] PROGMEM = "Next PM fulltime"; const char INTL_IPS[] PROGMEM = "Piera Systems IPS-7100 ({pm})"; +const char INTL_SEN5X[] PROGMEM = "Sensirion I2C SEN5X ({pm}, {t}, {h}, {voc}, {nox})"; const char INTL_SPS30[] PROGMEM = "Sensirion SPS30 ({pm})"; const char INTL_PPD42NS[] PROGMEM = "PPD42NS ({pm})"; const char INTL_DHT22[] PROGMEM = "DHT22 ({t}, {h})"; @@ -112,6 +113,8 @@ const char INTL_PARTICULATE_MATTER[] PROGMEM = "kietosios dalelės"; const char INTL_TEMPERATURE[] PROGMEM = "temperatūra"; const char INTL_HUMIDITY[] PROGMEM = "drėgmė"; const char INTL_PRESSURE[] PROGMEM = "oro slėgis"; +const char INTL_VOC[] PROGMEM = ""; +const char INTL_NOX[] PROGMEM = ""; const char INTL_DEW_POINT[] PROGMEM = ""; const char INTL_CO2_PPM[] PROGMEM = "ppm CO₂"; const char INTL_LEQ_A[] PROGMEM = "LAeq"; diff --git a/airrohr-firmware/intl_lu.h b/airrohr-firmware/intl_lu.h index 6bdccbc5..1e82df01 100644 --- a/airrohr-firmware/intl_lu.h +++ b/airrohr-firmware/intl_lu.h @@ -25,6 +25,7 @@ const char INTL_HPM[] PROGMEM = "Honeywell PM ({pm})"; const char INTL_NPM[] PROGMEM = "Tera Sensor Next PM ({pm})"; const char INTL_NPM_FULLTIME[] PROGMEM = "Next PM fulltime"; const char INTL_IPS[] PROGMEM = "Piera Systems IPS-7100 ({pm})"; +const char INTL_SEN5X[] PROGMEM = "Sensirion I2C SEN5X ({pm}, {t}, {h}, {voc}, {nox})"; const char INTL_SPS30[] PROGMEM = "Sensirion SPS30 ({pm})"; const char INTL_PPD42NS[] PROGMEM = "PPD42NS ({pm})"; const char INTL_DHT22[] PROGMEM = "DHT22 ({t}, {h})"; @@ -112,6 +113,8 @@ const char INTL_PARTICULATE_MATTER[] PROGMEM = "Reng Stëbspartikelen"; const char INTL_TEMPERATURE[] PROGMEM = "Temperatur"; const char INTL_HUMIDITY[] PROGMEM = "rel. Loftfiichtegkeet"; const char INTL_PRESSURE[] PROGMEM = "Loftdrock"; +const char INTL_VOC[] PROGMEM = ""; +const char INTL_NOX[] PROGMEM = ""; const char INTL_DEW_POINT[] PROGMEM = ""; const char INTL_CO2_PPM[] PROGMEM = "ppm CO₂"; const char INTL_LEQ_A[] PROGMEM = "LAeq"; diff --git a/airrohr-firmware/intl_lv.h b/airrohr-firmware/intl_lv.h index 5e2c6cc8..4360aeca 100644 --- a/airrohr-firmware/intl_lv.h +++ b/airrohr-firmware/intl_lv.h @@ -25,6 +25,7 @@ const char INTL_HPM[] PROGMEM = "Honeywell PM ({pm})"; const char INTL_NPM[] PROGMEM = "Tera Sensor Next PM ({pm})"; const char INTL_NPM_FULLTIME[] PROGMEM = "Next PM fulltime"; const char INTL_IPS[] PROGMEM = "Piera Systems IPS-7100 ({pm})"; +const char INTL_SEN5X[] PROGMEM = "Sensirion I2C SEN5X ({pm}, {t}, {h}, {voc}, {nox})"; const char INTL_SPS30[] PROGMEM = "Sensirion SPS30 ({pm})"; const char INTL_PPD42NS[] PROGMEM = "PPD42NS ({pm})"; const char INTL_DHT22[] PROGMEM = "DHT22 ({t}, {h})"; @@ -112,6 +113,8 @@ const char INTL_PARTICULATE_MATTER[] PROGMEM = "cietās daļiņas"; const char INTL_TEMPERATURE[] PROGMEM = "temperatūra"; const char INTL_HUMIDITY[] PROGMEM = "mitrums"; const char INTL_PRESSURE[] PROGMEM = "gaisa spiediens"; +const char INTL_VOC[] PROGMEM = ""; +const char INTL_NOX[] PROGMEM = ""; const char INTL_DEW_POINT[] PROGMEM = ""; const char INTL_CO2_PPM[] PROGMEM = "ppm CO₂"; const char INTL_LEQ_A[] PROGMEM = "LAeq"; diff --git a/airrohr-firmware/intl_nl.h b/airrohr-firmware/intl_nl.h index 32154b28..e53d756e 100644 --- a/airrohr-firmware/intl_nl.h +++ b/airrohr-firmware/intl_nl.h @@ -25,6 +25,7 @@ const char INTL_HPM[] PROGMEM = "Honeywell PM ({pm})"; const char INTL_NPM[] PROGMEM = "Tera Sensor Next PM ({pm})"; const char INTL_NPM_FULLTIME[] PROGMEM = "Next PM fulltime"; const char INTL_IPS[] PROGMEM = "Piera Systems IPS-7100 ({pm})"; +const char INTL_SEN5X[] PROGMEM = "Sensirion I2C SEN5X ({pm}, {t}, {h}, {voc}, {nox})"; const char INTL_SPS30[] PROGMEM = "Sensirion SPS30 ({pm})"; const char INTL_PPD42NS[] PROGMEM = "PPD42NS ({pm})"; const char INTL_DHT22[] PROGMEM = "DHT22 ({t}, {h})"; @@ -112,6 +113,8 @@ const char INTL_PARTICULATE_MATTER[] PROGMEM = "fijnstof"; const char INTL_TEMPERATURE[] PROGMEM = "Temperatuur"; const char INTL_HUMIDITY[] PROGMEM = "Rel. luchtvochtigheid"; const char INTL_PRESSURE[] PROGMEM = "Luchtdruk"; +const char INTL_VOC[] PROGMEM = "Vluchtige organische stoffen"; +const char INTL_NOX[] PROGMEM = "Stikstofoxiden"; const char INTL_DEW_POINT[] PROGMEM = "Dauwpunt"; const char INTL_CO2_PPM[] PROGMEM = "ppm CO₂"; const char INTL_LEQ_A[] PROGMEM = "LAeq"; diff --git a/airrohr-firmware/intl_pl.h b/airrohr-firmware/intl_pl.h index 6bd69cc2..b39e2fd6 100644 --- a/airrohr-firmware/intl_pl.h +++ b/airrohr-firmware/intl_pl.h @@ -25,6 +25,7 @@ const char INTL_HPM[] PROGMEM = "Honeywell ({pm})"; const char INTL_NPM[] PROGMEM = "Tera Sensor Next PM ({pm})"; const char INTL_NPM_FULLTIME[] PROGMEM = "Next PM fulltime"; const char INTL_IPS[] PROGMEM = "Piera Systems IPS-7100 ({pm})"; +const char INTL_SEN5X[] PROGMEM = "Sensirion I2C SEN5X ({pm}, {t}, {h}, {voc}, {nox})"; const char INTL_SPS30[] PROGMEM = "Sensirion SPS30 ({pm})"; const char INTL_PPD42NS[] PROGMEM = "PPD42NS ({pm})"; const char INTL_DHT22[] PROGMEM = "DHT22 ({t}, {h})"; @@ -67,7 +68,7 @@ const char INTL_STATIC_DNS[] PROGMEM = "Statyczny DNS"; const char INTL_DEBUG_LEVEL[] PROGMEM = "Poziom debugowania"; const char INTL_MEASUREMENT_INTERVAL[] PROGMEM = "Czas między pomiarami (sek.)"; const char INTL_DURATION_ROUTER_MODE[] PROGMEM = "Czas trwania w trybie routera (sek.)"; -const char INTL_POWERSAVE[] PROGMEM = ""; +const char INTL_POWERSAVE[] PROGMEM = "Oszczędzanie energii"; const char INTL_MORE_APIS[] PROGMEM = "Kolejne API"; const char INTL_SEND_TO_OWN_API[] PROGMEM = "Wysyłaj dane do własnego API"; const char INTL_SERVER[] PROGMEM = "Adres serwera"; @@ -112,6 +113,8 @@ const char INTL_PARTICULATE_MATTER[] PROGMEM = "Pył zawieszony"; const char INTL_TEMPERATURE[] PROGMEM = "Temperatura"; const char INTL_HUMIDITY[] PROGMEM = "Wilgotność"; const char INTL_PRESSURE[] PROGMEM = "Ciśnienie"; +const char INTL_VOC[] PROGMEM = "Lotne związki organiczne"; +const char INTL_NOX[] PROGMEM = "Tlenki azotu"; const char INTL_DEW_POINT[] PROGMEM = "Punkt rosy"; const char INTL_CO2_PPM[] PROGMEM = "ppm CO₂"; const char INTL_LEQ_A[] PROGMEM = "LAeq"; diff --git a/airrohr-firmware/intl_pt.h b/airrohr-firmware/intl_pt.h index 4d305581..d353d8fb 100644 --- a/airrohr-firmware/intl_pt.h +++ b/airrohr-firmware/intl_pt.h @@ -25,6 +25,7 @@ const char INTL_HPM[] PROGMEM = "Honeywell sensor de partículas finas"; const char INTL_NPM[] PROGMEM = "Tera Sensor Next PM ({pm})"; const char INTL_NPM_FULLTIME[] PROGMEM = "Next PM fulltime"; const char INTL_IPS[] PROGMEM = "Piera Systems IPS-7100 ({pm})"; +const char INTL_SEN5X[] PROGMEM = "Sensirion I2C SEN5X ({pm}, {t}, {h}, {voc}, {nox})"; const char INTL_SPS30[] PROGMEM = "Sensirion SPS30 ({pm})"; const char INTL_PPD42NS[] PROGMEM = "PPD42NS ({pm})"; const char INTL_DHT22[] PROGMEM = "DHT22 ({t}, {h})"; @@ -112,6 +113,8 @@ const char INTL_PARTICULATE_MATTER[] PROGMEM = "partículas finas"; const char INTL_TEMPERATURE[] PROGMEM = "Temperatura"; const char INTL_HUMIDITY[] PROGMEM = "Humidade"; const char INTL_PRESSURE[] PROGMEM = "Pressão atmosférica"; +const char INTL_VOC[] PROGMEM = ""; +const char INTL_NOX[] PROGMEM = ""; const char INTL_DEW_POINT[] PROGMEM = ""; const char INTL_CO2_PPM[] PROGMEM = "ppm CO₂"; const char INTL_LEQ_A[] PROGMEM = "LAeq"; diff --git a/airrohr-firmware/intl_ro.h b/airrohr-firmware/intl_ro.h index 68d3a54a..7c8ffe4f 100644 --- a/airrohr-firmware/intl_ro.h +++ b/airrohr-firmware/intl_ro.h @@ -25,6 +25,7 @@ const char INTL_HPM[] PROGMEM = "Honeywell PM ({pm})"; const char INTL_NPM[] PROGMEM = "Tera Sensor Next PM ({pm})"; const char INTL_NPM_FULLTIME[] PROGMEM = "Next PM fulltime"; const char INTL_IPS[] PROGMEM = "Piera Systems IPS-7100 ({pm})"; +const char INTL_SEN5X[] PROGMEM = "Sensirion I2C SEN5X ({pm}, {t}, {h}, {voc}, {nox})"; const char INTL_SPS30[] PROGMEM = "Sensirion SPS30 ({pm})"; const char INTL_PPD42NS[] PROGMEM = "PPD42NS ({pm})"; const char INTL_DHT22[] PROGMEM = "DHT22 ({t}, {h})"; @@ -112,6 +113,8 @@ const char INTL_PARTICULATE_MATTER[] PROGMEM = "pulberi în suspensie"; const char INTL_TEMPERATURE[] PROGMEM = "temperatură"; const char INTL_HUMIDITY[] PROGMEM = "umiditate"; const char INTL_PRESSURE[] PROGMEM = "presiunea aerului"; +const char INTL_VOC[] PROGMEM = ""; +const char INTL_NOX[] PROGMEM = ""; const char INTL_DEW_POINT[] PROGMEM = ""; const char INTL_CO2_PPM[] PROGMEM = "ppm CO₂"; const char INTL_LEQ_A[] PROGMEM = "LAeq"; diff --git a/airrohr-firmware/intl_rs.h b/airrohr-firmware/intl_rs.h index 42d9ea5d..ff1c0ed2 100644 --- a/airrohr-firmware/intl_rs.h +++ b/airrohr-firmware/intl_rs.h @@ -25,6 +25,7 @@ const char INTL_HPM[] PROGMEM = "Honeywell PM ({pm})"; const char INTL_NPM[] PROGMEM = "Tera Sensor Next PM ({pm})"; const char INTL_NPM_FULLTIME[] PROGMEM = "Next PM fulltime"; const char INTL_IPS[] PROGMEM = "Piera Systems IPS-7100 ({pm})"; +const char INTL_SEN5X[] PROGMEM = "Sensirion I2C SEN5X ({pm}, {t}, {h}, {voc}, {nox})"; const char INTL_SPS30[] PROGMEM = "Sensirion SPS30 ({pm})"; const char INTL_PPD42NS[] PROGMEM = "PPD42NS ({pm})"; const char INTL_DHT22[] PROGMEM = "DHT22 ({t}, {h})"; @@ -112,6 +113,8 @@ const char INTL_PARTICULATE_MATTER[] PROGMEM = "suspendovane čestice"; const char INTL_TEMPERATURE[] PROGMEM = "temperatura"; const char INTL_HUMIDITY[] PROGMEM = "vlažnost"; const char INTL_PRESSURE[] PROGMEM = "vazdušni pritisak"; +const char INTL_VOC[] PROGMEM = ""; +const char INTL_NOX[] PROGMEM = ""; const char INTL_DEW_POINT[] PROGMEM = ""; const char INTL_CO2_PPM[] PROGMEM = "ppm CO₂"; const char INTL_LEQ_A[] PROGMEM = "LAeq"; diff --git a/airrohr-firmware/intl_ru.h b/airrohr-firmware/intl_ru.h index cf29b690..6cfeb73f 100644 --- a/airrohr-firmware/intl_ru.h +++ b/airrohr-firmware/intl_ru.h @@ -25,6 +25,7 @@ const char INTL_HPM[] PROGMEM = "Honeywell PM ({pm})"; const char INTL_NPM[] PROGMEM = "Tera Sensor Next PM ({pm})"; const char INTL_NPM_FULLTIME[] PROGMEM = "Next PM fulltime"; const char INTL_IPS[] PROGMEM = "Piera Systems IPS-7100 ({pm})"; +const char INTL_SEN5X[] PROGMEM = "Sensirion I2C SEN5X ({pm}, {t}, {h}, {voc}, {nox})"; const char INTL_SPS30[] PROGMEM = "Sensirion SPS30 ({pm})"; const char INTL_PPD42NS[] PROGMEM = "PPD42NS ({pm})"; const char INTL_DHT22[] PROGMEM = "DHT22 ({t}, {h})"; @@ -112,6 +113,8 @@ const char INTL_PARTICULATE_MATTER[] PROGMEM = "Датчик пыли"; const char INTL_TEMPERATURE[] PROGMEM = "Температура"; const char INTL_HUMIDITY[] PROGMEM = "Относительная влажность"; const char INTL_PRESSURE[] PROGMEM = "Давление воздуха"; +const char INTL_VOC[] PROGMEM = ""; +const char INTL_NOX[] PROGMEM = ""; const char INTL_DEW_POINT[] PROGMEM = "Точка росы"; const char INTL_CO2_PPM[] PROGMEM = "ppm CO₂"; const char INTL_LEQ_A[] PROGMEM = "LAeq"; diff --git a/airrohr-firmware/intl_se.h b/airrohr-firmware/intl_se.h index 44a70e66..afb8ad89 100644 --- a/airrohr-firmware/intl_se.h +++ b/airrohr-firmware/intl_se.h @@ -25,6 +25,7 @@ const char INTL_HPM[] PROGMEM = "Honeywell PM ({pm})"; const char INTL_NPM[] PROGMEM = "Tera Sensor Next PM ({pm})"; const char INTL_NPM_FULLTIME[] PROGMEM = "Next PM fulltime"; const char INTL_IPS[] PROGMEM = "Piera Systems IPS-7100 ({pm})"; +const char INTL_SEN5X[] PROGMEM = "Sensirion I2C SEN5X ({pm}, {t}, {h}, {voc}, {nox})"; const char INTL_SPS30[] PROGMEM = "Sensirion SPS30 ({pm})"; const char INTL_PPD42NS[] PROGMEM = "PPD42NS ({pm})"; const char INTL_DHT22[] PROGMEM = "DHT22 ({t}, {h})"; @@ -112,6 +113,8 @@ const char INTL_PARTICULATE_MATTER[] PROGMEM = "partikelsensor"; const char INTL_TEMPERATURE[] PROGMEM = "Temperatur"; const char INTL_HUMIDITY[] PROGMEM = "rel. fuktighet"; const char INTL_PRESSURE[] PROGMEM = "Lufttryck"; +const char INTL_VOC[] PROGMEM = ""; +const char INTL_NOX[] PROGMEM = ""; const char INTL_DEW_POINT[] PROGMEM = "Daggpunkt"; const char INTL_CO2_PPM[] PROGMEM = "ppm CO₂"; const char INTL_LEQ_A[] PROGMEM = "LAeq"; diff --git a/airrohr-firmware/intl_si.h b/airrohr-firmware/intl_si.h index 1a0878f3..264c548c 100644 --- a/airrohr-firmware/intl_si.h +++ b/airrohr-firmware/intl_si.h @@ -25,6 +25,7 @@ const char INTL_HPM[] PROGMEM = "Honeywell PM ({pm})"; const char INTL_NPM[] PROGMEM = "Senzor Tera Naslednji PM ({pm})"; const char INTL_NPM_FULLTIME[] PROGMEM = "Next PM fulltime"; const char INTL_IPS[] PROGMEM = "Piera Systems IPS-7100 ({pm})"; +const char INTL_SEN5X[] PROGMEM = "Sensirion I2C SEN5X ({pm}, {t}, {h}, {voc}, {nox})"; const char INTL_SPS30[] PROGMEM = "Sensirion SPS30 ({pm})"; const char INTL_PPD42NS[] PROGMEM = "PPD42NS ({pm})"; const char INTL_DHT22[] PROGMEM = "DHT22 ({t}, {h})"; @@ -112,6 +113,8 @@ const char INTL_PARTICULATE_MATTER[] PROGMEM = "trdni delci"; const char INTL_TEMPERATURE[] PROGMEM = "temperatura"; const char INTL_HUMIDITY[] PROGMEM = "vlažnost"; const char INTL_PRESSURE[] PROGMEM = "zračni tlak"; +const char INTL_VOC[] PROGMEM = ""; +const char INTL_NOX[] PROGMEM = ""; const char INTL_DEW_POINT[] PROGMEM = ""; const char INTL_CO2_PPM[] PROGMEM = "ppm CO₂"; const char INTL_LEQ_A[] PROGMEM = "LAeq"; diff --git a/airrohr-firmware/intl_sk.h b/airrohr-firmware/intl_sk.h index 4ee73b65..a3ab0d65 100644 --- a/airrohr-firmware/intl_sk.h +++ b/airrohr-firmware/intl_sk.h @@ -25,6 +25,7 @@ const char INTL_HPM[] PROGMEM = "Honeywell PM ({pm})"; const char INTL_NPM[] PROGMEM = "Tera Sensor Next PM ({pm})"; const char INTL_NPM_FULLTIME[] PROGMEM = "Next PM fulltime"; const char INTL_IPS[] PROGMEM = "Piera Systems IPS-7100 ({pm})"; +const char INTL_SEN5X[] PROGMEM = "Sensirion I2C SEN5X ({pm}, {t}, {h}, {voc}, {nox})"; const char INTL_SPS30[] PROGMEM = "Sensirion SPS30 ({pm})"; const char INTL_PPD42NS[] PROGMEM = "PPD42NS ({pm})"; const char INTL_DHT22[] PROGMEM = "DHT22 ({t}, {h})"; @@ -112,6 +113,8 @@ const char INTL_PARTICULATE_MATTER[] PROGMEM = "prachových častíc"; const char INTL_TEMPERATURE[] PROGMEM = "teplota"; const char INTL_HUMIDITY[] PROGMEM = "rel. vlhkosť"; const char INTL_PRESSURE[] PROGMEM = "tlak vzduchu"; +const char INTL_VOC[] PROGMEM = ""; +const char INTL_NOX[] PROGMEM = ""; const char INTL_DEW_POINT[] PROGMEM = ""; const char INTL_CO2_PPM[] PROGMEM = "ppm CO₂"; const char INTL_LEQ_A[] PROGMEM = "LAeq"; diff --git a/airrohr-firmware/intl_template.h b/airrohr-firmware/intl_template.h index f3b6ca62..d61c2792 100644 --- a/airrohr-firmware/intl_template.h +++ b/airrohr-firmware/intl_template.h @@ -25,6 +25,8 @@ const char INTL_HPM[] PROGMEM = "Honeywell PM ({pm})"; const char INTL_NPM[] PROGMEM = "Tera Sensor Next PM ({pm})"; const char INTL_NPM_FULLTIME[] PROGMEM = "Next PM fulltime"; const char INTL_IPS[] PROGMEM = "Piera Systems IPS-7100 ({pm})"; +const char INTL_SEN5X[] PROGMEM = "Sensirion I2C SEN5X ({pm}, {t}, {h}, {voc}, {nox})"; +//const char INTL_SEN5X[] PROGMEM = "Sensirion I2C SEN5X ({pm}, {t}, {h}, {voc})"; const char INTL_SPS30[] PROGMEM = "Sensirion SPS30 ({pm})"; const char INTL_PPD42NS[] PROGMEM = "PPD42NS ({pm})"; const char INTL_DHT22[] PROGMEM = "DHT22 ({t}, {h})"; @@ -112,6 +114,8 @@ const char INTL_PARTICULATE_MATTER[] PROGMEM = ""; const char INTL_TEMPERATURE[] PROGMEM = ""; const char INTL_HUMIDITY[] PROGMEM = ""; const char INTL_PRESSURE[] PROGMEM = ""; +const char INTL_VOC[] PROGMEM = ""; +const char INTL_NOX[] PROGMEM = ""; const char INTL_DEW_POINT[] PROGMEM = ""; const char INTL_CO2_PPM[] PROGMEM = "ppm CO₂"; const char INTL_LEQ_A[] PROGMEM = "LAeq"; diff --git a/airrohr-firmware/intl_tr.h b/airrohr-firmware/intl_tr.h index cf791bd7..5047885d 100644 --- a/airrohr-firmware/intl_tr.h +++ b/airrohr-firmware/intl_tr.h @@ -25,6 +25,7 @@ const char INTL_HPM[] PROGMEM = "Honeywell PM ({pm})"; const char INTL_NPM[] PROGMEM = "Tera Sensor Next PM ({pm})"; const char INTL_NPM_FULLTIME[] PROGMEM = "Next PM fulltime"; const char INTL_IPS[] PROGMEM = "Piera Systems IPS-7100 ({pm})"; +const char INTL_SEN5X[] PROGMEM = "Sensirion I2C SEN5X ({pm}, {t}, {h}, {voc}, {nox})"; const char INTL_SPS30[] PROGMEM = "Sensirion SPS30 ({pm})"; const char INTL_PPD42NS[] PROGMEM = "PPD42NS ({pm})"; const char INTL_DHT22[] PROGMEM = "DHT22 ({t}, {h})"; @@ -112,6 +113,8 @@ const char INTL_PARTICULATE_MATTER[] PROGMEM = "Ince Toz(Hava Kirliliği)"; const char INTL_TEMPERATURE[] PROGMEM = "sıcaklık"; const char INTL_HUMIDITY[] PROGMEM = "nem"; const char INTL_PRESSURE[] PROGMEM = "hava basıncı"; +const char INTL_VOC[] PROGMEM = ""; +const char INTL_NOX[] PROGMEM = ""; const char INTL_DEW_POINT[] PROGMEM = "İşbâ"; const char INTL_CO2_PPM[] PROGMEM = "ppm CO₂"; const char INTL_LEQ_A[] PROGMEM = "LAeq"; diff --git a/airrohr-firmware/intl_ua.h b/airrohr-firmware/intl_ua.h index cb70e9ed..4c92b7a5 100644 --- a/airrohr-firmware/intl_ua.h +++ b/airrohr-firmware/intl_ua.h @@ -25,6 +25,7 @@ const char INTL_HPM[] PROGMEM = "Honeywell PM ({pm})"; const char INTL_NPM[] PROGMEM = "Tera Sensor Next PM ({pm})"; const char INTL_NPM_FULLTIME[] PROGMEM = "Next PM fulltime"; const char INTL_IPS[] PROGMEM = "Piera Systems IPS-7100 ({pm})"; +const char INTL_SEN5X[] PROGMEM = "Sensirion I2C SEN5X ({pm}, {t}, {h}, {voc}, {nox})"; const char INTL_SPS30[] PROGMEM = "Sensirion SPS30 ({pm})"; const char INTL_PPD42NS[] PROGMEM = "PPD42NS ({pm})"; const char INTL_DHT22[] PROGMEM = "DHT22 ({t}, {h})"; @@ -112,6 +113,8 @@ const char INTL_PARTICULATE_MATTER[] PROGMEM = "Вимірювач дрібни const char INTL_TEMPERATURE[] PROGMEM = "температура"; const char INTL_HUMIDITY[] PROGMEM = "вологість"; const char INTL_PRESSURE[] PROGMEM = "атмосферний тиск"; +const char INTL_VOC[] PROGMEM = "Леткі органічні речовини"; +const char INTL_NOX[] PROGMEM = "Оксиди азоту"; const char INTL_DEW_POINT[] PROGMEM = "точка роси"; const char INTL_CO2_PPM[] PROGMEM = "ppm CO₂"; const char INTL_LEQ_A[] PROGMEM = "LAeq"; diff --git a/airrohr-firmware/platformio.ini b/airrohr-firmware/platformio.ini index b92dd55f..7529c0cc 100644 --- a/airrohr-firmware/platformio.ini +++ b/airrohr-firmware/platformio.ini @@ -53,6 +53,8 @@ lib_deps_external = bblanchon/ArduinoJson@6.18.3 ThingPulse/ESP8266 and ESP32 OLED driver for SSD1306 displays @ ^4.2.1 mikalhart/TinyGPSPlus@1.0.2 + sensirion/Sensirion Core@^0.6.0 + sensirion/Sensirion I2C SEN5X@^0.2.0 ; system libraries from platform -> no version number lib_deps_esp8266_platform = @@ -451,3 +453,15 @@ board_build.filesystem = ${common.board_build.filesystem} build_flags = ${common.build_flags} -DINTL_UA lib_deps = ${common.lib_deps_esp8266} extra_scripts = ${common.extra_scripts} + +[env:d1_mini] +lang = fr +platform = ${common.platform_version} +framework = arduino +board = d1_mini +board_build.f_cpu = ${common.board_build.f_cpu} +board_build.ldscript = ${common.board_build.ldscript} +board_build.filesystem = ${common.board_build.filesystem} +build_flags = ${common.build_flags} -DINTL_FR +lib_deps = ${common.lib_deps_esp8266} +extra_scripts = ${common.extra_scripts} \ No newline at end of file diff --git a/airrohr-firmware/utils.cpp b/airrohr-firmware/utils.cpp index ec51f7f3..35b14c7a 100644 --- a/airrohr-firmware/utils.cpp +++ b/airrohr-firmware/utils.cpp @@ -105,6 +105,8 @@ String add_sensor_type(const String& sensor_text) { s.replace("{h}", FPSTR(INTL_HUMIDITY)); s.replace("{p}", FPSTR(INTL_PRESSURE)); s.replace("{l_a}", FPSTR(INTL_LEQ_A)); + s.replace("{voc}", FPSTR(INTL_VOC)); + s.replace("{nox}", FPSTR(INTL_NOX)); return s; } @@ -757,4 +759,4 @@ bool isNumeric(const String& str) { return false; } return true; -} \ No newline at end of file +}