From c9e3a2a9b4b7d8ff2a26823c7884c0971f516f68 Mon Sep 17 00:00:00 2001 From: Phat Nguyen Date: Sat, 17 Feb 2024 10:38:10 +0700 Subject: [PATCH 01/26] Rename example `Open_Air_O` to `Open_Air` --- examples/{Open_Air_O/Open_Air_O.ino => Open_Air/Open_Air.ino} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename examples/{Open_Air_O/Open_Air_O.ino => Open_Air/Open_Air.ino} (100%) diff --git a/examples/Open_Air_O/Open_Air_O.ino b/examples/Open_Air/Open_Air.ino similarity index 100% rename from examples/Open_Air_O/Open_Air_O.ino rename to examples/Open_Air/Open_Air.ino From e48ff0e41c965a3a7e0600fcab2221fbff19b920 Mon Sep 17 00:00:00 2001 From: Phat Nguyen Date: Sat, 17 Feb 2024 10:45:56 +0700 Subject: [PATCH 02/26] Fix model `PST` send data to cloud with channel --- examples/Open_Air/Open_Air.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/Open_Air/Open_Air.ino b/examples/Open_Air/Open_Air.ino index 9bfeac2..2f3dae5 100644 --- a/examples/Open_Air/Open_Air.ino +++ b/examples/Open_Air/Open_Air.ino @@ -557,7 +557,7 @@ static void sendDataToServer(void) { } } - if (fw_mode == FW_MODE_PP || FW_MODE_PPT) { + if ((fw_mode == FW_MODE_PP) || (fw_mode == FW_MODE_PPT)) { root["pm01"] = (int)((pm01_1 + pm01_2) / 2); root["pm02"] = (int)((pm25_1 + pm25_2) / 2); root["pm003_count"] = (int)((pm03PCount_1 + pm03PCount_2) / 2); From 7c1eae83e4b8962f7d56e0dc406e5e03c9ec2abc Mon Sep 17 00:00:00 2001 From: Phat Nguyen Date: Sat, 17 Feb 2024 12:04:11 +0700 Subject: [PATCH 03/26] Add logging for `abcDays` --- examples/BASIC_v4/BASIC_v4.ino | 14 ++++++++++---- examples/ONE_I-9PSL/ONE_I-9PSL.ino | 14 ++++++++++---- examples/Open_Air/Open_Air.ino | 16 +++++++++++----- src/s8/s8.cpp | 9 ++++++++- src/s8/s8.h | 3 ++- 5 files changed, 41 insertions(+), 15 deletions(-) diff --git a/examples/BASIC_v4/BASIC_v4.ino b/examples/BASIC_v4/BASIC_v4.ino index 8fdedca..9583ca3 100644 --- a/examples/BASIC_v4/BASIC_v4.ino +++ b/examples/BASIC_v4/BASIC_v4.ino @@ -305,7 +305,7 @@ public: * * @return int days, -1 if invalid. */ - int getCo2Abccalib(void) { return co2AbcCalib; } + int getCo2AbcDaysConfig(void) { return co2AbcCalib; } /** * @brief Get device configuration model name @@ -562,9 +562,15 @@ static void serverConfigPoll(void) { if (agServer.isCo2Calib()) { co2Calibration(); } - if (agServer.getCo2Abccalib() > 0) { - if (ag.s8.setAutoCalib(agServer.getCo2Abccalib() * 24) == false) { - Serial.println("Set S8 auto calib failed"); + if (agServer.getCo2AbcDaysConfig() > 0) { + Serial.printf("abcDays config: %d days(%d hours)\r\n", + agServer.getCo2AbcDaysConfig(), + agServer.getCo2AbcDaysConfig() * 24); + Serial.printf("Current config: %d (hours)\r\n", ag.s8.getAbcPeriod()); + if (ag.s8.setAbcPeriod(agServer.getCo2AbcDaysConfig() * 24) == false) { + Serial.println("Set S8 abcDays period calib failed"); + } else { + Serial.println("Set S8 abcDays period calib success"); } } } diff --git a/examples/ONE_I-9PSL/ONE_I-9PSL.ino b/examples/ONE_I-9PSL/ONE_I-9PSL.ino index a2ba33c..2ac75e6 100644 --- a/examples/ONE_I-9PSL/ONE_I-9PSL.ino +++ b/examples/ONE_I-9PSL/ONE_I-9PSL.ino @@ -372,7 +372,7 @@ public: * * @return int days, -1 if invalid. */ - int getCo2Abccalib(void) { return co2AbcCalib; } + int getCo2AbcDaysConfig(void) { return co2AbcCalib; } /** * @brief Get device configuration model name @@ -1086,9 +1086,15 @@ static void serverConfigPoll(void) { if (agServer.isCo2Calib()) { co2Calibration(); } - if (agServer.getCo2Abccalib() > 0) { - if (ag.s8.setAutoCalib(agServer.getCo2Abccalib() * 24) == false) { - Serial.println("Set S8 auto calib failed"); + if (agServer.getCo2AbcDaysConfig() > 0) { + Serial.printf("abcDays config: %d days(%d hours)\r\n", + agServer.getCo2AbcDaysConfig(), + agServer.getCo2AbcDaysConfig() * 24); + Serial.printf("Current config: %d (hours)\r\n", ag.s8.getAbcPeriod()); + if (ag.s8.setAbcPeriod(agServer.getCo2AbcDaysConfig() * 24) == false) { + Serial.println("Set S8 abcDays period calib failed"); + } else { + Serial.println("Set S8 abcDays period calib success"); } } if (agServer.isLedBarTestRequested()) { diff --git a/examples/Open_Air/Open_Air.ino b/examples/Open_Air/Open_Air.ino index 2f3dae5..d517e62 100644 --- a/examples/Open_Air/Open_Air.ino +++ b/examples/Open_Air/Open_Air.ino @@ -347,7 +347,7 @@ public: * * @return int days, -1 if invalid. */ - int getCo2Abccalib(void) { return co2AbcCalib; } + int getCo2AbcDaysConfig(void) { return co2AbcCalib; } /** * @brief Get device configuration model name @@ -373,7 +373,7 @@ public: Serial.printf(" useRGBLedBar: %d\r\n", (int)ledBarMode); Serial.printf(" Model: %s\r\n", models); Serial.printf(" Mqtt Broker: %s\r\n", mqttBroker); - Serial.printf(" S8 calib period: %d\r\n", co2AbcCalib); + Serial.printf(" abcDays period: %d\r\n", co2AbcCalib); } /** @@ -847,9 +847,15 @@ static void serverConfigPoll(void) { if (agServer.isCo2Calib()) { co2Calibration(); } - if (agServer.getCo2Abccalib() > 0) { - if (ag.s8.setAutoCalib(agServer.getCo2Abccalib() * 24) == false) { - Serial.println("Set S8 auto calib failed"); + if (agServer.getCo2AbcDaysConfig() > 0) { + Serial.printf("abcDays config: %d days(%d hours)\r\n", + agServer.getCo2AbcDaysConfig(), + agServer.getCo2AbcDaysConfig() * 24); + Serial.printf("Current config: %d (hours)\r\n", ag.s8.getAbcPeriod()); + if (ag.s8.setAbcPeriod(agServer.getCo2AbcDaysConfig() * 24) == false) { + Serial.println("Set S8 abcDays period calib failed"); + } else { + Serial.println("Set S8 abcDays period calib success"); } } } diff --git a/src/s8/s8.cpp b/src/s8/s8.cpp index 628cc5b..3e76583 100644 --- a/src/s8/s8.cpp +++ b/src/s8/s8.cpp @@ -801,7 +801,7 @@ void S8::sendCommand(uint8_t func, uint16_t reg, uint16_t value) { * @return true Success * @return false Failure */ -bool S8::setAutoCalib(int hours) { +bool S8::setAbcPeriod(int hours) { if (isBegin() == false) { return false; } @@ -813,3 +813,10 @@ bool S8::setAutoCalib(int hours) { return setCalibPeriodABC(hours); } + +/** + * @brief Get current 'ABC' calib period + * + * @return int Hour + */ +int S8::getAbcPeriod(void) { return getCalibPeriodABC(); } diff --git a/src/s8/s8.h b/src/s8/s8.h index b967a9e..5d18952 100644 --- a/src/s8/s8.h +++ b/src/s8/s8.h @@ -78,7 +78,8 @@ public: int16_t getCo2(void); bool setBaselineCalibration(void); bool isBaseLineCalibrationDone(void); - bool setAutoCalib(int hours); + bool setAbcPeriod(int hours); + int getAbcPeriod(void); private: /** Variables */ From 7c63af5ba9435614f0ae8b349b655f96dcfdfcc0 Mon Sep 17 00:00:00 2001 From: Phat Nguyen Date: Sat, 17 Feb 2024 12:11:44 +0700 Subject: [PATCH 04/26] Add Serial Nr into log --- examples/BASIC_v4/BASIC_v4.ino | 6 ++++++ examples/ONE_I-9PSL/ONE_I-9PSL.ino | 6 ++++++ examples/Open_Air/Open_Air.ino | 4 ++++ 3 files changed, 16 insertions(+) diff --git a/examples/BASIC_v4/BASIC_v4.ino b/examples/BASIC_v4/BASIC_v4.ino index 9583ca3..35f47b3 100644 --- a/examples/BASIC_v4/BASIC_v4.ino +++ b/examples/BASIC_v4/BASIC_v4.ino @@ -376,6 +376,7 @@ static void sendDataToServer(void); static void dispHandler(void); static String getDevId(void); static void updateWiFiConnect(void); +static void showNr(void); AgSchedule configSchedule(SERVER_CONFIG_UPDATE_INTERVAL, serverConfigPoll); AgSchedule serverSchedule(SERVER_SYNC_INTERVAL, sendDataToServer); @@ -386,6 +387,7 @@ AgSchedule tempHumSchedule(SENSOR_TEMP_HUM_UPDATE_INTERVAL, tempHumPoll); void setup() { Serial.begin(115200); + showNr(); /** Init I2C */ Wire.begin(ag.getI2cSdaPin(), ag.getI2cSclPin()); @@ -665,6 +667,10 @@ static void updateWiFiConnect(void) { } } +static void showNr(void) { + Serial.println("Serial nr: " + getDevId()); +} + String getNormalizedMac() { String mac = WiFi.macAddress(); mac.replace(":", ""); diff --git a/examples/ONE_I-9PSL/ONE_I-9PSL.ino b/examples/ONE_I-9PSL/ONE_I-9PSL.ino index 2ac75e6..7860e34 100644 --- a/examples/ONE_I-9PSL/ONE_I-9PSL.ino +++ b/examples/ONE_I-9PSL/ONE_I-9PSL.ino @@ -475,6 +475,7 @@ static void pmPoll(void); static void sendDataToServer(void); static void tempHumPoll(void); static void co2Poll(void); +static void showNr(void); /** Init schedule */ AgSchedule dispLedSchedule(DISP_UPDATE_INTERVAL, updateDispLedBar); @@ -488,6 +489,7 @@ AgSchedule tvocSchedule(SENSOR_TVOC_UPDATE_INTERVAL, tvocPoll); void setup() { /** Serial fore print debug message */ Serial.begin(115200); + showNr(); /** Init I2C */ Wire.begin(ag.getI2cSdaPin(), ag.getI2cSclPin()); @@ -646,6 +648,10 @@ static void co2Poll(void) { Serial.printf("CO2 index: %d\r\n", co2Ppm); } +static void showNr(void) { + Serial.println("Serial nr: " + getDevId()); +} + static void sendPing() { JSONVar root; root["wifi"] = WiFi.RSSI(); diff --git a/examples/Open_Air/Open_Air.ino b/examples/Open_Air/Open_Air.ino index d517e62..33f8eb3 100644 --- a/examples/Open_Air/Open_Air.ino +++ b/examples/Open_Air/Open_Air.ino @@ -458,6 +458,7 @@ static void sendDataToServer(void); static void co2Poll(void); static void serverConfigPoll(void); static const char *getFwMode(int mode); +static void showNr(void); AgSchedule configSchedule(SERVER_CONFIG_UPDATE_INTERVAL, serverConfigPoll); AgSchedule serverSchedule(SERVER_SYNC_INTERVAL, sendDataToServer); @@ -467,6 +468,7 @@ AgSchedule tvocSchedule(SENSOR_TVOC_UPDATE_INTERVAL, tvocPoll); void setup() { Serial.begin(115200); + showNr(); /** Board init */ boardInit(); @@ -978,3 +980,5 @@ static const char *getFwMode(int mode) { } return "FW_MODE_UNKNOW"; } + +static void showNr(void) { Serial.println("Serial nr: " + getDevId()); } From 8c94cea764c00990975a69c33222bfcddf9d02f2 Mon Sep 17 00:00:00 2001 From: Phat Nguyen Date: Sat, 17 Feb 2024 12:47:51 +0700 Subject: [PATCH 05/26] round real value with 2 decimal on server sync data json --- examples/BASIC_v4/BASIC_v4.ino | 10 ++++------ examples/ONE_I-9PSL/ONE_I-9PSL.ino | 10 ++++------ examples/Open_Air/Open_Air.ino | 20 ++++++++++---------- src/AirGradient.cpp | 4 ++++ src/AirGradient.h | 8 ++++++++ 5 files changed, 30 insertions(+), 22 deletions(-) diff --git a/examples/BASIC_v4/BASIC_v4.ino b/examples/BASIC_v4/BASIC_v4.ino index 35f47b3..281fa62 100644 --- a/examples/BASIC_v4/BASIC_v4.ino +++ b/examples/BASIC_v4/BASIC_v4.ino @@ -79,8 +79,8 @@ public: /** Call handler */ handler(); - Serial.printf("[AgSchedule] handle 0x%08x, period: %d(ms)\r\n", - (unsigned int)handler, period); + // Serial.printf("[AgSchedule] handle 0x%08x, period: %d(ms)\r\n", + // (unsigned int)handler, period); /** Update period time */ count = millis(); @@ -613,7 +613,7 @@ static void sendDataToServer() { root["pm02"] = pm25; } if (temp >= 0) { - root["atmp"] = temp; + root["atmp"] = ag.round2(temp); } if (hum >= 0) { root["rhum"] = hum; @@ -667,9 +667,7 @@ static void updateWiFiConnect(void) { } } -static void showNr(void) { - Serial.println("Serial nr: " + getDevId()); -} +static void showNr(void) { Serial.println("Serial nr: " + getDevId()); } String getNormalizedMac() { String mac = WiFi.macAddress(); diff --git a/examples/ONE_I-9PSL/ONE_I-9PSL.ino b/examples/ONE_I-9PSL/ONE_I-9PSL.ino index 7860e34..096f261 100644 --- a/examples/ONE_I-9PSL/ONE_I-9PSL.ino +++ b/examples/ONE_I-9PSL/ONE_I-9PSL.ino @@ -122,8 +122,8 @@ public: /** Call handler */ handler(); - Serial.printf("[AgSchedule] handle 0x%08x, period: %d(ms)\r\n", - (unsigned int)handler, period); + // Serial.printf("[AgSchedule] handle 0x%08x, period: %d(ms)\r\n", + // (unsigned int)handler, period); /** Update period time */ count = millis(); @@ -648,9 +648,7 @@ static void co2Poll(void) { Serial.printf("CO2 index: %d\r\n", co2Ppm); } -static void showNr(void) { - Serial.println("Serial nr: " + getDevId()); -} +static void showNr(void) { Serial.println("Serial nr: " + getDevId()); } static void sendPing() { JSONVar root; @@ -1500,7 +1498,7 @@ static void sendDataToServer(void) { root["noxIndex"] = noxIndex; } if (temp >= 0) { - root["atmp"] = temp; + root["atmp"] = ag.round2(temp); } if (hum >= 0) { root["rhum"] = hum; diff --git a/examples/Open_Air/Open_Air.ino b/examples/Open_Air/Open_Air.ino index 33f8eb3..3a43cc2 100644 --- a/examples/Open_Air/Open_Air.ino +++ b/examples/Open_Air/Open_Air.ino @@ -121,8 +121,8 @@ public: /** Call handler */ handler(); - Serial.printf("[AgSchedule] handle 0x%08x, period: %d(ms)\r\n", - (unsigned int)handler, period); + // Serial.printf("[AgSchedule] handle 0x%08x, period: %d(ms)\r\n", + // (unsigned int)handler, period); /** Update period time */ count = millis(); @@ -545,7 +545,7 @@ static void sendDataToServer(void) { root["noxIndex"] = noxIndex; } if (temp_1 >= 0) { - root["atmp"] = temp_1; + root["atmp"] = ag.round2(temp_1); } if (hum_1 >= 0) { root["rhum"] = hum_1; @@ -560,22 +560,22 @@ static void sendDataToServer(void) { } if ((fw_mode == FW_MODE_PP) || (fw_mode == FW_MODE_PPT)) { - root["pm01"] = (int)((pm01_1 + pm01_2) / 2); - root["pm02"] = (int)((pm25_1 + pm25_2) / 2); - root["pm003_count"] = (int)((pm03PCount_1 + pm03PCount_2) / 2); - root["atmp"] = (int)((temp_1 + temp_2) / 2); - root["rhum"] = (int)((hum_1 + hum_2) / 2); + root["pm01"] = ag.round2((pm01_1 + pm01_2) / 2.0); + root["pm02"] = ag.round2((pm25_1 + pm25_2) / 2.0); + root["pm003_count"] = ag.round2((pm03PCount_1 + pm03PCount_2) / 2.0); + root["atmp"] = ag.round2((temp_1 + temp_2) / 2.0); + root["rhum"] = ag.round2((hum_1 + hum_2) / 2.0); root["channels"]["1"]["pm01"] = pm01_1; root["channels"]["1"]["pm02"] = pm25_1; root["channels"]["1"]["pm10"] = pm10_1; root["channels"]["1"]["pm003_count"] = pm03PCount_1; - root["channels"]["1"]["atmp"] = temp_1; + root["channels"]["1"]["atmp"] = ag.round2(temp_1); root["channels"]["1"]["rhum"] = hum_1; root["channels"]["2"]["pm01"] = pm01_2; root["channels"]["2"]["pm02"] = pm25_2; root["channels"]["2"]["pm10"] = pm10_2; root["channels"]["2"]["pm003_count"] = pm03PCount_2; - root["channels"]["2"]["atmp"] = temp_2; + root["channels"]["2"]["atmp"] = ag.round2(temp_2); root["channels"]["2"]["rhum"] = hum_2; } diff --git a/src/AirGradient.cpp b/src/AirGradient.cpp index 8246876..c725bfc 100644 --- a/src/AirGradient.cpp +++ b/src/AirGradient.cpp @@ -36,3 +36,7 @@ int AirGradient::getI2cSclPin(void) { String AirGradient::getVersion(void) { return AG_LIB_VER; } BoardType AirGradient::getBoardType(void) { return boardType; } + +double AirGradient::round2(double value) { + return (int)(value * 100 + 0.5) / 100.0; +} diff --git a/src/AirGradient.h b/src/AirGradient.h index 2a1c102..49b4a71 100644 --- a/src/AirGradient.h +++ b/src/AirGradient.h @@ -107,6 +107,14 @@ public: */ String getVersion(void); + /** + * @brief Round double value with for 2 decimal + * + * @param valuem Round value + * @return double + */ + double round2(double value); + private: BoardType boardType; }; From ee9f26ee04c593b8b60f36248b6a5ca3a9c4f83b Mon Sep 17 00:00:00 2001 From: Phat Nguyen Date: Sat, 17 Feb 2024 13:02:24 +0700 Subject: [PATCH 06/26] Update multiple typos, #50 --- examples/BASIC_v4/BASIC_v4.ino | 2 +- examples/ONE_I-9PSL/ONE_I-9PSL.ino | 36 +++++++++++++++--------------- examples/Open_Air/Open_Air.ino | 22 +++++++++--------- 3 files changed, 30 insertions(+), 30 deletions(-) diff --git a/examples/BASIC_v4/BASIC_v4.ino b/examples/BASIC_v4/BASIC_v4.ino index 281fa62..d413a4a 100644 --- a/examples/BASIC_v4/BASIC_v4.ino +++ b/examples/BASIC_v4/BASIC_v4.ino @@ -271,7 +271,7 @@ public: bool isPMSinUSAQI(void) { return inUSAQI; } /** - * @brief Get status of get server coniguration is failed + * @brief Get status of get server configuration is failed * * @return true Failed * @return false Success diff --git a/examples/ONE_I-9PSL/ONE_I-9PSL.ino b/examples/ONE_I-9PSL/ONE_I-9PSL.ino index 096f261..3c53838 100644 --- a/examples/ONE_I-9PSL/ONE_I-9PSL.ino +++ b/examples/ONE_I-9PSL/ONE_I-9PSL.ino @@ -52,7 +52,7 @@ CC BY-SA 4.0 Attribution-ShareAlike 4.0 International License */ enum { APP_SM_WIFI_MANAGER_MODE, /** In WiFi Manger Mode */ - APP_SM_WIFI_MAMAGER_PORTAL_ACTIVE, /** WiFi Manager has connected to mobile + APP_SM_WIFI_MANAGER_PORTAL_ACTIVE, /** WiFi Manager has connected to mobile phone */ APP_SM_WIFI_MANAGER_STA_CONNECTING, /** After SSID and PW entered and OK clicked, connection to WiFI network is @@ -60,24 +60,24 @@ enum { APP_SM_WIFI_MANAGER_STA_CONNECTED, /** Connecting to WiFi worked */ APP_SM_WIFI_OK_SERVER_CONNECTING, /** Once connected to WiFi an attempt to reach the server is performed */ - APP_SM_WIFI_OK_SERVER_CONNNECTED, /** Server is reachable, all fine */ + APP_SM_WIFI_OK_SERVER_CONNECTED, /** Server is reachable, all fine */ /** Exceptions during WIFi Setup */ APP_SM_WIFI_MANAGER_CONNECT_FAILED, /** Cannot connect to WiFi (e.g. wrong password, WPA Enterprise etc.) */ APP_SM_WIFI_OK_SERVER_CONNECT_FAILED, /** Connected to WiFi but server not - reachable, e.g. firewall block/ + reachable, e.g. firewall block/ whitelisting needed etc. */ APP_SM_WIFI_OK_SERVER_OK_SENSOR_CONFIG_FAILED, /** Server reachable but sensor - not configured correctly*/ + not configured correctly*/ /** During Normal Operation */ APP_SM_WIFI_LOST, /** Connection to WiFi network failed credentials incorrect encryption not supported etc. */ APP_SM_SERVER_LOST, /** Connected to WiFi network but the server cannot be - reached through the internet, e.g. blocked by firewall + reached through the internet, e.g. blocked by firewall */ APP_SM_SENSOR_CONFIG_FAILED, /** Server is reachable but there is some - configuration issue to be fixed on the server + configuration issue to be fixed on the server side */ APP_SM_NORMAL, }; @@ -324,7 +324,7 @@ public: bool isPMSinUSAQI(void) { return inUSAQI; } /** - * @brief Get status of get server coniguration is failed + * @brief Get status of get server configuration is failed * * @return true Failed * @return false Success @@ -675,8 +675,8 @@ static void sendPing() { delay(1500); if (agServer.postToServer(getDevId(), JSON.stringify(root))) { - dispSmHandler(APP_SM_WIFI_OK_SERVER_CONNNECTED); - ledSmHandler(APP_SM_WIFI_OK_SERVER_CONNNECTED); + dispSmHandler(APP_SM_WIFI_OK_SERVER_CONNECTED); + ledSmHandler(APP_SM_WIFI_OK_SERVER_CONNECTED); } else { dispSmHandler(APP_SM_WIFI_OK_SERVER_CONNECT_FAILED); ledSmHandler(APP_SM_WIFI_OK_SERVER_CONNECT_FAILED); @@ -939,7 +939,7 @@ static void connectToWifi() { if (clientConnected != clientConnectChanged) { clientConnectChanged = clientConnected; if (clientConnectChanged) { - ledSmHandler(APP_SM_WIFI_MAMAGER_PORTAL_ACTIVE); + ledSmHandler(APP_SM_WIFI_MANAGER_PORTAL_ACTIVE); } else { ledCount = LED_BAR_COUNT_INIT_VALUE; ledSmHandler(APP_SM_WIFI_MANAGER_MODE); @@ -1197,7 +1197,7 @@ static void ledSmHandler(int sm) { ag.ledBar.setColor(0, 0, 255, ag.ledBar.getNumberOfLeds() / 2); break; } - case APP_SM_WIFI_MAMAGER_PORTAL_ACTIVE: { + case APP_SM_WIFI_MANAGER_PORTAL_ACTIVE: { /** WiFi Manager has connected to mobile phone */ ag.ledBar.setColor(0, 0, 255); break; @@ -1218,7 +1218,7 @@ static void ledSmHandler(int sm) { singleLedAnimation(0, 255, 0); break; } - case APP_SM_WIFI_OK_SERVER_CONNNECTED: { + case APP_SM_WIFI_OK_SERVER_CONNECTED: { /** Server is reachable, all fine */ ag.ledBar.setColor(0, 255, 0); break; @@ -1229,13 +1229,13 @@ static void ledSmHandler(int sm) { break; } case APP_SM_WIFI_OK_SERVER_CONNECT_FAILED: { - /** Connected to WiFi but server not reachable, e.g. firewall block/ + /** Connected to WiFi but server not reachable, e.g. firewall block/ * whitelisting needed etc. */ ag.ledBar.setColor(233, 183, 54); /** orange */ break; } case APP_SM_WIFI_OK_SERVER_OK_SENSOR_CONFIG_FAILED: { - /** Server reachable but sensor not configured correctly */ + /** Server reachable but sensor not configured correctly */ ag.ledBar.setColor(139, 24, 248); /** violet */ break; } @@ -1251,7 +1251,7 @@ static void ledSmHandler(int sm) { } case APP_SM_SERVER_LOST: { /** Connected to WiFi network but the server cannot be reached through the - * internet, e.g. blocked by firewall */ + * internet, e.g. blocked by firewall */ ag.ledBar.setColor(233, 183, 54, 0); @@ -1260,7 +1260,7 @@ static void ledSmHandler(int sm) { break; } case APP_SM_SENSOR_CONFIG_FAILED: { - /** 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 */ ag.ledBar.setColor(139, 24, 248, 0); @@ -1299,7 +1299,7 @@ static void dispSmHandler(int sm) { switch (sm) { case APP_SM_WIFI_MANAGER_MODE: - case APP_SM_WIFI_MAMAGER_PORTAL_ACTIVE: { + case APP_SM_WIFI_MANAGER_PORTAL_ACTIVE: { if (connectCountDown >= 0) { displayShowWifiText(String(connectCountDown) + "s to connect", "to WiFi hotspot:", "\"airgradient-", @@ -1320,7 +1320,7 @@ static void dispSmHandler(int sm) { displayShowText("Connecting to", "Server", "..."); break; } - case APP_SM_WIFI_OK_SERVER_CONNNECTED: { + case APP_SM_WIFI_OK_SERVER_CONNECTED: { displayShowText("Server", "connection", "successful"); break; } diff --git a/examples/Open_Air/Open_Air.ino b/examples/Open_Air/Open_Air.ino index 3a43cc2..87e2979 100644 --- a/examples/Open_Air/Open_Air.ino +++ b/examples/Open_Air/Open_Air.ino @@ -49,7 +49,7 @@ CC BY-SA 4.0 Attribution-ShareAlike 4.0 International License */ enum { APP_SM_WIFI_MANAGER_MODE, /** In WiFi Manger Mode */ - APP_SM_WIFI_MAMAGER_PORTAL_ACTIVE, /** WiFi Manager has connected to mobile + APP_SM_WIFI_MANAGER_PORTAL_ACTIVE, /** WiFi Manager has connected to mobile phone */ APP_SM_WIFI_MANAGER_STA_CONNECTING, /** After SSID and PW entered and OK clicked, connection to WiFI network is @@ -57,24 +57,24 @@ enum { APP_SM_WIFI_MANAGER_STA_CONNECTED, /** Connecting to WiFi worked */ APP_SM_WIFI_OK_SERVER_CONNECTING, /** Once connected to WiFi an attempt to reach the server is performed */ - APP_SM_WIFI_OK_SERVER_CONNNECTED, /** Server is reachable, all fine */ + APP_SM_WIFI_OK_SERVER_CONNECTED, /** Server is reachable, all fine */ /** Exceptions during WIFi Setup */ APP_SM_WIFI_MANAGER_CONNECT_FAILED, /** Cannot connect to WiFi (e.g. wrong password, WPA Enterprise etc.) */ APP_SM_WIFI_OK_SERVER_CONNECT_FAILED, /** Connected to WiFi but server not - reachable, e.g. firewall block/ + reachable, e.g. firewall block/ whitelisting needed etc. */ APP_SM_WIFI_OK_SERVER_OK_SENSOR_CONFIG_FAILED, /** Server reachable but sensor - not configured correctly*/ + not configured correctly*/ /** During Normal Operation */ APP_SM_WIFI_LOST, /** Connection to WiFi network failed credentials incorrect encryption not supported etc. */ APP_SM_SERVER_LOST, /** Connected to WiFi network but the server cannot be - reached through the internet, e.g. blocked by firewall + reached through the internet, e.g. blocked by firewall */ APP_SM_SENSOR_CONFIG_FAILED, /** Server is reachable but there is some - configuration issue to be fixed on the server + configuration issue to be fixed on the server side */ APP_SM_NORMAL, }; @@ -313,7 +313,7 @@ public: bool isPMSinUSAQI(void) { return inUSAQI; } /** - * @brief Get status of get server coniguration is failed + * @brief Get status of get server configuration is failed * * @return true Failed * @return false Success @@ -511,7 +511,7 @@ void sendPing() { root["wifi"] = WiFi.RSSI(); root["boot"] = loopCount; if (agServer.postToServer(getDevId(), JSON.stringify(root))) { - ledSmHandler(APP_SM_WIFI_OK_SERVER_CONNNECTED); + ledSmHandler(APP_SM_WIFI_OK_SERVER_CONNECTED); } else { ledSmHandler(APP_SM_WIFI_OK_SERVER_CONNECT_FAILED); } @@ -643,7 +643,7 @@ void connectToWifi() { if (clientConnected != clientConnectChanged) { clientConnectChanged = clientConnected; if (clientConnectChanged) { - ledSmHandler(APP_SM_WIFI_MAMAGER_PORTAL_ACTIVE); + ledSmHandler(APP_SM_WIFI_MANAGER_PORTAL_ACTIVE); } else { ledSmHandler(APP_SM_WIFI_MANAGER_MODE); } @@ -884,7 +884,7 @@ void ledSmHandler(int sm) { ag.statusLed.setToggle(); break; } - case APP_SM_WIFI_MAMAGER_PORTAL_ACTIVE: { + case APP_SM_WIFI_MANAGER_PORTAL_ACTIVE: { ag.statusLed.setOn(); break; } @@ -900,7 +900,7 @@ void ledSmHandler(int sm) { ag.statusLed.setOff(); break; } - case APP_SM_WIFI_OK_SERVER_CONNNECTED: { + case APP_SM_WIFI_OK_SERVER_CONNECTED: { ag.statusLed.setOff(); /** two time slow blink, then off */ From b475c5c1ec9ed69eb66d112a0d6a3a527b3b49a0 Mon Sep 17 00:00:00 2001 From: Phat Nguyen Date: Sat, 17 Feb 2024 13:17:45 +0700 Subject: [PATCH 07/26] capitalize folder names and file names Same like class file names --- src/AirGradient.h | 22 +++++++++--------- src/{display/oled.cpp => Display/Display.cpp} | 6 ++--- src/{display/oled.h => Display/Display.h} | 0 .../.github/ISSUE_TEMPLATE.md | 0 .../.github/PULL_REQUEST_TEMPLATE.md | 0 .../.github/workflows/githubci.yml | 0 .../Adafruit-GFX-Library/.gitignore | 0 .../Adafruit-GFX-Library/Adafruit_GFX.cpp | 0 .../Adafruit-GFX-Library/Adafruit_GFX.h | 0 .../Adafruit_GrayOLED.cpp | 0 .../Adafruit-GFX-Library/Adafruit_GrayOLED.h | 0 .../Adafruit-GFX-Library/Adafruit_SPITFT.cpp | 0 .../Adafruit-GFX-Library/Adafruit_SPITFT.h | 0 .../Adafruit_SPITFT_Macros.h | 0 .../Adafruit-GFX-Library/CMakeLists.txt | 0 .../Fonts/FreeMono12pt7b.h | 0 .../Fonts/FreeMono18pt7b.h | 0 .../Fonts/FreeMono24pt7b.h | 0 .../Fonts/FreeMono9pt7b.h | 0 .../Fonts/FreeMonoBold12pt7b.h | 0 .../Fonts/FreeMonoBold18pt7b.h | 0 .../Fonts/FreeMonoBold24pt7b.h | 0 .../Fonts/FreeMonoBold9pt7b.h | 0 .../Fonts/FreeMonoBoldOblique12pt7b.h | 0 .../Fonts/FreeMonoBoldOblique18pt7b.h | 0 .../Fonts/FreeMonoBoldOblique24pt7b.h | 0 .../Fonts/FreeMonoBoldOblique9pt7b.h | 0 .../Fonts/FreeMonoOblique12pt7b.h | 0 .../Fonts/FreeMonoOblique18pt7b.h | 0 .../Fonts/FreeMonoOblique24pt7b.h | 0 .../Fonts/FreeMonoOblique9pt7b.h | 0 .../Fonts/FreeSans12pt7b.h | 0 .../Fonts/FreeSans18pt7b.h | 0 .../Fonts/FreeSans24pt7b.h | 0 .../Fonts/FreeSans9pt7b.h | 0 .../Fonts/FreeSansBold12pt7b.h | 0 .../Fonts/FreeSansBold18pt7b.h | 0 .../Fonts/FreeSansBold24pt7b.h | 0 .../Fonts/FreeSansBold9pt7b.h | 0 .../Fonts/FreeSansBoldOblique12pt7b.h | 0 .../Fonts/FreeSansBoldOblique18pt7b.h | 0 .../Fonts/FreeSansBoldOblique24pt7b.h | 0 .../Fonts/FreeSansBoldOblique9pt7b.h | 0 .../Fonts/FreeSansOblique12pt7b.h | 0 .../Fonts/FreeSansOblique18pt7b.h | 0 .../Fonts/FreeSansOblique24pt7b.h | 0 .../Fonts/FreeSansOblique9pt7b.h | 0 .../Fonts/FreeSerif12pt7b.h | 0 .../Fonts/FreeSerif18pt7b.h | 0 .../Fonts/FreeSerif24pt7b.h | 0 .../Fonts/FreeSerif9pt7b.h | 0 .../Fonts/FreeSerifBold12pt7b.h | 0 .../Fonts/FreeSerifBold18pt7b.h | 0 .../Fonts/FreeSerifBold24pt7b.h | 0 .../Fonts/FreeSerifBold9pt7b.h | 0 .../Fonts/FreeSerifBoldItalic12pt7b.h | 0 .../Fonts/FreeSerifBoldItalic18pt7b.h | 0 .../Fonts/FreeSerifBoldItalic24pt7b.h | 0 .../Fonts/FreeSerifBoldItalic9pt7b.h | 0 .../Fonts/FreeSerifItalic12pt7b.h | 0 .../Fonts/FreeSerifItalic18pt7b.h | 0 .../Fonts/FreeSerifItalic24pt7b.h | 0 .../Fonts/FreeSerifItalic9pt7b.h | 0 .../Adafruit-GFX-Library/Fonts/Org_01.h | 0 .../Adafruit-GFX-Library/Fonts/Picopixel.h | 0 .../Fonts/Tiny3x3a2pt7b.h | 0 .../Adafruit-GFX-Library/Fonts/TomThumb.h | 0 .../Adafruit-GFX-Library/README.md | 0 .../Adafruit-GFX-Library/component.mk | 0 .../examples/GFXcanvas/GFXcanvas.ino | 0 .../GFXcanvas/GFXcanvasSerialDemo.cpp | 0 .../examples/GFXcanvas/GFXcanvasSerialDemo.h | 0 .../examples/mock_ili9341/mock_ili9341.ino | 0 .../Adafruit-GFX-Library/fontconvert/Makefile | 0 .../fontconvert/bdf2adafruit.py | 0 .../fontconvert/fontconvert.c | 0 .../fontconvert/fontconvert_win.md | 0 .../fontconvert/makefonts.sh | 0 .../Adafruit-GFX-Library/gfxfont.h | 0 .../Adafruit-GFX-Library/glcdfont.c | 0 .../Adafruit-GFX-Library/library.properties | 0 .../Adafruit-GFX-Library/license.txt | 0 .../Adafruit_BusIO/.github/ISSUE_TEMPLATE.md | 0 .../.github/PULL_REQUEST_TEMPLATE.md | 0 .../.github/workflows/githubci.yml | 0 .../Adafruit_BusIO_Register.cpp | 0 .../Adafruit_BusIO/Adafruit_BusIO_Register.h | 0 .../Adafruit_BusIO/Adafruit_I2CDevice.cpp | 0 .../Adafruit_BusIO/Adafruit_I2CDevice.h | 0 .../Adafruit_BusIO/Adafruit_I2CRegister.h | 0 .../Adafruit_BusIO/Adafruit_SPIDevice.cpp | 0 .../Adafruit_BusIO/Adafruit_SPIDevice.h | 0 .../Adafruit_BusIO/CMakeLists.txt | 0 .../Adafruit_BusIO/LICENSE | 0 .../Adafruit_BusIO/README.md | 0 .../Adafruit_BusIO/component.mk | 0 .../i2c_address_detect/i2c_address_detect.ino | 0 .../examples/i2c_readwrite/i2c_readwrite.ino | 0 .../examples/i2c_registers/i2c_registers.ino | 0 .../i2corspi_register/i2corspi_register.ino | 0 .../examples/spi_modetest/spi_modetest.ino | 0 .../examples/spi_readwrite/spi_readwrite.ino | 0 .../spi_register_bits/spi_register_bits.ino | 0 .../examples/spi_registers/spi_registers.ino | 0 .../Adafruit_BusIO/library.properties | 0 .../.github/ISSUE_TEMPLATE.md | 0 .../.github/PULL_REQUEST_TEMPLATE.md | 0 .../.github/workflows/githubci.yml | 0 .../Adafruit_NeoPixel/.gitignore | 0 .../Adafruit_NeoPixel/Adafruit_NeoPixel.cpp | 0 .../Adafruit_NeoPixel/Adafruit_NeoPixel.h | 0 .../Adafruit_NeoPixel/CONTRIBUTING.md | 0 .../Adafruit_NeoPixel/COPYING | 0 .../Adafruit_NeoPixel/README.md | 0 .../Adafruit_NeoPixel/esp.c | 0 .../Adafruit_NeoPixel/esp8266.c | 0 .../Adafruit_NeoPixel/kendyte_k210.c | 0 .../Adafruit_NeoPixel/keywords.txt | 0 .../Adafruit_NeoPixel/library.properties | 0 .../Adafruit_NeoPixel/rp2040_pio.h | 0 .../Adafruit_SH110x/.github/ISSUE_TEMPLATE.md | 0 .../.github/PULL_REQUEST_TEMPLATE.md | 0 .../.github/workflows/githubci.yml | 0 .../Adafruit_SH110x/.gitignore | 0 .../Adafruit_SH110x/Adafruit_SH1106G.cpp | 0 .../Adafruit_SH110x/Adafruit_SH1107.cpp | 0 .../Adafruit_SH110x/Adafruit_SH110X.cpp | 0 .../Adafruit_SH110x/Adafruit_SH110X.h | 0 .../Adafruit_SH110x/README.md | 0 .../SH1106_128x64_SPi_QTPY.ino | 0 .../SH1106_128x64_i2c_QTPY.ino | 0 .../OLED_featherwing/OLED_featherwing.ino | 0 .../SH1107_128x128/SH1107_128x128.ino | 0 .../Adafruit_SH110x/library.properties | 0 .../Adafruit_SH110x/license.txt | 0 .../Adafruit_SH110x/splash.h | 0 .../.github/ISSUE_TEMPLATE.md | 0 .../.github/PULL_REQUEST_TEMPLATE.md | 0 .../Adafruit_SSD1306.cpp | 0 .../Adafruit_SSD1306.h | 0 .../Adafruit_SSD1306_Wemos_OLED/README.md | 0 .../Adafruit_SSD1306_Wemos_OLED/README.txt | 0 .../ssd1306_128x32_i2c/ssd1306_128x32_i2c.ino | 0 .../ssd1306_128x32_spi/ssd1306_128x32_spi.ino | 0 .../ssd1306_128x64_i2c/ssd1306_128x64_i2c.ino | 0 .../ssd1306_128x64_spi/ssd1306_128x64_spi.ino | 0 .../ssd1306_64x48_i2c/ssd1306_64x48_i2c.ino | 0 .../library.properties | 0 .../Adafruit_SSD1306_Wemos_OLED/license.txt | 0 .../SensirionCore/.clang-format | 0 .../SensirionCore/.editorconfig | 0 .../SensirionCore/.gitignore | 0 .../SensirionCore/.gitlab-ci.yml | 0 .../SensirionCore/CHANGELOG.rst | 0 .../SensirionCore/LICENSE | 0 .../SensirionCore/README.md | 0 .../AllCommandsI2c/AllCommandsI2c.ino | 0 .../AllCommandsShdlc/AllCommandsShdlc.ino | 0 .../SensirionCore/keywords.txt | 0 .../SensirionCore/library.properties | 0 .../SensirionCore/src/SensirionCore.h | 0 .../src/SensirionCoreArduinoLibrary.h | 0 .../SensirionCore/src/SensirionCrc.cpp | 0 .../SensirionCore/src/SensirionCrc.h | 0 .../SensirionCore/src/SensirionErrors.cpp | 0 .../SensirionCore/src/SensirionErrors.h | 0 .../src/SensirionI2CCommunication.cpp | 0 .../src/SensirionI2CCommunication.h | 0 .../SensirionCore/src/SensirionI2CRxFrame.h | 0 .../SensirionCore/src/SensirionI2CTxFrame.cpp | 0 .../SensirionCore/src/SensirionI2CTxFrame.h | 0 .../SensirionCore/src/SensirionRxFrame.cpp | 0 .../SensirionCore/src/SensirionRxFrame.h | 0 .../src/SensirionShdlcCommunication.cpp | 0 .../src/SensirionShdlcCommunication.h | 0 .../SensirionCore/src/SensirionShdlcRxFrame.h | 0 .../src/SensirionShdlcTxFrame.cpp | 0 .../SensirionCore/src/SensirionShdlcTxFrame.h | 0 .../SensirionCore/tests/compile_test.py | 0 .../SensirionCore/tests/run_cppcheck.sh | 0 .../SensirionCore/tests/syntax_check.sh | 0 .../SensirionSGP41/.clang-format | 0 .../SensirionSGP41/.gitlab-ci.yml | 0 .../SensirionSGP41/CHANGELOG.md | 0 .../SensirionSGP41/LICENSE | 0 .../SensirionSGP41/README.md | 0 .../examples/exampleUsage/exampleUsage.ino | 0 .../SensirionSGP41/images/SGP41.png | Bin .../SensirionSGP41/keywords.txt | 0 .../SensirionSGP41/library.properties | 0 .../SensirionSGP41/src/SensirionI2CSgp41.cpp | 0 .../SensirionSGP41/src/SensirionI2CSgp41.h | 0 .../CHANGELOG.md | 0 .../Sensirion_Gas_Index_Algorithm/LICENSE | 0 .../Sensirion_Gas_Index_Algorithm/README.md | 0 .../exampleLowPowerUsage.ino | 0 .../examples/exampleUsage/exampleUsage.ino | 0 .../keywords.txt | 0 .../library.json | 0 .../library.properties | 0 .../src/NOxGasIndexAlgorithm.h | 0 .../src/SensirionGasIndexAlgorithm.cpp | 0 .../src/SensirionGasIndexAlgorithm.h | 0 .../src/VOCGasIndexAlgorithm.cpp | 0 .../src/VOCGasIndexAlgorithm.h | 0 .../algorithm/sensirion_gas_index_algorithm.c | 0 .../algorithm/sensirion_gas_index_algorithm.h | 0 .../arduino-sht/LICENSE | 0 .../arduino-sht/README.md | 0 .../arduino-sht/SHTSensor.cpp | 0 .../arduino-sht/SHTSensor.h | 0 .../arduino-sht/arduino-sht.h | 0 .../multiple-sht-sensors.ino | 0 .../sht-autodetect/sht-autodetect.ino | 0 .../examples/sht3xanalog/sht3xanalog.ino | 0 .../arduino-sht/keywords.txt | 0 .../arduino-sht/library.properties | 0 src/main/LedBar.cpp | 2 +- src/pms/pms5003.cpp | 2 +- src/pms/pms5003.h | 2 +- src/pms/pms5003t.cpp | 2 +- src/pms/pms5003t.h | 2 +- src/s8/s8.cpp | 2 +- src/sgp41/sgp41.cpp | 8 +++---- src/sht/sht.cpp | 4 ++-- 225 files changed, 26 insertions(+), 26 deletions(-) rename src/{display/oled.cpp => Display/Display.cpp} (97%) rename src/{display/oled.h => Display/Display.h} (100%) rename src/{library => Libraries}/Adafruit-GFX-Library/.github/ISSUE_TEMPLATE.md (100%) rename src/{library => Libraries}/Adafruit-GFX-Library/.github/PULL_REQUEST_TEMPLATE.md (100%) rename src/{library => Libraries}/Adafruit-GFX-Library/.github/workflows/githubci.yml (100%) rename src/{library => Libraries}/Adafruit-GFX-Library/.gitignore (100%) rename src/{library => Libraries}/Adafruit-GFX-Library/Adafruit_GFX.cpp (100%) rename src/{library => Libraries}/Adafruit-GFX-Library/Adafruit_GFX.h (100%) rename src/{library => Libraries}/Adafruit-GFX-Library/Adafruit_GrayOLED.cpp (100%) rename src/{library => Libraries}/Adafruit-GFX-Library/Adafruit_GrayOLED.h (100%) rename src/{library => Libraries}/Adafruit-GFX-Library/Adafruit_SPITFT.cpp (100%) rename src/{library => Libraries}/Adafruit-GFX-Library/Adafruit_SPITFT.h (100%) rename src/{library => Libraries}/Adafruit-GFX-Library/Adafruit_SPITFT_Macros.h (100%) rename src/{library => Libraries}/Adafruit-GFX-Library/CMakeLists.txt (100%) rename src/{library => Libraries}/Adafruit-GFX-Library/Fonts/FreeMono12pt7b.h (100%) rename src/{library => Libraries}/Adafruit-GFX-Library/Fonts/FreeMono18pt7b.h (100%) rename src/{library => Libraries}/Adafruit-GFX-Library/Fonts/FreeMono24pt7b.h (100%) rename src/{library => Libraries}/Adafruit-GFX-Library/Fonts/FreeMono9pt7b.h (100%) rename src/{library => Libraries}/Adafruit-GFX-Library/Fonts/FreeMonoBold12pt7b.h (100%) rename src/{library => Libraries}/Adafruit-GFX-Library/Fonts/FreeMonoBold18pt7b.h (100%) rename src/{library => Libraries}/Adafruit-GFX-Library/Fonts/FreeMonoBold24pt7b.h (100%) rename src/{library => Libraries}/Adafruit-GFX-Library/Fonts/FreeMonoBold9pt7b.h (100%) rename src/{library => Libraries}/Adafruit-GFX-Library/Fonts/FreeMonoBoldOblique12pt7b.h (100%) rename src/{library => Libraries}/Adafruit-GFX-Library/Fonts/FreeMonoBoldOblique18pt7b.h (100%) rename src/{library => Libraries}/Adafruit-GFX-Library/Fonts/FreeMonoBoldOblique24pt7b.h (100%) rename src/{library => Libraries}/Adafruit-GFX-Library/Fonts/FreeMonoBoldOblique9pt7b.h (100%) rename src/{library => Libraries}/Adafruit-GFX-Library/Fonts/FreeMonoOblique12pt7b.h (100%) rename src/{library => Libraries}/Adafruit-GFX-Library/Fonts/FreeMonoOblique18pt7b.h (100%) rename src/{library => Libraries}/Adafruit-GFX-Library/Fonts/FreeMonoOblique24pt7b.h (100%) rename src/{library => Libraries}/Adafruit-GFX-Library/Fonts/FreeMonoOblique9pt7b.h (100%) rename src/{library => Libraries}/Adafruit-GFX-Library/Fonts/FreeSans12pt7b.h (100%) rename src/{library => Libraries}/Adafruit-GFX-Library/Fonts/FreeSans18pt7b.h (100%) rename src/{library => Libraries}/Adafruit-GFX-Library/Fonts/FreeSans24pt7b.h (100%) rename src/{library => Libraries}/Adafruit-GFX-Library/Fonts/FreeSans9pt7b.h (100%) rename src/{library => Libraries}/Adafruit-GFX-Library/Fonts/FreeSansBold12pt7b.h (100%) rename src/{library => Libraries}/Adafruit-GFX-Library/Fonts/FreeSansBold18pt7b.h (100%) rename src/{library => Libraries}/Adafruit-GFX-Library/Fonts/FreeSansBold24pt7b.h (100%) rename src/{library => Libraries}/Adafruit-GFX-Library/Fonts/FreeSansBold9pt7b.h (100%) rename src/{library => Libraries}/Adafruit-GFX-Library/Fonts/FreeSansBoldOblique12pt7b.h (100%) rename src/{library => Libraries}/Adafruit-GFX-Library/Fonts/FreeSansBoldOblique18pt7b.h (100%) rename src/{library => Libraries}/Adafruit-GFX-Library/Fonts/FreeSansBoldOblique24pt7b.h (100%) rename src/{library => Libraries}/Adafruit-GFX-Library/Fonts/FreeSansBoldOblique9pt7b.h (100%) rename src/{library => Libraries}/Adafruit-GFX-Library/Fonts/FreeSansOblique12pt7b.h (100%) rename src/{library => Libraries}/Adafruit-GFX-Library/Fonts/FreeSansOblique18pt7b.h (100%) rename src/{library => Libraries}/Adafruit-GFX-Library/Fonts/FreeSansOblique24pt7b.h (100%) rename src/{library => Libraries}/Adafruit-GFX-Library/Fonts/FreeSansOblique9pt7b.h (100%) rename src/{library => Libraries}/Adafruit-GFX-Library/Fonts/FreeSerif12pt7b.h (100%) rename src/{library => Libraries}/Adafruit-GFX-Library/Fonts/FreeSerif18pt7b.h (100%) rename src/{library => Libraries}/Adafruit-GFX-Library/Fonts/FreeSerif24pt7b.h (100%) rename src/{library => Libraries}/Adafruit-GFX-Library/Fonts/FreeSerif9pt7b.h (100%) rename src/{library => Libraries}/Adafruit-GFX-Library/Fonts/FreeSerifBold12pt7b.h (100%) rename src/{library => Libraries}/Adafruit-GFX-Library/Fonts/FreeSerifBold18pt7b.h (100%) rename src/{library => Libraries}/Adafruit-GFX-Library/Fonts/FreeSerifBold24pt7b.h (100%) rename src/{library => Libraries}/Adafruit-GFX-Library/Fonts/FreeSerifBold9pt7b.h (100%) rename src/{library => Libraries}/Adafruit-GFX-Library/Fonts/FreeSerifBoldItalic12pt7b.h (100%) rename src/{library => Libraries}/Adafruit-GFX-Library/Fonts/FreeSerifBoldItalic18pt7b.h (100%) rename src/{library => Libraries}/Adafruit-GFX-Library/Fonts/FreeSerifBoldItalic24pt7b.h (100%) rename src/{library => Libraries}/Adafruit-GFX-Library/Fonts/FreeSerifBoldItalic9pt7b.h (100%) rename src/{library => Libraries}/Adafruit-GFX-Library/Fonts/FreeSerifItalic12pt7b.h (100%) rename src/{library => Libraries}/Adafruit-GFX-Library/Fonts/FreeSerifItalic18pt7b.h (100%) rename src/{library => Libraries}/Adafruit-GFX-Library/Fonts/FreeSerifItalic24pt7b.h (100%) rename src/{library => Libraries}/Adafruit-GFX-Library/Fonts/FreeSerifItalic9pt7b.h (100%) rename src/{library => Libraries}/Adafruit-GFX-Library/Fonts/Org_01.h (100%) rename src/{library => Libraries}/Adafruit-GFX-Library/Fonts/Picopixel.h (100%) rename src/{library => Libraries}/Adafruit-GFX-Library/Fonts/Tiny3x3a2pt7b.h (100%) rename src/{library => Libraries}/Adafruit-GFX-Library/Fonts/TomThumb.h (100%) rename src/{library => Libraries}/Adafruit-GFX-Library/README.md (100%) rename src/{library => Libraries}/Adafruit-GFX-Library/component.mk (100%) rename src/{library => Libraries}/Adafruit-GFX-Library/examples/GFXcanvas/GFXcanvas.ino (100%) rename src/{library => Libraries}/Adafruit-GFX-Library/examples/GFXcanvas/GFXcanvasSerialDemo.cpp (100%) rename src/{library => Libraries}/Adafruit-GFX-Library/examples/GFXcanvas/GFXcanvasSerialDemo.h (100%) rename src/{library => Libraries}/Adafruit-GFX-Library/examples/mock_ili9341/mock_ili9341.ino (100%) rename src/{library => Libraries}/Adafruit-GFX-Library/fontconvert/Makefile (100%) rename src/{library => Libraries}/Adafruit-GFX-Library/fontconvert/bdf2adafruit.py (100%) rename src/{library => Libraries}/Adafruit-GFX-Library/fontconvert/fontconvert.c (100%) rename src/{library => Libraries}/Adafruit-GFX-Library/fontconvert/fontconvert_win.md (100%) rename src/{library => Libraries}/Adafruit-GFX-Library/fontconvert/makefonts.sh (100%) rename src/{library => Libraries}/Adafruit-GFX-Library/gfxfont.h (100%) rename src/{library => Libraries}/Adafruit-GFX-Library/glcdfont.c (100%) rename src/{library => Libraries}/Adafruit-GFX-Library/library.properties (100%) rename src/{library => Libraries}/Adafruit-GFX-Library/license.txt (100%) rename src/{library => Libraries}/Adafruit_BusIO/.github/ISSUE_TEMPLATE.md (100%) rename src/{library => Libraries}/Adafruit_BusIO/.github/PULL_REQUEST_TEMPLATE.md (100%) rename src/{library => Libraries}/Adafruit_BusIO/.github/workflows/githubci.yml (100%) rename src/{library => Libraries}/Adafruit_BusIO/Adafruit_BusIO_Register.cpp (100%) rename src/{library => Libraries}/Adafruit_BusIO/Adafruit_BusIO_Register.h (100%) rename src/{library => Libraries}/Adafruit_BusIO/Adafruit_I2CDevice.cpp (100%) rename src/{library => Libraries}/Adafruit_BusIO/Adafruit_I2CDevice.h (100%) rename src/{library => Libraries}/Adafruit_BusIO/Adafruit_I2CRegister.h (100%) rename src/{library => Libraries}/Adafruit_BusIO/Adafruit_SPIDevice.cpp (100%) rename src/{library => Libraries}/Adafruit_BusIO/Adafruit_SPIDevice.h (100%) rename src/{library => Libraries}/Adafruit_BusIO/CMakeLists.txt (100%) rename src/{library => Libraries}/Adafruit_BusIO/LICENSE (100%) rename src/{library => Libraries}/Adafruit_BusIO/README.md (100%) rename src/{library => Libraries}/Adafruit_BusIO/component.mk (100%) rename src/{library => Libraries}/Adafruit_BusIO/examples/i2c_address_detect/i2c_address_detect.ino (100%) rename src/{library => Libraries}/Adafruit_BusIO/examples/i2c_readwrite/i2c_readwrite.ino (100%) rename src/{library => Libraries}/Adafruit_BusIO/examples/i2c_registers/i2c_registers.ino (100%) rename src/{library => Libraries}/Adafruit_BusIO/examples/i2corspi_register/i2corspi_register.ino (100%) rename src/{library => Libraries}/Adafruit_BusIO/examples/spi_modetest/spi_modetest.ino (100%) rename src/{library => Libraries}/Adafruit_BusIO/examples/spi_readwrite/spi_readwrite.ino (100%) rename src/{library => Libraries}/Adafruit_BusIO/examples/spi_register_bits/spi_register_bits.ino (100%) rename src/{library => Libraries}/Adafruit_BusIO/examples/spi_registers/spi_registers.ino (100%) rename src/{library => Libraries}/Adafruit_BusIO/library.properties (100%) rename src/{library => Libraries}/Adafruit_NeoPixel/.github/ISSUE_TEMPLATE.md (100%) rename src/{library => Libraries}/Adafruit_NeoPixel/.github/PULL_REQUEST_TEMPLATE.md (100%) rename src/{library => Libraries}/Adafruit_NeoPixel/.github/workflows/githubci.yml (100%) rename src/{library => Libraries}/Adafruit_NeoPixel/.gitignore (100%) rename src/{library => Libraries}/Adafruit_NeoPixel/Adafruit_NeoPixel.cpp (100%) rename src/{library => Libraries}/Adafruit_NeoPixel/Adafruit_NeoPixel.h (100%) rename src/{library => Libraries}/Adafruit_NeoPixel/CONTRIBUTING.md (100%) rename src/{library => Libraries}/Adafruit_NeoPixel/COPYING (100%) rename src/{library => Libraries}/Adafruit_NeoPixel/README.md (100%) rename src/{library => Libraries}/Adafruit_NeoPixel/esp.c (100%) rename src/{library => Libraries}/Adafruit_NeoPixel/esp8266.c (100%) rename src/{library => Libraries}/Adafruit_NeoPixel/kendyte_k210.c (100%) rename src/{library => Libraries}/Adafruit_NeoPixel/keywords.txt (100%) rename src/{library => Libraries}/Adafruit_NeoPixel/library.properties (100%) rename src/{library => Libraries}/Adafruit_NeoPixel/rp2040_pio.h (100%) rename src/{library => Libraries}/Adafruit_SH110x/.github/ISSUE_TEMPLATE.md (100%) rename src/{library => Libraries}/Adafruit_SH110x/.github/PULL_REQUEST_TEMPLATE.md (100%) rename src/{library => Libraries}/Adafruit_SH110x/.github/workflows/githubci.yml (100%) rename src/{library => Libraries}/Adafruit_SH110x/.gitignore (100%) rename src/{library => Libraries}/Adafruit_SH110x/Adafruit_SH1106G.cpp (100%) rename src/{library => Libraries}/Adafruit_SH110x/Adafruit_SH1107.cpp (100%) rename src/{library => Libraries}/Adafruit_SH110x/Adafruit_SH110X.cpp (100%) rename src/{library => Libraries}/Adafruit_SH110x/Adafruit_SH110X.h (100%) rename src/{library => Libraries}/Adafruit_SH110x/README.md (100%) rename src/{library => Libraries}/Adafruit_SH110x/examples/OLED_QTPY_SH1106/SH1106_128x64_SPi_QTPY/SH1106_128x64_SPi_QTPY.ino (100%) rename src/{library => Libraries}/Adafruit_SH110x/examples/OLED_QTPY_SH1106/SH1106_128x64_i2c_QTPY/SH1106_128x64_i2c_QTPY.ino (100%) rename src/{library => Libraries}/Adafruit_SH110x/examples/OLED_featherwing/OLED_featherwing.ino (100%) rename src/{library => Libraries}/Adafruit_SH110x/examples/SH1107_128x128/SH1107_128x128.ino (100%) rename src/{library => Libraries}/Adafruit_SH110x/library.properties (100%) rename src/{library => Libraries}/Adafruit_SH110x/license.txt (100%) rename src/{library => Libraries}/Adafruit_SH110x/splash.h (100%) rename src/{library => Libraries}/Adafruit_SSD1306_Wemos_OLED/.github/ISSUE_TEMPLATE.md (100%) rename src/{library => Libraries}/Adafruit_SSD1306_Wemos_OLED/.github/PULL_REQUEST_TEMPLATE.md (100%) rename src/{library => Libraries}/Adafruit_SSD1306_Wemos_OLED/Adafruit_SSD1306.cpp (100%) rename src/{library => Libraries}/Adafruit_SSD1306_Wemos_OLED/Adafruit_SSD1306.h (100%) rename src/{library => Libraries}/Adafruit_SSD1306_Wemos_OLED/README.md (100%) rename src/{library => Libraries}/Adafruit_SSD1306_Wemos_OLED/README.txt (100%) rename src/{library => Libraries}/Adafruit_SSD1306_Wemos_OLED/examples/ssd1306_128x32_i2c/ssd1306_128x32_i2c.ino (100%) rename src/{library => Libraries}/Adafruit_SSD1306_Wemos_OLED/examples/ssd1306_128x32_spi/ssd1306_128x32_spi.ino (100%) rename src/{library => Libraries}/Adafruit_SSD1306_Wemos_OLED/examples/ssd1306_128x64_i2c/ssd1306_128x64_i2c.ino (100%) rename src/{library => Libraries}/Adafruit_SSD1306_Wemos_OLED/examples/ssd1306_128x64_spi/ssd1306_128x64_spi.ino (100%) rename src/{library => Libraries}/Adafruit_SSD1306_Wemos_OLED/examples/ssd1306_64x48_i2c/ssd1306_64x48_i2c.ino (100%) rename src/{library => Libraries}/Adafruit_SSD1306_Wemos_OLED/library.properties (100%) rename src/{library => Libraries}/Adafruit_SSD1306_Wemos_OLED/license.txt (100%) rename src/{library => Libraries}/SensirionCore/.clang-format (100%) rename src/{library => Libraries}/SensirionCore/.editorconfig (100%) rename src/{library => Libraries}/SensirionCore/.gitignore (100%) rename src/{library => Libraries}/SensirionCore/.gitlab-ci.yml (100%) rename src/{library => Libraries}/SensirionCore/CHANGELOG.rst (100%) rename src/{library => Libraries}/SensirionCore/LICENSE (100%) rename src/{library => Libraries}/SensirionCore/README.md (100%) rename src/{library => Libraries}/SensirionCore/examples/AllCommandsI2c/AllCommandsI2c.ino (100%) rename src/{library => Libraries}/SensirionCore/examples/AllCommandsShdlc/AllCommandsShdlc.ino (100%) rename src/{library => Libraries}/SensirionCore/keywords.txt (100%) rename src/{library => Libraries}/SensirionCore/library.properties (100%) rename src/{library => Libraries}/SensirionCore/src/SensirionCore.h (100%) rename src/{library => Libraries}/SensirionCore/src/SensirionCoreArduinoLibrary.h (100%) rename src/{library => Libraries}/SensirionCore/src/SensirionCrc.cpp (100%) rename src/{library => Libraries}/SensirionCore/src/SensirionCrc.h (100%) rename src/{library => Libraries}/SensirionCore/src/SensirionErrors.cpp (100%) rename src/{library => Libraries}/SensirionCore/src/SensirionErrors.h (100%) rename src/{library => Libraries}/SensirionCore/src/SensirionI2CCommunication.cpp (100%) rename src/{library => Libraries}/SensirionCore/src/SensirionI2CCommunication.h (100%) rename src/{library => Libraries}/SensirionCore/src/SensirionI2CRxFrame.h (100%) rename src/{library => Libraries}/SensirionCore/src/SensirionI2CTxFrame.cpp (100%) rename src/{library => Libraries}/SensirionCore/src/SensirionI2CTxFrame.h (100%) rename src/{library => Libraries}/SensirionCore/src/SensirionRxFrame.cpp (100%) rename src/{library => Libraries}/SensirionCore/src/SensirionRxFrame.h (100%) rename src/{library => Libraries}/SensirionCore/src/SensirionShdlcCommunication.cpp (100%) rename src/{library => Libraries}/SensirionCore/src/SensirionShdlcCommunication.h (100%) rename src/{library => Libraries}/SensirionCore/src/SensirionShdlcRxFrame.h (100%) rename src/{library => Libraries}/SensirionCore/src/SensirionShdlcTxFrame.cpp (100%) rename src/{library => Libraries}/SensirionCore/src/SensirionShdlcTxFrame.h (100%) rename src/{library => Libraries}/SensirionCore/tests/compile_test.py (100%) rename src/{library => Libraries}/SensirionCore/tests/run_cppcheck.sh (100%) rename src/{library => Libraries}/SensirionCore/tests/syntax_check.sh (100%) rename src/{library => Libraries}/SensirionSGP41/.clang-format (100%) rename src/{library => Libraries}/SensirionSGP41/.gitlab-ci.yml (100%) rename src/{library => Libraries}/SensirionSGP41/CHANGELOG.md (100%) rename src/{library => Libraries}/SensirionSGP41/LICENSE (100%) rename src/{library => Libraries}/SensirionSGP41/README.md (100%) rename src/{library => Libraries}/SensirionSGP41/examples/exampleUsage/exampleUsage.ino (100%) rename src/{library => Libraries}/SensirionSGP41/images/SGP41.png (100%) rename src/{library => Libraries}/SensirionSGP41/keywords.txt (100%) rename src/{library => Libraries}/SensirionSGP41/library.properties (100%) rename src/{library => Libraries}/SensirionSGP41/src/SensirionI2CSgp41.cpp (100%) rename src/{library => Libraries}/SensirionSGP41/src/SensirionI2CSgp41.h (100%) rename src/{library => Libraries}/Sensirion_Gas_Index_Algorithm/CHANGELOG.md (100%) rename src/{library => Libraries}/Sensirion_Gas_Index_Algorithm/LICENSE (100%) rename src/{library => Libraries}/Sensirion_Gas_Index_Algorithm/README.md (100%) rename src/{library => Libraries}/Sensirion_Gas_Index_Algorithm/examples/exampleLowPowerUsage/exampleLowPowerUsage.ino (100%) rename src/{library => Libraries}/Sensirion_Gas_Index_Algorithm/examples/exampleUsage/exampleUsage.ino (100%) rename src/{library => Libraries}/Sensirion_Gas_Index_Algorithm/keywords.txt (100%) rename src/{library => Libraries}/Sensirion_Gas_Index_Algorithm/library.json (100%) rename src/{library => Libraries}/Sensirion_Gas_Index_Algorithm/library.properties (100%) rename src/{library => Libraries}/Sensirion_Gas_Index_Algorithm/src/NOxGasIndexAlgorithm.h (100%) rename src/{library => Libraries}/Sensirion_Gas_Index_Algorithm/src/SensirionGasIndexAlgorithm.cpp (100%) rename src/{library => Libraries}/Sensirion_Gas_Index_Algorithm/src/SensirionGasIndexAlgorithm.h (100%) rename src/{library => Libraries}/Sensirion_Gas_Index_Algorithm/src/VOCGasIndexAlgorithm.cpp (100%) rename src/{library => Libraries}/Sensirion_Gas_Index_Algorithm/src/VOCGasIndexAlgorithm.h (100%) rename src/{library => Libraries}/Sensirion_Gas_Index_Algorithm/src/algorithm/sensirion_gas_index_algorithm.c (100%) rename src/{library => Libraries}/Sensirion_Gas_Index_Algorithm/src/algorithm/sensirion_gas_index_algorithm.h (100%) rename src/{library => Libraries}/arduino-sht/LICENSE (100%) rename src/{library => Libraries}/arduino-sht/README.md (100%) rename src/{library => Libraries}/arduino-sht/SHTSensor.cpp (100%) rename src/{library => Libraries}/arduino-sht/SHTSensor.h (100%) rename src/{library => Libraries}/arduino-sht/arduino-sht.h (100%) rename src/{library => Libraries}/arduino-sht/examples/multiple-sht-sensors/multiple-sht-sensors.ino (100%) rename src/{library => Libraries}/arduino-sht/examples/sht-autodetect/sht-autodetect.ino (100%) rename src/{library => Libraries}/arduino-sht/examples/sht3xanalog/sht3xanalog.ino (100%) rename src/{library => Libraries}/arduino-sht/keywords.txt (100%) rename src/{library => Libraries}/arduino-sht/library.properties (100%) diff --git a/src/AirGradient.h b/src/AirGradient.h index 49b4a71..376f43d 100644 --- a/src/AirGradient.h +++ b/src/AirGradient.h @@ -1,17 +1,17 @@ #ifndef _AIR_GRADIENT_H_ #define _AIR_GRADIENT_H_ -#include "display/oled.h" -#include "main/BoardDef.h" -#include "main/HardwareWatchdog.h" -#include "main/LedBar.h" -#include "main/PushButton.h" -#include "main/StatusLed.h" -#include "pms/pms5003.h" -#include "pms/pms5003t.h" -#include "s8/s8.h" -#include "sgp41/sgp41.h" -#include "sht/sht.h" +#include "Display/Display.h" +#include "Main/BoardDef.h" +#include "Main/HardwareWatchdog.h" +#include "Main/LedBar.h" +#include "Main/PushButton.h" +#include "Main/StatusLed.h" +#include "PMS/PMS5003.h" +#include "PMS/PMS5003T.h" +#include "S8/S8.h" +#include "Sgp41/Sgp41.h" +#include "Sht/Sht.h" /** * @brief Class with define all the sensor has supported by Airgradient. Each diff --git a/src/display/oled.cpp b/src/Display/Display.cpp similarity index 97% rename from src/display/oled.cpp rename to src/Display/Display.cpp index 24d1a44..3bc433e 100644 --- a/src/display/oled.cpp +++ b/src/Display/Display.cpp @@ -1,6 +1,6 @@ -#include "oled.h" -#include "../library/Adafruit_SH110x/Adafruit_SH110X.h" -#include "../library/Adafruit_SSD1306_Wemos_OLED/Adafruit_SSD1306.h" +#include "Display.h" +#include "../Libraries/Adafruit_SH110x/Adafruit_SH110X.h" +#include "../Libraries/Adafruit_SSD1306_Wemos_OLED/Adafruit_SSD1306.h" #define disp(func) \ if (this->_boardType == DIY_BASIC) { \ diff --git a/src/display/oled.h b/src/Display/Display.h similarity index 100% rename from src/display/oled.h rename to src/Display/Display.h diff --git a/src/library/Adafruit-GFX-Library/.github/ISSUE_TEMPLATE.md b/src/Libraries/Adafruit-GFX-Library/.github/ISSUE_TEMPLATE.md similarity index 100% rename from src/library/Adafruit-GFX-Library/.github/ISSUE_TEMPLATE.md rename to src/Libraries/Adafruit-GFX-Library/.github/ISSUE_TEMPLATE.md diff --git a/src/library/Adafruit-GFX-Library/.github/PULL_REQUEST_TEMPLATE.md b/src/Libraries/Adafruit-GFX-Library/.github/PULL_REQUEST_TEMPLATE.md similarity index 100% rename from src/library/Adafruit-GFX-Library/.github/PULL_REQUEST_TEMPLATE.md rename to src/Libraries/Adafruit-GFX-Library/.github/PULL_REQUEST_TEMPLATE.md diff --git a/src/library/Adafruit-GFX-Library/.github/workflows/githubci.yml b/src/Libraries/Adafruit-GFX-Library/.github/workflows/githubci.yml similarity index 100% rename from src/library/Adafruit-GFX-Library/.github/workflows/githubci.yml rename to src/Libraries/Adafruit-GFX-Library/.github/workflows/githubci.yml diff --git a/src/library/Adafruit-GFX-Library/.gitignore b/src/Libraries/Adafruit-GFX-Library/.gitignore similarity index 100% rename from src/library/Adafruit-GFX-Library/.gitignore rename to src/Libraries/Adafruit-GFX-Library/.gitignore diff --git a/src/library/Adafruit-GFX-Library/Adafruit_GFX.cpp b/src/Libraries/Adafruit-GFX-Library/Adafruit_GFX.cpp similarity index 100% rename from src/library/Adafruit-GFX-Library/Adafruit_GFX.cpp rename to src/Libraries/Adafruit-GFX-Library/Adafruit_GFX.cpp diff --git a/src/library/Adafruit-GFX-Library/Adafruit_GFX.h b/src/Libraries/Adafruit-GFX-Library/Adafruit_GFX.h similarity index 100% rename from src/library/Adafruit-GFX-Library/Adafruit_GFX.h rename to src/Libraries/Adafruit-GFX-Library/Adafruit_GFX.h diff --git a/src/library/Adafruit-GFX-Library/Adafruit_GrayOLED.cpp b/src/Libraries/Adafruit-GFX-Library/Adafruit_GrayOLED.cpp similarity index 100% rename from src/library/Adafruit-GFX-Library/Adafruit_GrayOLED.cpp rename to src/Libraries/Adafruit-GFX-Library/Adafruit_GrayOLED.cpp diff --git a/src/library/Adafruit-GFX-Library/Adafruit_GrayOLED.h b/src/Libraries/Adafruit-GFX-Library/Adafruit_GrayOLED.h similarity index 100% rename from src/library/Adafruit-GFX-Library/Adafruit_GrayOLED.h rename to src/Libraries/Adafruit-GFX-Library/Adafruit_GrayOLED.h diff --git a/src/library/Adafruit-GFX-Library/Adafruit_SPITFT.cpp b/src/Libraries/Adafruit-GFX-Library/Adafruit_SPITFT.cpp similarity index 100% rename from src/library/Adafruit-GFX-Library/Adafruit_SPITFT.cpp rename to src/Libraries/Adafruit-GFX-Library/Adafruit_SPITFT.cpp diff --git a/src/library/Adafruit-GFX-Library/Adafruit_SPITFT.h b/src/Libraries/Adafruit-GFX-Library/Adafruit_SPITFT.h similarity index 100% rename from src/library/Adafruit-GFX-Library/Adafruit_SPITFT.h rename to src/Libraries/Adafruit-GFX-Library/Adafruit_SPITFT.h diff --git a/src/library/Adafruit-GFX-Library/Adafruit_SPITFT_Macros.h b/src/Libraries/Adafruit-GFX-Library/Adafruit_SPITFT_Macros.h similarity index 100% rename from src/library/Adafruit-GFX-Library/Adafruit_SPITFT_Macros.h rename to src/Libraries/Adafruit-GFX-Library/Adafruit_SPITFT_Macros.h diff --git a/src/library/Adafruit-GFX-Library/CMakeLists.txt b/src/Libraries/Adafruit-GFX-Library/CMakeLists.txt similarity index 100% rename from src/library/Adafruit-GFX-Library/CMakeLists.txt rename to src/Libraries/Adafruit-GFX-Library/CMakeLists.txt diff --git a/src/library/Adafruit-GFX-Library/Fonts/FreeMono12pt7b.h b/src/Libraries/Adafruit-GFX-Library/Fonts/FreeMono12pt7b.h similarity index 100% rename from src/library/Adafruit-GFX-Library/Fonts/FreeMono12pt7b.h rename to src/Libraries/Adafruit-GFX-Library/Fonts/FreeMono12pt7b.h diff --git a/src/library/Adafruit-GFX-Library/Fonts/FreeMono18pt7b.h b/src/Libraries/Adafruit-GFX-Library/Fonts/FreeMono18pt7b.h similarity index 100% rename from src/library/Adafruit-GFX-Library/Fonts/FreeMono18pt7b.h rename to src/Libraries/Adafruit-GFX-Library/Fonts/FreeMono18pt7b.h diff --git a/src/library/Adafruit-GFX-Library/Fonts/FreeMono24pt7b.h b/src/Libraries/Adafruit-GFX-Library/Fonts/FreeMono24pt7b.h similarity index 100% rename from src/library/Adafruit-GFX-Library/Fonts/FreeMono24pt7b.h rename to src/Libraries/Adafruit-GFX-Library/Fonts/FreeMono24pt7b.h diff --git a/src/library/Adafruit-GFX-Library/Fonts/FreeMono9pt7b.h b/src/Libraries/Adafruit-GFX-Library/Fonts/FreeMono9pt7b.h similarity index 100% rename from src/library/Adafruit-GFX-Library/Fonts/FreeMono9pt7b.h rename to src/Libraries/Adafruit-GFX-Library/Fonts/FreeMono9pt7b.h diff --git a/src/library/Adafruit-GFX-Library/Fonts/FreeMonoBold12pt7b.h b/src/Libraries/Adafruit-GFX-Library/Fonts/FreeMonoBold12pt7b.h similarity index 100% rename from src/library/Adafruit-GFX-Library/Fonts/FreeMonoBold12pt7b.h rename to src/Libraries/Adafruit-GFX-Library/Fonts/FreeMonoBold12pt7b.h diff --git a/src/library/Adafruit-GFX-Library/Fonts/FreeMonoBold18pt7b.h b/src/Libraries/Adafruit-GFX-Library/Fonts/FreeMonoBold18pt7b.h similarity index 100% rename from src/library/Adafruit-GFX-Library/Fonts/FreeMonoBold18pt7b.h rename to src/Libraries/Adafruit-GFX-Library/Fonts/FreeMonoBold18pt7b.h diff --git a/src/library/Adafruit-GFX-Library/Fonts/FreeMonoBold24pt7b.h b/src/Libraries/Adafruit-GFX-Library/Fonts/FreeMonoBold24pt7b.h similarity index 100% rename from src/library/Adafruit-GFX-Library/Fonts/FreeMonoBold24pt7b.h rename to src/Libraries/Adafruit-GFX-Library/Fonts/FreeMonoBold24pt7b.h diff --git a/src/library/Adafruit-GFX-Library/Fonts/FreeMonoBold9pt7b.h b/src/Libraries/Adafruit-GFX-Library/Fonts/FreeMonoBold9pt7b.h similarity index 100% rename from src/library/Adafruit-GFX-Library/Fonts/FreeMonoBold9pt7b.h rename to src/Libraries/Adafruit-GFX-Library/Fonts/FreeMonoBold9pt7b.h diff --git a/src/library/Adafruit-GFX-Library/Fonts/FreeMonoBoldOblique12pt7b.h b/src/Libraries/Adafruit-GFX-Library/Fonts/FreeMonoBoldOblique12pt7b.h similarity index 100% rename from src/library/Adafruit-GFX-Library/Fonts/FreeMonoBoldOblique12pt7b.h rename to src/Libraries/Adafruit-GFX-Library/Fonts/FreeMonoBoldOblique12pt7b.h diff --git a/src/library/Adafruit-GFX-Library/Fonts/FreeMonoBoldOblique18pt7b.h b/src/Libraries/Adafruit-GFX-Library/Fonts/FreeMonoBoldOblique18pt7b.h similarity index 100% rename from src/library/Adafruit-GFX-Library/Fonts/FreeMonoBoldOblique18pt7b.h rename to src/Libraries/Adafruit-GFX-Library/Fonts/FreeMonoBoldOblique18pt7b.h diff --git a/src/library/Adafruit-GFX-Library/Fonts/FreeMonoBoldOblique24pt7b.h b/src/Libraries/Adafruit-GFX-Library/Fonts/FreeMonoBoldOblique24pt7b.h similarity index 100% rename from src/library/Adafruit-GFX-Library/Fonts/FreeMonoBoldOblique24pt7b.h rename to src/Libraries/Adafruit-GFX-Library/Fonts/FreeMonoBoldOblique24pt7b.h diff --git a/src/library/Adafruit-GFX-Library/Fonts/FreeMonoBoldOblique9pt7b.h b/src/Libraries/Adafruit-GFX-Library/Fonts/FreeMonoBoldOblique9pt7b.h similarity index 100% rename from src/library/Adafruit-GFX-Library/Fonts/FreeMonoBoldOblique9pt7b.h rename to src/Libraries/Adafruit-GFX-Library/Fonts/FreeMonoBoldOblique9pt7b.h diff --git a/src/library/Adafruit-GFX-Library/Fonts/FreeMonoOblique12pt7b.h b/src/Libraries/Adafruit-GFX-Library/Fonts/FreeMonoOblique12pt7b.h similarity index 100% rename from src/library/Adafruit-GFX-Library/Fonts/FreeMonoOblique12pt7b.h rename to src/Libraries/Adafruit-GFX-Library/Fonts/FreeMonoOblique12pt7b.h diff --git a/src/library/Adafruit-GFX-Library/Fonts/FreeMonoOblique18pt7b.h b/src/Libraries/Adafruit-GFX-Library/Fonts/FreeMonoOblique18pt7b.h similarity index 100% rename from src/library/Adafruit-GFX-Library/Fonts/FreeMonoOblique18pt7b.h rename to src/Libraries/Adafruit-GFX-Library/Fonts/FreeMonoOblique18pt7b.h diff --git a/src/library/Adafruit-GFX-Library/Fonts/FreeMonoOblique24pt7b.h b/src/Libraries/Adafruit-GFX-Library/Fonts/FreeMonoOblique24pt7b.h similarity index 100% rename from src/library/Adafruit-GFX-Library/Fonts/FreeMonoOblique24pt7b.h rename to src/Libraries/Adafruit-GFX-Library/Fonts/FreeMonoOblique24pt7b.h diff --git a/src/library/Adafruit-GFX-Library/Fonts/FreeMonoOblique9pt7b.h b/src/Libraries/Adafruit-GFX-Library/Fonts/FreeMonoOblique9pt7b.h similarity index 100% rename from src/library/Adafruit-GFX-Library/Fonts/FreeMonoOblique9pt7b.h rename to src/Libraries/Adafruit-GFX-Library/Fonts/FreeMonoOblique9pt7b.h diff --git a/src/library/Adafruit-GFX-Library/Fonts/FreeSans12pt7b.h b/src/Libraries/Adafruit-GFX-Library/Fonts/FreeSans12pt7b.h similarity index 100% rename from src/library/Adafruit-GFX-Library/Fonts/FreeSans12pt7b.h rename to src/Libraries/Adafruit-GFX-Library/Fonts/FreeSans12pt7b.h diff --git a/src/library/Adafruit-GFX-Library/Fonts/FreeSans18pt7b.h b/src/Libraries/Adafruit-GFX-Library/Fonts/FreeSans18pt7b.h similarity index 100% rename from src/library/Adafruit-GFX-Library/Fonts/FreeSans18pt7b.h rename to src/Libraries/Adafruit-GFX-Library/Fonts/FreeSans18pt7b.h diff --git a/src/library/Adafruit-GFX-Library/Fonts/FreeSans24pt7b.h b/src/Libraries/Adafruit-GFX-Library/Fonts/FreeSans24pt7b.h similarity index 100% rename from src/library/Adafruit-GFX-Library/Fonts/FreeSans24pt7b.h rename to src/Libraries/Adafruit-GFX-Library/Fonts/FreeSans24pt7b.h diff --git a/src/library/Adafruit-GFX-Library/Fonts/FreeSans9pt7b.h b/src/Libraries/Adafruit-GFX-Library/Fonts/FreeSans9pt7b.h similarity index 100% rename from src/library/Adafruit-GFX-Library/Fonts/FreeSans9pt7b.h rename to src/Libraries/Adafruit-GFX-Library/Fonts/FreeSans9pt7b.h diff --git a/src/library/Adafruit-GFX-Library/Fonts/FreeSansBold12pt7b.h b/src/Libraries/Adafruit-GFX-Library/Fonts/FreeSansBold12pt7b.h similarity index 100% rename from src/library/Adafruit-GFX-Library/Fonts/FreeSansBold12pt7b.h rename to src/Libraries/Adafruit-GFX-Library/Fonts/FreeSansBold12pt7b.h diff --git a/src/library/Adafruit-GFX-Library/Fonts/FreeSansBold18pt7b.h b/src/Libraries/Adafruit-GFX-Library/Fonts/FreeSansBold18pt7b.h similarity index 100% rename from src/library/Adafruit-GFX-Library/Fonts/FreeSansBold18pt7b.h rename to src/Libraries/Adafruit-GFX-Library/Fonts/FreeSansBold18pt7b.h diff --git a/src/library/Adafruit-GFX-Library/Fonts/FreeSansBold24pt7b.h b/src/Libraries/Adafruit-GFX-Library/Fonts/FreeSansBold24pt7b.h similarity index 100% rename from src/library/Adafruit-GFX-Library/Fonts/FreeSansBold24pt7b.h rename to src/Libraries/Adafruit-GFX-Library/Fonts/FreeSansBold24pt7b.h diff --git a/src/library/Adafruit-GFX-Library/Fonts/FreeSansBold9pt7b.h b/src/Libraries/Adafruit-GFX-Library/Fonts/FreeSansBold9pt7b.h similarity index 100% rename from src/library/Adafruit-GFX-Library/Fonts/FreeSansBold9pt7b.h rename to src/Libraries/Adafruit-GFX-Library/Fonts/FreeSansBold9pt7b.h diff --git a/src/library/Adafruit-GFX-Library/Fonts/FreeSansBoldOblique12pt7b.h b/src/Libraries/Adafruit-GFX-Library/Fonts/FreeSansBoldOblique12pt7b.h similarity index 100% rename from src/library/Adafruit-GFX-Library/Fonts/FreeSansBoldOblique12pt7b.h rename to src/Libraries/Adafruit-GFX-Library/Fonts/FreeSansBoldOblique12pt7b.h diff --git a/src/library/Adafruit-GFX-Library/Fonts/FreeSansBoldOblique18pt7b.h b/src/Libraries/Adafruit-GFX-Library/Fonts/FreeSansBoldOblique18pt7b.h similarity index 100% rename from src/library/Adafruit-GFX-Library/Fonts/FreeSansBoldOblique18pt7b.h rename to src/Libraries/Adafruit-GFX-Library/Fonts/FreeSansBoldOblique18pt7b.h diff --git a/src/library/Adafruit-GFX-Library/Fonts/FreeSansBoldOblique24pt7b.h b/src/Libraries/Adafruit-GFX-Library/Fonts/FreeSansBoldOblique24pt7b.h similarity index 100% rename from src/library/Adafruit-GFX-Library/Fonts/FreeSansBoldOblique24pt7b.h rename to src/Libraries/Adafruit-GFX-Library/Fonts/FreeSansBoldOblique24pt7b.h diff --git a/src/library/Adafruit-GFX-Library/Fonts/FreeSansBoldOblique9pt7b.h b/src/Libraries/Adafruit-GFX-Library/Fonts/FreeSansBoldOblique9pt7b.h similarity index 100% rename from src/library/Adafruit-GFX-Library/Fonts/FreeSansBoldOblique9pt7b.h rename to src/Libraries/Adafruit-GFX-Library/Fonts/FreeSansBoldOblique9pt7b.h diff --git a/src/library/Adafruit-GFX-Library/Fonts/FreeSansOblique12pt7b.h b/src/Libraries/Adafruit-GFX-Library/Fonts/FreeSansOblique12pt7b.h similarity index 100% rename from src/library/Adafruit-GFX-Library/Fonts/FreeSansOblique12pt7b.h rename to src/Libraries/Adafruit-GFX-Library/Fonts/FreeSansOblique12pt7b.h diff --git a/src/library/Adafruit-GFX-Library/Fonts/FreeSansOblique18pt7b.h b/src/Libraries/Adafruit-GFX-Library/Fonts/FreeSansOblique18pt7b.h similarity index 100% rename from src/library/Adafruit-GFX-Library/Fonts/FreeSansOblique18pt7b.h rename to src/Libraries/Adafruit-GFX-Library/Fonts/FreeSansOblique18pt7b.h diff --git a/src/library/Adafruit-GFX-Library/Fonts/FreeSansOblique24pt7b.h b/src/Libraries/Adafruit-GFX-Library/Fonts/FreeSansOblique24pt7b.h similarity index 100% rename from src/library/Adafruit-GFX-Library/Fonts/FreeSansOblique24pt7b.h rename to src/Libraries/Adafruit-GFX-Library/Fonts/FreeSansOblique24pt7b.h diff --git a/src/library/Adafruit-GFX-Library/Fonts/FreeSansOblique9pt7b.h b/src/Libraries/Adafruit-GFX-Library/Fonts/FreeSansOblique9pt7b.h similarity index 100% rename from src/library/Adafruit-GFX-Library/Fonts/FreeSansOblique9pt7b.h rename to src/Libraries/Adafruit-GFX-Library/Fonts/FreeSansOblique9pt7b.h diff --git a/src/library/Adafruit-GFX-Library/Fonts/FreeSerif12pt7b.h b/src/Libraries/Adafruit-GFX-Library/Fonts/FreeSerif12pt7b.h similarity index 100% rename from src/library/Adafruit-GFX-Library/Fonts/FreeSerif12pt7b.h rename to src/Libraries/Adafruit-GFX-Library/Fonts/FreeSerif12pt7b.h diff --git a/src/library/Adafruit-GFX-Library/Fonts/FreeSerif18pt7b.h b/src/Libraries/Adafruit-GFX-Library/Fonts/FreeSerif18pt7b.h similarity index 100% rename from src/library/Adafruit-GFX-Library/Fonts/FreeSerif18pt7b.h rename to src/Libraries/Adafruit-GFX-Library/Fonts/FreeSerif18pt7b.h diff --git a/src/library/Adafruit-GFX-Library/Fonts/FreeSerif24pt7b.h b/src/Libraries/Adafruit-GFX-Library/Fonts/FreeSerif24pt7b.h similarity index 100% rename from src/library/Adafruit-GFX-Library/Fonts/FreeSerif24pt7b.h rename to src/Libraries/Adafruit-GFX-Library/Fonts/FreeSerif24pt7b.h diff --git a/src/library/Adafruit-GFX-Library/Fonts/FreeSerif9pt7b.h b/src/Libraries/Adafruit-GFX-Library/Fonts/FreeSerif9pt7b.h similarity index 100% rename from src/library/Adafruit-GFX-Library/Fonts/FreeSerif9pt7b.h rename to src/Libraries/Adafruit-GFX-Library/Fonts/FreeSerif9pt7b.h diff --git a/src/library/Adafruit-GFX-Library/Fonts/FreeSerifBold12pt7b.h b/src/Libraries/Adafruit-GFX-Library/Fonts/FreeSerifBold12pt7b.h similarity index 100% rename from src/library/Adafruit-GFX-Library/Fonts/FreeSerifBold12pt7b.h rename to src/Libraries/Adafruit-GFX-Library/Fonts/FreeSerifBold12pt7b.h diff --git a/src/library/Adafruit-GFX-Library/Fonts/FreeSerifBold18pt7b.h b/src/Libraries/Adafruit-GFX-Library/Fonts/FreeSerifBold18pt7b.h similarity index 100% rename from src/library/Adafruit-GFX-Library/Fonts/FreeSerifBold18pt7b.h rename to src/Libraries/Adafruit-GFX-Library/Fonts/FreeSerifBold18pt7b.h diff --git a/src/library/Adafruit-GFX-Library/Fonts/FreeSerifBold24pt7b.h b/src/Libraries/Adafruit-GFX-Library/Fonts/FreeSerifBold24pt7b.h similarity index 100% rename from src/library/Adafruit-GFX-Library/Fonts/FreeSerifBold24pt7b.h rename to src/Libraries/Adafruit-GFX-Library/Fonts/FreeSerifBold24pt7b.h diff --git a/src/library/Adafruit-GFX-Library/Fonts/FreeSerifBold9pt7b.h b/src/Libraries/Adafruit-GFX-Library/Fonts/FreeSerifBold9pt7b.h similarity index 100% rename from src/library/Adafruit-GFX-Library/Fonts/FreeSerifBold9pt7b.h rename to src/Libraries/Adafruit-GFX-Library/Fonts/FreeSerifBold9pt7b.h diff --git a/src/library/Adafruit-GFX-Library/Fonts/FreeSerifBoldItalic12pt7b.h b/src/Libraries/Adafruit-GFX-Library/Fonts/FreeSerifBoldItalic12pt7b.h similarity index 100% rename from src/library/Adafruit-GFX-Library/Fonts/FreeSerifBoldItalic12pt7b.h rename to src/Libraries/Adafruit-GFX-Library/Fonts/FreeSerifBoldItalic12pt7b.h diff --git a/src/library/Adafruit-GFX-Library/Fonts/FreeSerifBoldItalic18pt7b.h b/src/Libraries/Adafruit-GFX-Library/Fonts/FreeSerifBoldItalic18pt7b.h similarity index 100% rename from src/library/Adafruit-GFX-Library/Fonts/FreeSerifBoldItalic18pt7b.h rename to src/Libraries/Adafruit-GFX-Library/Fonts/FreeSerifBoldItalic18pt7b.h diff --git a/src/library/Adafruit-GFX-Library/Fonts/FreeSerifBoldItalic24pt7b.h b/src/Libraries/Adafruit-GFX-Library/Fonts/FreeSerifBoldItalic24pt7b.h similarity index 100% rename from src/library/Adafruit-GFX-Library/Fonts/FreeSerifBoldItalic24pt7b.h rename to src/Libraries/Adafruit-GFX-Library/Fonts/FreeSerifBoldItalic24pt7b.h diff --git a/src/library/Adafruit-GFX-Library/Fonts/FreeSerifBoldItalic9pt7b.h b/src/Libraries/Adafruit-GFX-Library/Fonts/FreeSerifBoldItalic9pt7b.h similarity index 100% rename from src/library/Adafruit-GFX-Library/Fonts/FreeSerifBoldItalic9pt7b.h rename to src/Libraries/Adafruit-GFX-Library/Fonts/FreeSerifBoldItalic9pt7b.h diff --git a/src/library/Adafruit-GFX-Library/Fonts/FreeSerifItalic12pt7b.h b/src/Libraries/Adafruit-GFX-Library/Fonts/FreeSerifItalic12pt7b.h similarity index 100% rename from src/library/Adafruit-GFX-Library/Fonts/FreeSerifItalic12pt7b.h rename to src/Libraries/Adafruit-GFX-Library/Fonts/FreeSerifItalic12pt7b.h diff --git a/src/library/Adafruit-GFX-Library/Fonts/FreeSerifItalic18pt7b.h b/src/Libraries/Adafruit-GFX-Library/Fonts/FreeSerifItalic18pt7b.h similarity index 100% rename from src/library/Adafruit-GFX-Library/Fonts/FreeSerifItalic18pt7b.h rename to src/Libraries/Adafruit-GFX-Library/Fonts/FreeSerifItalic18pt7b.h diff --git a/src/library/Adafruit-GFX-Library/Fonts/FreeSerifItalic24pt7b.h b/src/Libraries/Adafruit-GFX-Library/Fonts/FreeSerifItalic24pt7b.h similarity index 100% rename from src/library/Adafruit-GFX-Library/Fonts/FreeSerifItalic24pt7b.h rename to src/Libraries/Adafruit-GFX-Library/Fonts/FreeSerifItalic24pt7b.h diff --git a/src/library/Adafruit-GFX-Library/Fonts/FreeSerifItalic9pt7b.h b/src/Libraries/Adafruit-GFX-Library/Fonts/FreeSerifItalic9pt7b.h similarity index 100% rename from src/library/Adafruit-GFX-Library/Fonts/FreeSerifItalic9pt7b.h rename to src/Libraries/Adafruit-GFX-Library/Fonts/FreeSerifItalic9pt7b.h diff --git a/src/library/Adafruit-GFX-Library/Fonts/Org_01.h b/src/Libraries/Adafruit-GFX-Library/Fonts/Org_01.h similarity index 100% rename from src/library/Adafruit-GFX-Library/Fonts/Org_01.h rename to src/Libraries/Adafruit-GFX-Library/Fonts/Org_01.h diff --git a/src/library/Adafruit-GFX-Library/Fonts/Picopixel.h b/src/Libraries/Adafruit-GFX-Library/Fonts/Picopixel.h similarity index 100% rename from src/library/Adafruit-GFX-Library/Fonts/Picopixel.h rename to src/Libraries/Adafruit-GFX-Library/Fonts/Picopixel.h diff --git a/src/library/Adafruit-GFX-Library/Fonts/Tiny3x3a2pt7b.h b/src/Libraries/Adafruit-GFX-Library/Fonts/Tiny3x3a2pt7b.h similarity index 100% rename from src/library/Adafruit-GFX-Library/Fonts/Tiny3x3a2pt7b.h rename to src/Libraries/Adafruit-GFX-Library/Fonts/Tiny3x3a2pt7b.h diff --git a/src/library/Adafruit-GFX-Library/Fonts/TomThumb.h b/src/Libraries/Adafruit-GFX-Library/Fonts/TomThumb.h similarity index 100% rename from src/library/Adafruit-GFX-Library/Fonts/TomThumb.h rename to src/Libraries/Adafruit-GFX-Library/Fonts/TomThumb.h diff --git a/src/library/Adafruit-GFX-Library/README.md b/src/Libraries/Adafruit-GFX-Library/README.md similarity index 100% rename from src/library/Adafruit-GFX-Library/README.md rename to src/Libraries/Adafruit-GFX-Library/README.md diff --git a/src/library/Adafruit-GFX-Library/component.mk b/src/Libraries/Adafruit-GFX-Library/component.mk similarity index 100% rename from src/library/Adafruit-GFX-Library/component.mk rename to src/Libraries/Adafruit-GFX-Library/component.mk diff --git a/src/library/Adafruit-GFX-Library/examples/GFXcanvas/GFXcanvas.ino b/src/Libraries/Adafruit-GFX-Library/examples/GFXcanvas/GFXcanvas.ino similarity index 100% rename from src/library/Adafruit-GFX-Library/examples/GFXcanvas/GFXcanvas.ino rename to src/Libraries/Adafruit-GFX-Library/examples/GFXcanvas/GFXcanvas.ino diff --git a/src/library/Adafruit-GFX-Library/examples/GFXcanvas/GFXcanvasSerialDemo.cpp b/src/Libraries/Adafruit-GFX-Library/examples/GFXcanvas/GFXcanvasSerialDemo.cpp similarity index 100% rename from src/library/Adafruit-GFX-Library/examples/GFXcanvas/GFXcanvasSerialDemo.cpp rename to src/Libraries/Adafruit-GFX-Library/examples/GFXcanvas/GFXcanvasSerialDemo.cpp diff --git a/src/library/Adafruit-GFX-Library/examples/GFXcanvas/GFXcanvasSerialDemo.h b/src/Libraries/Adafruit-GFX-Library/examples/GFXcanvas/GFXcanvasSerialDemo.h similarity index 100% rename from src/library/Adafruit-GFX-Library/examples/GFXcanvas/GFXcanvasSerialDemo.h rename to src/Libraries/Adafruit-GFX-Library/examples/GFXcanvas/GFXcanvasSerialDemo.h diff --git a/src/library/Adafruit-GFX-Library/examples/mock_ili9341/mock_ili9341.ino b/src/Libraries/Adafruit-GFX-Library/examples/mock_ili9341/mock_ili9341.ino similarity index 100% rename from src/library/Adafruit-GFX-Library/examples/mock_ili9341/mock_ili9341.ino rename to src/Libraries/Adafruit-GFX-Library/examples/mock_ili9341/mock_ili9341.ino diff --git a/src/library/Adafruit-GFX-Library/fontconvert/Makefile b/src/Libraries/Adafruit-GFX-Library/fontconvert/Makefile similarity index 100% rename from src/library/Adafruit-GFX-Library/fontconvert/Makefile rename to src/Libraries/Adafruit-GFX-Library/fontconvert/Makefile diff --git a/src/library/Adafruit-GFX-Library/fontconvert/bdf2adafruit.py b/src/Libraries/Adafruit-GFX-Library/fontconvert/bdf2adafruit.py similarity index 100% rename from src/library/Adafruit-GFX-Library/fontconvert/bdf2adafruit.py rename to src/Libraries/Adafruit-GFX-Library/fontconvert/bdf2adafruit.py diff --git a/src/library/Adafruit-GFX-Library/fontconvert/fontconvert.c b/src/Libraries/Adafruit-GFX-Library/fontconvert/fontconvert.c similarity index 100% rename from src/library/Adafruit-GFX-Library/fontconvert/fontconvert.c rename to src/Libraries/Adafruit-GFX-Library/fontconvert/fontconvert.c diff --git a/src/library/Adafruit-GFX-Library/fontconvert/fontconvert_win.md b/src/Libraries/Adafruit-GFX-Library/fontconvert/fontconvert_win.md similarity index 100% rename from src/library/Adafruit-GFX-Library/fontconvert/fontconvert_win.md rename to src/Libraries/Adafruit-GFX-Library/fontconvert/fontconvert_win.md diff --git a/src/library/Adafruit-GFX-Library/fontconvert/makefonts.sh b/src/Libraries/Adafruit-GFX-Library/fontconvert/makefonts.sh similarity index 100% rename from src/library/Adafruit-GFX-Library/fontconvert/makefonts.sh rename to src/Libraries/Adafruit-GFX-Library/fontconvert/makefonts.sh diff --git a/src/library/Adafruit-GFX-Library/gfxfont.h b/src/Libraries/Adafruit-GFX-Library/gfxfont.h similarity index 100% rename from src/library/Adafruit-GFX-Library/gfxfont.h rename to src/Libraries/Adafruit-GFX-Library/gfxfont.h diff --git a/src/library/Adafruit-GFX-Library/glcdfont.c b/src/Libraries/Adafruit-GFX-Library/glcdfont.c similarity index 100% rename from src/library/Adafruit-GFX-Library/glcdfont.c rename to src/Libraries/Adafruit-GFX-Library/glcdfont.c diff --git a/src/library/Adafruit-GFX-Library/library.properties b/src/Libraries/Adafruit-GFX-Library/library.properties similarity index 100% rename from src/library/Adafruit-GFX-Library/library.properties rename to src/Libraries/Adafruit-GFX-Library/library.properties diff --git a/src/library/Adafruit-GFX-Library/license.txt b/src/Libraries/Adafruit-GFX-Library/license.txt similarity index 100% rename from src/library/Adafruit-GFX-Library/license.txt rename to src/Libraries/Adafruit-GFX-Library/license.txt diff --git a/src/library/Adafruit_BusIO/.github/ISSUE_TEMPLATE.md b/src/Libraries/Adafruit_BusIO/.github/ISSUE_TEMPLATE.md similarity index 100% rename from src/library/Adafruit_BusIO/.github/ISSUE_TEMPLATE.md rename to src/Libraries/Adafruit_BusIO/.github/ISSUE_TEMPLATE.md diff --git a/src/library/Adafruit_BusIO/.github/PULL_REQUEST_TEMPLATE.md b/src/Libraries/Adafruit_BusIO/.github/PULL_REQUEST_TEMPLATE.md similarity index 100% rename from src/library/Adafruit_BusIO/.github/PULL_REQUEST_TEMPLATE.md rename to src/Libraries/Adafruit_BusIO/.github/PULL_REQUEST_TEMPLATE.md diff --git a/src/library/Adafruit_BusIO/.github/workflows/githubci.yml b/src/Libraries/Adafruit_BusIO/.github/workflows/githubci.yml similarity index 100% rename from src/library/Adafruit_BusIO/.github/workflows/githubci.yml rename to src/Libraries/Adafruit_BusIO/.github/workflows/githubci.yml diff --git a/src/library/Adafruit_BusIO/Adafruit_BusIO_Register.cpp b/src/Libraries/Adafruit_BusIO/Adafruit_BusIO_Register.cpp similarity index 100% rename from src/library/Adafruit_BusIO/Adafruit_BusIO_Register.cpp rename to src/Libraries/Adafruit_BusIO/Adafruit_BusIO_Register.cpp diff --git a/src/library/Adafruit_BusIO/Adafruit_BusIO_Register.h b/src/Libraries/Adafruit_BusIO/Adafruit_BusIO_Register.h similarity index 100% rename from src/library/Adafruit_BusIO/Adafruit_BusIO_Register.h rename to src/Libraries/Adafruit_BusIO/Adafruit_BusIO_Register.h diff --git a/src/library/Adafruit_BusIO/Adafruit_I2CDevice.cpp b/src/Libraries/Adafruit_BusIO/Adafruit_I2CDevice.cpp similarity index 100% rename from src/library/Adafruit_BusIO/Adafruit_I2CDevice.cpp rename to src/Libraries/Adafruit_BusIO/Adafruit_I2CDevice.cpp diff --git a/src/library/Adafruit_BusIO/Adafruit_I2CDevice.h b/src/Libraries/Adafruit_BusIO/Adafruit_I2CDevice.h similarity index 100% rename from src/library/Adafruit_BusIO/Adafruit_I2CDevice.h rename to src/Libraries/Adafruit_BusIO/Adafruit_I2CDevice.h diff --git a/src/library/Adafruit_BusIO/Adafruit_I2CRegister.h b/src/Libraries/Adafruit_BusIO/Adafruit_I2CRegister.h similarity index 100% rename from src/library/Adafruit_BusIO/Adafruit_I2CRegister.h rename to src/Libraries/Adafruit_BusIO/Adafruit_I2CRegister.h diff --git a/src/library/Adafruit_BusIO/Adafruit_SPIDevice.cpp b/src/Libraries/Adafruit_BusIO/Adafruit_SPIDevice.cpp similarity index 100% rename from src/library/Adafruit_BusIO/Adafruit_SPIDevice.cpp rename to src/Libraries/Adafruit_BusIO/Adafruit_SPIDevice.cpp diff --git a/src/library/Adafruit_BusIO/Adafruit_SPIDevice.h b/src/Libraries/Adafruit_BusIO/Adafruit_SPIDevice.h similarity index 100% rename from src/library/Adafruit_BusIO/Adafruit_SPIDevice.h rename to src/Libraries/Adafruit_BusIO/Adafruit_SPIDevice.h diff --git a/src/library/Adafruit_BusIO/CMakeLists.txt b/src/Libraries/Adafruit_BusIO/CMakeLists.txt similarity index 100% rename from src/library/Adafruit_BusIO/CMakeLists.txt rename to src/Libraries/Adafruit_BusIO/CMakeLists.txt diff --git a/src/library/Adafruit_BusIO/LICENSE b/src/Libraries/Adafruit_BusIO/LICENSE similarity index 100% rename from src/library/Adafruit_BusIO/LICENSE rename to src/Libraries/Adafruit_BusIO/LICENSE diff --git a/src/library/Adafruit_BusIO/README.md b/src/Libraries/Adafruit_BusIO/README.md similarity index 100% rename from src/library/Adafruit_BusIO/README.md rename to src/Libraries/Adafruit_BusIO/README.md diff --git a/src/library/Adafruit_BusIO/component.mk b/src/Libraries/Adafruit_BusIO/component.mk similarity index 100% rename from src/library/Adafruit_BusIO/component.mk rename to src/Libraries/Adafruit_BusIO/component.mk diff --git a/src/library/Adafruit_BusIO/examples/i2c_address_detect/i2c_address_detect.ino b/src/Libraries/Adafruit_BusIO/examples/i2c_address_detect/i2c_address_detect.ino similarity index 100% rename from src/library/Adafruit_BusIO/examples/i2c_address_detect/i2c_address_detect.ino rename to src/Libraries/Adafruit_BusIO/examples/i2c_address_detect/i2c_address_detect.ino diff --git a/src/library/Adafruit_BusIO/examples/i2c_readwrite/i2c_readwrite.ino b/src/Libraries/Adafruit_BusIO/examples/i2c_readwrite/i2c_readwrite.ino similarity index 100% rename from src/library/Adafruit_BusIO/examples/i2c_readwrite/i2c_readwrite.ino rename to src/Libraries/Adafruit_BusIO/examples/i2c_readwrite/i2c_readwrite.ino diff --git a/src/library/Adafruit_BusIO/examples/i2c_registers/i2c_registers.ino b/src/Libraries/Adafruit_BusIO/examples/i2c_registers/i2c_registers.ino similarity index 100% rename from src/library/Adafruit_BusIO/examples/i2c_registers/i2c_registers.ino rename to src/Libraries/Adafruit_BusIO/examples/i2c_registers/i2c_registers.ino diff --git a/src/library/Adafruit_BusIO/examples/i2corspi_register/i2corspi_register.ino b/src/Libraries/Adafruit_BusIO/examples/i2corspi_register/i2corspi_register.ino similarity index 100% rename from src/library/Adafruit_BusIO/examples/i2corspi_register/i2corspi_register.ino rename to src/Libraries/Adafruit_BusIO/examples/i2corspi_register/i2corspi_register.ino diff --git a/src/library/Adafruit_BusIO/examples/spi_modetest/spi_modetest.ino b/src/Libraries/Adafruit_BusIO/examples/spi_modetest/spi_modetest.ino similarity index 100% rename from src/library/Adafruit_BusIO/examples/spi_modetest/spi_modetest.ino rename to src/Libraries/Adafruit_BusIO/examples/spi_modetest/spi_modetest.ino diff --git a/src/library/Adafruit_BusIO/examples/spi_readwrite/spi_readwrite.ino b/src/Libraries/Adafruit_BusIO/examples/spi_readwrite/spi_readwrite.ino similarity index 100% rename from src/library/Adafruit_BusIO/examples/spi_readwrite/spi_readwrite.ino rename to src/Libraries/Adafruit_BusIO/examples/spi_readwrite/spi_readwrite.ino diff --git a/src/library/Adafruit_BusIO/examples/spi_register_bits/spi_register_bits.ino b/src/Libraries/Adafruit_BusIO/examples/spi_register_bits/spi_register_bits.ino similarity index 100% rename from src/library/Adafruit_BusIO/examples/spi_register_bits/spi_register_bits.ino rename to src/Libraries/Adafruit_BusIO/examples/spi_register_bits/spi_register_bits.ino diff --git a/src/library/Adafruit_BusIO/examples/spi_registers/spi_registers.ino b/src/Libraries/Adafruit_BusIO/examples/spi_registers/spi_registers.ino similarity index 100% rename from src/library/Adafruit_BusIO/examples/spi_registers/spi_registers.ino rename to src/Libraries/Adafruit_BusIO/examples/spi_registers/spi_registers.ino diff --git a/src/library/Adafruit_BusIO/library.properties b/src/Libraries/Adafruit_BusIO/library.properties similarity index 100% rename from src/library/Adafruit_BusIO/library.properties rename to src/Libraries/Adafruit_BusIO/library.properties diff --git a/src/library/Adafruit_NeoPixel/.github/ISSUE_TEMPLATE.md b/src/Libraries/Adafruit_NeoPixel/.github/ISSUE_TEMPLATE.md similarity index 100% rename from src/library/Adafruit_NeoPixel/.github/ISSUE_TEMPLATE.md rename to src/Libraries/Adafruit_NeoPixel/.github/ISSUE_TEMPLATE.md diff --git a/src/library/Adafruit_NeoPixel/.github/PULL_REQUEST_TEMPLATE.md b/src/Libraries/Adafruit_NeoPixel/.github/PULL_REQUEST_TEMPLATE.md similarity index 100% rename from src/library/Adafruit_NeoPixel/.github/PULL_REQUEST_TEMPLATE.md rename to src/Libraries/Adafruit_NeoPixel/.github/PULL_REQUEST_TEMPLATE.md diff --git a/src/library/Adafruit_NeoPixel/.github/workflows/githubci.yml b/src/Libraries/Adafruit_NeoPixel/.github/workflows/githubci.yml similarity index 100% rename from src/library/Adafruit_NeoPixel/.github/workflows/githubci.yml rename to src/Libraries/Adafruit_NeoPixel/.github/workflows/githubci.yml diff --git a/src/library/Adafruit_NeoPixel/.gitignore b/src/Libraries/Adafruit_NeoPixel/.gitignore similarity index 100% rename from src/library/Adafruit_NeoPixel/.gitignore rename to src/Libraries/Adafruit_NeoPixel/.gitignore diff --git a/src/library/Adafruit_NeoPixel/Adafruit_NeoPixel.cpp b/src/Libraries/Adafruit_NeoPixel/Adafruit_NeoPixel.cpp similarity index 100% rename from src/library/Adafruit_NeoPixel/Adafruit_NeoPixel.cpp rename to src/Libraries/Adafruit_NeoPixel/Adafruit_NeoPixel.cpp diff --git a/src/library/Adafruit_NeoPixel/Adafruit_NeoPixel.h b/src/Libraries/Adafruit_NeoPixel/Adafruit_NeoPixel.h similarity index 100% rename from src/library/Adafruit_NeoPixel/Adafruit_NeoPixel.h rename to src/Libraries/Adafruit_NeoPixel/Adafruit_NeoPixel.h diff --git a/src/library/Adafruit_NeoPixel/CONTRIBUTING.md b/src/Libraries/Adafruit_NeoPixel/CONTRIBUTING.md similarity index 100% rename from src/library/Adafruit_NeoPixel/CONTRIBUTING.md rename to src/Libraries/Adafruit_NeoPixel/CONTRIBUTING.md diff --git a/src/library/Adafruit_NeoPixel/COPYING b/src/Libraries/Adafruit_NeoPixel/COPYING similarity index 100% rename from src/library/Adafruit_NeoPixel/COPYING rename to src/Libraries/Adafruit_NeoPixel/COPYING diff --git a/src/library/Adafruit_NeoPixel/README.md b/src/Libraries/Adafruit_NeoPixel/README.md similarity index 100% rename from src/library/Adafruit_NeoPixel/README.md rename to src/Libraries/Adafruit_NeoPixel/README.md diff --git a/src/library/Adafruit_NeoPixel/esp.c b/src/Libraries/Adafruit_NeoPixel/esp.c similarity index 100% rename from src/library/Adafruit_NeoPixel/esp.c rename to src/Libraries/Adafruit_NeoPixel/esp.c diff --git a/src/library/Adafruit_NeoPixel/esp8266.c b/src/Libraries/Adafruit_NeoPixel/esp8266.c similarity index 100% rename from src/library/Adafruit_NeoPixel/esp8266.c rename to src/Libraries/Adafruit_NeoPixel/esp8266.c diff --git a/src/library/Adafruit_NeoPixel/kendyte_k210.c b/src/Libraries/Adafruit_NeoPixel/kendyte_k210.c similarity index 100% rename from src/library/Adafruit_NeoPixel/kendyte_k210.c rename to src/Libraries/Adafruit_NeoPixel/kendyte_k210.c diff --git a/src/library/Adafruit_NeoPixel/keywords.txt b/src/Libraries/Adafruit_NeoPixel/keywords.txt similarity index 100% rename from src/library/Adafruit_NeoPixel/keywords.txt rename to src/Libraries/Adafruit_NeoPixel/keywords.txt diff --git a/src/library/Adafruit_NeoPixel/library.properties b/src/Libraries/Adafruit_NeoPixel/library.properties similarity index 100% rename from src/library/Adafruit_NeoPixel/library.properties rename to src/Libraries/Adafruit_NeoPixel/library.properties diff --git a/src/library/Adafruit_NeoPixel/rp2040_pio.h b/src/Libraries/Adafruit_NeoPixel/rp2040_pio.h similarity index 100% rename from src/library/Adafruit_NeoPixel/rp2040_pio.h rename to src/Libraries/Adafruit_NeoPixel/rp2040_pio.h diff --git a/src/library/Adafruit_SH110x/.github/ISSUE_TEMPLATE.md b/src/Libraries/Adafruit_SH110x/.github/ISSUE_TEMPLATE.md similarity index 100% rename from src/library/Adafruit_SH110x/.github/ISSUE_TEMPLATE.md rename to src/Libraries/Adafruit_SH110x/.github/ISSUE_TEMPLATE.md diff --git a/src/library/Adafruit_SH110x/.github/PULL_REQUEST_TEMPLATE.md b/src/Libraries/Adafruit_SH110x/.github/PULL_REQUEST_TEMPLATE.md similarity index 100% rename from src/library/Adafruit_SH110x/.github/PULL_REQUEST_TEMPLATE.md rename to src/Libraries/Adafruit_SH110x/.github/PULL_REQUEST_TEMPLATE.md diff --git a/src/library/Adafruit_SH110x/.github/workflows/githubci.yml b/src/Libraries/Adafruit_SH110x/.github/workflows/githubci.yml similarity index 100% rename from src/library/Adafruit_SH110x/.github/workflows/githubci.yml rename to src/Libraries/Adafruit_SH110x/.github/workflows/githubci.yml diff --git a/src/library/Adafruit_SH110x/.gitignore b/src/Libraries/Adafruit_SH110x/.gitignore similarity index 100% rename from src/library/Adafruit_SH110x/.gitignore rename to src/Libraries/Adafruit_SH110x/.gitignore diff --git a/src/library/Adafruit_SH110x/Adafruit_SH1106G.cpp b/src/Libraries/Adafruit_SH110x/Adafruit_SH1106G.cpp similarity index 100% rename from src/library/Adafruit_SH110x/Adafruit_SH1106G.cpp rename to src/Libraries/Adafruit_SH110x/Adafruit_SH1106G.cpp diff --git a/src/library/Adafruit_SH110x/Adafruit_SH1107.cpp b/src/Libraries/Adafruit_SH110x/Adafruit_SH1107.cpp similarity index 100% rename from src/library/Adafruit_SH110x/Adafruit_SH1107.cpp rename to src/Libraries/Adafruit_SH110x/Adafruit_SH1107.cpp diff --git a/src/library/Adafruit_SH110x/Adafruit_SH110X.cpp b/src/Libraries/Adafruit_SH110x/Adafruit_SH110X.cpp similarity index 100% rename from src/library/Adafruit_SH110x/Adafruit_SH110X.cpp rename to src/Libraries/Adafruit_SH110x/Adafruit_SH110X.cpp diff --git a/src/library/Adafruit_SH110x/Adafruit_SH110X.h b/src/Libraries/Adafruit_SH110x/Adafruit_SH110X.h similarity index 100% rename from src/library/Adafruit_SH110x/Adafruit_SH110X.h rename to src/Libraries/Adafruit_SH110x/Adafruit_SH110X.h diff --git a/src/library/Adafruit_SH110x/README.md b/src/Libraries/Adafruit_SH110x/README.md similarity index 100% rename from src/library/Adafruit_SH110x/README.md rename to src/Libraries/Adafruit_SH110x/README.md diff --git a/src/library/Adafruit_SH110x/examples/OLED_QTPY_SH1106/SH1106_128x64_SPi_QTPY/SH1106_128x64_SPi_QTPY.ino b/src/Libraries/Adafruit_SH110x/examples/OLED_QTPY_SH1106/SH1106_128x64_SPi_QTPY/SH1106_128x64_SPi_QTPY.ino similarity index 100% rename from src/library/Adafruit_SH110x/examples/OLED_QTPY_SH1106/SH1106_128x64_SPi_QTPY/SH1106_128x64_SPi_QTPY.ino rename to src/Libraries/Adafruit_SH110x/examples/OLED_QTPY_SH1106/SH1106_128x64_SPi_QTPY/SH1106_128x64_SPi_QTPY.ino diff --git a/src/library/Adafruit_SH110x/examples/OLED_QTPY_SH1106/SH1106_128x64_i2c_QTPY/SH1106_128x64_i2c_QTPY.ino b/src/Libraries/Adafruit_SH110x/examples/OLED_QTPY_SH1106/SH1106_128x64_i2c_QTPY/SH1106_128x64_i2c_QTPY.ino similarity index 100% rename from src/library/Adafruit_SH110x/examples/OLED_QTPY_SH1106/SH1106_128x64_i2c_QTPY/SH1106_128x64_i2c_QTPY.ino rename to src/Libraries/Adafruit_SH110x/examples/OLED_QTPY_SH1106/SH1106_128x64_i2c_QTPY/SH1106_128x64_i2c_QTPY.ino diff --git a/src/library/Adafruit_SH110x/examples/OLED_featherwing/OLED_featherwing.ino b/src/Libraries/Adafruit_SH110x/examples/OLED_featherwing/OLED_featherwing.ino similarity index 100% rename from src/library/Adafruit_SH110x/examples/OLED_featherwing/OLED_featherwing.ino rename to src/Libraries/Adafruit_SH110x/examples/OLED_featherwing/OLED_featherwing.ino diff --git a/src/library/Adafruit_SH110x/examples/SH1107_128x128/SH1107_128x128.ino b/src/Libraries/Adafruit_SH110x/examples/SH1107_128x128/SH1107_128x128.ino similarity index 100% rename from src/library/Adafruit_SH110x/examples/SH1107_128x128/SH1107_128x128.ino rename to src/Libraries/Adafruit_SH110x/examples/SH1107_128x128/SH1107_128x128.ino diff --git a/src/library/Adafruit_SH110x/library.properties b/src/Libraries/Adafruit_SH110x/library.properties similarity index 100% rename from src/library/Adafruit_SH110x/library.properties rename to src/Libraries/Adafruit_SH110x/library.properties diff --git a/src/library/Adafruit_SH110x/license.txt b/src/Libraries/Adafruit_SH110x/license.txt similarity index 100% rename from src/library/Adafruit_SH110x/license.txt rename to src/Libraries/Adafruit_SH110x/license.txt diff --git a/src/library/Adafruit_SH110x/splash.h b/src/Libraries/Adafruit_SH110x/splash.h similarity index 100% rename from src/library/Adafruit_SH110x/splash.h rename to src/Libraries/Adafruit_SH110x/splash.h diff --git a/src/library/Adafruit_SSD1306_Wemos_OLED/.github/ISSUE_TEMPLATE.md b/src/Libraries/Adafruit_SSD1306_Wemos_OLED/.github/ISSUE_TEMPLATE.md similarity index 100% rename from src/library/Adafruit_SSD1306_Wemos_OLED/.github/ISSUE_TEMPLATE.md rename to src/Libraries/Adafruit_SSD1306_Wemos_OLED/.github/ISSUE_TEMPLATE.md diff --git a/src/library/Adafruit_SSD1306_Wemos_OLED/.github/PULL_REQUEST_TEMPLATE.md b/src/Libraries/Adafruit_SSD1306_Wemos_OLED/.github/PULL_REQUEST_TEMPLATE.md similarity index 100% rename from src/library/Adafruit_SSD1306_Wemos_OLED/.github/PULL_REQUEST_TEMPLATE.md rename to src/Libraries/Adafruit_SSD1306_Wemos_OLED/.github/PULL_REQUEST_TEMPLATE.md diff --git a/src/library/Adafruit_SSD1306_Wemos_OLED/Adafruit_SSD1306.cpp b/src/Libraries/Adafruit_SSD1306_Wemos_OLED/Adafruit_SSD1306.cpp similarity index 100% rename from src/library/Adafruit_SSD1306_Wemos_OLED/Adafruit_SSD1306.cpp rename to src/Libraries/Adafruit_SSD1306_Wemos_OLED/Adafruit_SSD1306.cpp diff --git a/src/library/Adafruit_SSD1306_Wemos_OLED/Adafruit_SSD1306.h b/src/Libraries/Adafruit_SSD1306_Wemos_OLED/Adafruit_SSD1306.h similarity index 100% rename from src/library/Adafruit_SSD1306_Wemos_OLED/Adafruit_SSD1306.h rename to src/Libraries/Adafruit_SSD1306_Wemos_OLED/Adafruit_SSD1306.h diff --git a/src/library/Adafruit_SSD1306_Wemos_OLED/README.md b/src/Libraries/Adafruit_SSD1306_Wemos_OLED/README.md similarity index 100% rename from src/library/Adafruit_SSD1306_Wemos_OLED/README.md rename to src/Libraries/Adafruit_SSD1306_Wemos_OLED/README.md diff --git a/src/library/Adafruit_SSD1306_Wemos_OLED/README.txt b/src/Libraries/Adafruit_SSD1306_Wemos_OLED/README.txt similarity index 100% rename from src/library/Adafruit_SSD1306_Wemos_OLED/README.txt rename to src/Libraries/Adafruit_SSD1306_Wemos_OLED/README.txt diff --git a/src/library/Adafruit_SSD1306_Wemos_OLED/examples/ssd1306_128x32_i2c/ssd1306_128x32_i2c.ino b/src/Libraries/Adafruit_SSD1306_Wemos_OLED/examples/ssd1306_128x32_i2c/ssd1306_128x32_i2c.ino similarity index 100% rename from src/library/Adafruit_SSD1306_Wemos_OLED/examples/ssd1306_128x32_i2c/ssd1306_128x32_i2c.ino rename to src/Libraries/Adafruit_SSD1306_Wemos_OLED/examples/ssd1306_128x32_i2c/ssd1306_128x32_i2c.ino diff --git a/src/library/Adafruit_SSD1306_Wemos_OLED/examples/ssd1306_128x32_spi/ssd1306_128x32_spi.ino b/src/Libraries/Adafruit_SSD1306_Wemos_OLED/examples/ssd1306_128x32_spi/ssd1306_128x32_spi.ino similarity index 100% rename from src/library/Adafruit_SSD1306_Wemos_OLED/examples/ssd1306_128x32_spi/ssd1306_128x32_spi.ino rename to src/Libraries/Adafruit_SSD1306_Wemos_OLED/examples/ssd1306_128x32_spi/ssd1306_128x32_spi.ino diff --git a/src/library/Adafruit_SSD1306_Wemos_OLED/examples/ssd1306_128x64_i2c/ssd1306_128x64_i2c.ino b/src/Libraries/Adafruit_SSD1306_Wemos_OLED/examples/ssd1306_128x64_i2c/ssd1306_128x64_i2c.ino similarity index 100% rename from src/library/Adafruit_SSD1306_Wemos_OLED/examples/ssd1306_128x64_i2c/ssd1306_128x64_i2c.ino rename to src/Libraries/Adafruit_SSD1306_Wemos_OLED/examples/ssd1306_128x64_i2c/ssd1306_128x64_i2c.ino diff --git a/src/library/Adafruit_SSD1306_Wemos_OLED/examples/ssd1306_128x64_spi/ssd1306_128x64_spi.ino b/src/Libraries/Adafruit_SSD1306_Wemos_OLED/examples/ssd1306_128x64_spi/ssd1306_128x64_spi.ino similarity index 100% rename from src/library/Adafruit_SSD1306_Wemos_OLED/examples/ssd1306_128x64_spi/ssd1306_128x64_spi.ino rename to src/Libraries/Adafruit_SSD1306_Wemos_OLED/examples/ssd1306_128x64_spi/ssd1306_128x64_spi.ino diff --git a/src/library/Adafruit_SSD1306_Wemos_OLED/examples/ssd1306_64x48_i2c/ssd1306_64x48_i2c.ino b/src/Libraries/Adafruit_SSD1306_Wemos_OLED/examples/ssd1306_64x48_i2c/ssd1306_64x48_i2c.ino similarity index 100% rename from src/library/Adafruit_SSD1306_Wemos_OLED/examples/ssd1306_64x48_i2c/ssd1306_64x48_i2c.ino rename to src/Libraries/Adafruit_SSD1306_Wemos_OLED/examples/ssd1306_64x48_i2c/ssd1306_64x48_i2c.ino diff --git a/src/library/Adafruit_SSD1306_Wemos_OLED/library.properties b/src/Libraries/Adafruit_SSD1306_Wemos_OLED/library.properties similarity index 100% rename from src/library/Adafruit_SSD1306_Wemos_OLED/library.properties rename to src/Libraries/Adafruit_SSD1306_Wemos_OLED/library.properties diff --git a/src/library/Adafruit_SSD1306_Wemos_OLED/license.txt b/src/Libraries/Adafruit_SSD1306_Wemos_OLED/license.txt similarity index 100% rename from src/library/Adafruit_SSD1306_Wemos_OLED/license.txt rename to src/Libraries/Adafruit_SSD1306_Wemos_OLED/license.txt diff --git a/src/library/SensirionCore/.clang-format b/src/Libraries/SensirionCore/.clang-format similarity index 100% rename from src/library/SensirionCore/.clang-format rename to src/Libraries/SensirionCore/.clang-format diff --git a/src/library/SensirionCore/.editorconfig b/src/Libraries/SensirionCore/.editorconfig similarity index 100% rename from src/library/SensirionCore/.editorconfig rename to src/Libraries/SensirionCore/.editorconfig diff --git a/src/library/SensirionCore/.gitignore b/src/Libraries/SensirionCore/.gitignore similarity index 100% rename from src/library/SensirionCore/.gitignore rename to src/Libraries/SensirionCore/.gitignore diff --git a/src/library/SensirionCore/.gitlab-ci.yml b/src/Libraries/SensirionCore/.gitlab-ci.yml similarity index 100% rename from src/library/SensirionCore/.gitlab-ci.yml rename to src/Libraries/SensirionCore/.gitlab-ci.yml diff --git a/src/library/SensirionCore/CHANGELOG.rst b/src/Libraries/SensirionCore/CHANGELOG.rst similarity index 100% rename from src/library/SensirionCore/CHANGELOG.rst rename to src/Libraries/SensirionCore/CHANGELOG.rst diff --git a/src/library/SensirionCore/LICENSE b/src/Libraries/SensirionCore/LICENSE similarity index 100% rename from src/library/SensirionCore/LICENSE rename to src/Libraries/SensirionCore/LICENSE diff --git a/src/library/SensirionCore/README.md b/src/Libraries/SensirionCore/README.md similarity index 100% rename from src/library/SensirionCore/README.md rename to src/Libraries/SensirionCore/README.md diff --git a/src/library/SensirionCore/examples/AllCommandsI2c/AllCommandsI2c.ino b/src/Libraries/SensirionCore/examples/AllCommandsI2c/AllCommandsI2c.ino similarity index 100% rename from src/library/SensirionCore/examples/AllCommandsI2c/AllCommandsI2c.ino rename to src/Libraries/SensirionCore/examples/AllCommandsI2c/AllCommandsI2c.ino diff --git a/src/library/SensirionCore/examples/AllCommandsShdlc/AllCommandsShdlc.ino b/src/Libraries/SensirionCore/examples/AllCommandsShdlc/AllCommandsShdlc.ino similarity index 100% rename from src/library/SensirionCore/examples/AllCommandsShdlc/AllCommandsShdlc.ino rename to src/Libraries/SensirionCore/examples/AllCommandsShdlc/AllCommandsShdlc.ino diff --git a/src/library/SensirionCore/keywords.txt b/src/Libraries/SensirionCore/keywords.txt similarity index 100% rename from src/library/SensirionCore/keywords.txt rename to src/Libraries/SensirionCore/keywords.txt diff --git a/src/library/SensirionCore/library.properties b/src/Libraries/SensirionCore/library.properties similarity index 100% rename from src/library/SensirionCore/library.properties rename to src/Libraries/SensirionCore/library.properties diff --git a/src/library/SensirionCore/src/SensirionCore.h b/src/Libraries/SensirionCore/src/SensirionCore.h similarity index 100% rename from src/library/SensirionCore/src/SensirionCore.h rename to src/Libraries/SensirionCore/src/SensirionCore.h diff --git a/src/library/SensirionCore/src/SensirionCoreArduinoLibrary.h b/src/Libraries/SensirionCore/src/SensirionCoreArduinoLibrary.h similarity index 100% rename from src/library/SensirionCore/src/SensirionCoreArduinoLibrary.h rename to src/Libraries/SensirionCore/src/SensirionCoreArduinoLibrary.h diff --git a/src/library/SensirionCore/src/SensirionCrc.cpp b/src/Libraries/SensirionCore/src/SensirionCrc.cpp similarity index 100% rename from src/library/SensirionCore/src/SensirionCrc.cpp rename to src/Libraries/SensirionCore/src/SensirionCrc.cpp diff --git a/src/library/SensirionCore/src/SensirionCrc.h b/src/Libraries/SensirionCore/src/SensirionCrc.h similarity index 100% rename from src/library/SensirionCore/src/SensirionCrc.h rename to src/Libraries/SensirionCore/src/SensirionCrc.h diff --git a/src/library/SensirionCore/src/SensirionErrors.cpp b/src/Libraries/SensirionCore/src/SensirionErrors.cpp similarity index 100% rename from src/library/SensirionCore/src/SensirionErrors.cpp rename to src/Libraries/SensirionCore/src/SensirionErrors.cpp diff --git a/src/library/SensirionCore/src/SensirionErrors.h b/src/Libraries/SensirionCore/src/SensirionErrors.h similarity index 100% rename from src/library/SensirionCore/src/SensirionErrors.h rename to src/Libraries/SensirionCore/src/SensirionErrors.h diff --git a/src/library/SensirionCore/src/SensirionI2CCommunication.cpp b/src/Libraries/SensirionCore/src/SensirionI2CCommunication.cpp similarity index 100% rename from src/library/SensirionCore/src/SensirionI2CCommunication.cpp rename to src/Libraries/SensirionCore/src/SensirionI2CCommunication.cpp diff --git a/src/library/SensirionCore/src/SensirionI2CCommunication.h b/src/Libraries/SensirionCore/src/SensirionI2CCommunication.h similarity index 100% rename from src/library/SensirionCore/src/SensirionI2CCommunication.h rename to src/Libraries/SensirionCore/src/SensirionI2CCommunication.h diff --git a/src/library/SensirionCore/src/SensirionI2CRxFrame.h b/src/Libraries/SensirionCore/src/SensirionI2CRxFrame.h similarity index 100% rename from src/library/SensirionCore/src/SensirionI2CRxFrame.h rename to src/Libraries/SensirionCore/src/SensirionI2CRxFrame.h diff --git a/src/library/SensirionCore/src/SensirionI2CTxFrame.cpp b/src/Libraries/SensirionCore/src/SensirionI2CTxFrame.cpp similarity index 100% rename from src/library/SensirionCore/src/SensirionI2CTxFrame.cpp rename to src/Libraries/SensirionCore/src/SensirionI2CTxFrame.cpp diff --git a/src/library/SensirionCore/src/SensirionI2CTxFrame.h b/src/Libraries/SensirionCore/src/SensirionI2CTxFrame.h similarity index 100% rename from src/library/SensirionCore/src/SensirionI2CTxFrame.h rename to src/Libraries/SensirionCore/src/SensirionI2CTxFrame.h diff --git a/src/library/SensirionCore/src/SensirionRxFrame.cpp b/src/Libraries/SensirionCore/src/SensirionRxFrame.cpp similarity index 100% rename from src/library/SensirionCore/src/SensirionRxFrame.cpp rename to src/Libraries/SensirionCore/src/SensirionRxFrame.cpp diff --git a/src/library/SensirionCore/src/SensirionRxFrame.h b/src/Libraries/SensirionCore/src/SensirionRxFrame.h similarity index 100% rename from src/library/SensirionCore/src/SensirionRxFrame.h rename to src/Libraries/SensirionCore/src/SensirionRxFrame.h diff --git a/src/library/SensirionCore/src/SensirionShdlcCommunication.cpp b/src/Libraries/SensirionCore/src/SensirionShdlcCommunication.cpp similarity index 100% rename from src/library/SensirionCore/src/SensirionShdlcCommunication.cpp rename to src/Libraries/SensirionCore/src/SensirionShdlcCommunication.cpp diff --git a/src/library/SensirionCore/src/SensirionShdlcCommunication.h b/src/Libraries/SensirionCore/src/SensirionShdlcCommunication.h similarity index 100% rename from src/library/SensirionCore/src/SensirionShdlcCommunication.h rename to src/Libraries/SensirionCore/src/SensirionShdlcCommunication.h diff --git a/src/library/SensirionCore/src/SensirionShdlcRxFrame.h b/src/Libraries/SensirionCore/src/SensirionShdlcRxFrame.h similarity index 100% rename from src/library/SensirionCore/src/SensirionShdlcRxFrame.h rename to src/Libraries/SensirionCore/src/SensirionShdlcRxFrame.h diff --git a/src/library/SensirionCore/src/SensirionShdlcTxFrame.cpp b/src/Libraries/SensirionCore/src/SensirionShdlcTxFrame.cpp similarity index 100% rename from src/library/SensirionCore/src/SensirionShdlcTxFrame.cpp rename to src/Libraries/SensirionCore/src/SensirionShdlcTxFrame.cpp diff --git a/src/library/SensirionCore/src/SensirionShdlcTxFrame.h b/src/Libraries/SensirionCore/src/SensirionShdlcTxFrame.h similarity index 100% rename from src/library/SensirionCore/src/SensirionShdlcTxFrame.h rename to src/Libraries/SensirionCore/src/SensirionShdlcTxFrame.h diff --git a/src/library/SensirionCore/tests/compile_test.py b/src/Libraries/SensirionCore/tests/compile_test.py similarity index 100% rename from src/library/SensirionCore/tests/compile_test.py rename to src/Libraries/SensirionCore/tests/compile_test.py diff --git a/src/library/SensirionCore/tests/run_cppcheck.sh b/src/Libraries/SensirionCore/tests/run_cppcheck.sh similarity index 100% rename from src/library/SensirionCore/tests/run_cppcheck.sh rename to src/Libraries/SensirionCore/tests/run_cppcheck.sh diff --git a/src/library/SensirionCore/tests/syntax_check.sh b/src/Libraries/SensirionCore/tests/syntax_check.sh similarity index 100% rename from src/library/SensirionCore/tests/syntax_check.sh rename to src/Libraries/SensirionCore/tests/syntax_check.sh diff --git a/src/library/SensirionSGP41/.clang-format b/src/Libraries/SensirionSGP41/.clang-format similarity index 100% rename from src/library/SensirionSGP41/.clang-format rename to src/Libraries/SensirionSGP41/.clang-format diff --git a/src/library/SensirionSGP41/.gitlab-ci.yml b/src/Libraries/SensirionSGP41/.gitlab-ci.yml similarity index 100% rename from src/library/SensirionSGP41/.gitlab-ci.yml rename to src/Libraries/SensirionSGP41/.gitlab-ci.yml diff --git a/src/library/SensirionSGP41/CHANGELOG.md b/src/Libraries/SensirionSGP41/CHANGELOG.md similarity index 100% rename from src/library/SensirionSGP41/CHANGELOG.md rename to src/Libraries/SensirionSGP41/CHANGELOG.md diff --git a/src/library/SensirionSGP41/LICENSE b/src/Libraries/SensirionSGP41/LICENSE similarity index 100% rename from src/library/SensirionSGP41/LICENSE rename to src/Libraries/SensirionSGP41/LICENSE diff --git a/src/library/SensirionSGP41/README.md b/src/Libraries/SensirionSGP41/README.md similarity index 100% rename from src/library/SensirionSGP41/README.md rename to src/Libraries/SensirionSGP41/README.md diff --git a/src/library/SensirionSGP41/examples/exampleUsage/exampleUsage.ino b/src/Libraries/SensirionSGP41/examples/exampleUsage/exampleUsage.ino similarity index 100% rename from src/library/SensirionSGP41/examples/exampleUsage/exampleUsage.ino rename to src/Libraries/SensirionSGP41/examples/exampleUsage/exampleUsage.ino diff --git a/src/library/SensirionSGP41/images/SGP41.png b/src/Libraries/SensirionSGP41/images/SGP41.png similarity index 100% rename from src/library/SensirionSGP41/images/SGP41.png rename to src/Libraries/SensirionSGP41/images/SGP41.png diff --git a/src/library/SensirionSGP41/keywords.txt b/src/Libraries/SensirionSGP41/keywords.txt similarity index 100% rename from src/library/SensirionSGP41/keywords.txt rename to src/Libraries/SensirionSGP41/keywords.txt diff --git a/src/library/SensirionSGP41/library.properties b/src/Libraries/SensirionSGP41/library.properties similarity index 100% rename from src/library/SensirionSGP41/library.properties rename to src/Libraries/SensirionSGP41/library.properties diff --git a/src/library/SensirionSGP41/src/SensirionI2CSgp41.cpp b/src/Libraries/SensirionSGP41/src/SensirionI2CSgp41.cpp similarity index 100% rename from src/library/SensirionSGP41/src/SensirionI2CSgp41.cpp rename to src/Libraries/SensirionSGP41/src/SensirionI2CSgp41.cpp diff --git a/src/library/SensirionSGP41/src/SensirionI2CSgp41.h b/src/Libraries/SensirionSGP41/src/SensirionI2CSgp41.h similarity index 100% rename from src/library/SensirionSGP41/src/SensirionI2CSgp41.h rename to src/Libraries/SensirionSGP41/src/SensirionI2CSgp41.h diff --git a/src/library/Sensirion_Gas_Index_Algorithm/CHANGELOG.md b/src/Libraries/Sensirion_Gas_Index_Algorithm/CHANGELOG.md similarity index 100% rename from src/library/Sensirion_Gas_Index_Algorithm/CHANGELOG.md rename to src/Libraries/Sensirion_Gas_Index_Algorithm/CHANGELOG.md diff --git a/src/library/Sensirion_Gas_Index_Algorithm/LICENSE b/src/Libraries/Sensirion_Gas_Index_Algorithm/LICENSE similarity index 100% rename from src/library/Sensirion_Gas_Index_Algorithm/LICENSE rename to src/Libraries/Sensirion_Gas_Index_Algorithm/LICENSE diff --git a/src/library/Sensirion_Gas_Index_Algorithm/README.md b/src/Libraries/Sensirion_Gas_Index_Algorithm/README.md similarity index 100% rename from src/library/Sensirion_Gas_Index_Algorithm/README.md rename to src/Libraries/Sensirion_Gas_Index_Algorithm/README.md diff --git a/src/library/Sensirion_Gas_Index_Algorithm/examples/exampleLowPowerUsage/exampleLowPowerUsage.ino b/src/Libraries/Sensirion_Gas_Index_Algorithm/examples/exampleLowPowerUsage/exampleLowPowerUsage.ino similarity index 100% rename from src/library/Sensirion_Gas_Index_Algorithm/examples/exampleLowPowerUsage/exampleLowPowerUsage.ino rename to src/Libraries/Sensirion_Gas_Index_Algorithm/examples/exampleLowPowerUsage/exampleLowPowerUsage.ino diff --git a/src/library/Sensirion_Gas_Index_Algorithm/examples/exampleUsage/exampleUsage.ino b/src/Libraries/Sensirion_Gas_Index_Algorithm/examples/exampleUsage/exampleUsage.ino similarity index 100% rename from src/library/Sensirion_Gas_Index_Algorithm/examples/exampleUsage/exampleUsage.ino rename to src/Libraries/Sensirion_Gas_Index_Algorithm/examples/exampleUsage/exampleUsage.ino diff --git a/src/library/Sensirion_Gas_Index_Algorithm/keywords.txt b/src/Libraries/Sensirion_Gas_Index_Algorithm/keywords.txt similarity index 100% rename from src/library/Sensirion_Gas_Index_Algorithm/keywords.txt rename to src/Libraries/Sensirion_Gas_Index_Algorithm/keywords.txt diff --git a/src/library/Sensirion_Gas_Index_Algorithm/library.json b/src/Libraries/Sensirion_Gas_Index_Algorithm/library.json similarity index 100% rename from src/library/Sensirion_Gas_Index_Algorithm/library.json rename to src/Libraries/Sensirion_Gas_Index_Algorithm/library.json diff --git a/src/library/Sensirion_Gas_Index_Algorithm/library.properties b/src/Libraries/Sensirion_Gas_Index_Algorithm/library.properties similarity index 100% rename from src/library/Sensirion_Gas_Index_Algorithm/library.properties rename to src/Libraries/Sensirion_Gas_Index_Algorithm/library.properties diff --git a/src/library/Sensirion_Gas_Index_Algorithm/src/NOxGasIndexAlgorithm.h b/src/Libraries/Sensirion_Gas_Index_Algorithm/src/NOxGasIndexAlgorithm.h similarity index 100% rename from src/library/Sensirion_Gas_Index_Algorithm/src/NOxGasIndexAlgorithm.h rename to src/Libraries/Sensirion_Gas_Index_Algorithm/src/NOxGasIndexAlgorithm.h diff --git a/src/library/Sensirion_Gas_Index_Algorithm/src/SensirionGasIndexAlgorithm.cpp b/src/Libraries/Sensirion_Gas_Index_Algorithm/src/SensirionGasIndexAlgorithm.cpp similarity index 100% rename from src/library/Sensirion_Gas_Index_Algorithm/src/SensirionGasIndexAlgorithm.cpp rename to src/Libraries/Sensirion_Gas_Index_Algorithm/src/SensirionGasIndexAlgorithm.cpp diff --git a/src/library/Sensirion_Gas_Index_Algorithm/src/SensirionGasIndexAlgorithm.h b/src/Libraries/Sensirion_Gas_Index_Algorithm/src/SensirionGasIndexAlgorithm.h similarity index 100% rename from src/library/Sensirion_Gas_Index_Algorithm/src/SensirionGasIndexAlgorithm.h rename to src/Libraries/Sensirion_Gas_Index_Algorithm/src/SensirionGasIndexAlgorithm.h diff --git a/src/library/Sensirion_Gas_Index_Algorithm/src/VOCGasIndexAlgorithm.cpp b/src/Libraries/Sensirion_Gas_Index_Algorithm/src/VOCGasIndexAlgorithm.cpp similarity index 100% rename from src/library/Sensirion_Gas_Index_Algorithm/src/VOCGasIndexAlgorithm.cpp rename to src/Libraries/Sensirion_Gas_Index_Algorithm/src/VOCGasIndexAlgorithm.cpp diff --git a/src/library/Sensirion_Gas_Index_Algorithm/src/VOCGasIndexAlgorithm.h b/src/Libraries/Sensirion_Gas_Index_Algorithm/src/VOCGasIndexAlgorithm.h similarity index 100% rename from src/library/Sensirion_Gas_Index_Algorithm/src/VOCGasIndexAlgorithm.h rename to src/Libraries/Sensirion_Gas_Index_Algorithm/src/VOCGasIndexAlgorithm.h diff --git a/src/library/Sensirion_Gas_Index_Algorithm/src/algorithm/sensirion_gas_index_algorithm.c b/src/Libraries/Sensirion_Gas_Index_Algorithm/src/algorithm/sensirion_gas_index_algorithm.c similarity index 100% rename from src/library/Sensirion_Gas_Index_Algorithm/src/algorithm/sensirion_gas_index_algorithm.c rename to src/Libraries/Sensirion_Gas_Index_Algorithm/src/algorithm/sensirion_gas_index_algorithm.c diff --git a/src/library/Sensirion_Gas_Index_Algorithm/src/algorithm/sensirion_gas_index_algorithm.h b/src/Libraries/Sensirion_Gas_Index_Algorithm/src/algorithm/sensirion_gas_index_algorithm.h similarity index 100% rename from src/library/Sensirion_Gas_Index_Algorithm/src/algorithm/sensirion_gas_index_algorithm.h rename to src/Libraries/Sensirion_Gas_Index_Algorithm/src/algorithm/sensirion_gas_index_algorithm.h diff --git a/src/library/arduino-sht/LICENSE b/src/Libraries/arduino-sht/LICENSE similarity index 100% rename from src/library/arduino-sht/LICENSE rename to src/Libraries/arduino-sht/LICENSE diff --git a/src/library/arduino-sht/README.md b/src/Libraries/arduino-sht/README.md similarity index 100% rename from src/library/arduino-sht/README.md rename to src/Libraries/arduino-sht/README.md diff --git a/src/library/arduino-sht/SHTSensor.cpp b/src/Libraries/arduino-sht/SHTSensor.cpp similarity index 100% rename from src/library/arduino-sht/SHTSensor.cpp rename to src/Libraries/arduino-sht/SHTSensor.cpp diff --git a/src/library/arduino-sht/SHTSensor.h b/src/Libraries/arduino-sht/SHTSensor.h similarity index 100% rename from src/library/arduino-sht/SHTSensor.h rename to src/Libraries/arduino-sht/SHTSensor.h diff --git a/src/library/arduino-sht/arduino-sht.h b/src/Libraries/arduino-sht/arduino-sht.h similarity index 100% rename from src/library/arduino-sht/arduino-sht.h rename to src/Libraries/arduino-sht/arduino-sht.h diff --git a/src/library/arduino-sht/examples/multiple-sht-sensors/multiple-sht-sensors.ino b/src/Libraries/arduino-sht/examples/multiple-sht-sensors/multiple-sht-sensors.ino similarity index 100% rename from src/library/arduino-sht/examples/multiple-sht-sensors/multiple-sht-sensors.ino rename to src/Libraries/arduino-sht/examples/multiple-sht-sensors/multiple-sht-sensors.ino diff --git a/src/library/arduino-sht/examples/sht-autodetect/sht-autodetect.ino b/src/Libraries/arduino-sht/examples/sht-autodetect/sht-autodetect.ino similarity index 100% rename from src/library/arduino-sht/examples/sht-autodetect/sht-autodetect.ino rename to src/Libraries/arduino-sht/examples/sht-autodetect/sht-autodetect.ino diff --git a/src/library/arduino-sht/examples/sht3xanalog/sht3xanalog.ino b/src/Libraries/arduino-sht/examples/sht3xanalog/sht3xanalog.ino similarity index 100% rename from src/library/arduino-sht/examples/sht3xanalog/sht3xanalog.ino rename to src/Libraries/arduino-sht/examples/sht3xanalog/sht3xanalog.ino diff --git a/src/library/arduino-sht/keywords.txt b/src/Libraries/arduino-sht/keywords.txt similarity index 100% rename from src/library/arduino-sht/keywords.txt rename to src/Libraries/arduino-sht/keywords.txt diff --git a/src/library/arduino-sht/library.properties b/src/Libraries/arduino-sht/library.properties similarity index 100% rename from src/library/arduino-sht/library.properties rename to src/Libraries/arduino-sht/library.properties diff --git a/src/main/LedBar.cpp b/src/main/LedBar.cpp index 1b1f5ef..c6cca1e 100644 --- a/src/main/LedBar.cpp +++ b/src/main/LedBar.cpp @@ -1,6 +1,6 @@ #include "LedBar.h" -#include "../library/Adafruit_NeoPixel/Adafruit_NeoPixel.h" +#include "../Libraries/Adafruit_NeoPixel/Adafruit_NeoPixel.h" #define pixel() ((Adafruit_NeoPixel *)this->pixels) diff --git a/src/pms/pms5003.cpp b/src/pms/pms5003.cpp index 9f4fe81..128d1b1 100644 --- a/src/pms/pms5003.cpp +++ b/src/pms/pms5003.cpp @@ -1,4 +1,4 @@ -#include "pms5003.h" +#include "PMS5003.h" #include "Arduino.h" #if defined(ESP8266) diff --git a/src/pms/pms5003.h b/src/pms/pms5003.h index 3ba47aa..69e6de4 100644 --- a/src/pms/pms5003.h +++ b/src/pms/pms5003.h @@ -1,7 +1,7 @@ #ifndef _AIR_GRADIENT_PMS5003_H_ #define _AIR_GRADIENT_PMS5003_H_ -#include "../main/BoardDef.h" +#include "../Main/BoardDef.h" #include "Stream.h" #include "PMS.h" diff --git a/src/pms/pms5003t.cpp b/src/pms/pms5003t.cpp index a229229..ee0c709 100644 --- a/src/pms/pms5003t.cpp +++ b/src/pms/pms5003t.cpp @@ -1,4 +1,4 @@ -#include "pms5003t.h" +#include "PMS5003T.h" #include "Arduino.h" #if defined(ESP8266) diff --git a/src/pms/pms5003t.h b/src/pms/pms5003t.h index f5a19f5..e1394ef 100644 --- a/src/pms/pms5003t.h +++ b/src/pms/pms5003t.h @@ -2,7 +2,7 @@ #define _PMS5003T_H_ #include -#include "../main/BoardDef.h" +#include "../Main/BoardDef.h" #include "PMS.h" #include "Stream.h" diff --git a/src/s8/s8.cpp b/src/s8/s8.cpp index 3e76583..dc22155 100644 --- a/src/s8/s8.cpp +++ b/src/s8/s8.cpp @@ -1,4 +1,4 @@ -#include "s8.h" +#include "S8.h" #include "mb_crc.h" #if defined(ESP8266) #include diff --git a/src/sgp41/sgp41.cpp b/src/sgp41/sgp41.cpp index b6ae3aa..c86ba58 100644 --- a/src/sgp41/sgp41.cpp +++ b/src/sgp41/sgp41.cpp @@ -1,7 +1,7 @@ -#include "sgp41.h" -#include "../library/SensirionSGP41/src/SensirionI2CSgp41.h" -#include "../library/Sensirion_Gas_Index_Algorithm/src/NOxGasIndexAlgorithm.h" -#include "../library/Sensirion_Gas_Index_Algorithm/src/VOCGasIndexAlgorithm.h" +#include "Sgp41.h" +#include "../Libraries/SensirionSGP41/src/SensirionI2CSgp41.h" +#include "../Libraries/Sensirion_Gas_Index_Algorithm/src/NOxGasIndexAlgorithm.h" +#include "../Libraries/Sensirion_Gas_Index_Algorithm/src/VOCGasIndexAlgorithm.h" #define sgpSensor() ((SensirionI2CSgp41 *)(this->_sensor)) #define vocAlgorithm() ((VOCGasIndexAlgorithm *)(this->_vocAlgorithm)) diff --git a/src/sht/sht.cpp b/src/sht/sht.cpp index 7e5f9e6..aaba59d 100644 --- a/src/sht/sht.cpp +++ b/src/sht/sht.cpp @@ -1,6 +1,6 @@ -#include "sht.h" +#include "Sht.h" -#include "../library/arduino-sht/SHTSensor.h" +#include "../Libraries/arduino-sht/SHTSensor.h" /** Cast _sensor to SHTSensor */ #define shtSensor() ((SHTSensor *)(this->_sensor)) From 23513cf88cd8221c89b96baab0fe6e2a0020a3b9 Mon Sep 17 00:00:00 2001 From: Phat Nguyen Date: Sat, 17 Feb 2024 13:36:32 +0700 Subject: [PATCH 08/26] Add parameter `tvoc_raw` for SGP41 --- examples/ONE_I-9PSL/ONE_I-9PSL.ino | 12 +++++++++--- examples/Open_Air/Open_Air.ino | 12 +++++++++--- src/sgp41/sgp41.cpp | 8 ++++++++ src/sgp41/sgp41.h | 2 ++ 4 files changed, 28 insertions(+), 6 deletions(-) diff --git a/examples/ONE_I-9PSL/ONE_I-9PSL.ino b/examples/ONE_I-9PSL/ONE_I-9PSL.ino index 3c53838..941dbbd 100644 --- a/examples/ONE_I-9PSL/ONE_I-9PSL.ino +++ b/examples/ONE_I-9PSL/ONE_I-9PSL.ino @@ -60,7 +60,7 @@ enum { APP_SM_WIFI_MANAGER_STA_CONNECTED, /** Connecting to WiFi worked */ APP_SM_WIFI_OK_SERVER_CONNECTING, /** Once connected to WiFi an attempt to reach the server is performed */ - APP_SM_WIFI_OK_SERVER_CONNECTED, /** Server is reachable, all fine */ + APP_SM_WIFI_OK_SERVER_CONNECTED, /** Server is reachable, all fine */ /** Exceptions during WIFi Setup */ APP_SM_WIFI_MANAGER_CONNECT_FAILED, /** Cannot connect to WiFi (e.g. wrong password, WPA Enterprise etc.) */ @@ -446,6 +446,7 @@ static int ledSmState = APP_SM_NORMAL; /** Save display SM */ static int dispSmState = APP_SM_NORMAL; /** Save LED SM */ static int tvocIndex = -1; +static int tvocRawIndex = -1; static int noxIndex = -1; static int co2Ppm = -1; static int pm25 = -1; @@ -1440,10 +1441,12 @@ static void updateDispLedBar(void) { */ static void tvocPoll(void) { tvocIndex = ag.sgp41.getTvocIndex(); + tvocRawIndex = ag.sgp41.getTvocRaw(); noxIndex = ag.sgp41.getNoxIndex(); - Serial.printf("tvocIndexindex: %d\r\n", tvocIndex); - Serial.printf(" NOx index: %d\r\n", noxIndex); + Serial.printf(" TVOC index: %d\r\n", tvocIndex); + Serial.printf("TVOC raw index: %d\r\n", tvocRawIndex); + Serial.printf(" NOx index: %d\r\n", noxIndex); } /** @@ -1494,6 +1497,9 @@ static void sendDataToServer(void) { if (tvocIndex >= 0) { root["tvoc_index"] = tvocIndex; } + if (tvocRawIndex >= 0) { + root["tvoc_raw"] = tvocRawIndex; + } if (noxIndex >= 0) { root["noxIndex"] = noxIndex; } diff --git a/examples/Open_Air/Open_Air.ino b/examples/Open_Air/Open_Air.ino index 87e2979..99d5002 100644 --- a/examples/Open_Air/Open_Air.ino +++ b/examples/Open_Air/Open_Air.ino @@ -57,7 +57,7 @@ enum { APP_SM_WIFI_MANAGER_STA_CONNECTED, /** Connecting to WiFi worked */ APP_SM_WIFI_OK_SERVER_CONNECTING, /** Once connected to WiFi an attempt to reach the server is performed */ - APP_SM_WIFI_OK_SERVER_CONNECTED, /** Server is reachable, all fine */ + APP_SM_WIFI_OK_SERVER_CONNECTED, /** Server is reachable, all fine */ /** Exceptions during WIFi Setup */ APP_SM_WIFI_MANAGER_CONNECT_FAILED, /** Cannot connect to WiFi (e.g. wrong password, WPA Enterprise etc.) */ @@ -408,6 +408,7 @@ static bool wifiHasConfig = false; static String wifiSSID = ""; int tvocIndex = -1; +int tvocRawIndex = -1; int noxIndex = -1; int co2Ppm = 0; @@ -554,6 +555,9 @@ static void sendDataToServer(void) { if (tvocIndex > 0) { root["tvoc_index"] = loopCount; } + if (tvocRawIndex >= 0) { + root["tvoc_raw"] = tvocRawIndex; + } if (noxIndex > 0) { root["nox_index"] = loopCount; } @@ -769,10 +773,12 @@ static void updateWiFiConnect(void) { */ static void tvocPoll(void) { tvocIndex = ag.sgp41.getTvocIndex(); + tvocRawIndex = ag.sgp41.getTvocRaw(); noxIndex = ag.sgp41.getNoxIndex(); - Serial.printf("tvocIndexindex: %d\r\n", tvocIndex); - Serial.printf(" NOx index: %d\r\n", noxIndex); + Serial.printf(" TVOC index: %d\r\n", tvocIndex); + Serial.printf("TVOC raw index: %d\r\n", tvocRawIndex); + Serial.printf(" NOx index: %d\r\n", noxIndex); } /** diff --git a/src/sgp41/sgp41.cpp b/src/sgp41/sgp41.cpp index c86ba58..ea3d4ae 100644 --- a/src/sgp41/sgp41.cpp +++ b/src/sgp41/sgp41.cpp @@ -120,6 +120,7 @@ void Sgp41::_handle(void) { for (;;) { vTaskDelay(pdMS_TO_TICKS(1000)); if (getRawSignal(srawVoc, srawNox)) { + tvocRaw = srawVoc; nox = noxAlgorithm()->process(srawNox); tvoc = vocAlgorithm()->process(srawVoc); AgLog("Polling SGP41 success: tvoc: %d, nox: %d", tvoc, nox); @@ -241,3 +242,10 @@ bool Sgp41::_noxConditioning(void) { err = sgpSensor()->executeConditioning(defaultRh, defaultT, srawVoc); return (err == 0); } + +/** + * @brief Get TVOC raw value + * + * @return int + */ +int Sgp41::getTvocRaw(void) { return tvocRaw; } diff --git a/src/sgp41/sgp41.h b/src/sgp41/sgp41.h index f26b343..5c58de1 100644 --- a/src/sgp41/sgp41.h +++ b/src/sgp41/sgp41.h @@ -23,6 +23,7 @@ public: void end(void); int getTvocIndex(void); int getNoxIndex(void); + int getTvocRaw(void); private: bool onConditioning = true; @@ -36,6 +37,7 @@ private: uint16_t defaultRh = 0x8000; uint16_t defaultT = 0x6666; int tvoc = 0; + int tvocRaw; int nox = 0; #if defined(ESP8266) uint32_t conditioningPeriod; From 571b36d05f48209d5c269b70c7c053bd0908acc9 Mon Sep 17 00:00:00 2001 From: Phat Nguyen Date: Sat, 17 Feb 2024 13:50:22 +0700 Subject: [PATCH 09/26] Optimize `Serial nr` show and display do not show content after power up or flash firmware --- examples/BASIC_v4/BASIC_v4.ino | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/examples/BASIC_v4/BASIC_v4.ino b/examples/BASIC_v4/BASIC_v4.ino index d413a4a..f4485b3 100644 --- a/examples/BASIC_v4/BASIC_v4.ino +++ b/examples/BASIC_v4/BASIC_v4.ino @@ -525,6 +525,7 @@ static void boardInit(void) { /** Display init */ ag.display.begin(Wire); ag.display.setTextColor(1); + ag.display.clear(); } static void failedHandler(String msg) { @@ -667,7 +668,10 @@ static void updateWiFiConnect(void) { } } -static void showNr(void) { Serial.println("Serial nr: " + getDevId()); } +static void showNr(void) { + Serial.println(); + Serial.println("Serial nr: " + getDevId()); +} String getNormalizedMac() { String mac = WiFi.macAddress(); From 7a4b665bb5497aefe8524a09d04d62861936e8ef Mon Sep 17 00:00:00 2001 From: Phat Nguyen Date: Sat, 17 Feb 2024 13:56:07 +0700 Subject: [PATCH 10/26] [Update] optimize display not show on power up or after flash firmware --- examples/BASIC_v4/BASIC_v4.ino | 3 +++ 1 file changed, 3 insertions(+) diff --git a/examples/BASIC_v4/BASIC_v4.ino b/examples/BASIC_v4/BASIC_v4.ino index f4485b3..c94d793 100644 --- a/examples/BASIC_v4/BASIC_v4.ino +++ b/examples/BASIC_v4/BASIC_v4.ino @@ -471,6 +471,7 @@ void displayShowText(String ln1, String ln2, String ln3) { ag.display.setText(ln3); ag.display.show(); + delay(100); } // Wifi Manager @@ -526,6 +527,8 @@ static void boardInit(void) { ag.display.begin(Wire); ag.display.setTextColor(1); ag.display.clear(); + ag.display.show(); + delay(100); } static void failedHandler(String msg) { From 17646f3067cf6defad6f0439b7a2d548a13d9395 Mon Sep 17 00:00:00 2001 From: Phat Nguyen Date: Sat, 17 Feb 2024 14:05:17 +0700 Subject: [PATCH 11/26] Update typo, #49 --- examples/ONE_I-9PSL/ONE_I-9PSL.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/ONE_I-9PSL/ONE_I-9PSL.ino b/examples/ONE_I-9PSL/ONE_I-9PSL.ino index 941dbbd..3d6273f 100644 --- a/examples/ONE_I-9PSL/ONE_I-9PSL.ino +++ b/examples/ONE_I-9PSL/ONE_I-9PSL.ino @@ -1352,7 +1352,7 @@ static void dispSmHandler(int sm) { case APP_SM_NORMAL: { displayShowDashboard(""); } - detault: + default: break; } } From 781fb51c6f2b0dfd01d7d0ef9a7d51802f87e8ab Mon Sep 17 00:00:00 2001 From: Phat Nguyen Date: Sat, 17 Feb 2024 17:19:29 +0700 Subject: [PATCH 12/26] Add mqtt client --- examples/ONE_I-9PSL/ONE_I-9PSL.ino | 186 +++++++++++++++++++++++++++- examples/Open_Air/Open_Air.ino | 190 ++++++++++++++++++++++++++++- 2 files changed, 372 insertions(+), 4 deletions(-) diff --git a/examples/ONE_I-9PSL/ONE_I-9PSL.ino b/examples/ONE_I-9PSL/ONE_I-9PSL.ino index 3d6273f..9e19de5 100644 --- a/examples/ONE_I-9PSL/ONE_I-9PSL.ino +++ b/examples/ONE_I-9PSL/ONE_I-9PSL.ino @@ -38,6 +38,7 @@ CC BY-SA 4.0 Attribution-ShareAlike 4.0 International License */ +#include "mqtt_client.h" #include #include #include @@ -430,6 +431,115 @@ private: }; AgServer agServer; +static void mqtt_event_handler(void *handler_args, esp_event_base_t base, + int32_t event_id, void *event_data); + +class AgMqtt { +private: + bool _isBegin = false; + String uri; + String hostname; + String user; + String pass; + int port; + esp_mqtt_client_handle_t client; + bool clientConnected = false; + +public: + AgMqtt() {} + ~AgMqtt() {} + + /** + * @brief Initialize mqtt + * + * @param uri Complete mqtt uri, ex: + * mqtts://username:password@my.broker.com:4711 + * @return true Success + * @return false Failure + */ + bool begin(String uri) { + if (_isBegin) { + Serial.println("Mqtt already begin, call 'end' and try again"); + return true; + } + this->uri = uri; + Serial.printf("mqtt init '%s'\r\n", uri.c_str()); + + /** config esp_mqtt client */ + esp_mqtt_client_config_t config = { + .uri = this->uri.c_str(), + }; + + /** init client */ + client = esp_mqtt_client_init(&config); + if (client == NULL) { + Serial.println("mqtt client init failed"); + return false; + } + + /** Register event */ + if (esp_mqtt_client_register_event(client, MQTT_EVENT_ANY, + mqtt_event_handler, NULL) != ESP_OK) { + Serial.println("mqtt client register event failed"); + return false; + } + + if (esp_mqtt_client_start(client) != ESP_OK) { + Serial.println("mqtt client start failed"); + return false; + } + + _isBegin = true; + return true; + } + + /** + * @brief Deinitialize mqtt + * + */ + void end(void) { + if (_isBegin == false) { + return; + } + + esp_mqtt_client_disconnect(client); + esp_mqtt_client_stop(client); + esp_mqtt_client_destroy(client); + _isBegin = false; + + Serial.println("mqtt de-init"); + } + + bool publish(const char *topic, const char *payload, int len) { + if ((_isBegin == false) || (clientConnected == false)) { + return false; + } + + if (esp_mqtt_client_publish(client, topic, payload, len, 0, 0) == ESP_OK) { + return true; + } + return false; + } + + /** + * @brief Get current complete mqtt uri + * + * @return String + */ + String getUri(void) { return uri; } + + void _connectionHandler(bool connected) { clientConnected = connected; } + + /** + * @brief Mqtt client connect status + * + * @return true Connected + * @return false Disconnected or Not initialize + */ + bool isConnected(void) { return (_isBegin && clientConnected); } +}; +AgMqtt agMqtt; + /** Create airgradient instance for 'ONE_INDOOR' board */ AirGradient ag(ONE_INDOOR); @@ -490,6 +600,7 @@ AgSchedule tvocSchedule(SENSOR_TVOC_UPDATE_INTERVAL, tvocPoll); void setup() { /** Serial fore print debug message */ Serial.begin(115200); + delay(100); /** For bester show log */ showNr(); /** Init I2C */ @@ -1109,6 +1220,16 @@ static void serverConfigPoll(void) { ledTest(); } } + + String mqttUri = agServer.getMqttBroker(); + if (mqttUri != agMqtt.getUri()) { + agMqtt.end(); + if (agMqtt.begin(mqttUri)) { + Serial.println("Connect to new mqtt broker success"); + } else { + Serial.println("Connect to new mqtt broker failed"); + } + } } } @@ -1511,10 +1632,19 @@ static void sendDataToServer(void) { } root["boot"] = bootCount; - // NOTE Need determine offline mode to reset watchdog timer - if (agServer.postToServer(getDevId(), JSON.stringify(root))) { + String syncData = JSON.stringify(root); + if (agServer.postToServer(getDevId(), syncData)) { resetWatchdog(); } + + if (agMqtt.isConnected()) { + String topic = "airgradient/readings/" + getDevId(); + if (agMqtt.publish(topic.c_str(), syncData.c_str(), syncData.length())) { + Serial.println("Mqtt sync success"); + } else { + Serial.println("Mqtt sync failure"); + } + } bootCount++; } @@ -1533,3 +1663,55 @@ static void tempHumPoll(void) { Serial.println("Measure SHT failed"); } } + + +static void mqtt_event_handler(void *handler_args, esp_event_base_t base, + int32_t event_id, void *event_data) { + + ESP_LOGD(TAG, + "Event dispatched from event loop base=%s, event_id=%" PRIi32 "", + base, event_id); + esp_mqtt_event_handle_t event = (esp_mqtt_event_handle_t)event_data; + esp_mqtt_client_handle_t client = event->client; + int msg_id; + switch ((esp_mqtt_event_id_t)event_id) { + case MQTT_EVENT_CONNECTED: + Serial.println("MQTT_EVENT_CONNECTED"); + // msg_id = esp_mqtt_client_subscribe(client, "helloworld", 0); + // Serial.printf("sent subscribe successful, msg_id=%d\r\n", msg_id); + agMqtt._connectionHandler(true); + break; + case MQTT_EVENT_DISCONNECTED: + Serial.println("MQTT_EVENT_DISCONNECTED"); + agMqtt._connectionHandler(false); + break; + case MQTT_EVENT_SUBSCRIBED: + break; + case MQTT_EVENT_UNSUBSCRIBED: + Serial.printf("MQTT_EVENT_UNSUBSCRIBED, msg_id=%d\r\n", event->msg_id); + break; + case MQTT_EVENT_PUBLISHED: + Serial.printf("MQTT_EVENT_PUBLISHED, msg_id=%d\r\n", event->msg_id); + break; + case MQTT_EVENT_DATA: + Serial.println("MQTT_EVENT_DATA"); + // add null terminal to data + // event->data[event->data_len] = 0; + // rpc_attritbutes_handler(event->data, event->data_len); + break; + case MQTT_EVENT_ERROR: + Serial.println("MQTT_EVENT_ERROR"); + if (event->error_handle->error_type == MQTT_ERROR_TYPE_TCP_TRANSPORT) { + Serial.printf("reported from esp-tls: %d", + event->error_handle->esp_tls_last_esp_err); + Serial.printf("reported from tls stack: %d", + event->error_handle->esp_tls_stack_err); + Serial.printf("captured as transport's socket errno: %d", + event->error_handle->esp_transport_sock_errno); + } + break; + default: + Serial.printf("Other event id:%d\r\n", event->event_id); + break; + } +} diff --git a/examples/Open_Air/Open_Air.ino b/examples/Open_Air/Open_Air.ino index 99d5002..bc1c867 100644 --- a/examples/Open_Air/Open_Air.ino +++ b/examples/Open_Air/Open_Air.ino @@ -35,6 +35,7 @@ CC BY-SA 4.0 Attribution-ShareAlike 4.0 International License */ +#include "mqtt_client.h" #include #include #include @@ -396,6 +397,117 @@ private: }; AgServer agServer; +static void mqtt_event_handler(void *handler_args, esp_event_base_t base, + int32_t event_id, void *event_data); + +class AgMqtt { +private: + bool _isBegin = false; + String uri; + String hostname; + String user; + String pass; + int port; + esp_mqtt_client_handle_t client; + bool clientConnected = false; + +public: + AgMqtt() {} + ~AgMqtt() {} + + /** + * @brief Initialize mqtt + * + * @param uri Complete mqtt uri, ex: + * mqtts://username:password@my.broker.com:4711 + * @return true Success + * @return false Failure + */ + bool begin(String uri) { + if (_isBegin) { + Serial.println("Mqtt already begin, call 'end' and try again"); + return true; + } + this->uri = uri; + Serial.printf("mqtt init '%s'\r\n", uri.c_str()); + + /** config esp_mqtt client */ + esp_mqtt_client_config_t config = { + .uri = this->uri.c_str(), + }; + + /** init client */ + client = esp_mqtt_client_init(&config); + if (client == NULL) { + Serial.println("mqtt client init failed"); + return false; + } + + /** Register event */ + if (esp_mqtt_client_register_event( + client, MQTT_EVENT_ANY, + mqtt_event_handler, + NULL) != ESP_OK) { + Serial.println("mqtt client register event failed"); + return false; + } + + if (esp_mqtt_client_start(client) != ESP_OK) { + Serial.println("mqtt client start failed"); + return false; + } + + _isBegin = true; + return true; + } + + /** + * @brief Deinitialize mqtt + * + */ + void end(void) { + if (_isBegin == false) { + return; + } + + esp_mqtt_client_disconnect(client); + esp_mqtt_client_stop(client); + esp_mqtt_client_destroy(client); + _isBegin = false; + + Serial.println("mqtt de-init"); + } + + bool publish(const char *topic, const char *payload, int len) { + if ((_isBegin == false) || (clientConnected == false)) { + return false; + } + + if (esp_mqtt_client_publish(client, topic, payload, len, 0, 0) == ESP_OK) { + return true; + } + return false; + } + + /** + * @brief Get current complete mqtt uri + * + * @return String + */ + String getUri(void) { return uri; } + + void _connectionHandler(bool connected) { clientConnected = connected; } + + /** + * @brief Mqtt client connect status + * + * @return true Connected + * @return false Disconnected or Not initialize + */ + bool isConnected(void) { return (_isBegin && clientConnected); } +}; +AgMqtt agMqtt; + /** Create airgradient instance for 'OPEN_AIR_OUTDOOR' board */ AirGradient ag(OPEN_AIR_OUTDOOR); @@ -469,6 +581,7 @@ AgSchedule tvocSchedule(SENSOR_TVOC_UPDATE_INTERVAL, tvocPoll); void setup() { Serial.begin(115200); + delay(100); /** For bester show log */ showNr(); /** Board init */ @@ -551,7 +664,9 @@ static void sendDataToServer(void) { if (hum_1 >= 0) { root["rhum"] = hum_1; } - } else if (fw_mode == FW_MODE_PPT) { + } + + if ((fw_mode == FW_MODE_PPT) || (fw_mode == FW_MODE_PST)) { if (tvocIndex > 0) { root["tvoc_index"] = loopCount; } @@ -584,9 +699,19 @@ static void sendDataToServer(void) { } /** Send data to sensor */ - if (agServer.postToServer(getDevId(), JSON.stringify(root))) { + String syncData = JSON.stringify(root); + if (agServer.postToServer(getDevId(), syncData)) { resetWatchdog(); } + + if (agMqtt.isConnected()) { + String topic = "airgradient/readings/" + getDevId(); + if (agMqtt.publish(topic.c_str(), syncData.c_str(), syncData.length())) { + Serial.println("Mqtt sync success"); + } else { + Serial.println("Mqtt sync failure"); + } + } loopCount++; } @@ -867,6 +992,16 @@ static void serverConfigPoll(void) { } } } + + String mqttUri = agServer.getMqttBroker(); + if (mqttUri != agMqtt.getUri()) { + agMqtt.end(); + if (agMqtt.begin(mqttUri)) { + Serial.println("Connect to new mqtt broker success"); + } else { + Serial.println("Connect to new mqtt broker failed"); + } + } } } @@ -988,3 +1123,54 @@ static const char *getFwMode(int mode) { } static void showNr(void) { Serial.println("Serial nr: " + getDevId()); } + +static void mqtt_event_handler(void *handler_args, esp_event_base_t base, + int32_t event_id, void *event_data) { + + ESP_LOGD(TAG, + "Event dispatched from event loop base=%s, event_id=%" PRIi32 "", + base, event_id); + esp_mqtt_event_handle_t event = (esp_mqtt_event_handle_t)event_data; + esp_mqtt_client_handle_t client = event->client; + int msg_id; + switch ((esp_mqtt_event_id_t)event_id) { + case MQTT_EVENT_CONNECTED: + Serial.println("MQTT_EVENT_CONNECTED"); + // msg_id = esp_mqtt_client_subscribe(client, "helloworld", 0); + // Serial.printf("sent subscribe successful, msg_id=%d\r\n", msg_id); + agMqtt._connectionHandler(true); + break; + case MQTT_EVENT_DISCONNECTED: + Serial.println("MQTT_EVENT_DISCONNECTED"); + agMqtt._connectionHandler(false); + break; + case MQTT_EVENT_SUBSCRIBED: + break; + case MQTT_EVENT_UNSUBSCRIBED: + Serial.printf("MQTT_EVENT_UNSUBSCRIBED, msg_id=%d\r\n", event->msg_id); + break; + case MQTT_EVENT_PUBLISHED: + Serial.printf("MQTT_EVENT_PUBLISHED, msg_id=%d\r\n", event->msg_id); + break; + case MQTT_EVENT_DATA: + Serial.println("MQTT_EVENT_DATA"); + // add null terminal to data + // event->data[event->data_len] = 0; + // rpc_attritbutes_handler(event->data, event->data_len); + break; + case MQTT_EVENT_ERROR: + Serial.println("MQTT_EVENT_ERROR"); + if (event->error_handle->error_type == MQTT_ERROR_TYPE_TCP_TRANSPORT) { + Serial.printf("reported from esp-tls: %d", + event->error_handle->esp_tls_last_esp_err); + Serial.printf("reported from tls stack: %d", + event->error_handle->esp_tls_stack_err); + Serial.printf("captured as transport's socket errno: %d", + event->error_handle->esp_transport_sock_errno); + } + break; + default: + Serial.printf("Other event id:%d\r\n", event->event_id); + break; + } +} From 6cdbb8a0a31750f339d093b27cd213909ce5a8e5 Mon Sep 17 00:00:00 2001 From: Phat Nguyen Date: Sat, 17 Feb 2024 17:28:51 +0700 Subject: [PATCH 13/26] Fix capitalize folder and file name ignored --- src/Main/BoardDef.cpp | 501 +++++++++++++++++++++ src/Main/BoardDef.h | 88 ++++ src/Main/HardwareWatchdog.cpp | 74 +++ src/Main/HardwareWatchdog.h | 37 ++ src/Main/LedBar.cpp | 126 ++++++ src/Main/LedBar.h | 42 ++ src/Main/PushButton.cpp | 74 +++ src/Main/PushButton.h | 47 ++ src/Main/StatusLed.cpp | 115 +++++ src/Main/StatusLed.h | 45 ++ src/PMS/PMS.cpp | 164 +++++++ src/PMS/PMS.h | 75 +++ src/{pms/pms5003.cpp => PMS/PMS5003.cpp} | 0 src/{pms/pms5003.h => PMS/PMS5003.h} | 0 src/{pms/pms5003t.cpp => PMS/PMS5003T.cpp} | 0 src/{pms/pms5003t.h => PMS/PMS5003T.h} | 0 src/{s8/s8.cpp => S8/S8.cpp} | 0 src/{s8/s8.h => S8/S8.h} | 0 src/S8/mb_crc.cpp | 73 +++ src/S8/mb_crc.h | 8 + src/{sgp41/sgp41.cpp => Sgp41/Sgp41.cpp} | 0 src/{sgp41/sgp41.h => Sgp41/Sgp41.h} | 0 src/{sht/sht.cpp => Sht/Sht.cpp} | 0 src/{sht/sht.h => Sht/Sht.h} | 0 24 files changed, 1469 insertions(+) create mode 100644 src/Main/BoardDef.cpp create mode 100644 src/Main/BoardDef.h create mode 100644 src/Main/HardwareWatchdog.cpp create mode 100644 src/Main/HardwareWatchdog.h create mode 100644 src/Main/LedBar.cpp create mode 100644 src/Main/LedBar.h create mode 100644 src/Main/PushButton.cpp create mode 100644 src/Main/PushButton.h create mode 100644 src/Main/StatusLed.cpp create mode 100644 src/Main/StatusLed.h create mode 100644 src/PMS/PMS.cpp create mode 100644 src/PMS/PMS.h rename src/{pms/pms5003.cpp => PMS/PMS5003.cpp} (100%) rename src/{pms/pms5003.h => PMS/PMS5003.h} (100%) rename src/{pms/pms5003t.cpp => PMS/PMS5003T.cpp} (100%) rename src/{pms/pms5003t.h => PMS/PMS5003T.h} (100%) rename src/{s8/s8.cpp => S8/S8.cpp} (100%) rename src/{s8/s8.h => S8/S8.h} (100%) create mode 100644 src/S8/mb_crc.cpp create mode 100644 src/S8/mb_crc.h rename src/{sgp41/sgp41.cpp => Sgp41/Sgp41.cpp} (100%) rename src/{sgp41/sgp41.h => Sgp41/Sgp41.h} (100%) rename src/{sht/sht.cpp => Sht/Sht.cpp} (100%) rename src/{sht/sht.h => Sht/Sht.h} (100%) diff --git a/src/Main/BoardDef.cpp b/src/Main/BoardDef.cpp new file mode 100644 index 0000000..23fe603 --- /dev/null +++ b/src/Main/BoardDef.cpp @@ -0,0 +1,501 @@ +#include "BoardDef.h" +#if defined(ESP32) +#include "esp32-hal-log.h" +#endif + +const BoardDef bsps[_BOARD_MAX] = { + /** DIY_BASIC */ + [DIY_BASIC] = + { + .SenseAirS8 = + { + .uart_tx_pin = 2, + .uart_rx_pin = 0, +#if defined(ESP8266) + .supported = true, +#else + .supported = false, +#endif + }, + .Pms5003 = + { + .uart_tx_pin = 14, + .uart_rx_pin = 12, +#if defined(ESP8266) + .supported = true, +#else + .supported = false, +#endif + }, + .I2C = + { + .sda_pin = 4, + .scl_pin = 5, +#if defined(ESP8266) + .supported = true, +#else + .supported = false, +#endif + }, + .SW = + { + .pin = -1, /** Not supported */ + .activeLevel = 0, /** Don't care */ + .supported = false, /** Not supported */ + }, + .LED = + { + .pin = -1, + .rgbNum = 0, + .onState = 0, + .supported = false, + .rgbSupported = false, + }, + .OLED = + { +#if defined(ESP8266) + .width = 64, + .height = 48, + .addr = 0x3C, + .supported = true, +#else + .width = 0, + .height = 0, + .addr = 0, + .supported = false, +#endif + }, + .WDG = + { + .resetPin = -1, + .supported = false, + }, + .name = "DIY_BASIC", + }, + /** DIY_PRO_INDOOR_V4_2 */ + [DIY_PRO_INDOOR_V4_2] = + { + .SenseAirS8 = + { + .uart_tx_pin = 2, + .uart_rx_pin = 0, +#if defined(ESP8266) + .supported = true, +#else + .supported = false, +#endif + }, + .Pms5003 = + { + .uart_tx_pin = 14, + .uart_rx_pin = 12, +#if defined(ESP8266) + .supported = true, +#else + .supported = false, +#endif + }, + .I2C = + { + .sda_pin = 4, + .scl_pin = 5, +#if defined(ESP8266) + .supported = true, +#else + .supported = false, +#endif + }, + .SW = + { +#if defined(ESP8266) + .pin = 13, /** D7 */ + .activeLevel = 0, + .supported = true, +#else + .pin = -1, + .activeLevel = 1, + .supported = false, +#endif + }, + .LED = + { + .pin = -1, + .rgbNum = 0, + .onState = 0, + .supported = false, + .rgbSupported = false, + }, + .OLED = + { +#if defined(ESP8266) + .width = 128, + .height = 64, + .addr = 0x3C, + .supported = true, +#else + .width = 0, + .height = 0, + .addr = 0, + .supported = false, +#endif + }, + .WDG = + { + .resetPin = -1, + .supported = false, + }, + .name = "DIY_PRO_INDOOR_V4_2", + }, + /** ONE_INDOOR */ + [ONE_INDOOR] = + { + .SenseAirS8 = + { + .uart_tx_pin = 1, + .uart_rx_pin = 0, +#if defined(ESP8266) + .supported = false, +#else + .supported = true, +#endif + }, + /** Use UART0 don't use define pin number */ + .Pms5003 = + { + .uart_tx_pin = -1, + .uart_rx_pin = -1, +#if defined(ESP8266) + .supported = false, +#else + .supported = true, +#endif + }, + .I2C = + { + .sda_pin = 7, + .scl_pin = 6, +#if defined(ESP8266) + .supported = false, +#else + .supported = true, +#endif + }, + .SW = + { +#if defined(ESP8266) + .pin = -1, + .activeLevel = 1, + .supported = false, +#else + .pin = 9, + .activeLevel = 0, + .supported = true, +#endif + }, + .LED = + { +#if defined(ESP8266) + .pin = -1, + .rgbNum = 0, + .onState = 0, + .supported = false, + .rgbSupported = false, +#else + .pin = 10, + .rgbNum = 11, + .onState = 1, + .supported = true, + .rgbSupported = true, +#endif + }, + .OLED = + { +#if defined(ESP8266) + .width = 0, + .height = 0, + .addr = 0, + .supported = false, +#else + .width = 128, + .height = 64, + .addr = 0x3C, + .supported = true, +#endif + }, + .WDG = + { +#if defined(ESP8266) + .resetPin = -1, + .supported = false, +#else + .resetPin = 2, + .supported = true, +#endif + }, + .name = "ONE_INDOOR", + }, + /** OPEN_AIR_OUTDOOR */ + [OPEN_AIR_OUTDOOR] = { + .SenseAirS8 = + { + .uart_tx_pin = 1, + .uart_rx_pin = 0, +#if defined(ESP8266) + .supported = false, +#else + .supported = true, +#endif + }, + /** Use UART0 don't use define pin number */ + .Pms5003 = + { + .uart_tx_pin = -1, + .uart_rx_pin = -1, +#if defined(ESP8266) + .supported = false, +#else + .supported = true, +#endif + }, + .I2C = + { + .sda_pin = 7, + .scl_pin = 6, +#if defined(ESP8266) + .supported = false, +#else + .supported = true, +#endif + }, + .SW = + { +#if defined(ESP8266) + .pin = -1, + .activeLevel = 1, + .supported = false, +#else + .pin = 9, + .activeLevel = 0, + .supported = true, +#endif + }, + .LED = + { +#if defined(ESP8266) + .pin = -1, + .rgbNum = 0, + .onState = 0, + .supported = false, + .rgbSupported = false, +#else + .pin = 10, + .rgbNum = 0, + .onState = 1, + .supported = true, + .rgbSupported = false, +#endif + }, + .OLED = + { +#if defined(ESP8266) + .width = 0, + .height = 0, + .addr = 0, + .supported = false, +#else + .width = 128, + .height = 64, + .addr = 0x3C, + .supported = true, +#endif + }, + .WDG = + { +#if defined(ESP8266) + .resetPin = -1, + .supported = false, +#else + .resetPin = 2, + .supported = true, +#endif + }, + .name = "OPEN_AIR_OUTDOOR", + }}; + +/** + * @brief Get Board Support Package + * + * @param def Board define @ref BoardType + * @return const BoardDef* + */ +const BoardDef *getBoardDef(BoardType def) { + if (def >= _BOARD_MAX) { + return NULL; + } + return &bsps[def]; +} + +#if defined(ESP8266) +#define bspPrintf(c, ...) \ + if (_debug != nullptr) { \ + _debug->printf("[BSP] " c "\r\n", ##__VA_ARGS__); \ + } +#else +#define bspPrintf(c, ...) log_i(c, ##__VA_ARGS__) +#endif + +/** + * @brief Print list of support Board and sensor + * + * @param _debug Serial debug + */ +void printBoardDef(Stream *_debug) { +#if defined(ESP8266) + if (_debug == NULL) { + return; + } +#endif + + for (int i = 0; i < _BOARD_MAX; i++) { + bspPrintf("Board name: %s", bsps[i].name); + bspPrintf("\tSensor CO2 S8:"); + bspPrintf("\t\tSupported: %d", bsps[i].SenseAirS8.supported); + if (bsps[i].SenseAirS8.supported) { + bspPrintf("\t\tUART Tx: %d", bsps[i].SenseAirS8.uart_tx_pin); + bspPrintf("\t\tUART Rx: %d", bsps[i].SenseAirS8.uart_rx_pin); + } + + bspPrintf("\tSensor PMS5003:"); + bspPrintf("\t\tSupported: %d", bsps[i].Pms5003.supported); + if (bsps[i].Pms5003.supported) { + bspPrintf("\t\tUART Tx: %d", bsps[i].Pms5003.uart_tx_pin); + bspPrintf("\t\tUART Rx: %d", bsps[i].Pms5003.uart_rx_pin); + } + + bspPrintf("\tI2C"); + bspPrintf("\t\tSupported: %d", bsps[i].I2C.supported); + if (bsps[i].I2C.supported) { + bspPrintf("\t\tI2C SCL: %d", bsps[i].I2C.scl_pin); + bspPrintf("\t\tI2C SDA: %d", bsps[i].I2C.sda_pin); + } + + bspPrintf("\tSwitch"); + bspPrintf("\t\tSupported: %d", bsps[i].SW.supported); + if (bsps[i].SW.supported) { + bspPrintf("\t\tPin : %d", bsps[i].SW.pin); + bspPrintf("\t\tActive Level: %d", bsps[i].SW.activeLevel); + } + + bspPrintf("\tLED"); + bspPrintf("\t\tSupported: %d", bsps[i].LED.supported); + if (bsps[i].LED.supported) { + bspPrintf("\t\tPin : %d", bsps[i].LED.pin); + bspPrintf("\t\tRGB : %d", bsps[i].LED.rgbSupported); + if (bsps[i].LED.rgbSupported) { + bspPrintf("\t\tNumber of RGB: %d", bsps[i].LED.rgbNum); + } else { + bspPrintf("\t\tLED state ON: %d (Single LED)", bsps[i].LED.onState); + } + } + + bspPrintf("\tOLED"); + bspPrintf("\t\tSupported: %d", bsps[i].OLED.supported); + if (bsps[i].OLED.supported) { + bspPrintf("\t\tWidth : %d", bsps[i].OLED.width); + bspPrintf("\t\tHeigth : %d", bsps[i].OLED.height); + bspPrintf("\t\tI2C Addr: %d", bsps[i].OLED.addr); + } + + bspPrintf("\tWatchDog"); + bspPrintf("\t\tSupported: %d", bsps[i].WDG.supported); + if (bsps[i].OLED.supported) { + bspPrintf("\t\tReset Pin: %d", bsps[i].WDG.resetPin); + } + } +} + +bool getBoardDef_I2C_Supported(const BoardDef *bsp) { + if (bsp == nullptr) { + return false; + } + return bsp->I2C.supported; +} + +int getBoardDef_I2C_SDA(const BoardDef *bsp) { + if ((bsp == nullptr) || (bsp->I2C.supported == false)) { + return -1; + } + return bsp->I2C.sda_pin; +} + +int getBoardDef_I2C_SCL(const BoardDef *bsp) { + if ((bsp == nullptr) || (bsp->I2C.supported == false)) { + return -1; + } + return bsp->I2C.scl_pin; +} + +bool getBoardDef_SW_Supported(const BoardDef *bsp) { + if (bsp == nullptr) { + return false; + } + return bsp->SW.supported; +} + +int getBoardDef_SW_Pin(const BoardDef *bsp) { + if ((bsp == nullptr) || (bsp->SW.supported == false)) { + return -1; + } + return bsp->SW.supported; +} + +int getBoardDef_SW_ActiveLevel(const BoardDef *bsp) { + if (bsp == nullptr) { + return 0; + } + return bsp->SW.activeLevel; +} + +void AirGradientBspWdgInit(const BoardDef *bsp) { + if (bsp == nullptr) { + return; + } + if (bsp->WDG.supported) { + pinMode(bsp->WDG.resetPin, OUTPUT); + digitalWrite(bsp->WDG.resetPin, LOW); + delay(25); // Delay 25ms + digitalWrite(bsp->WDG.resetPin, HIGH); + } +} + +/** + * @brief Begin reset external watchdog. Must call @ref AirGradientBspWdgFeedEnd + * after 20 ms + * + * @param bsp + */ +void AirGradientBspWdgFeedBegin(const BoardDef *bsp) { + if (bsp == nullptr) { + return; + } + + if (bsp->WDG.supported) { + digitalWrite(bsp->WDG.resetPin, HIGH); + } +} + +/** + * @brief Call this function to finish watchdog feed after call @ref + * AirGradientBspWdgFeedBegin 25 ms + * + * @param bsp + */ +void AirGradientBspWdgFeedEnd(const BoardDef *bsp) { + if (bsp == nullptr) { + return; + } + + if (bsp->WDG.supported) { + digitalWrite(bsp->WDG.resetPin, LOW); + } +} diff --git a/src/Main/BoardDef.h b/src/Main/BoardDef.h new file mode 100644 index 0000000..b445993 --- /dev/null +++ b/src/Main/BoardDef.h @@ -0,0 +1,88 @@ +#ifndef _AIR_GRADIENT_BOARD_DEF_H_ +#define _AIR_GRADIENT_BOARD_DEF_H_ + +#include + +#if defined(ESP8266) +#define AgLog(c, ...) \ + if (this->_debugStream != nullptr) { \ + this->_debugStream->printf("[%s] " c "\r\n", this->TAG, ##__VA_ARGS__); \ + } +#else +#include +#define AgLog(c, ...) log_i(c, ##__VA_ARGS__) +#endif + +/** + * @brief Define Airgradient supported board type + */ +enum BoardType { + DIY_BASIC = 0x00, + DIY_PRO_INDOOR_V4_2 = 0x01, + ONE_INDOOR = 0x02, + OPEN_AIR_OUTDOOR = 0x03, + _BOARD_MAX +}; + +/** + * @brief Board definitions + * + */ +struct BoardDef { + /** Board Support CO2 SenseS8 */ + struct { + const int uart_tx_pin; /** UART tx pin */ + const int uart_rx_pin; /** UART rx pin */ + const bool supported; /** Is BSP supported for this sensor */ + } SenseAirS8; + + /** Board Support Plantower PMS5003 */ + struct { + const int uart_tx_pin; /** UART tx pin */ + const int uart_rx_pin; /** UART rx pin */ + const bool supported; /** Is BSP supported for this sensor */ + } Pms5003; + + /** I2C Bus */ + struct { + const int sda_pin; /** I2C SDA pin */ + const int scl_pin; /** I2C SCL pin */ + const bool supported; /** Is BSP supported I2C communication */ + } I2C; + + /** Switch */ + struct { + const int pin; /** Switch PIN */ + const int activeLevel; /** Switch pressed level */ + const bool supported; + } SW; + + /** LED */ + struct { + const int pin; /** Pin control */ + const int rgbNum; /** Number of RGB LED */ + const int onState; /** Single LED turn on state */ + const bool supported; /** SUpported LED */ + const bool rgbSupported; /** LED is RGB */ + } LED; + + /** OLED */ + struct { + const uint8_t width; /** Display Width */ + const uint8_t height; /** Display height */ + const uint8_t addr; /** OLED I2C address */ + const bool supported; + } OLED; + + /** Watchdog */ + struct { + const uint8_t resetPin; + const bool supported; + } WDG; + const char *name; +}; + +const BoardDef *getBoardDef(BoardType def); +void printBoardDef(Stream *_debug); + +#endif /** _AIR_GRADIENT_BOARD_DEF_H_ */ diff --git a/src/Main/HardwareWatchdog.cpp b/src/Main/HardwareWatchdog.cpp new file mode 100644 index 0000000..37a963c --- /dev/null +++ b/src/Main/HardwareWatchdog.cpp @@ -0,0 +1,74 @@ +#include "HardwareWatchdog.h" + +HardwareWatchdog::HardwareWatchdog(BoardType type) : boardType(type) {} + +#if defined(ESP8266) +void HardwareWatchdog::begin(Stream &debugStream) { + this->_debugStream = &debugStream; + this->begin(); +} +#else +#endif + +/** + * @brief Initialize external watchdog + * + */ +void HardwareWatchdog::begin(void) { + if (this->_isInit) { + return; + } + + /** Get BSP */ + this->bsp = getBoardDef(this->boardType); + if ((this->bsp == nullptr) || (this->bsp->WDG.supported == false)) { + AgLog("Board not supported Watchdog"); + return; + } + + /** Init GPIO and first feed external watchdog */ + pinMode(this->bsp->WDG.resetPin, OUTPUT); + this->_feed(); + + this->_isInit = true; + AgLog("Inittialized"); +} + +/** + * @brief Reset Watchdog + * + */ +void HardwareWatchdog::reset(void) { + if (this->isInitInvalid()) { + return; + } + + this->_feed(); +} + +/** + * @brief Wathdog timeout + * + * @return int Millisecionds + */ +int HardwareWatchdog::getTimeout(void) { return 5 * 1000 * 60; } + +bool HardwareWatchdog::isInitInvalid(void) { + if (this->_isInit == false) { + AgLog("No-initialized"); + return true; + } + return false; +} + +/** + * @brief Reset external watchdog + * + */ +void HardwareWatchdog::_feed(void) { + digitalWrite(this->bsp->WDG.resetPin, HIGH); + delay(25); + digitalWrite(this->bsp->WDG.resetPin, LOW); + + AgLog("Reset"); +} diff --git a/src/Main/HardwareWatchdog.h b/src/Main/HardwareWatchdog.h new file mode 100644 index 0000000..367ff91 --- /dev/null +++ b/src/Main/HardwareWatchdog.h @@ -0,0 +1,37 @@ +#ifndef _HARDWARE_WATCHDOG_H_ +#define _HARDWARE_WATCHDOG_H_ + +#include + +#include "BoardDef.h" + +/** + * @brief The class define how to control external watchdog on ONE-V9 and + * Outdoor + */ +class HardwareWatchdog { +public: + HardwareWatchdog(BoardType type); +#if defined(ESP8266) + void begin(Stream &debugStream); +#else +#endif + void begin(void); + void reset(void); + int getTimeout(void); + +private: + bool _isInit = false; + const BoardDef *bsp; + BoardType boardType; +#if defined(ESP8266) + Stream *_debugStream; + const char *TAG = "HardwareWatchdog"; +#else +#endif + + bool isInitInvalid(void); + void _feed(void); +}; + +#endif /** _HARDWARE_WATCHDOG_H_ */ diff --git a/src/Main/LedBar.cpp b/src/Main/LedBar.cpp new file mode 100644 index 0000000..c6cca1e --- /dev/null +++ b/src/Main/LedBar.cpp @@ -0,0 +1,126 @@ +#include "LedBar.h" + +#include "../Libraries/Adafruit_NeoPixel/Adafruit_NeoPixel.h" + +#define pixel() ((Adafruit_NeoPixel *)this->pixels) + +#if defined(ESP8266) +void LedBar::begin(Stream &debugStream) { + this->_debugStream = &debugStream; + this->begin(); +} +#else +#endif +LedBar::LedBar(BoardType type) : _boardType(type) {} + +/** + * @brief LED bar initialize + * + */ +void LedBar::begin(void) { + if (this->_isBegin) { + return; + } + + /** Get board support package define */ + this->_bsp = getBoardDef(this->_boardType); + if ((this->_bsp == nullptr) || (this->_bsp->LED.supported == false) || + (this->_bsp->LED.rgbNum == 0)) { + AgLog("Board Not supported or LED not available on board"); + return; + } + + /** Init pixels */ + this->pixels = new Adafruit_NeoPixel( + this->_bsp->LED.rgbNum, this->_bsp->LED.pin, NEO_GRB + NEO_KHZ800); + pixel()->begin(); + pixel()->clear(); + + this->_isBegin = true; + + AgLog("Initialize"); +} + +/** + * @brief Set LED color, if LED is on the color update immedietly. Otherwise + * must setOn to show LED color + * + * @param red Color Red (0 - 255) + * @param green Color Green (0 - 255) + * @param blue Color Blue (0 - 255) + * @param ledNum Index of LED from 0 to getNumberOfLeds() - 1 + */ +void LedBar::setColor(uint8_t red, uint8_t green, uint8_t blue, int ledNum) { + if (this->ledNumInvalid(ledNum)) { + return; + } + + pixel()->setPixelColor(ledNum, red, green, blue); +} + +/** + * @brief Set LED brightness apply for all LED bar + * + * @param brightness Brightness (0 - 255) + */ +void LedBar::setBrighness(uint8_t brightness) { + if (this->isBegin() == false) { + return; + } + pixel()->setBrightness(brightness); +} + +/** + * @brief Get number of LED on bar + * + * @return int Number of LED + */ +int LedBar::getNumberOfLeds(void) { + if (this->isBegin() == false) { + return 0; + } + + return this->_bsp->LED.rgbNum; +} + +bool LedBar::isBegin(void) { + if (this->_isBegin) { + return true; + } + AgLog("LED is not initialized"); + return false; +} + +bool LedBar::ledNumInvalid(int ledNum) { + if (this->isBegin() == false) { + return true; + } + + if ((ledNum < 0) || (ledNum >= this->_bsp->LED.rgbNum)) { + AgLog("ledNum invalid: %d", ledNum); + return true; + } + return false; +} + +void LedBar::setColor(uint8_t red, uint8_t green, uint8_t blue) { + for (int ledNum = 0; ledNum < this->_bsp->LED.rgbNum; ledNum++) { + this->setColor(red, green, blue, ledNum); + } +} + +/** + * @brief Call to turn LED on/off base on the setting color + * + */ +void LedBar::show(void) { + if (pixel()->canShow()) { + pixel()->show(); + } +} + +/** + * @brief Set all LED to off color (r,g,b) = (0,0,0) + * + */ +void LedBar::clear(void) { pixel()->clear(); } diff --git a/src/Main/LedBar.h b/src/Main/LedBar.h new file mode 100644 index 0000000..b2431e3 --- /dev/null +++ b/src/Main/LedBar.h @@ -0,0 +1,42 @@ +#ifndef _AIR_GRADIENT_LED_H_ +#define _AIR_GRADIENT_LED_H_ + +#include + +#include "BoardDef.h" + +/** + * @brief The class define how to handle the RGB LED bar + * + */ +class LedBar { +public: +#if defined(ESP8266) + void begin(Stream &debugStream); +#else +#endif + LedBar(BoardType type); + void begin(void); + void setColor(uint8_t red, uint8_t green, uint8_t blue, int ledNum); + void setColor(uint8_t red, uint8_t green, uint8_t blue); + void setBrighness(uint8_t brightness); + int getNumberOfLeds(void); + void show(void); + void clear(void); + +private: + const BoardDef *_bsp; + bool _isBegin = false; + uint8_t _ledState = 0; + BoardType _boardType; + void *pixels = nullptr; +#if defined(ESP8266) + Stream *_debugStream = NULL; + const char *TAG = "LED"; +#else +#endif + bool isBegin(void); + bool ledNumInvalid(int ledNum); +}; + +#endif /** _AIR_GRADIENT_LED_H_ */ diff --git a/src/Main/PushButton.cpp b/src/Main/PushButton.cpp new file mode 100644 index 0000000..d81f81b --- /dev/null +++ b/src/Main/PushButton.cpp @@ -0,0 +1,74 @@ +#include "PushButton.h" + +PushButton::PushButton(BoardType type) : _boardType(type) {} + +#if defined(ESP8266) +void PushButton::begin(Stream &debugStream) { + this->_debugStream = &debugStream; + this->begin(); +} +#else +#endif + +/** + * @brief Initialize PushButton, If PushButton is not initialized the get state + * + */ +void PushButton::begin(void) { + if (this->_isBegin) { + AgLog("Initialized, call end() then try again"); + return; + } + + this->_bsp = getBoardDef(this->_boardType); + if ((this->_bsp == nullptr) || (this->_bsp->SW.supported == false)) { + AgLog("Board not supported or switch not available"); + return; + } + + if (this->_boardType == DIY_PRO_INDOOR_V4_2) { + pinMode(this->_bsp->SW.pin, INPUT_PULLUP); + } else { + pinMode(this->_bsp->SW.pin, INPUT); + } + + this->_isBegin = true; + AgLog("Initialize"); +} + +/** + * @brief Get button state, Alway retrun State::BUTTON_RELEASED if no-initialize + * + * @return PushButton::State + */ +PushButton::State PushButton::getState(void) { + if (this->isBegin() == false) { + return State::BUTTON_RELEASED; + } + + if (digitalRead(this->_bsp->SW.pin) == this->_bsp->SW.activeLevel) { + return State::BUTTON_PRESSED; + } + return State::BUTTON_RELEASED; +} + +/** + * @brief Get PushButton::State as string + * + * @param state Buttons State + * @return String + */ +String PushButton::toString(PushButton::State state) { + if (state == BUTTON_PRESSED) { + return "Presssed"; + } + return "Released"; +} + +bool PushButton::isBegin(void) { + if (this->_isBegin) { + return true; + } + AgLog("Switch not initialized"); + return false; +} diff --git a/src/Main/PushButton.h b/src/Main/PushButton.h new file mode 100644 index 0000000..4b2f6d4 --- /dev/null +++ b/src/Main/PushButton.h @@ -0,0 +1,47 @@ +#ifndef _AIR_GRADIENT_SW_H_ +#define _AIR_GRADIENT_SW_H_ + +#include "BoardDef.h" +#include + +/** + * @brief The class define how to handle the Push button + * + */ +class PushButton { +public: + /** + * @brief Enum button state + */ + enum State { BUTTON_PRESSED, BUTTON_RELEASED }; + +#if defined(ESP8266) + void begin(Stream &debugStream); +#else +#endif + PushButton(BoardType type); + void begin(void); + State getState(void); + String toString(State state); + +private: + /** BSP constant variable */ + const BoardDef *_bsp; + /** Board type */ + BoardType _boardType; + /** Is inititalize flag */ + bool _isBegin = false; + + /** Special variable for ESP8266 */ +#if defined(ESP8266) + Stream *_debugStream = nullptr; + const char *TAG = "PushButton"; +#else +#endif + + /** Method */ + + bool isBegin(void); +}; + +#endif /** _AIR_GRADIENT_SW_H_ */ diff --git a/src/Main/StatusLed.cpp b/src/Main/StatusLed.cpp new file mode 100644 index 0000000..d0451e8 --- /dev/null +++ b/src/Main/StatusLed.cpp @@ -0,0 +1,115 @@ +#include "StatusLed.h" + +StatusLed::StatusLed(BoardType boardType) : boardType(boardType) {} + +#if defined(ESP8266) +void StatusLed::begin(Stream &debugStream) { + this->_debugStream = &debugStream; + this->begin(); +} +#else +#endif + +/** + * @brief Initialized LED + * + */ +void StatusLed::begin(void) { + if (this->_isBegin) { + AgLog("Initialized, call end() then try again"); + return; + } + bsp = getBoardDef(this->boardType); + if ((bsp == nullptr) || (bsp->LED.supported == false)) { + AgLog("Board not support StatusLed"); + return; + } + + pinMode(bsp->LED.pin, OUTPUT); + digitalWrite(bsp->LED.pin, !bsp->LED.onState); + + this->state = LED_OFF; + this->_isBegin = true; + + AgLog("Initialize"); +} + +/** + * @brief Turn LED on + * + */ +void StatusLed::setOn(void) { + if (this->isBegin() == false) { + return; + } + digitalWrite(bsp->LED.pin, bsp->LED.onState); + this->state = LED_ON; + AgLog("Turn ON"); +} + +/** + * @brief Turn LED off + * + */ +void StatusLed::setOff(void) { + if (this->isBegin() == false) { + return; + } + digitalWrite(bsp->LED.pin, !bsp->LED.onState); + this->state = LED_OFF; + AgLog("Turn OFF"); +} + +/** + * @brief Set LED toggle + * + */ +void StatusLed::setToggle(void) { + if (this->state == LED_ON) { + this->setOff(); + } else { + this->setOn(); + } +} + +/** + * @brief Get current LED state + * + * @return StatusLed::State + */ +StatusLed::State StatusLed::getState(void) { return this->state; } + +/** + * @brief Convert LED state to string + * + * @param state LED state + * @return String + */ +String StatusLed::toString(StatusLed::State state) { + if (state == LED_ON) { + return "On"; + } + return "Off"; +} + +bool StatusLed::isBegin(void) { + if (this->_isBegin == false) { + AgLog("Not-Initialized"); + return false; + } + + return true; +} + +void StatusLed::end(void) { + if (_isBegin == false) { + return; + } + +#if defined(ESP8266) + _debugStream = nullptr; +#endif + setOff(); + _isBegin = false; + AgLog("De-initialize"); +} diff --git a/src/Main/StatusLed.h b/src/Main/StatusLed.h new file mode 100644 index 0000000..3890243 --- /dev/null +++ b/src/Main/StatusLed.h @@ -0,0 +1,45 @@ +#ifndef _STATUS_LED_H_ +#define _STATUS_LED_H_ + +#include "BoardDef.h" +#include + +/** + * @brief The class define how to handle the LED + * + */ +class StatusLed { +public: + enum State { + LED_OFF, + LED_ON, + }; + + StatusLed(BoardType boardType); +#if defined(ESP8266) + void begin(Stream &debugStream); +#else +#endif + void begin(void); + void end(void); + void setOn(void); + void setOff(void); + void setToggle(void); + State getState(void); + String toString(StatusLed::State state); + +private: + const BoardDef *bsp = nullptr; + BoardType boardType; + bool _isBegin = false; + State state; +#if defined(ESP8266) + Stream *_debugStream; + const char *TAG = "StatusLed"; +#else +#endif + + bool isBegin(void); +}; + +#endif /** _STATUS_LED_H_ */ diff --git a/src/PMS/PMS.cpp b/src/PMS/PMS.cpp new file mode 100644 index 0000000..be7e919 --- /dev/null +++ b/src/PMS/PMS.cpp @@ -0,0 +1,164 @@ +#include "PMS.h" + +bool PMS::begin(Stream *stream) { + _stream = stream; + + DATA data; + if (readUntil(data, 5000)) { + return true; + } + + return false; +} + +// Standby mode. For low power consumption and prolong the life of the sensor. +void PMS::sleep() { + uint8_t command[] = {0x42, 0x4D, 0xE4, 0x00, 0x00, 0x01, 0x73}; + _stream->write(command, sizeof(command)); +} + +// Operating mode. Stable data should be got at least 30 seconds after the +// sensor wakeup from the sleep mode because of the fan's performance. +void PMS::wakeUp() { + uint8_t command[] = {0x42, 0x4D, 0xE4, 0x00, 0x01, 0x01, 0x74}; + _stream->write(command, sizeof(command)); +} + +// Active mode. Default mode after power up. In this mode sensor would send +// serial data to the host automatically. +void PMS::activeMode() { + uint8_t command[] = {0x42, 0x4D, 0xE1, 0x00, 0x01, 0x01, 0x71}; + _stream->write(command, sizeof(command)); + _mode = MODE_ACTIVE; +} + +// Passive mode. In this mode sensor would send serial data to the host only for +// request. +void PMS::passiveMode() { + uint8_t command[] = {0x42, 0x4D, 0xE1, 0x00, 0x00, 0x01, 0x70}; + _stream->write(command, sizeof(command)); + _mode = MODE_PASSIVE; +} + +// Request read in Passive Mode. +void PMS::requestRead() { + if (_mode == MODE_PASSIVE) { + uint8_t command[] = {0x42, 0x4D, 0xE2, 0x00, 0x00, 0x01, 0x71}; + _stream->write(command, sizeof(command)); + } +} + +// Non-blocking function for parse response. +bool PMS::read(DATA &data) { + _data = &data; + loop(); + + return _status == STATUS_OK; +} + +// Blocking function for parse response. Default timeout is 1s. +bool PMS::readUntil(DATA &data, uint16_t timeout) { + _data = &data; + uint32_t start = millis(); + do { + loop(); + if (_status == STATUS_OK) { + break; + } + + /** Relax task to avoid watchdog reset */ + delay(1); + } while (millis() - start < timeout); + + return _status == STATUS_OK; +} + +void PMS::loop() { + _status = STATUS_WAITING; + if (_stream->available()) { + uint8_t ch = _stream->read(); + + switch (_index) { + case 0: + if (ch != 0x42) { + return; + } + _calculatedChecksum = ch; + break; + + case 1: + if (ch != 0x4D) { + _index = 0; + return; + } + _calculatedChecksum += ch; + break; + + case 2: + _calculatedChecksum += ch; + _frameLen = ch << 8; + break; + + case 3: + _frameLen |= ch; + // Unsupported sensor, different frame length, transmission error e.t.c. + if (_frameLen != 2 * 9 + 2 && _frameLen != 2 * 13 + 2) { + _index = 0; + return; + } + _calculatedChecksum += ch; + break; + + default: + if (_index == _frameLen + 2) { + _checksum = ch << 8; + } else if (_index == _frameLen + 2 + 1) { + _checksum |= ch; + + if (_calculatedChecksum == _checksum) { + _status = STATUS_OK; + + // Standard Particles, CF=1. + _data->PM_SP_UG_1_0 = makeWord(_payload[0], _payload[1]); + _data->PM_SP_UG_2_5 = makeWord(_payload[2], _payload[3]); + _data->PM_SP_UG_10_0 = makeWord(_payload[4], _payload[5]); + + // Atmospheric Environment. + _data->PM_AE_UG_1_0 = makeWord(_payload[6], _payload[7]); + _data->PM_AE_UG_2_5 = makeWord(_payload[8], _payload[9]); + _data->PM_AE_UG_10_0 = makeWord(_payload[10], _payload[11]); + + // Total particles count per 100ml air + _data->PM_RAW_0_3 = makeWord(_payload[12], _payload[13]); + _data->PM_RAW_0_5 = makeWord(_payload[14], _payload[15]); + _data->PM_RAW_1_0 = makeWord(_payload[16], _payload[17]); + _data->PM_RAW_2_5 = makeWord(_payload[18], _payload[19]); + _data->PM_RAW_5_0 = makeWord(_payload[20], _payload[21]); + _data->PM_RAW_10_0 = makeWord(_payload[22], _payload[23]); + + // Formaldehyde concentration (PMSxxxxST units only) + _data->AMB_HCHO = makeWord(_payload[24], _payload[25]) / 1000; + + // Temperature & humidity (PMSxxxxST units only) + _data->AMB_TMP = makeWord(_payload[20], _payload[21]); + _data->AMB_HUM = makeWord(_payload[22], _payload[23]); + } + + _index = 0; + return; + } else { + _calculatedChecksum += ch; + uint8_t payloadIndex = _index - 4; + + // Payload is common to all sensors (first 2x6 bytes). + if (payloadIndex < sizeof(_payload)) { + _payload[payloadIndex] = ch; + } + } + + break; + } + + _index++; + } +} diff --git a/src/PMS/PMS.h b/src/PMS/PMS.h new file mode 100644 index 0000000..f1f32dc --- /dev/null +++ b/src/PMS/PMS.h @@ -0,0 +1,75 @@ +#ifndef _PMS_BASE_H_ +#define _PMS_BASE_H_ + +#include + +/** + * @brief Class define how to handle plantower PMS sensor it's upport for + * PMS5003 and PMS5003T series. The data @ref AMB_TMP and @ref AMB_HUM only + * valid on PMS5003T + */ +class PMS { +public: + static const uint16_t SINGLE_RESPONSE_TIME = 1000; + static const uint16_t TOTAL_RESPONSE_TIME = 1000 * 10; + static const uint16_t STEADY_RESPONSE_TIME = 1000 * 30; + + // static const uint16_t BAUD_RATE = 9600; + + struct DATA { + // Standard Particles, CF=1 + uint16_t PM_SP_UG_1_0; + uint16_t PM_SP_UG_2_5; + uint16_t PM_SP_UG_10_0; + + // Atmospheric environment + uint16_t PM_AE_UG_1_0; + uint16_t PM_AE_UG_2_5; + uint16_t PM_AE_UG_10_0; + + // Raw particles count (number of particles in 0.1l of air + uint16_t PM_RAW_0_3; + uint16_t PM_RAW_0_5; + uint16_t PM_RAW_1_0; + uint16_t PM_RAW_2_5; + uint16_t PM_RAW_5_0; + uint16_t PM_RAW_10_0; + + // Formaldehyde (HCHO) concentration in mg/m^3 - PMSxxxxST units only + uint16_t AMB_HCHO; + + // Temperature & humidity - PMSxxxxST units only + int16_t AMB_TMP; + uint16_t AMB_HUM; + }; + + bool begin(Stream *stream); + void sleep(); + void wakeUp(); + void activeMode(); + void passiveMode(); + + void requestRead(); + bool read(DATA &data); + bool readUntil(DATA &data, uint16_t timeout = SINGLE_RESPONSE_TIME); + +private: + enum STATUS { STATUS_WAITING, STATUS_OK }; + enum MODE { MODE_ACTIVE, MODE_PASSIVE }; + + uint8_t _payload[50]; + Stream *_stream; + DATA *_data; + STATUS _status; + MODE _mode = MODE_ACTIVE; + + uint8_t _index = 0; + uint16_t _frameLen; + uint16_t _checksum; + uint16_t _calculatedChecksum; + + void loop(); + char Char_PM2[10]; +}; + +#endif diff --git a/src/pms/pms5003.cpp b/src/PMS/PMS5003.cpp similarity index 100% rename from src/pms/pms5003.cpp rename to src/PMS/PMS5003.cpp diff --git a/src/pms/pms5003.h b/src/PMS/PMS5003.h similarity index 100% rename from src/pms/pms5003.h rename to src/PMS/PMS5003.h diff --git a/src/pms/pms5003t.cpp b/src/PMS/PMS5003T.cpp similarity index 100% rename from src/pms/pms5003t.cpp rename to src/PMS/PMS5003T.cpp diff --git a/src/pms/pms5003t.h b/src/PMS/PMS5003T.h similarity index 100% rename from src/pms/pms5003t.h rename to src/PMS/PMS5003T.h diff --git a/src/s8/s8.cpp b/src/S8/S8.cpp similarity index 100% rename from src/s8/s8.cpp rename to src/S8/S8.cpp diff --git a/src/s8/s8.h b/src/S8/S8.h similarity index 100% rename from src/s8/s8.h rename to src/S8/S8.h diff --git a/src/S8/mb_crc.cpp b/src/S8/mb_crc.cpp new file mode 100644 index 0000000..462cca1 --- /dev/null +++ b/src/S8/mb_crc.cpp @@ -0,0 +1,73 @@ +#include "mb_crc.h" +#include + +/* ModBus CRC routine extracted from + * https://modbus.org/docs/Modbus_over_serial_line_V1_02.pdf */ + +/* Table of CRC values for high–order byte */ +static const uint8_t auchCRCHi[] = { + 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, + 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, + 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, + 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, + 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, + 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, + 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, + 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, + 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, + 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, + 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, + 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, + 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, + 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, + 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, + 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, + 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, + 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, + 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, + 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, + 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, + 0x00, 0xC1, 0x81, 0x40}; + +/* Table of CRC values for low–order byte */ +static const uint8_t auchCRCLo[] = { + 0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06, 0x07, 0xC7, + 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD, 0x0F, 0xCF, 0xCE, 0x0E, + 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09, 0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, + 0x1B, 0xDB, 0xDA, 0x1A, 0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, + 0x14, 0xD4, 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3, + 0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3, 0xF2, 0x32, + 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4, 0x3C, 0xFC, 0xFD, 0x3D, + 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A, 0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, + 0x28, 0xE8, 0xE9, 0x29, 0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, + 0x2D, 0xED, 0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26, + 0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60, 0x61, 0xA1, + 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67, 0xA5, 0x65, 0x64, 0xA4, + 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F, 0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, + 0x69, 0xA9, 0xA8, 0x68, 0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA, + 0xBE, 0x7E, 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5, + 0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71, 0x70, 0xB0, + 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92, 0x96, 0x56, 0x57, 0x97, + 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C, 0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, + 0x5A, 0x9A, 0x9B, 0x5B, 0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, + 0x4B, 0x8B, 0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C, + 0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42, 0x43, 0x83, + 0x41, 0x81, 0x80, 0x40}; + +uint16_t AgMb16Crc(uint8_t *puchMsg, uint16_t usDataLen) { + /* + puchMsg -> message to calculate CRC upon + usDataLen -> quantity of bytes in message + */ + uint8_t uchCRCHi = 0xFF; /* high byte of CRC initialized */ + uint8_t uchCRCLo = 0xFF; /* low byte of CRC initialized */ + uint16_t uIndex; /* will index into CRC lookup table */ + + while (usDataLen--) /* pass through message buffer */ + { + uIndex = uchCRCLo ^ *puchMsg++; /* calculate the CRC */ + uchCRCLo = uchCRCHi ^ auchCRCHi[uIndex]; + uchCRCHi = auchCRCLo[uIndex]; + } + return (uchCRCHi << 8 | uchCRCLo); +} diff --git a/src/S8/mb_crc.h b/src/S8/mb_crc.h new file mode 100644 index 0000000..b15274b --- /dev/null +++ b/src/S8/mb_crc.h @@ -0,0 +1,8 @@ +#ifndef _AIR_GRADIENT_MODBUS_CRC_H_ +#define _AIR_GRADIENT_MODBUS_CRC_H_ + +#include + +uint16_t AgMb16Crc(uint8_t *buf, uint16_t len); + +#endif /** _AIR_GRADIENT_MODBUS_CRC_H_ */ diff --git a/src/sgp41/sgp41.cpp b/src/Sgp41/Sgp41.cpp similarity index 100% rename from src/sgp41/sgp41.cpp rename to src/Sgp41/Sgp41.cpp diff --git a/src/sgp41/sgp41.h b/src/Sgp41/Sgp41.h similarity index 100% rename from src/sgp41/sgp41.h rename to src/Sgp41/Sgp41.h diff --git a/src/sht/sht.cpp b/src/Sht/Sht.cpp similarity index 100% rename from src/sht/sht.cpp rename to src/Sht/Sht.cpp diff --git a/src/sht/sht.h b/src/Sht/Sht.h similarity index 100% rename from src/sht/sht.h rename to src/Sht/Sht.h From 6cb7fa8a1b15adbe94856b60f5ae6b90ec4ba4b8 Mon Sep 17 00:00:00 2001 From: Phat Nguyen Date: Sat, 17 Feb 2024 17:34:01 +0700 Subject: [PATCH 14/26] Fix: capitalize folder and file --- src/main/BoardDef.cpp | 501 ---------------------------------- src/main/BoardDef.h | 88 ------ src/main/HardwareWatchdog.cpp | 74 ----- src/main/HardwareWatchdog.h | 37 --- src/main/LedBar.cpp | 126 --------- src/main/LedBar.h | 42 --- src/main/PushButton.cpp | 74 ----- src/main/PushButton.h | 47 ---- src/main/StatusLed.cpp | 115 -------- src/main/StatusLed.h | 45 --- src/pms/PMS.cpp | 164 ----------- src/pms/PMS.h | 75 ----- src/s8/mb_crc.cpp | 73 ----- src/s8/mb_crc.h | 8 - 14 files changed, 1469 deletions(-) delete mode 100644 src/main/BoardDef.cpp delete mode 100644 src/main/BoardDef.h delete mode 100644 src/main/HardwareWatchdog.cpp delete mode 100644 src/main/HardwareWatchdog.h delete mode 100644 src/main/LedBar.cpp delete mode 100644 src/main/LedBar.h delete mode 100644 src/main/PushButton.cpp delete mode 100644 src/main/PushButton.h delete mode 100644 src/main/StatusLed.cpp delete mode 100644 src/main/StatusLed.h delete mode 100644 src/pms/PMS.cpp delete mode 100644 src/pms/PMS.h delete mode 100644 src/s8/mb_crc.cpp delete mode 100644 src/s8/mb_crc.h diff --git a/src/main/BoardDef.cpp b/src/main/BoardDef.cpp deleted file mode 100644 index 23fe603..0000000 --- a/src/main/BoardDef.cpp +++ /dev/null @@ -1,501 +0,0 @@ -#include "BoardDef.h" -#if defined(ESP32) -#include "esp32-hal-log.h" -#endif - -const BoardDef bsps[_BOARD_MAX] = { - /** DIY_BASIC */ - [DIY_BASIC] = - { - .SenseAirS8 = - { - .uart_tx_pin = 2, - .uart_rx_pin = 0, -#if defined(ESP8266) - .supported = true, -#else - .supported = false, -#endif - }, - .Pms5003 = - { - .uart_tx_pin = 14, - .uart_rx_pin = 12, -#if defined(ESP8266) - .supported = true, -#else - .supported = false, -#endif - }, - .I2C = - { - .sda_pin = 4, - .scl_pin = 5, -#if defined(ESP8266) - .supported = true, -#else - .supported = false, -#endif - }, - .SW = - { - .pin = -1, /** Not supported */ - .activeLevel = 0, /** Don't care */ - .supported = false, /** Not supported */ - }, - .LED = - { - .pin = -1, - .rgbNum = 0, - .onState = 0, - .supported = false, - .rgbSupported = false, - }, - .OLED = - { -#if defined(ESP8266) - .width = 64, - .height = 48, - .addr = 0x3C, - .supported = true, -#else - .width = 0, - .height = 0, - .addr = 0, - .supported = false, -#endif - }, - .WDG = - { - .resetPin = -1, - .supported = false, - }, - .name = "DIY_BASIC", - }, - /** DIY_PRO_INDOOR_V4_2 */ - [DIY_PRO_INDOOR_V4_2] = - { - .SenseAirS8 = - { - .uart_tx_pin = 2, - .uart_rx_pin = 0, -#if defined(ESP8266) - .supported = true, -#else - .supported = false, -#endif - }, - .Pms5003 = - { - .uart_tx_pin = 14, - .uart_rx_pin = 12, -#if defined(ESP8266) - .supported = true, -#else - .supported = false, -#endif - }, - .I2C = - { - .sda_pin = 4, - .scl_pin = 5, -#if defined(ESP8266) - .supported = true, -#else - .supported = false, -#endif - }, - .SW = - { -#if defined(ESP8266) - .pin = 13, /** D7 */ - .activeLevel = 0, - .supported = true, -#else - .pin = -1, - .activeLevel = 1, - .supported = false, -#endif - }, - .LED = - { - .pin = -1, - .rgbNum = 0, - .onState = 0, - .supported = false, - .rgbSupported = false, - }, - .OLED = - { -#if defined(ESP8266) - .width = 128, - .height = 64, - .addr = 0x3C, - .supported = true, -#else - .width = 0, - .height = 0, - .addr = 0, - .supported = false, -#endif - }, - .WDG = - { - .resetPin = -1, - .supported = false, - }, - .name = "DIY_PRO_INDOOR_V4_2", - }, - /** ONE_INDOOR */ - [ONE_INDOOR] = - { - .SenseAirS8 = - { - .uart_tx_pin = 1, - .uart_rx_pin = 0, -#if defined(ESP8266) - .supported = false, -#else - .supported = true, -#endif - }, - /** Use UART0 don't use define pin number */ - .Pms5003 = - { - .uart_tx_pin = -1, - .uart_rx_pin = -1, -#if defined(ESP8266) - .supported = false, -#else - .supported = true, -#endif - }, - .I2C = - { - .sda_pin = 7, - .scl_pin = 6, -#if defined(ESP8266) - .supported = false, -#else - .supported = true, -#endif - }, - .SW = - { -#if defined(ESP8266) - .pin = -1, - .activeLevel = 1, - .supported = false, -#else - .pin = 9, - .activeLevel = 0, - .supported = true, -#endif - }, - .LED = - { -#if defined(ESP8266) - .pin = -1, - .rgbNum = 0, - .onState = 0, - .supported = false, - .rgbSupported = false, -#else - .pin = 10, - .rgbNum = 11, - .onState = 1, - .supported = true, - .rgbSupported = true, -#endif - }, - .OLED = - { -#if defined(ESP8266) - .width = 0, - .height = 0, - .addr = 0, - .supported = false, -#else - .width = 128, - .height = 64, - .addr = 0x3C, - .supported = true, -#endif - }, - .WDG = - { -#if defined(ESP8266) - .resetPin = -1, - .supported = false, -#else - .resetPin = 2, - .supported = true, -#endif - }, - .name = "ONE_INDOOR", - }, - /** OPEN_AIR_OUTDOOR */ - [OPEN_AIR_OUTDOOR] = { - .SenseAirS8 = - { - .uart_tx_pin = 1, - .uart_rx_pin = 0, -#if defined(ESP8266) - .supported = false, -#else - .supported = true, -#endif - }, - /** Use UART0 don't use define pin number */ - .Pms5003 = - { - .uart_tx_pin = -1, - .uart_rx_pin = -1, -#if defined(ESP8266) - .supported = false, -#else - .supported = true, -#endif - }, - .I2C = - { - .sda_pin = 7, - .scl_pin = 6, -#if defined(ESP8266) - .supported = false, -#else - .supported = true, -#endif - }, - .SW = - { -#if defined(ESP8266) - .pin = -1, - .activeLevel = 1, - .supported = false, -#else - .pin = 9, - .activeLevel = 0, - .supported = true, -#endif - }, - .LED = - { -#if defined(ESP8266) - .pin = -1, - .rgbNum = 0, - .onState = 0, - .supported = false, - .rgbSupported = false, -#else - .pin = 10, - .rgbNum = 0, - .onState = 1, - .supported = true, - .rgbSupported = false, -#endif - }, - .OLED = - { -#if defined(ESP8266) - .width = 0, - .height = 0, - .addr = 0, - .supported = false, -#else - .width = 128, - .height = 64, - .addr = 0x3C, - .supported = true, -#endif - }, - .WDG = - { -#if defined(ESP8266) - .resetPin = -1, - .supported = false, -#else - .resetPin = 2, - .supported = true, -#endif - }, - .name = "OPEN_AIR_OUTDOOR", - }}; - -/** - * @brief Get Board Support Package - * - * @param def Board define @ref BoardType - * @return const BoardDef* - */ -const BoardDef *getBoardDef(BoardType def) { - if (def >= _BOARD_MAX) { - return NULL; - } - return &bsps[def]; -} - -#if defined(ESP8266) -#define bspPrintf(c, ...) \ - if (_debug != nullptr) { \ - _debug->printf("[BSP] " c "\r\n", ##__VA_ARGS__); \ - } -#else -#define bspPrintf(c, ...) log_i(c, ##__VA_ARGS__) -#endif - -/** - * @brief Print list of support Board and sensor - * - * @param _debug Serial debug - */ -void printBoardDef(Stream *_debug) { -#if defined(ESP8266) - if (_debug == NULL) { - return; - } -#endif - - for (int i = 0; i < _BOARD_MAX; i++) { - bspPrintf("Board name: %s", bsps[i].name); - bspPrintf("\tSensor CO2 S8:"); - bspPrintf("\t\tSupported: %d", bsps[i].SenseAirS8.supported); - if (bsps[i].SenseAirS8.supported) { - bspPrintf("\t\tUART Tx: %d", bsps[i].SenseAirS8.uart_tx_pin); - bspPrintf("\t\tUART Rx: %d", bsps[i].SenseAirS8.uart_rx_pin); - } - - bspPrintf("\tSensor PMS5003:"); - bspPrintf("\t\tSupported: %d", bsps[i].Pms5003.supported); - if (bsps[i].Pms5003.supported) { - bspPrintf("\t\tUART Tx: %d", bsps[i].Pms5003.uart_tx_pin); - bspPrintf("\t\tUART Rx: %d", bsps[i].Pms5003.uart_rx_pin); - } - - bspPrintf("\tI2C"); - bspPrintf("\t\tSupported: %d", bsps[i].I2C.supported); - if (bsps[i].I2C.supported) { - bspPrintf("\t\tI2C SCL: %d", bsps[i].I2C.scl_pin); - bspPrintf("\t\tI2C SDA: %d", bsps[i].I2C.sda_pin); - } - - bspPrintf("\tSwitch"); - bspPrintf("\t\tSupported: %d", bsps[i].SW.supported); - if (bsps[i].SW.supported) { - bspPrintf("\t\tPin : %d", bsps[i].SW.pin); - bspPrintf("\t\tActive Level: %d", bsps[i].SW.activeLevel); - } - - bspPrintf("\tLED"); - bspPrintf("\t\tSupported: %d", bsps[i].LED.supported); - if (bsps[i].LED.supported) { - bspPrintf("\t\tPin : %d", bsps[i].LED.pin); - bspPrintf("\t\tRGB : %d", bsps[i].LED.rgbSupported); - if (bsps[i].LED.rgbSupported) { - bspPrintf("\t\tNumber of RGB: %d", bsps[i].LED.rgbNum); - } else { - bspPrintf("\t\tLED state ON: %d (Single LED)", bsps[i].LED.onState); - } - } - - bspPrintf("\tOLED"); - bspPrintf("\t\tSupported: %d", bsps[i].OLED.supported); - if (bsps[i].OLED.supported) { - bspPrintf("\t\tWidth : %d", bsps[i].OLED.width); - bspPrintf("\t\tHeigth : %d", bsps[i].OLED.height); - bspPrintf("\t\tI2C Addr: %d", bsps[i].OLED.addr); - } - - bspPrintf("\tWatchDog"); - bspPrintf("\t\tSupported: %d", bsps[i].WDG.supported); - if (bsps[i].OLED.supported) { - bspPrintf("\t\tReset Pin: %d", bsps[i].WDG.resetPin); - } - } -} - -bool getBoardDef_I2C_Supported(const BoardDef *bsp) { - if (bsp == nullptr) { - return false; - } - return bsp->I2C.supported; -} - -int getBoardDef_I2C_SDA(const BoardDef *bsp) { - if ((bsp == nullptr) || (bsp->I2C.supported == false)) { - return -1; - } - return bsp->I2C.sda_pin; -} - -int getBoardDef_I2C_SCL(const BoardDef *bsp) { - if ((bsp == nullptr) || (bsp->I2C.supported == false)) { - return -1; - } - return bsp->I2C.scl_pin; -} - -bool getBoardDef_SW_Supported(const BoardDef *bsp) { - if (bsp == nullptr) { - return false; - } - return bsp->SW.supported; -} - -int getBoardDef_SW_Pin(const BoardDef *bsp) { - if ((bsp == nullptr) || (bsp->SW.supported == false)) { - return -1; - } - return bsp->SW.supported; -} - -int getBoardDef_SW_ActiveLevel(const BoardDef *bsp) { - if (bsp == nullptr) { - return 0; - } - return bsp->SW.activeLevel; -} - -void AirGradientBspWdgInit(const BoardDef *bsp) { - if (bsp == nullptr) { - return; - } - if (bsp->WDG.supported) { - pinMode(bsp->WDG.resetPin, OUTPUT); - digitalWrite(bsp->WDG.resetPin, LOW); - delay(25); // Delay 25ms - digitalWrite(bsp->WDG.resetPin, HIGH); - } -} - -/** - * @brief Begin reset external watchdog. Must call @ref AirGradientBspWdgFeedEnd - * after 20 ms - * - * @param bsp - */ -void AirGradientBspWdgFeedBegin(const BoardDef *bsp) { - if (bsp == nullptr) { - return; - } - - if (bsp->WDG.supported) { - digitalWrite(bsp->WDG.resetPin, HIGH); - } -} - -/** - * @brief Call this function to finish watchdog feed after call @ref - * AirGradientBspWdgFeedBegin 25 ms - * - * @param bsp - */ -void AirGradientBspWdgFeedEnd(const BoardDef *bsp) { - if (bsp == nullptr) { - return; - } - - if (bsp->WDG.supported) { - digitalWrite(bsp->WDG.resetPin, LOW); - } -} diff --git a/src/main/BoardDef.h b/src/main/BoardDef.h deleted file mode 100644 index b445993..0000000 --- a/src/main/BoardDef.h +++ /dev/null @@ -1,88 +0,0 @@ -#ifndef _AIR_GRADIENT_BOARD_DEF_H_ -#define _AIR_GRADIENT_BOARD_DEF_H_ - -#include - -#if defined(ESP8266) -#define AgLog(c, ...) \ - if (this->_debugStream != nullptr) { \ - this->_debugStream->printf("[%s] " c "\r\n", this->TAG, ##__VA_ARGS__); \ - } -#else -#include -#define AgLog(c, ...) log_i(c, ##__VA_ARGS__) -#endif - -/** - * @brief Define Airgradient supported board type - */ -enum BoardType { - DIY_BASIC = 0x00, - DIY_PRO_INDOOR_V4_2 = 0x01, - ONE_INDOOR = 0x02, - OPEN_AIR_OUTDOOR = 0x03, - _BOARD_MAX -}; - -/** - * @brief Board definitions - * - */ -struct BoardDef { - /** Board Support CO2 SenseS8 */ - struct { - const int uart_tx_pin; /** UART tx pin */ - const int uart_rx_pin; /** UART rx pin */ - const bool supported; /** Is BSP supported for this sensor */ - } SenseAirS8; - - /** Board Support Plantower PMS5003 */ - struct { - const int uart_tx_pin; /** UART tx pin */ - const int uart_rx_pin; /** UART rx pin */ - const bool supported; /** Is BSP supported for this sensor */ - } Pms5003; - - /** I2C Bus */ - struct { - const int sda_pin; /** I2C SDA pin */ - const int scl_pin; /** I2C SCL pin */ - const bool supported; /** Is BSP supported I2C communication */ - } I2C; - - /** Switch */ - struct { - const int pin; /** Switch PIN */ - const int activeLevel; /** Switch pressed level */ - const bool supported; - } SW; - - /** LED */ - struct { - const int pin; /** Pin control */ - const int rgbNum; /** Number of RGB LED */ - const int onState; /** Single LED turn on state */ - const bool supported; /** SUpported LED */ - const bool rgbSupported; /** LED is RGB */ - } LED; - - /** OLED */ - struct { - const uint8_t width; /** Display Width */ - const uint8_t height; /** Display height */ - const uint8_t addr; /** OLED I2C address */ - const bool supported; - } OLED; - - /** Watchdog */ - struct { - const uint8_t resetPin; - const bool supported; - } WDG; - const char *name; -}; - -const BoardDef *getBoardDef(BoardType def); -void printBoardDef(Stream *_debug); - -#endif /** _AIR_GRADIENT_BOARD_DEF_H_ */ diff --git a/src/main/HardwareWatchdog.cpp b/src/main/HardwareWatchdog.cpp deleted file mode 100644 index 37a963c..0000000 --- a/src/main/HardwareWatchdog.cpp +++ /dev/null @@ -1,74 +0,0 @@ -#include "HardwareWatchdog.h" - -HardwareWatchdog::HardwareWatchdog(BoardType type) : boardType(type) {} - -#if defined(ESP8266) -void HardwareWatchdog::begin(Stream &debugStream) { - this->_debugStream = &debugStream; - this->begin(); -} -#else -#endif - -/** - * @brief Initialize external watchdog - * - */ -void HardwareWatchdog::begin(void) { - if (this->_isInit) { - return; - } - - /** Get BSP */ - this->bsp = getBoardDef(this->boardType); - if ((this->bsp == nullptr) || (this->bsp->WDG.supported == false)) { - AgLog("Board not supported Watchdog"); - return; - } - - /** Init GPIO and first feed external watchdog */ - pinMode(this->bsp->WDG.resetPin, OUTPUT); - this->_feed(); - - this->_isInit = true; - AgLog("Inittialized"); -} - -/** - * @brief Reset Watchdog - * - */ -void HardwareWatchdog::reset(void) { - if (this->isInitInvalid()) { - return; - } - - this->_feed(); -} - -/** - * @brief Wathdog timeout - * - * @return int Millisecionds - */ -int HardwareWatchdog::getTimeout(void) { return 5 * 1000 * 60; } - -bool HardwareWatchdog::isInitInvalid(void) { - if (this->_isInit == false) { - AgLog("No-initialized"); - return true; - } - return false; -} - -/** - * @brief Reset external watchdog - * - */ -void HardwareWatchdog::_feed(void) { - digitalWrite(this->bsp->WDG.resetPin, HIGH); - delay(25); - digitalWrite(this->bsp->WDG.resetPin, LOW); - - AgLog("Reset"); -} diff --git a/src/main/HardwareWatchdog.h b/src/main/HardwareWatchdog.h deleted file mode 100644 index 367ff91..0000000 --- a/src/main/HardwareWatchdog.h +++ /dev/null @@ -1,37 +0,0 @@ -#ifndef _HARDWARE_WATCHDOG_H_ -#define _HARDWARE_WATCHDOG_H_ - -#include - -#include "BoardDef.h" - -/** - * @brief The class define how to control external watchdog on ONE-V9 and - * Outdoor - */ -class HardwareWatchdog { -public: - HardwareWatchdog(BoardType type); -#if defined(ESP8266) - void begin(Stream &debugStream); -#else -#endif - void begin(void); - void reset(void); - int getTimeout(void); - -private: - bool _isInit = false; - const BoardDef *bsp; - BoardType boardType; -#if defined(ESP8266) - Stream *_debugStream; - const char *TAG = "HardwareWatchdog"; -#else -#endif - - bool isInitInvalid(void); - void _feed(void); -}; - -#endif /** _HARDWARE_WATCHDOG_H_ */ diff --git a/src/main/LedBar.cpp b/src/main/LedBar.cpp deleted file mode 100644 index c6cca1e..0000000 --- a/src/main/LedBar.cpp +++ /dev/null @@ -1,126 +0,0 @@ -#include "LedBar.h" - -#include "../Libraries/Adafruit_NeoPixel/Adafruit_NeoPixel.h" - -#define pixel() ((Adafruit_NeoPixel *)this->pixels) - -#if defined(ESP8266) -void LedBar::begin(Stream &debugStream) { - this->_debugStream = &debugStream; - this->begin(); -} -#else -#endif -LedBar::LedBar(BoardType type) : _boardType(type) {} - -/** - * @brief LED bar initialize - * - */ -void LedBar::begin(void) { - if (this->_isBegin) { - return; - } - - /** Get board support package define */ - this->_bsp = getBoardDef(this->_boardType); - if ((this->_bsp == nullptr) || (this->_bsp->LED.supported == false) || - (this->_bsp->LED.rgbNum == 0)) { - AgLog("Board Not supported or LED not available on board"); - return; - } - - /** Init pixels */ - this->pixels = new Adafruit_NeoPixel( - this->_bsp->LED.rgbNum, this->_bsp->LED.pin, NEO_GRB + NEO_KHZ800); - pixel()->begin(); - pixel()->clear(); - - this->_isBegin = true; - - AgLog("Initialize"); -} - -/** - * @brief Set LED color, if LED is on the color update immedietly. Otherwise - * must setOn to show LED color - * - * @param red Color Red (0 - 255) - * @param green Color Green (0 - 255) - * @param blue Color Blue (0 - 255) - * @param ledNum Index of LED from 0 to getNumberOfLeds() - 1 - */ -void LedBar::setColor(uint8_t red, uint8_t green, uint8_t blue, int ledNum) { - if (this->ledNumInvalid(ledNum)) { - return; - } - - pixel()->setPixelColor(ledNum, red, green, blue); -} - -/** - * @brief Set LED brightness apply for all LED bar - * - * @param brightness Brightness (0 - 255) - */ -void LedBar::setBrighness(uint8_t brightness) { - if (this->isBegin() == false) { - return; - } - pixel()->setBrightness(brightness); -} - -/** - * @brief Get number of LED on bar - * - * @return int Number of LED - */ -int LedBar::getNumberOfLeds(void) { - if (this->isBegin() == false) { - return 0; - } - - return this->_bsp->LED.rgbNum; -} - -bool LedBar::isBegin(void) { - if (this->_isBegin) { - return true; - } - AgLog("LED is not initialized"); - return false; -} - -bool LedBar::ledNumInvalid(int ledNum) { - if (this->isBegin() == false) { - return true; - } - - if ((ledNum < 0) || (ledNum >= this->_bsp->LED.rgbNum)) { - AgLog("ledNum invalid: %d", ledNum); - return true; - } - return false; -} - -void LedBar::setColor(uint8_t red, uint8_t green, uint8_t blue) { - for (int ledNum = 0; ledNum < this->_bsp->LED.rgbNum; ledNum++) { - this->setColor(red, green, blue, ledNum); - } -} - -/** - * @brief Call to turn LED on/off base on the setting color - * - */ -void LedBar::show(void) { - if (pixel()->canShow()) { - pixel()->show(); - } -} - -/** - * @brief Set all LED to off color (r,g,b) = (0,0,0) - * - */ -void LedBar::clear(void) { pixel()->clear(); } diff --git a/src/main/LedBar.h b/src/main/LedBar.h deleted file mode 100644 index b2431e3..0000000 --- a/src/main/LedBar.h +++ /dev/null @@ -1,42 +0,0 @@ -#ifndef _AIR_GRADIENT_LED_H_ -#define _AIR_GRADIENT_LED_H_ - -#include - -#include "BoardDef.h" - -/** - * @brief The class define how to handle the RGB LED bar - * - */ -class LedBar { -public: -#if defined(ESP8266) - void begin(Stream &debugStream); -#else -#endif - LedBar(BoardType type); - void begin(void); - void setColor(uint8_t red, uint8_t green, uint8_t blue, int ledNum); - void setColor(uint8_t red, uint8_t green, uint8_t blue); - void setBrighness(uint8_t brightness); - int getNumberOfLeds(void); - void show(void); - void clear(void); - -private: - const BoardDef *_bsp; - bool _isBegin = false; - uint8_t _ledState = 0; - BoardType _boardType; - void *pixels = nullptr; -#if defined(ESP8266) - Stream *_debugStream = NULL; - const char *TAG = "LED"; -#else -#endif - bool isBegin(void); - bool ledNumInvalid(int ledNum); -}; - -#endif /** _AIR_GRADIENT_LED_H_ */ diff --git a/src/main/PushButton.cpp b/src/main/PushButton.cpp deleted file mode 100644 index d81f81b..0000000 --- a/src/main/PushButton.cpp +++ /dev/null @@ -1,74 +0,0 @@ -#include "PushButton.h" - -PushButton::PushButton(BoardType type) : _boardType(type) {} - -#if defined(ESP8266) -void PushButton::begin(Stream &debugStream) { - this->_debugStream = &debugStream; - this->begin(); -} -#else -#endif - -/** - * @brief Initialize PushButton, If PushButton is not initialized the get state - * - */ -void PushButton::begin(void) { - if (this->_isBegin) { - AgLog("Initialized, call end() then try again"); - return; - } - - this->_bsp = getBoardDef(this->_boardType); - if ((this->_bsp == nullptr) || (this->_bsp->SW.supported == false)) { - AgLog("Board not supported or switch not available"); - return; - } - - if (this->_boardType == DIY_PRO_INDOOR_V4_2) { - pinMode(this->_bsp->SW.pin, INPUT_PULLUP); - } else { - pinMode(this->_bsp->SW.pin, INPUT); - } - - this->_isBegin = true; - AgLog("Initialize"); -} - -/** - * @brief Get button state, Alway retrun State::BUTTON_RELEASED if no-initialize - * - * @return PushButton::State - */ -PushButton::State PushButton::getState(void) { - if (this->isBegin() == false) { - return State::BUTTON_RELEASED; - } - - if (digitalRead(this->_bsp->SW.pin) == this->_bsp->SW.activeLevel) { - return State::BUTTON_PRESSED; - } - return State::BUTTON_RELEASED; -} - -/** - * @brief Get PushButton::State as string - * - * @param state Buttons State - * @return String - */ -String PushButton::toString(PushButton::State state) { - if (state == BUTTON_PRESSED) { - return "Presssed"; - } - return "Released"; -} - -bool PushButton::isBegin(void) { - if (this->_isBegin) { - return true; - } - AgLog("Switch not initialized"); - return false; -} diff --git a/src/main/PushButton.h b/src/main/PushButton.h deleted file mode 100644 index 4b2f6d4..0000000 --- a/src/main/PushButton.h +++ /dev/null @@ -1,47 +0,0 @@ -#ifndef _AIR_GRADIENT_SW_H_ -#define _AIR_GRADIENT_SW_H_ - -#include "BoardDef.h" -#include - -/** - * @brief The class define how to handle the Push button - * - */ -class PushButton { -public: - /** - * @brief Enum button state - */ - enum State { BUTTON_PRESSED, BUTTON_RELEASED }; - -#if defined(ESP8266) - void begin(Stream &debugStream); -#else -#endif - PushButton(BoardType type); - void begin(void); - State getState(void); - String toString(State state); - -private: - /** BSP constant variable */ - const BoardDef *_bsp; - /** Board type */ - BoardType _boardType; - /** Is inititalize flag */ - bool _isBegin = false; - - /** Special variable for ESP8266 */ -#if defined(ESP8266) - Stream *_debugStream = nullptr; - const char *TAG = "PushButton"; -#else -#endif - - /** Method */ - - bool isBegin(void); -}; - -#endif /** _AIR_GRADIENT_SW_H_ */ diff --git a/src/main/StatusLed.cpp b/src/main/StatusLed.cpp deleted file mode 100644 index d0451e8..0000000 --- a/src/main/StatusLed.cpp +++ /dev/null @@ -1,115 +0,0 @@ -#include "StatusLed.h" - -StatusLed::StatusLed(BoardType boardType) : boardType(boardType) {} - -#if defined(ESP8266) -void StatusLed::begin(Stream &debugStream) { - this->_debugStream = &debugStream; - this->begin(); -} -#else -#endif - -/** - * @brief Initialized LED - * - */ -void StatusLed::begin(void) { - if (this->_isBegin) { - AgLog("Initialized, call end() then try again"); - return; - } - bsp = getBoardDef(this->boardType); - if ((bsp == nullptr) || (bsp->LED.supported == false)) { - AgLog("Board not support StatusLed"); - return; - } - - pinMode(bsp->LED.pin, OUTPUT); - digitalWrite(bsp->LED.pin, !bsp->LED.onState); - - this->state = LED_OFF; - this->_isBegin = true; - - AgLog("Initialize"); -} - -/** - * @brief Turn LED on - * - */ -void StatusLed::setOn(void) { - if (this->isBegin() == false) { - return; - } - digitalWrite(bsp->LED.pin, bsp->LED.onState); - this->state = LED_ON; - AgLog("Turn ON"); -} - -/** - * @brief Turn LED off - * - */ -void StatusLed::setOff(void) { - if (this->isBegin() == false) { - return; - } - digitalWrite(bsp->LED.pin, !bsp->LED.onState); - this->state = LED_OFF; - AgLog("Turn OFF"); -} - -/** - * @brief Set LED toggle - * - */ -void StatusLed::setToggle(void) { - if (this->state == LED_ON) { - this->setOff(); - } else { - this->setOn(); - } -} - -/** - * @brief Get current LED state - * - * @return StatusLed::State - */ -StatusLed::State StatusLed::getState(void) { return this->state; } - -/** - * @brief Convert LED state to string - * - * @param state LED state - * @return String - */ -String StatusLed::toString(StatusLed::State state) { - if (state == LED_ON) { - return "On"; - } - return "Off"; -} - -bool StatusLed::isBegin(void) { - if (this->_isBegin == false) { - AgLog("Not-Initialized"); - return false; - } - - return true; -} - -void StatusLed::end(void) { - if (_isBegin == false) { - return; - } - -#if defined(ESP8266) - _debugStream = nullptr; -#endif - setOff(); - _isBegin = false; - AgLog("De-initialize"); -} diff --git a/src/main/StatusLed.h b/src/main/StatusLed.h deleted file mode 100644 index 3890243..0000000 --- a/src/main/StatusLed.h +++ /dev/null @@ -1,45 +0,0 @@ -#ifndef _STATUS_LED_H_ -#define _STATUS_LED_H_ - -#include "BoardDef.h" -#include - -/** - * @brief The class define how to handle the LED - * - */ -class StatusLed { -public: - enum State { - LED_OFF, - LED_ON, - }; - - StatusLed(BoardType boardType); -#if defined(ESP8266) - void begin(Stream &debugStream); -#else -#endif - void begin(void); - void end(void); - void setOn(void); - void setOff(void); - void setToggle(void); - State getState(void); - String toString(StatusLed::State state); - -private: - const BoardDef *bsp = nullptr; - BoardType boardType; - bool _isBegin = false; - State state; -#if defined(ESP8266) - Stream *_debugStream; - const char *TAG = "StatusLed"; -#else -#endif - - bool isBegin(void); -}; - -#endif /** _STATUS_LED_H_ */ diff --git a/src/pms/PMS.cpp b/src/pms/PMS.cpp deleted file mode 100644 index be7e919..0000000 --- a/src/pms/PMS.cpp +++ /dev/null @@ -1,164 +0,0 @@ -#include "PMS.h" - -bool PMS::begin(Stream *stream) { - _stream = stream; - - DATA data; - if (readUntil(data, 5000)) { - return true; - } - - return false; -} - -// Standby mode. For low power consumption and prolong the life of the sensor. -void PMS::sleep() { - uint8_t command[] = {0x42, 0x4D, 0xE4, 0x00, 0x00, 0x01, 0x73}; - _stream->write(command, sizeof(command)); -} - -// Operating mode. Stable data should be got at least 30 seconds after the -// sensor wakeup from the sleep mode because of the fan's performance. -void PMS::wakeUp() { - uint8_t command[] = {0x42, 0x4D, 0xE4, 0x00, 0x01, 0x01, 0x74}; - _stream->write(command, sizeof(command)); -} - -// Active mode. Default mode after power up. In this mode sensor would send -// serial data to the host automatically. -void PMS::activeMode() { - uint8_t command[] = {0x42, 0x4D, 0xE1, 0x00, 0x01, 0x01, 0x71}; - _stream->write(command, sizeof(command)); - _mode = MODE_ACTIVE; -} - -// Passive mode. In this mode sensor would send serial data to the host only for -// request. -void PMS::passiveMode() { - uint8_t command[] = {0x42, 0x4D, 0xE1, 0x00, 0x00, 0x01, 0x70}; - _stream->write(command, sizeof(command)); - _mode = MODE_PASSIVE; -} - -// Request read in Passive Mode. -void PMS::requestRead() { - if (_mode == MODE_PASSIVE) { - uint8_t command[] = {0x42, 0x4D, 0xE2, 0x00, 0x00, 0x01, 0x71}; - _stream->write(command, sizeof(command)); - } -} - -// Non-blocking function for parse response. -bool PMS::read(DATA &data) { - _data = &data; - loop(); - - return _status == STATUS_OK; -} - -// Blocking function for parse response. Default timeout is 1s. -bool PMS::readUntil(DATA &data, uint16_t timeout) { - _data = &data; - uint32_t start = millis(); - do { - loop(); - if (_status == STATUS_OK) { - break; - } - - /** Relax task to avoid watchdog reset */ - delay(1); - } while (millis() - start < timeout); - - return _status == STATUS_OK; -} - -void PMS::loop() { - _status = STATUS_WAITING; - if (_stream->available()) { - uint8_t ch = _stream->read(); - - switch (_index) { - case 0: - if (ch != 0x42) { - return; - } - _calculatedChecksum = ch; - break; - - case 1: - if (ch != 0x4D) { - _index = 0; - return; - } - _calculatedChecksum += ch; - break; - - case 2: - _calculatedChecksum += ch; - _frameLen = ch << 8; - break; - - case 3: - _frameLen |= ch; - // Unsupported sensor, different frame length, transmission error e.t.c. - if (_frameLen != 2 * 9 + 2 && _frameLen != 2 * 13 + 2) { - _index = 0; - return; - } - _calculatedChecksum += ch; - break; - - default: - if (_index == _frameLen + 2) { - _checksum = ch << 8; - } else if (_index == _frameLen + 2 + 1) { - _checksum |= ch; - - if (_calculatedChecksum == _checksum) { - _status = STATUS_OK; - - // Standard Particles, CF=1. - _data->PM_SP_UG_1_0 = makeWord(_payload[0], _payload[1]); - _data->PM_SP_UG_2_5 = makeWord(_payload[2], _payload[3]); - _data->PM_SP_UG_10_0 = makeWord(_payload[4], _payload[5]); - - // Atmospheric Environment. - _data->PM_AE_UG_1_0 = makeWord(_payload[6], _payload[7]); - _data->PM_AE_UG_2_5 = makeWord(_payload[8], _payload[9]); - _data->PM_AE_UG_10_0 = makeWord(_payload[10], _payload[11]); - - // Total particles count per 100ml air - _data->PM_RAW_0_3 = makeWord(_payload[12], _payload[13]); - _data->PM_RAW_0_5 = makeWord(_payload[14], _payload[15]); - _data->PM_RAW_1_0 = makeWord(_payload[16], _payload[17]); - _data->PM_RAW_2_5 = makeWord(_payload[18], _payload[19]); - _data->PM_RAW_5_0 = makeWord(_payload[20], _payload[21]); - _data->PM_RAW_10_0 = makeWord(_payload[22], _payload[23]); - - // Formaldehyde concentration (PMSxxxxST units only) - _data->AMB_HCHO = makeWord(_payload[24], _payload[25]) / 1000; - - // Temperature & humidity (PMSxxxxST units only) - _data->AMB_TMP = makeWord(_payload[20], _payload[21]); - _data->AMB_HUM = makeWord(_payload[22], _payload[23]); - } - - _index = 0; - return; - } else { - _calculatedChecksum += ch; - uint8_t payloadIndex = _index - 4; - - // Payload is common to all sensors (first 2x6 bytes). - if (payloadIndex < sizeof(_payload)) { - _payload[payloadIndex] = ch; - } - } - - break; - } - - _index++; - } -} diff --git a/src/pms/PMS.h b/src/pms/PMS.h deleted file mode 100644 index f1f32dc..0000000 --- a/src/pms/PMS.h +++ /dev/null @@ -1,75 +0,0 @@ -#ifndef _PMS_BASE_H_ -#define _PMS_BASE_H_ - -#include - -/** - * @brief Class define how to handle plantower PMS sensor it's upport for - * PMS5003 and PMS5003T series. The data @ref AMB_TMP and @ref AMB_HUM only - * valid on PMS5003T - */ -class PMS { -public: - static const uint16_t SINGLE_RESPONSE_TIME = 1000; - static const uint16_t TOTAL_RESPONSE_TIME = 1000 * 10; - static const uint16_t STEADY_RESPONSE_TIME = 1000 * 30; - - // static const uint16_t BAUD_RATE = 9600; - - struct DATA { - // Standard Particles, CF=1 - uint16_t PM_SP_UG_1_0; - uint16_t PM_SP_UG_2_5; - uint16_t PM_SP_UG_10_0; - - // Atmospheric environment - uint16_t PM_AE_UG_1_0; - uint16_t PM_AE_UG_2_5; - uint16_t PM_AE_UG_10_0; - - // Raw particles count (number of particles in 0.1l of air - uint16_t PM_RAW_0_3; - uint16_t PM_RAW_0_5; - uint16_t PM_RAW_1_0; - uint16_t PM_RAW_2_5; - uint16_t PM_RAW_5_0; - uint16_t PM_RAW_10_0; - - // Formaldehyde (HCHO) concentration in mg/m^3 - PMSxxxxST units only - uint16_t AMB_HCHO; - - // Temperature & humidity - PMSxxxxST units only - int16_t AMB_TMP; - uint16_t AMB_HUM; - }; - - bool begin(Stream *stream); - void sleep(); - void wakeUp(); - void activeMode(); - void passiveMode(); - - void requestRead(); - bool read(DATA &data); - bool readUntil(DATA &data, uint16_t timeout = SINGLE_RESPONSE_TIME); - -private: - enum STATUS { STATUS_WAITING, STATUS_OK }; - enum MODE { MODE_ACTIVE, MODE_PASSIVE }; - - uint8_t _payload[50]; - Stream *_stream; - DATA *_data; - STATUS _status; - MODE _mode = MODE_ACTIVE; - - uint8_t _index = 0; - uint16_t _frameLen; - uint16_t _checksum; - uint16_t _calculatedChecksum; - - void loop(); - char Char_PM2[10]; -}; - -#endif diff --git a/src/s8/mb_crc.cpp b/src/s8/mb_crc.cpp deleted file mode 100644 index 462cca1..0000000 --- a/src/s8/mb_crc.cpp +++ /dev/null @@ -1,73 +0,0 @@ -#include "mb_crc.h" -#include - -/* ModBus CRC routine extracted from - * https://modbus.org/docs/Modbus_over_serial_line_V1_02.pdf */ - -/* Table of CRC values for high–order byte */ -static const uint8_t auchCRCHi[] = { - 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, - 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, - 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, - 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, - 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, - 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, - 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, - 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, - 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, - 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, - 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, - 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, - 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, - 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, - 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, - 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, - 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, - 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, - 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, - 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, - 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, - 0x00, 0xC1, 0x81, 0x40}; - -/* Table of CRC values for low–order byte */ -static const uint8_t auchCRCLo[] = { - 0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06, 0x07, 0xC7, - 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD, 0x0F, 0xCF, 0xCE, 0x0E, - 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09, 0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, - 0x1B, 0xDB, 0xDA, 0x1A, 0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, - 0x14, 0xD4, 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3, - 0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3, 0xF2, 0x32, - 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4, 0x3C, 0xFC, 0xFD, 0x3D, - 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A, 0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, - 0x28, 0xE8, 0xE9, 0x29, 0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, - 0x2D, 0xED, 0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26, - 0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60, 0x61, 0xA1, - 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67, 0xA5, 0x65, 0x64, 0xA4, - 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F, 0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, - 0x69, 0xA9, 0xA8, 0x68, 0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA, - 0xBE, 0x7E, 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5, - 0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71, 0x70, 0xB0, - 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92, 0x96, 0x56, 0x57, 0x97, - 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C, 0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, - 0x5A, 0x9A, 0x9B, 0x5B, 0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, - 0x4B, 0x8B, 0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C, - 0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42, 0x43, 0x83, - 0x41, 0x81, 0x80, 0x40}; - -uint16_t AgMb16Crc(uint8_t *puchMsg, uint16_t usDataLen) { - /* - puchMsg -> message to calculate CRC upon - usDataLen -> quantity of bytes in message - */ - uint8_t uchCRCHi = 0xFF; /* high byte of CRC initialized */ - uint8_t uchCRCLo = 0xFF; /* low byte of CRC initialized */ - uint16_t uIndex; /* will index into CRC lookup table */ - - while (usDataLen--) /* pass through message buffer */ - { - uIndex = uchCRCLo ^ *puchMsg++; /* calculate the CRC */ - uchCRCLo = uchCRCHi ^ auchCRCHi[uIndex]; - uchCRCHi = auchCRCLo[uIndex]; - } - return (uchCRCHi << 8 | uchCRCLo); -} diff --git a/src/s8/mb_crc.h b/src/s8/mb_crc.h deleted file mode 100644 index b15274b..0000000 --- a/src/s8/mb_crc.h +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef _AIR_GRADIENT_MODBUS_CRC_H_ -#define _AIR_GRADIENT_MODBUS_CRC_H_ - -#include - -uint16_t AgMb16Crc(uint8_t *buf, uint16_t len); - -#endif /** _AIR_GRADIENT_MODBUS_CRC_H_ */ From cb4d9372f82fc8dc7ade5e77b391fdb6877a0996 Mon Sep 17 00:00:00 2001 From: Phat Nguyen Date: Sun, 18 Feb 2024 10:35:20 +0700 Subject: [PATCH 15/26] Add device webserver to get measure data at `/measures/current` --- examples/ONE_I-9PSL/ONE_I-9PSL.ino | 104 +++++++++++++++++++---------- 1 file changed, 68 insertions(+), 36 deletions(-) diff --git a/examples/ONE_I-9PSL/ONE_I-9PSL.ino b/examples/ONE_I-9PSL/ONE_I-9PSL.ino index 9e19de5..5a64055 100644 --- a/examples/ONE_I-9PSL/ONE_I-9PSL.ino +++ b/examples/ONE_I-9PSL/ONE_I-9PSL.ino @@ -46,6 +46,7 @@ CC BY-SA 4.0 Attribution-ShareAlike 4.0 International License #include #include #include +#include /** * @brief Application state machine state @@ -549,6 +550,9 @@ U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/U8X8_PIN_NONE); /** wifi manager instance */ WiFiManager wifiManager; +/** Web server instance */ +WebServer webServer; + static bool wifiHasConfig = false; /** */ static int connectCountDown; /** wifi configuration countdown */ static int ledCount; /** For LED animation */ @@ -587,6 +591,8 @@ static void sendDataToServer(void); static void tempHumPoll(void); static void co2Poll(void); static void showNr(void); +static void webServerInit(void); +static String getServerSyncData(void); /** Init schedule */ AgSchedule dispLedSchedule(DISP_UPDATE_INTERVAL, updateDispLedBar); @@ -646,6 +652,8 @@ void setup() { * Send first data to ping server and get server configuration */ if (WiFi.status() == WL_CONNECTED) { + webServerInit(); + sendPing(); Serial.println(F("WiFi connected!")); Serial.println("IP address: "); @@ -762,6 +770,65 @@ static void co2Poll(void) { static void showNr(void) { Serial.println("Serial nr: " + getDevId()); } +void webServerMeasureCurrentGet(void) { + webServer.send(200, "application/json", getServerSyncData()); +} + +void webServerHandler(void* param) { + for (;;) { + webServer.handleClient(); + } +} + +static void webServerInit(void) { + webServer.on("/measures/current", HTTP_GET, webServerMeasureCurrentGet); + webServer.begin(); + + if (xTaskCreate(webServerHandler, "webserver", 1024 * 4, NULL, 5, NULL) != + pdTRUE) { + Serial.println("Create task handle webserver failed"); + } + Serial.println("Webserver init"); +} + +static String getServerSyncData(void) { + JSONVar root; + root["wifi"] = WiFi.RSSI(); + if (co2Ppm >= 0) { + root["rco2"] = co2Ppm; + } + if (pm01 >= 0) { + root["pm01"] = pm01; + } + if (pm25 >= 0) { + root["pm02"] = pm25; + } + if (pm10 >= 0) { + root["pm10"] = pm10; + } + if (pm03PCount >= 0) { + root["pm003_count"] = pm03PCount; + } + if (tvocIndex >= 0) { + root["tvoc_index"] = tvocIndex; + } + if (tvocRawIndex >= 0) { + root["tvoc_raw"] = tvocRawIndex; + } + if (noxIndex >= 0) { + root["noxIndex"] = noxIndex; + } + if (temp >= 0) { + root["atmp"] = ag.round2(temp); + } + if (hum >= 0) { + root["rhum"] = hum; + } + root["boot"] = bootCount; + + return JSON.stringify(root); +} + static void sendPing() { JSONVar root; root["wifi"] = WiFi.RSSI(); @@ -1598,41 +1665,7 @@ static void pmPoll(void) { * */ static void sendDataToServer(void) { - JSONVar root; - root["wifi"] = WiFi.RSSI(); - if (co2Ppm >= 0) { - root["rco2"] = co2Ppm; - } - if (pm01 >= 0) { - root["pm01"] = pm01; - } - if (pm25 >= 0) { - root["pm02"] = pm25; - } - if (pm10 >= 0) { - root["pm10"] = pm10; - } - if (pm03PCount >= 0) { - root["pm003_count"] = pm03PCount; - } - if (tvocIndex >= 0) { - root["tvoc_index"] = tvocIndex; - } - if (tvocRawIndex >= 0) { - root["tvoc_raw"] = tvocRawIndex; - } - if (noxIndex >= 0) { - root["noxIndex"] = noxIndex; - } - if (temp >= 0) { - root["atmp"] = ag.round2(temp); - } - if (hum >= 0) { - root["rhum"] = hum; - } - root["boot"] = bootCount; - - String syncData = JSON.stringify(root); + String syncData = getServerSyncData(); if (agServer.postToServer(getDevId(), syncData)) { resetWatchdog(); } @@ -1664,7 +1697,6 @@ static void tempHumPoll(void) { } } - static void mqtt_event_handler(void *handler_args, esp_event_base_t base, int32_t event_id, void *event_data) { From 589b98d97e689ff0ec62432eb4f8d9bcb30d4032 Mon Sep 17 00:00:00 2001 From: Phat Nguyen Date: Sun, 18 Feb 2024 10:49:06 +0700 Subject: [PATCH 16/26] Better server configure for `abcDays` debug message --- examples/BASIC_v4/BASIC_v4.ino | 15 ++++++++++----- examples/ONE_I-9PSL/ONE_I-9PSL.ino | 19 +++++++++++++------ examples/Open_Air/Open_Air.ino | 23 ++++++++++++++--------- 3 files changed, 37 insertions(+), 20 deletions(-) diff --git a/examples/BASIC_v4/BASIC_v4.ino b/examples/BASIC_v4/BASIC_v4.ino index c94d793..def607e 100644 --- a/examples/BASIC_v4/BASIC_v4.ino +++ b/examples/BASIC_v4/BASIC_v4.ino @@ -569,14 +569,19 @@ static void serverConfigPoll(void) { co2Calibration(); } if (agServer.getCo2AbcDaysConfig() > 0) { + int newHour = agServer.getCo2AbcDaysConfig() * 24; Serial.printf("abcDays config: %d days(%d hours)\r\n", - agServer.getCo2AbcDaysConfig(), - agServer.getCo2AbcDaysConfig() * 24); + agServer.getCo2AbcDaysConfig(), newHour); + int curHour = ag.s8.getAbcPeriod(); Serial.printf("Current config: %d (hours)\r\n", ag.s8.getAbcPeriod()); - if (ag.s8.setAbcPeriod(agServer.getCo2AbcDaysConfig() * 24) == false) { - Serial.println("Set S8 abcDays period calib failed"); + if (curHour == newHour) { + Serial.println("set 'abcDays' ignored"); } else { - Serial.println("Set S8 abcDays period calib success"); + if (ag.s8.setAbcPeriod(agServer.getCo2AbcDaysConfig() * 24) == false) { + Serial.println("Set S8 abcDays period calib failed"); + } else { + Serial.println("Set S8 abcDays period calib success"); + } } } } diff --git a/examples/ONE_I-9PSL/ONE_I-9PSL.ino b/examples/ONE_I-9PSL/ONE_I-9PSL.ino index 5a64055..51032b9 100644 --- a/examples/ONE_I-9PSL/ONE_I-9PSL.ino +++ b/examples/ONE_I-9PSL/ONE_I-9PSL.ino @@ -774,7 +774,7 @@ void webServerMeasureCurrentGet(void) { webServer.send(200, "application/json", getServerSyncData()); } -void webServerHandler(void* param) { +void webServerHandler(void *param) { for (;;) { webServer.handleClient(); } @@ -1269,17 +1269,24 @@ static void serverConfigPoll(void) { if (agServer.isCo2Calib()) { co2Calibration(); } + if (agServer.getCo2AbcDaysConfig() > 0) { + int newHour = agServer.getCo2AbcDaysConfig() * 24; Serial.printf("abcDays config: %d days(%d hours)\r\n", - agServer.getCo2AbcDaysConfig(), - agServer.getCo2AbcDaysConfig() * 24); + agServer.getCo2AbcDaysConfig(), newHour); + int curHour = ag.s8.getAbcPeriod(); Serial.printf("Current config: %d (hours)\r\n", ag.s8.getAbcPeriod()); - if (ag.s8.setAbcPeriod(agServer.getCo2AbcDaysConfig() * 24) == false) { - Serial.println("Set S8 abcDays period calib failed"); + if (curHour == newHour) { + Serial.println("set 'abcDays' ignored"); } else { - Serial.println("Set S8 abcDays period calib success"); + if (ag.s8.setAbcPeriod(agServer.getCo2AbcDaysConfig() * 24) == false) { + Serial.println("Set S8 abcDays period calib failed"); + } else { + Serial.println("Set S8 abcDays period calib success"); + } } } + if (agServer.isLedBarTestRequested()) { if (agServer.getCountry() == "TH") { ledTest2Min(); diff --git a/examples/Open_Air/Open_Air.ino b/examples/Open_Air/Open_Air.ino index bc1c867..f24c30f 100644 --- a/examples/Open_Air/Open_Air.ino +++ b/examples/Open_Air/Open_Air.ino @@ -444,10 +444,8 @@ public: } /** Register event */ - if (esp_mqtt_client_register_event( - client, MQTT_EVENT_ANY, - mqtt_event_handler, - NULL) != ESP_OK) { + if (esp_mqtt_client_register_event(client, MQTT_EVENT_ANY, + mqtt_event_handler, NULL) != ESP_OK) { Serial.println("mqtt client register event failed"); return false; } @@ -980,15 +978,22 @@ static void serverConfigPoll(void) { if (agServer.isCo2Calib()) { co2Calibration(); } + if (agServer.getCo2AbcDaysConfig() > 0) { + int newHour = agServer.getCo2AbcDaysConfig() * 24; Serial.printf("abcDays config: %d days(%d hours)\r\n", - agServer.getCo2AbcDaysConfig(), - agServer.getCo2AbcDaysConfig() * 24); + agServer.getCo2AbcDaysConfig(), newHour); + int curHour = ag.s8.getAbcPeriod(); Serial.printf("Current config: %d (hours)\r\n", ag.s8.getAbcPeriod()); - if (ag.s8.setAbcPeriod(agServer.getCo2AbcDaysConfig() * 24) == false) { - Serial.println("Set S8 abcDays period calib failed"); + if (curHour == newHour) { + Serial.println("set 'abcDays' ignored"); } else { - Serial.println("Set S8 abcDays period calib success"); + if (ag.s8.setAbcPeriod(agServer.getCo2AbcDaysConfig() * 24) == + false) { + Serial.println("Set S8 abcDays period calib failed"); + } else { + Serial.println("Set S8 abcDays period calib success"); + } } } } From 26a8b065bc76e5e812a7837f824fd2c3ebff234e Mon Sep 17 00:00:00 2001 From: Phat Nguyen Date: Sun, 18 Feb 2024 10:59:01 +0700 Subject: [PATCH 17/26] fix: wifi not connect if LED test with button request --- examples/ONE_I-9PSL/ONE_I-9PSL.ino | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/examples/ONE_I-9PSL/ONE_I-9PSL.ino b/examples/ONE_I-9PSL/ONE_I-9PSL.ino index 51032b9..c931435 100644 --- a/examples/ONE_I-9PSL/ONE_I-9PSL.ino +++ b/examples/ONE_I-9PSL/ONE_I-9PSL.ino @@ -643,10 +643,9 @@ void setup() { } if (test) { ledTest(); - } else { - /** WIFI connect */ - connectToWifi(); } + /** WIFI connect */ + connectToWifi(); /** * Send first data to ping server and get server configuration From e16966d092900a8fc0bd99e5cd90cdba84a9ca82 Mon Sep 17 00:00:00 2001 From: Phat Nguyen Date: Sun, 18 Feb 2024 11:06:06 +0700 Subject: [PATCH 18/26] Add webserver to get measure data on example `Open_Air` --- examples/Open_Air/Open_Air.ino | 166 ++++++++++++++++++++------------- 1 file changed, 99 insertions(+), 67 deletions(-) diff --git a/examples/Open_Air/Open_Air.ino b/examples/Open_Air/Open_Air.ino index f24c30f..71448d4 100644 --- a/examples/Open_Air/Open_Air.ino +++ b/examples/Open_Air/Open_Air.ino @@ -40,6 +40,7 @@ CC BY-SA 4.0 Attribution-ShareAlike 4.0 International License #include #include #include +#include #include #include @@ -517,6 +518,9 @@ WiFiManager wifiManager; /** wifi manager instance */ static bool wifiHasConfig = false; static String wifiSSID = ""; +/** Web server instance */ +WebServer webServer; + int tvocIndex = -1; int tvocRawIndex = -1; int noxIndex = -1; @@ -570,6 +574,8 @@ static void co2Poll(void); static void serverConfigPoll(void); static const char *getFwMode(int mode); static void showNr(void); +static void webServerInit(void); +static String getServerSyncData(void); AgSchedule configSchedule(SERVER_CONFIG_UPDATE_INTERVAL, serverConfigPoll); AgSchedule serverSchedule(SERVER_SYNC_INTERVAL, sendDataToServer); @@ -592,6 +598,8 @@ void setup() { connectToWifi(); if (WiFi.isConnected()) { + webServerInit(); + wifiHasConfig = true; sendPing(); @@ -631,73 +639,7 @@ void sendPing() { } static void sendDataToServer(void) { - JSONVar root; - root["wifi"] = WiFi.RSSI(); - root["boot"] = loopCount; - if (fw_mode == FW_MODE_PST) { - if (co2Ppm >= 0) { - root["rco2"] = co2Ppm; - } - if (pm01_1 >= 0) { - root["pm01"] = pm01_1; - } - if (pm25_1 >= 0) { - root["pm02"] = pm25_1; - } - if (pm10_1 >= 0) { - root["pm10"] = pm10_1; - } - if (pm03PCount_1 >= 0) { - root["pm003_count"] = pm03PCount_1; - } - if (tvocIndex >= 0) { - root["tvoc_index"] = tvocIndex; - } - if (noxIndex >= 0) { - root["noxIndex"] = noxIndex; - } - if (temp_1 >= 0) { - root["atmp"] = ag.round2(temp_1); - } - if (hum_1 >= 0) { - root["rhum"] = hum_1; - } - } - - if ((fw_mode == FW_MODE_PPT) || (fw_mode == FW_MODE_PST)) { - if (tvocIndex > 0) { - root["tvoc_index"] = loopCount; - } - if (tvocRawIndex >= 0) { - root["tvoc_raw"] = tvocRawIndex; - } - if (noxIndex > 0) { - root["nox_index"] = loopCount; - } - } - - if ((fw_mode == FW_MODE_PP) || (fw_mode == FW_MODE_PPT)) { - root["pm01"] = ag.round2((pm01_1 + pm01_2) / 2.0); - root["pm02"] = ag.round2((pm25_1 + pm25_2) / 2.0); - root["pm003_count"] = ag.round2((pm03PCount_1 + pm03PCount_2) / 2.0); - root["atmp"] = ag.round2((temp_1 + temp_2) / 2.0); - root["rhum"] = ag.round2((hum_1 + hum_2) / 2.0); - root["channels"]["1"]["pm01"] = pm01_1; - root["channels"]["1"]["pm02"] = pm25_1; - root["channels"]["1"]["pm10"] = pm10_1; - root["channels"]["1"]["pm003_count"] = pm03PCount_1; - root["channels"]["1"]["atmp"] = ag.round2(temp_1); - root["channels"]["1"]["rhum"] = hum_1; - root["channels"]["2"]["pm01"] = pm01_2; - root["channels"]["2"]["pm02"] = pm25_2; - root["channels"]["2"]["pm10"] = pm10_2; - root["channels"]["2"]["pm003_count"] = pm03PCount_2; - root["channels"]["2"]["atmp"] = ag.round2(temp_2); - root["channels"]["2"]["rhum"] = hum_2; - } - - /** Send data to sensor */ - String syncData = JSON.stringify(root); + String syncData = getServerSyncData(); if (agServer.postToServer(getDevId(), syncData)) { resetWatchdog(); } @@ -1129,6 +1071,96 @@ static const char *getFwMode(int mode) { static void showNr(void) { Serial.println("Serial nr: " + getDevId()); } +void webServerMeasureCurrentGet(void) { + webServer.send(200, "application/json", getServerSyncData()); +} + +void webServerHandler(void *param) { + for (;;) { + webServer.handleClient(); + } +} + +static void webServerInit(void) { + webServer.on("/measures/current", HTTP_GET, webServerMeasureCurrentGet); + webServer.begin(); + + if (xTaskCreate(webServerHandler, "webserver", 1024 * 4, NULL, 5, NULL) != + pdTRUE) { + Serial.println("Create task handle webserver failed"); + } + Serial.println("Webserver init"); +} + +static String getServerSyncData(void) { + JSONVar root; + root["wifi"] = WiFi.RSSI(); + root["boot"] = loopCount; + if (fw_mode == FW_MODE_PST) { + if (co2Ppm >= 0) { + root["rco2"] = co2Ppm; + } + if (pm01_1 >= 0) { + root["pm01"] = pm01_1; + } + if (pm25_1 >= 0) { + root["pm02"] = pm25_1; + } + if (pm10_1 >= 0) { + root["pm10"] = pm10_1; + } + if (pm03PCount_1 >= 0) { + root["pm003_count"] = pm03PCount_1; + } + if (tvocIndex >= 0) { + root["tvoc_index"] = tvocIndex; + } + if (noxIndex >= 0) { + root["noxIndex"] = noxIndex; + } + if (temp_1 >= 0) { + root["atmp"] = ag.round2(temp_1); + } + if (hum_1 >= 0) { + root["rhum"] = hum_1; + } + } + + if ((fw_mode == FW_MODE_PPT) || (fw_mode == FW_MODE_PST)) { + if (tvocIndex > 0) { + root["tvoc_index"] = loopCount; + } + if (tvocRawIndex >= 0) { + root["tvoc_raw"] = tvocRawIndex; + } + if (noxIndex > 0) { + root["nox_index"] = loopCount; + } + } + + if ((fw_mode == FW_MODE_PP) || (fw_mode == FW_MODE_PPT)) { + root["pm01"] = ag.round2((pm01_1 + pm01_2) / 2.0); + root["pm02"] = ag.round2((pm25_1 + pm25_2) / 2.0); + root["pm003_count"] = ag.round2((pm03PCount_1 + pm03PCount_2) / 2.0); + root["atmp"] = ag.round2((temp_1 + temp_2) / 2.0); + root["rhum"] = ag.round2((hum_1 + hum_2) / 2.0); + root["channels"]["1"]["pm01"] = pm01_1; + root["channels"]["1"]["pm02"] = pm25_1; + root["channels"]["1"]["pm10"] = pm10_1; + root["channels"]["1"]["pm003_count"] = pm03PCount_1; + root["channels"]["1"]["atmp"] = ag.round2(temp_1); + root["channels"]["1"]["rhum"] = hum_1; + root["channels"]["2"]["pm01"] = pm01_2; + root["channels"]["2"]["pm02"] = pm25_2; + root["channels"]["2"]["pm10"] = pm10_2; + root["channels"]["2"]["pm003_count"] = pm03PCount_2; + root["channels"]["2"]["atmp"] = ag.round2(temp_2); + root["channels"]["2"]["rhum"] = hum_2; + } + + return JSON.stringify(root); +} + static void mqtt_event_handler(void *handler_args, esp_event_base_t base, int32_t event_id, void *event_data) { From e09128572cad6b4912055c0426cbf0dc94a89dc1 Mon Sep 17 00:00:00 2001 From: Phat Nguyen Date: Sun, 18 Feb 2024 12:43:37 +0700 Subject: [PATCH 19/26] fix: FW stops if some sensor not found --- examples/BASIC_v4/BASIC_v4.ino | 61 +++-- examples/ONE_I-9PSL/ONE_I-9PSL.ino | 134 ++++++---- examples/Open_Air/Open_Air.ino | 379 +++++++++++++++++++---------- 3 files changed, 373 insertions(+), 201 deletions(-) diff --git a/examples/BASIC_v4/BASIC_v4.ino b/examples/BASIC_v4/BASIC_v4.ino index def607e..eac568f 100644 --- a/examples/BASIC_v4/BASIC_v4.ino +++ b/examples/BASIC_v4/BASIC_v4.ino @@ -359,7 +359,7 @@ AirGradient ag = AirGradient(DIY_BASIC); static int co2Ppm = -1; static int pm25 = -1; -static float temp = -1; +static float temp = -1001; static int hum = -1; static long val; static String wifiSSID = ""; @@ -378,6 +378,9 @@ static String getDevId(void); static void updateWiFiConnect(void); static void showNr(void); +bool hasSensorS8 = true; +bool hasSensorPMS = true; +bool hasSensorSHT = true; AgSchedule configSchedule(SERVER_CONFIG_UPDATE_INTERVAL, serverConfigPoll); AgSchedule serverSchedule(SERVER_SYNC_INTERVAL, sendDataToServer); AgSchedule dispSchedule(DISP_UPDATE_INTERVAL, dispHandler); @@ -438,9 +441,15 @@ void loop() { configSchedule.run(); serverSchedule.run(); dispSchedule.run(); - co2Schedule.run(); - pmsSchedule.run(); - tempHumSchedule.run(); + if (hasSensorS8) { + co2Schedule.run(); + } + if (hasSensorPMS) { + pmsSchedule.run(); + } + if (hasSensorSHT) { + tempHumSchedule.run(); + } updateWiFiConnect(); } @@ -510,17 +519,20 @@ void connectToWifi() { static void boardInit(void) { /** Init SHT sensor */ if (ag.sht.begin(Wire) == false) { - failedHandler("SHT init failed"); + hasSensorSHT = false; + Serial.println("SHT sensor not found"); } /** CO2 init */ if (ag.s8.begin(&Serial) == false) { - failedHandler("SenseAirS8 init failed"); + Serial.println("CO2 S8 snsor not found"); + hasSensorS8 = false; } /** PMS init */ if (ag.pms5003.begin(&Serial) == false) { - failedHandler("PMS5003 init failed"); + Serial.println("PMS sensor not found"); + hasSensorPMS = false; } /** Display init */ @@ -566,22 +578,31 @@ static void co2Calibration(void) { static void serverConfigPoll(void) { if (agServer.pollServerConfig(getDevId())) { if (agServer.isCo2Calib()) { - co2Calibration(); + if (hasSensorS8) { + co2Calibration(); + } else { + Serial.println("CO2 S8 not available, calib ignored"); + } } if (agServer.getCo2AbcDaysConfig() > 0) { - int newHour = agServer.getCo2AbcDaysConfig() * 24; - Serial.printf("abcDays config: %d days(%d hours)\r\n", - agServer.getCo2AbcDaysConfig(), newHour); - int curHour = ag.s8.getAbcPeriod(); - Serial.printf("Current config: %d (hours)\r\n", ag.s8.getAbcPeriod()); - if (curHour == newHour) { - Serial.println("set 'abcDays' ignored"); - } else { - if (ag.s8.setAbcPeriod(agServer.getCo2AbcDaysConfig() * 24) == false) { - Serial.println("Set S8 abcDays period calib failed"); + if (hasSensorS8) { + int newHour = agServer.getCo2AbcDaysConfig() * 24; + Serial.printf("abcDays config: %d days(%d hours)\r\n", + agServer.getCo2AbcDaysConfig(), newHour); + int curHour = ag.s8.getAbcPeriod(); + Serial.printf("Current config: %d (hours)\r\n", ag.s8.getAbcPeriod()); + if (curHour == newHour) { + Serial.println("set 'abcDays' ignored"); } else { - Serial.println("Set S8 abcDays period calib success"); + if (ag.s8.setAbcPeriod(agServer.getCo2AbcDaysConfig() * 24) == + false) { + Serial.println("Set S8 abcDays period calib failed"); + } else { + Serial.println("Set S8 abcDays period calib success"); + } } + } else { + Serial.println("CO2 S8 not available, set 'abcDays' ignored"); } } } @@ -621,7 +642,7 @@ static void sendDataToServer() { if (pm25 >= 0) { root["pm02"] = pm25; } - if (temp >= 0) { + if (temp > -1001) { root["atmp"] = ag.round2(temp); } if (hum >= 0) { diff --git a/examples/ONE_I-9PSL/ONE_I-9PSL.ino b/examples/ONE_I-9PSL/ONE_I-9PSL.ino index c931435..55cf742 100644 --- a/examples/ONE_I-9PSL/ONE_I-9PSL.ino +++ b/examples/ONE_I-9PSL/ONE_I-9PSL.ino @@ -567,7 +567,7 @@ static int pm25 = -1; static int pm01 = -1; static int pm10 = -1; static int pm03PCount = -1; -static float temp = -1; +static float temp = -1001; static int hum = -1; static int bootCount; static String wifiSSID = ""; @@ -595,6 +595,10 @@ static void webServerInit(void); static String getServerSyncData(void); /** Init schedule */ +bool hasSensorS8 = true; +bool hasSensorPMS = true; +bool hasSensorSGP = true; +bool hasSensorSHT = true; AgSchedule dispLedSchedule(DISP_UPDATE_INTERVAL, updateDispLedBar); AgSchedule configSchedule(SERVER_CONFIG_UPDATE_INTERVAL, serverConfigPoll); AgSchedule serverSchedule(SERVER_SYNC_INTERVAL, sendDataToServer); @@ -680,10 +684,22 @@ void loop() { dispLedSchedule.run(); configSchedule.run(); serverSchedule.run(); - co2Schedule.run(); - pmsSchedule.run(); - tempHumSchedule.run(); - tvocSchedule.run(); + + if (hasSensorS8) { + co2Schedule.run(); + } + + if (hasSensorPMS) { + pmsSchedule.run(); + } + + if (hasSensorSHT) { + tempHumSchedule.run(); + } + + if (hasSensorSGP) { + tvocSchedule.run(); + } /** Check for handle WiFi reconnect */ updateWiFiConnect(); @@ -793,35 +809,43 @@ static void webServerInit(void) { static String getServerSyncData(void) { JSONVar root; root["wifi"] = WiFi.RSSI(); - if (co2Ppm >= 0) { - root["rco2"] = co2Ppm; + if (hasSensorS8) { + if (co2Ppm >= 0) { + root["rco2"] = co2Ppm; + } } - if (pm01 >= 0) { - root["pm01"] = pm01; + if (hasSensorPMS) { + if (pm01 >= 0) { + root["pm01"] = pm01; + } + if (pm25 >= 0) { + root["pm02"] = pm25; + } + if (pm10 >= 0) { + root["pm10"] = pm10; + } + if (pm03PCount >= 0) { + root["pm003_count"] = pm03PCount; + } } - if (pm25 >= 0) { - root["pm02"] = pm25; + if (hasSensorSGP) { + if (tvocIndex >= 0) { + root["tvoc_index"] = tvocIndex; + } + if (tvocRawIndex >= 0) { + root["tvoc_raw"] = tvocRawIndex; + } + if (noxIndex >= 0) { + root["noxIndex"] = noxIndex; + } } - if (pm10 >= 0) { - root["pm10"] = pm10; - } - if (pm03PCount >= 0) { - root["pm003_count"] = pm03PCount; - } - if (tvocIndex >= 0) { - root["tvoc_index"] = tvocIndex; - } - if (tvocRawIndex >= 0) { - root["tvoc_raw"] = tvocRawIndex; - } - if (noxIndex >= 0) { - root["noxIndex"] = noxIndex; - } - if (temp >= 0) { - root["atmp"] = ag.round2(temp); - } - if (hum >= 0) { - root["rhum"] = hum; + if (hasSensorSHT) { + if (temp > -1001) { + root["atmp"] = ag.round2(temp); + } + if (hum >= 0) { + root["rhum"] = hum; + } } root["boot"] = bootCount; @@ -1226,12 +1250,14 @@ static void boardInit(void) { /** Init sensor SGP41 */ if (ag.sgp41.begin(Wire) == false) { - failedHandler("Init SGP41 failed"); + Serial.println("SGP41 sensor not found"); + hasSensorSGP = false; } /** INit SHT */ if (ag.sht.begin(Wire) == false) { - failedHandler("Init SHT failed"); + Serial.println("SHTx sensor not found"); + hasSensorSHT = false; } /** Init watchdog */ @@ -1239,12 +1265,15 @@ static void boardInit(void) { /** Init S8 CO2 sensor */ if (ag.s8.begin(Serial1) == false) { - failedHandler("Init SenseAirS8 failed"); + // failedHandler("Init SenseAirS8 failed"); + Serial.println("CO2 S8 sensor not found"); + hasSensorS8 = false; } /** Init PMS5003 */ if (ag.pms5003.begin(Serial0) == false) { - failedHandler("Init PMS5003 failed"); + Serial.println("PMS sensor not found"); + hasSensorPMS = false; } } @@ -1266,23 +1295,32 @@ static void failedHandler(String msg) { static void serverConfigPoll(void) { if (agServer.pollServerConfig(getDevId())) { if (agServer.isCo2Calib()) { - co2Calibration(); + if (hasSensorS8) { + co2Calibration(); + } else { + Serial.println("CO2 S8 not available, calib ignored"); + } } if (agServer.getCo2AbcDaysConfig() > 0) { - int newHour = agServer.getCo2AbcDaysConfig() * 24; - Serial.printf("abcDays config: %d days(%d hours)\r\n", - agServer.getCo2AbcDaysConfig(), newHour); - int curHour = ag.s8.getAbcPeriod(); - Serial.printf("Current config: %d (hours)\r\n", ag.s8.getAbcPeriod()); - if (curHour == newHour) { - Serial.println("set 'abcDays' ignored"); - } else { - if (ag.s8.setAbcPeriod(agServer.getCo2AbcDaysConfig() * 24) == false) { - Serial.println("Set S8 abcDays period calib failed"); + if (hasSensorS8) { + int newHour = agServer.getCo2AbcDaysConfig() * 24; + Serial.printf("abcDays config: %d days(%d hours)\r\n", + agServer.getCo2AbcDaysConfig(), newHour); + int curHour = ag.s8.getAbcPeriod(); + Serial.printf("Current config: %d (hours)\r\n", ag.s8.getAbcPeriod()); + if (curHour == newHour) { + Serial.println("set 'abcDays' ignored"); } else { - Serial.println("Set S8 abcDays period calib success"); + if (ag.s8.setAbcPeriod(agServer.getCo2AbcDaysConfig() * 24) == + false) { + Serial.println("Set S8 abcDays period calib failed"); + } else { + Serial.println("Set S8 abcDays period calib success"); + } } + } else { + Serial.println("CO2 S8 not available, set 'abcDays' ignored"); } } @@ -1638,6 +1676,7 @@ static void tvocPoll(void) { tvocRawIndex = ag.sgp41.getTvocRaw(); noxIndex = ag.sgp41.getNoxIndex(); + Serial.println(); Serial.printf(" TVOC index: %d\r\n", tvocIndex); Serial.printf("TVOC raw index: %d\r\n", tvocRawIndex); Serial.printf(" NOx index: %d\r\n", noxIndex); @@ -1654,6 +1693,7 @@ static void pmPoll(void) { pm10 = ag.pms5003.getPm10Ae(); pm03PCount = ag.pms5003.getPm03ParticleCount(); + Serial.println(); Serial.printf(" PMS0.1: %d\r\n", pm01); Serial.printf(" PMS2.5: %d\r\n", pm25); Serial.printf(" PMS10.0: %d\r\n", pm10); diff --git a/examples/Open_Air/Open_Air.ino b/examples/Open_Air/Open_Air.ino index 71448d4..0533038 100644 --- a/examples/Open_Air/Open_Air.ino +++ b/examples/Open_Air/Open_Air.ino @@ -530,15 +530,15 @@ int pm25_1 = -1; int pm01_1 = -1; int pm10_1 = -1; int pm03PCount_1 = -1; -float temp_1; -int hum_1; +float temp_1 = -1001; +int hum_1 = -1; int pm25_2 = -1; int pm01_2 = -1; int pm10_2 = -1; int pm03PCount_2 = -1; -float temp_2; -int hum_2; +float temp_2 = -1001; +int hum_2 = -1; int pm1Value01; int pm1Value25; @@ -577,6 +577,10 @@ static void showNr(void); static void webServerInit(void); static String getServerSyncData(void); +bool hasSensorS8 = true; +bool hasSensorPMS1 = true; +bool hasSensorPMS2 = true; +bool hasSensorSGP = true; AgSchedule configSchedule(SERVER_CONFIG_UPDATE_INTERVAL, serverConfigPoll); AgSchedule serverSchedule(SERVER_SYNC_INTERVAL, sendDataToServer); AgSchedule co2Schedule(SENSOR_CO2_UPDATE_INTERVAL, co2Poll); @@ -616,12 +620,21 @@ void setup() { void loop() { configSchedule.run(); serverSchedule.run(); + if (fw_mode == FW_MODE_PST) { - co2Schedule.run(); + if (hasSensorS8) { + co2Schedule.run(); + } } - pmsSchedule.run(); + + if (hasSensorPMS1 || hasSensorPMS2) { + pmsSchedule.run(); + } + if (fw_mode == FW_MODE_PST || fw_mode == FW_MODE_PPT) { - tvocSchedule.run(); + if (hasSensorSGP) { + tvocSchedule.run(); + } } updateWiFiConnect(); } @@ -741,39 +754,50 @@ void boardInit(void) { } ag.watchdog.begin(); - ag.button.begin(); - ag.statusLed.begin(); /** detect sensor: PMS5003, PMS5003T, SGP41 and S8 */ if (ag.s8.begin(Serial1) == false) { - Serial.println("S8 not detect run mode 'PPT'"); + hasSensorS8 = false; + + Serial.println("CO2 S8 sensor not found"); + Serial.println("Can not detect S8 run mode 'PPT'"); fw_mode = FW_MODE_PPT; /** De-initialize Serial1 */ Serial1.end(); } if (ag.sgp41.begin(Wire) == false) { - if (fw_mode == FW_MODE_PST) { - failedHandler("Init SGP41 failed"); - } else { - Serial.println("SGP41 not detect run mode 'PP'"); - fw_mode = FW_MODE_PP; - } + hasSensorSGP = false; + Serial.println("SGP sensor not found"); + + Serial.println("Can not detect SGP run mode 'PP'"); + fw_mode = FW_MODE_PP; } if (ag.pms5003t_1.begin(Serial0) == false) { - failedHandler("Init PMS5003T_1 failed"); - } - if (fw_mode != FW_MODE_PST) { + hasSensorPMS1 = false; + Serial.println("PMS1 sensor not found"); + if (ag.pms5003t_2.begin(Serial1) == false) { - failedHandler("Init PMS5003T_2 failed"); + hasSensorPMS2 = false; + Serial.println("PMS2 sensor not found"); } } if (fw_mode != FW_MODE_PST) { - pmsSchedule.setPeriod(2000); + if (ag.pms5003t_2.begin(Serial1) == false) { + hasSensorPMS2 = false; + Serial.println("PMS2 sensor not found"); + } + } + + /** update the PMS poll period base on fw mode and sensor available */ + if (fw_mode != FW_MODE_PST) { + if (hasSensorPMS1 && hasSensorPMS2) { + pmsSchedule.setPeriod(2000); + } } Serial.printf("Firmware node: %s\r\n", getFwMode(fw_mode)); @@ -841,6 +865,7 @@ static void tvocPoll(void) { tvocRawIndex = ag.sgp41.getTvocRaw(); noxIndex = ag.sgp41.getNoxIndex(); + Serial.println(); Serial.printf(" TVOC index: %d\r\n", tvocIndex); Serial.printf("TVOC raw index: %d\r\n", tvocRawIndex); Serial.printf(" NOx index: %d\r\n", noxIndex); @@ -851,59 +876,109 @@ static void tvocPoll(void) { * */ static void pmPoll(void) { - if (fw_mode == FW_MODE_PST) { - if (ag.pms5003t_1.readData()) { - pm01_1 = ag.pms5003t_1.getPm01Ae(); - pm25_1 = ag.pms5003t_1.getPm25Ae(); - pm25_1 = ag.pms5003t_1.getPm10Ae(); - pm03PCount_1 = ag.pms5003t_1.getPm03ParticleCount(); - temp_1 = ag.pms5003t_1.getTemperature(); - hum_1 = ag.pms5003t_1.getRelativeHumidity(); - } + bool pmsResult_1 = false; + bool pmsResult_2 = false; + if (hasSensorPMS1 && ag.pms5003t_1.readData()) { + pm01_1 = ag.pms5003t_1.getPm01Ae(); + pm25_1 = ag.pms5003t_1.getPm25Ae(); + pm10_1 = ag.pms5003t_1.getPm10Ae(); + pm03PCount_1 = ag.pms5003t_1.getPm03ParticleCount(); + temp_1 = ag.pms5003t_1.getTemperature(); + hum_1 = ag.pms5003t_1.getRelativeHumidity(); + + pmsResult_1 = true; + + Serial.println(); + Serial.printf("[1] PMS0.1: %d\r\n", pm01_1); + Serial.printf("[1] PMS2.5: %d\r\n", pm25_1); + Serial.printf("[1] PMS10.0: %d\r\n", pm10_1); + Serial.printf("[1]PMS3.0 Count: %d\r\n", pm03PCount_1); + Serial.printf("[1] Temperature: %0.2f\r\n", temp_1); + Serial.printf("[1] Humidity: %d\r\n", hum_1); } else { - if (ag.pms5003t_1.readData() && ag.pms5003t_2.readData()) { - pm1Value01 = pm1Value01 + ag.pms5003t_1.getPm01Ae(); - pm1Value25 = pm1Value25 + ag.pms5003t_1.getPm25Ae(); - pm1Value10 = pm1Value10 + ag.pms5003t_1.getPm10Ae(); - pm1PCount = pm1PCount + ag.pms5003t_1.getPm03ParticleCount(); - pm1temp = pm1temp + ag.pms5003t_1.getTemperature(); - pm1hum = pm1hum + ag.pms5003t_1.getRelativeHumidity(); - pm2Value01 = pm2Value01 + ag.pms5003t_2.getPm01Ae(); - pm2Value25 = pm2Value25 + ag.pms5003t_2.getPm25Ae(); - pm2Value10 = pm2Value10 + ag.pms5003t_2.getPm10Ae(); - pm2PCount = pm2PCount + ag.pms5003t_2.getPm03ParticleCount(); - pm2temp = pm2temp + ag.pms5003t_2.getTemperature(); - pm2hum = pm2hum + ag.pms5003t_2.getRelativeHumidity(); - countPosition++; - if (countPosition == targetCount) { - pm01_1 = pm1Value01 / targetCount; - pm25_1 = pm1Value25 / targetCount; - pm10_1 = pm1Value10 / targetCount; - pm03PCount_1 = pm1PCount / targetCount; - temp_1 = pm1temp / targetCount; - hum_1 = pm1hum / targetCount; - pm01_2 = pm2Value01 / targetCount; - pm25_2 = pm2Value25 / targetCount; - pm10_2 = pm2Value10 / targetCount; - pm03PCount_2 = pm2PCount / targetCount; - temp_2 = pm2temp / targetCount; - hum_2 = pm2hum / targetCount; + pm01_1 = -1; + pm25_1 = -1; + pm10_1 = -1; + pm03PCount_1 = -1; + temp_1 = -1001; + hum_1 = -1; + } - countPosition = 0; + if (hasSensorPMS2 && ag.pms5003t_2.readData()) { + pm01_2 = ag.pms5003t_2.getPm01Ae(); + pm25_2 = ag.pms5003t_2.getPm25Ae(); + pm10_2 = ag.pms5003t_2.getPm10Ae(); + pm03PCount_2 = ag.pms5003t_2.getPm03ParticleCount(); + temp_2 = ag.pms5003t_2.getTemperature(); + hum_2 = ag.pms5003t_2.getRelativeHumidity(); - pm1Value01 = 0; - pm1Value25 = 0; - pm1Value10 = 0; - pm1PCount = 0; - pm1temp = 0; - pm1hum = 0; - pm2Value01 = 0; - pm2Value25 = 0; - pm2Value10 = 0; - pm2PCount = 0; - pm2temp = 0; - pm2hum = 0; - } + pmsResult_2 = true; + + Serial.println(); + Serial.printf("[2] PMS0.1: %d\r\n", pm01_2); + Serial.printf("[2] PMS2.5: %d\r\n", pm25_2); + Serial.printf("[2] PMS10.0: %d\r\n", pm10_2); + Serial.printf("[2]PMS3.0 Count: %d\r\n", pm03PCount_2); + Serial.printf("[2] Temperature: %0.2f\r\n", temp_2); + Serial.printf("[2] Humidity: %d\r\n", hum_2); + } else { + pm01_2 = -1; + pm25_2 = -1; + pm10_2 = -1; + pm03PCount_2 = -1; + temp_2 = -1001; + hum_2 = -1; + } + + if (hasSensorPMS1 && hasSensorPMS2 && pmsResult_1 && pmsResult_2) { + /** Get total of PMS1*/ + pm1Value01 = pm1Value01 + pm01_1; + pm1Value25 = pm1Value25 + pm25_1; + pm1Value10 = pm1Value10 + pm10_1; + pm1PCount = pm1PCount + pm03PCount_1; + pm1temp = pm1temp + temp_1; + pm1hum = pm1hum + hum_1; + + /** Get total of PMS2 */ + pm2Value01 = pm2Value01 + pm01_2; + pm2Value25 = pm2Value25 + pm25_2; + pm2Value10 = pm2Value10 + pm10_2; + pm2PCount = pm2PCount + pm03PCount_2; + pm2temp = pm2temp + temp_2; + pm2hum = pm2hum + hum_2; + + countPosition++; + + /** Get average */ + if (countPosition == targetCount) { + pm01_1 = pm1Value01 / targetCount; + pm25_1 = pm1Value25 / targetCount; + pm10_1 = pm1Value10 / targetCount; + pm03PCount_1 = pm1PCount / targetCount; + temp_1 = pm1temp / targetCount; + hum_1 = pm1hum / targetCount; + + pm01_2 = pm2Value01 / targetCount; + pm25_2 = pm2Value25 / targetCount; + pm10_2 = pm2Value10 / targetCount; + pm03PCount_2 = pm2PCount / targetCount; + temp_2 = pm2temp / targetCount; + hum_2 = pm2hum / targetCount; + + countPosition = 0; + + pm1Value01 = 0; + pm1Value25 = 0; + pm1Value10 = 0; + pm1PCount = 0; + pm1temp = 0; + pm1hum = 0; + pm2Value01 = 0; + pm2Value25 = 0; + pm2Value10 = 0; + pm2PCount = 0; + pm2temp = 0; + pm2hum = 0; } } } @@ -918,25 +993,33 @@ static void serverConfigPoll(void) { /** Only support CO2 S8 sensor on FW_MODE_PST */ if (fw_mode == FW_MODE_PST) { if (agServer.isCo2Calib()) { - co2Calibration(); + if (hasSensorS8) { + co2Calibration(); + } else { + Serial.println("CO2 S8 not available, calib ignored"); + } } if (agServer.getCo2AbcDaysConfig() > 0) { - int newHour = agServer.getCo2AbcDaysConfig() * 24; - Serial.printf("abcDays config: %d days(%d hours)\r\n", - agServer.getCo2AbcDaysConfig(), newHour); - int curHour = ag.s8.getAbcPeriod(); - Serial.printf("Current config: %d (hours)\r\n", ag.s8.getAbcPeriod()); - if (curHour == newHour) { - Serial.println("set 'abcDays' ignored"); - } else { - if (ag.s8.setAbcPeriod(agServer.getCo2AbcDaysConfig() * 24) == - false) { - Serial.println("Set S8 abcDays period calib failed"); + if (hasSensorS8) { + int newHour = agServer.getCo2AbcDaysConfig() * 24; + Serial.printf("abcDays config: %d days(%d hours)\r\n", + agServer.getCo2AbcDaysConfig(), newHour); + int curHour = ag.s8.getAbcPeriod(); + Serial.printf("Current config: %d (hours)\r\n", ag.s8.getAbcPeriod()); + if (curHour == newHour) { + Serial.println("set 'abcDays' ignored"); } else { - Serial.println("Set S8 abcDays period calib success"); + if (ag.s8.setAbcPeriod(agServer.getCo2AbcDaysConfig() * 24) == + false) { + Serial.println("Set S8 abcDays period calib failed"); + } else { + Serial.println("Set S8 abcDays period calib success"); + } } } + } else { + Serial.println("CO2 S8 not available, set 'abcDays' ignored"); } } @@ -1096,66 +1179,94 @@ static String getServerSyncData(void) { JSONVar root; root["wifi"] = WiFi.RSSI(); root["boot"] = loopCount; + if (fw_mode == FW_MODE_PST) { - if (co2Ppm >= 0) { - root["rco2"] = co2Ppm; + if (hasSensorS8) { + if (co2Ppm >= 0) { + root["rco2"] = co2Ppm; + } } - if (pm01_1 >= 0) { - root["pm01"] = pm01_1; - } - if (pm25_1 >= 0) { - root["pm02"] = pm25_1; - } - if (pm10_1 >= 0) { - root["pm10"] = pm10_1; - } - if (pm03PCount_1 >= 0) { - root["pm003_count"] = pm03PCount_1; - } - if (tvocIndex >= 0) { - root["tvoc_index"] = tvocIndex; - } - if (noxIndex >= 0) { - root["noxIndex"] = noxIndex; - } - if (temp_1 >= 0) { - root["atmp"] = ag.round2(temp_1); - } - if (hum_1 >= 0) { - root["rhum"] = hum_1; + + if (hasSensorPMS1) { + if (pm01_1 >= 0) { + root["pm01"] = pm01_1; + } + if (pm25_1 >= 0) { + root["pm02"] = pm25_1; + } + if (pm10_1 >= 0) { + root["pm10"] = pm10_1; + } + if (pm03PCount_1 >= 0) { + root["pm003_count"] = pm03PCount_1; + } + if (temp_1 > -1001) { + root["atmp"] = ag.round2(temp_1); + } + if (hum_1 >= 0) { + root["rhum"] = hum_1; + } + } else if (hasSensorPMS2) { + if (pm01_2 >= 0) { + root["pm01"] = pm01_2; + } + if (pm25_2 >= 0) { + root["pm02"] = pm25_2; + } + if (pm10_2 >= 0) { + root["pm10"] = pm10_2; + } + if (pm03PCount_2 >= 0) { + root["pm003_count"] = pm03PCount_2; + } + if (temp_2 > -1001) { + root["atmp"] = ag.round2(temp_2); + } + if (hum_2 >= 0) { + root["rhum"] = hum_2; + } } } if ((fw_mode == FW_MODE_PPT) || (fw_mode == FW_MODE_PST)) { - if (tvocIndex > 0) { - root["tvoc_index"] = loopCount; - } - if (tvocRawIndex >= 0) { - root["tvoc_raw"] = tvocRawIndex; - } - if (noxIndex > 0) { - root["nox_index"] = loopCount; + if (hasSensorSGP) { + if (tvocIndex > 0) { + root["tvoc_index"] = tvocIndex; + } + if (tvocRawIndex >= 0) { + root["tvoc_raw"] = tvocRawIndex; + } + if (noxIndex > 0) { + root["nox_index"] = noxIndex; + } } } if ((fw_mode == FW_MODE_PP) || (fw_mode == FW_MODE_PPT)) { - root["pm01"] = ag.round2((pm01_1 + pm01_2) / 2.0); - root["pm02"] = ag.round2((pm25_1 + pm25_2) / 2.0); - root["pm003_count"] = ag.round2((pm03PCount_1 + pm03PCount_2) / 2.0); - root["atmp"] = ag.round2((temp_1 + temp_2) / 2.0); - root["rhum"] = ag.round2((hum_1 + hum_2) / 2.0); - root["channels"]["1"]["pm01"] = pm01_1; - root["channels"]["1"]["pm02"] = pm25_1; - root["channels"]["1"]["pm10"] = pm10_1; - root["channels"]["1"]["pm003_count"] = pm03PCount_1; - root["channels"]["1"]["atmp"] = ag.round2(temp_1); - root["channels"]["1"]["rhum"] = hum_1; - root["channels"]["2"]["pm01"] = pm01_2; - root["channels"]["2"]["pm02"] = pm25_2; - root["channels"]["2"]["pm10"] = pm10_2; - root["channels"]["2"]["pm003_count"] = pm03PCount_2; - root["channels"]["2"]["atmp"] = ag.round2(temp_2); - root["channels"]["2"]["rhum"] = hum_2; + if (hasSensorPMS1 && hasSensorPMS2) { + root["pm01"] = ag.round2((pm01_1 + pm01_2) / 2.0); + root["pm02"] = ag.round2((pm25_1 + pm25_2) / 2.0); + root["pm10"] = ag.round2((pm10_1 + pm10_2) / 2.0); + root["pm003_count"] = ag.round2((pm03PCount_1 + pm03PCount_2) / 2.0); + root["atmp"] = ag.round2((temp_1 + temp_2) / 2.0); + root["rhum"] = ag.round2((hum_1 + hum_2) / 2.0); + } + if (hasSensorPMS1) { + root["channels"]["1"]["pm01"] = pm01_1; + root["channels"]["1"]["pm02"] = pm25_1; + root["channels"]["1"]["pm10"] = pm10_1; + root["channels"]["1"]["pm003_count"] = pm03PCount_1; + root["channels"]["1"]["atmp"] = ag.round2(temp_1); + root["channels"]["1"]["rhum"] = hum_1; + } + if (hasSensorPMS2) { + root["channels"]["2"]["pm01"] = pm01_2; + root["channels"]["2"]["pm02"] = pm25_2; + root["channels"]["2"]["pm10"] = pm10_2; + root["channels"]["2"]["pm003_count"] = pm03PCount_2; + root["channels"]["2"]["atmp"] = ag.round2(temp_2); + root["channels"]["2"]["rhum"] = hum_2; + } } return JSON.stringify(root); From b2091114b3c0e705257ca3b472a7f79252d87daf Mon Sep 17 00:00:00 2001 From: Phat Nguyen Date: Sun, 18 Feb 2024 12:50:46 +0700 Subject: [PATCH 20/26] add `serialno` to local server data `GET` response --- examples/ONE_I-9PSL/ONE_I-9PSL.ino | 11 +++++++---- examples/Open_Air/Open_Air.ino | 11 +++++++---- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/examples/ONE_I-9PSL/ONE_I-9PSL.ino b/examples/ONE_I-9PSL/ONE_I-9PSL.ino index 55cf742..220a09f 100644 --- a/examples/ONE_I-9PSL/ONE_I-9PSL.ino +++ b/examples/ONE_I-9PSL/ONE_I-9PSL.ino @@ -592,7 +592,7 @@ static void tempHumPoll(void); static void co2Poll(void); static void showNr(void); static void webServerInit(void); -static String getServerSyncData(void); +static String getServerSyncData(bool localServer); /** Init schedule */ bool hasSensorS8 = true; @@ -786,7 +786,7 @@ static void co2Poll(void) { static void showNr(void) { Serial.println("Serial nr: " + getDevId()); } void webServerMeasureCurrentGet(void) { - webServer.send(200, "application/json", getServerSyncData()); + webServer.send(200, "application/json", getServerSyncData(true)); } void webServerHandler(void *param) { @@ -806,9 +806,12 @@ static void webServerInit(void) { Serial.println("Webserver init"); } -static String getServerSyncData(void) { +static String getServerSyncData(bool localServer) { JSONVar root; root["wifi"] = WiFi.RSSI(); + if (localServer) { + root["serialno"] = getDevId(); + } if (hasSensorS8) { if (co2Ppm >= 0) { root["rco2"] = co2Ppm; @@ -1711,7 +1714,7 @@ static void pmPoll(void) { * */ static void sendDataToServer(void) { - String syncData = getServerSyncData(); + String syncData = getServerSyncData(false); if (agServer.postToServer(getDevId(), syncData)) { resetWatchdog(); } diff --git a/examples/Open_Air/Open_Air.ino b/examples/Open_Air/Open_Air.ino index 0533038..6e70c71 100644 --- a/examples/Open_Air/Open_Air.ino +++ b/examples/Open_Air/Open_Air.ino @@ -575,7 +575,7 @@ static void serverConfigPoll(void); static const char *getFwMode(int mode); static void showNr(void); static void webServerInit(void); -static String getServerSyncData(void); +static String getServerSyncData(bool localServer); bool hasSensorS8 = true; bool hasSensorPMS1 = true; @@ -652,7 +652,7 @@ void sendPing() { } static void sendDataToServer(void) { - String syncData = getServerSyncData(); + String syncData = getServerSyncData(false); if (agServer.postToServer(getDevId(), syncData)) { resetWatchdog(); } @@ -1155,7 +1155,7 @@ static const char *getFwMode(int mode) { static void showNr(void) { Serial.println("Serial nr: " + getDevId()); } void webServerMeasureCurrentGet(void) { - webServer.send(200, "application/json", getServerSyncData()); + webServer.send(200, "application/json", getServerSyncData(true)); } void webServerHandler(void *param) { @@ -1175,10 +1175,13 @@ static void webServerInit(void) { Serial.println("Webserver init"); } -static String getServerSyncData(void) { +static String getServerSyncData(bool localServer) { JSONVar root; root["wifi"] = WiFi.RSSI(); root["boot"] = loopCount; + if (localServer) { + root["serialno"] = getDevId(); + } if (fw_mode == FW_MODE_PST) { if (hasSensorS8) { From da07067661874948e4ef4c8009d83da9d74ca4ca Mon Sep 17 00:00:00 2001 From: Phat Nguyen Date: Sun, 18 Feb 2024 15:01:30 +0700 Subject: [PATCH 21/26] Save configuration on device persistently --- examples/ONE_I-9PSL/ONE_I-9PSL.ino | 161 +++++++++++++++++----- examples/Open_Air/Open_Air.ino | 205 ++++++++++++++++++++++++----- 2 files changed, 301 insertions(+), 65 deletions(-) diff --git a/examples/ONE_I-9PSL/ONE_I-9PSL.ino b/examples/ONE_I-9PSL/ONE_I-9PSL.ino index 220a09f..8cd1177 100644 --- a/examples/ONE_I-9PSL/ONE_I-9PSL.ino +++ b/examples/ONE_I-9PSL/ONE_I-9PSL.ino @@ -43,6 +43,7 @@ CC BY-SA 4.0 Attribution-ShareAlike 4.0 International License #include #include +#include "EEPROM.h" #include #include #include @@ -145,12 +146,9 @@ private: class AgServer { public: void begin(void) { - inF = false; - inUSAQI = false; configFailed = false; serverFailed = false; - memset(models, 0, sizeof(models)); - memset(mqttBroker, 0, sizeof(mqttBroker)); + loadConfig(); } /** @@ -195,6 +193,7 @@ public: } /** Get "country" */ + bool inF = false; if (JSON.typeof_(root["country"]) == "string") { String _country = root["country"]; country = _country; @@ -207,6 +206,7 @@ public: } /** Get "pmsStandard" */ + bool inUSAQI = false; if (JSON.typeof_(root["pmStandard"]) == "string") { String standard = root["pmStandard"]; if (standard == "ugm3") { @@ -224,6 +224,7 @@ public: } /** Get "ledBarMode" */ + uint8_t ledBarMode = UseLedBarOff; if (JSON.typeof_(root["ledBarMode"]) == "string") { String mode = root["ledBarMode"]; if (mode == "co2") { @@ -238,13 +239,18 @@ public: } /** Get model */ + bool _saveConfig = false; if (JSON.typeof_(root["model"]) == "string") { String model = root["model"]; if (model.length()) { - int len = - model.length() < sizeof(models) ? model.length() : sizeof(models); - memset(models, 0, sizeof(models)); - memcpy(models, model.c_str(), len); + int len = model.length() < sizeof(config.models) + ? model.length() + : sizeof(config.models); + if (model != String(config.models)) { + memset(config.models, 0, sizeof(config.models)); + memcpy(config.models, model.c_str(), len); + _saveConfig = true; + } } } @@ -252,10 +258,14 @@ public: if (JSON.typeof_(root["mqttBrokerUrl"]) == "string") { String mqtt = root["mqttBrokerUrl"]; if (mqtt.length()) { - int len = mqtt.length() < sizeof(mqttBroker) ? mqtt.length() - : sizeof(mqttBroker); - memset(mqttBroker, 0, sizeof(mqttBroker)); - memcpy(mqttBroker, mqtt.c_str(), len); + int len = mqtt.length() < sizeof(config.mqttBrokers) + ? mqtt.length() + : sizeof(config.mqttBrokers); + if (mqtt != String(config.mqttBrokers)) { + memset(config.mqttBrokers, 0, sizeof(config.mqttBrokers)); + memcpy(config.mqttBrokers, mqtt.c_str(), len); + _saveConfig = true; + } } } @@ -275,6 +285,14 @@ public: /** Show configuration */ showServerConfig(); + if (_saveConfig || (inF != config.inF) || (inUSAQI != config.inUSAQI) || + (ledBarMode != config.useRGBLedBar)) { + config.inF = inF; + config.inUSAQI = inUSAQI; + config.useRGBLedBar = ledBarMode; + + saveConfig(); + } return true; } @@ -315,7 +333,7 @@ public: * @return true F unit * @return false C Unit */ - bool isTemperatureUnitF(void) { return inF; } + bool isTemperatureUnitF(void) { return config.inF; } /** * @brief Get PMS standard unit @@ -323,7 +341,7 @@ public: * @return true USAQI * @return false ugm3 */ - bool isPMSinUSAQI(void) { return inUSAQI; } + bool isPMSinUSAQI(void) { return config.inUSAQI; } /** * @brief Get status of get server configuration is failed @@ -381,25 +399,26 @@ public: * * @return String Model name, empty string if server failed */ - String getModelName(void) { return String(models); } + String getModelName(void) { return String(config.models); } /** * @brief Get mqttBroker url * * @return String Broker url, empty if server failed */ - String getMqttBroker(void) { return String(mqttBroker); } + String getMqttBroker(void) { return String(config.mqttBrokers); } /** * @brief Show server configuration parameter */ void showServerConfig(void) { Serial.println("Server configuration: "); - Serial.printf(" inF: %s\r\n", inF ? "true" : "false"); - Serial.printf(" inUSAQI: %s\r\n", inUSAQI ? "true" : "false"); - Serial.printf(" useRGBLedBar: %d\r\n", (int)ledBarMode); - Serial.printf(" Model: %s\r\n", models); - Serial.printf(" Mqtt Broker: %s\r\n", mqttBroker); + Serial.printf(" inF: %s\r\n", config.inF ? "true" : "false"); + Serial.printf(" inUSAQI: %s\r\n", + config.inUSAQI ? "true" : "false"); + Serial.printf(" useRGBLedBar: %d\r\n", (int)config.useRGBLedBar); + Serial.printf(" Model: %s\r\n", config.models); + Serial.printf(" Mqtt Broker: %s\r\n", config.mqttBrokers); Serial.printf(" S8 calib period: %d\r\n", co2AbcCalib); } @@ -408,7 +427,7 @@ public: * * @return UseLedBar */ - UseLedBar getLedBarMode(void) { return ledBarMode; } + UseLedBar getLedBarMode(void) { return (UseLedBar)config.useRGBLedBar; } /** * @brief Get the Country @@ -418,17 +437,67 @@ public: String getCountry(void) { return country; } private: - bool inF; /** Temperature unit, true: F, false: C */ - bool inUSAQI; /** PMS unit, true: USAQI, false: ugm3 */ bool configFailed; /** Flag indicate get server configuration failed */ bool serverFailed; /** Flag indicate post data to server failed */ bool co2Calib; /** Is co2Ppmcalibration requset */ bool ledBarTestRequested; /** */ int co2AbcCalib = -1; /** update auto calibration number of day */ - UseLedBar ledBarMode = UseLedBarCO2; /** */ - char models[20]; /** */ - char mqttBroker[256]; /** */ - String country; /***/ + String country; /***/ + + struct config_s { + bool inF; + bool inUSAQI; + uint8_t useRGBLedBar; + char models[20]; + char mqttBrokers[256]; + uint32_t checksum; + }; + struct config_s config; + + void defaultConfig(void) { + config.inF = false; + config.inUSAQI = false; + memset(config.models, 0, sizeof(config.models)); + memset(config.mqttBrokers, 0, sizeof(config.mqttBrokers)); + + Serial.println("Load config default"); + saveConfig(); + } + + void loadConfig(void) { + if (EEPROM.readBytes(0, &config, sizeof(config)) != sizeof(config)) { + config.inF = false; + config.inUSAQI = false; + memset(config.models, 0, sizeof(config.models)); + memset(config.mqttBrokers, 0, sizeof(config.mqttBrokers)); + + Serial.println("Load configure failed"); + } else { + uint32_t sum = 0; + uint8_t *data = (uint8_t *)&config; + for (int i = 0; i < sizeof(config) - 4; i++) { + sum += data[i]; + } + if (sum != config.checksum) { + Serial.println("config checksum failed"); + defaultConfig(); + } + } + + showServerConfig(); + } + + void saveConfig(void) { + config.checksum = 0; + uint8_t *data = (uint8_t *)&config; + for (int i = 0; i < sizeof(config) - 4; i++) { + config.checksum += data[i]; + } + + EEPROM.writeBytes(0, &config, sizeof(config)); + EEPROM.commit(); + Serial.println("Save config"); + } }; AgServer agServer; @@ -445,6 +514,7 @@ private: int port; esp_mqtt_client_handle_t client; bool clientConnected = false; + int connectFailedCount = 0; public: AgMqtt() {} @@ -463,6 +533,12 @@ public: Serial.println("Mqtt already begin, call 'end' and try again"); return true; } + + if (uri.isEmpty()) { + Serial.println("Mqtt uri is empty"); + return false; + } + this->uri = uri; Serial.printf("mqtt init '%s'\r\n", uri.c_str()); @@ -529,7 +605,14 @@ public: */ String getUri(void) { return uri; } - void _connectionHandler(bool connected) { clientConnected = connected; } + void _connectionHandler(bool connected) { + clientConnected = connected; + if (clientConnected == false) { + connectFailedCount++; + } else { + connectFailedCount = 0; + } + } /** * @brief Mqtt client connect status @@ -538,6 +621,13 @@ public: * @return false Disconnected or Not initialize */ bool isConnected(void) { return (_isBegin && clientConnected); } + + /** + * @brief Get number of times connection failed + * + * @return int + */ + int connectionFailedCount(void) { return connectFailedCount; } }; AgMqtt agMqtt; @@ -608,7 +698,9 @@ AgSchedule tempHumSchedule(SENSOR_TEMP_HUM_UPDATE_INTERVAL, tempHumPoll); AgSchedule tvocSchedule(SENSOR_TVOC_UPDATE_INTERVAL, tvocPoll); void setup() { - /** Serial fore print debug message */ + EEPROM.begin(512); + + /** Serial for print debug message */ Serial.begin(115200); delay(100); /** For bester show log */ showNr(); @@ -657,6 +749,15 @@ void setup() { if (WiFi.status() == WL_CONNECTED) { webServerInit(); + /** MQTT init */ + if (agServer.getMqttBroker().isEmpty() == false) { + if (agMqtt.begin(agServer.getMqttBroker())) { + Serial.println("MQTT client init success"); + } else { + Serial.println("MQTT client init failure"); + } + } + sendPing(); Serial.println(F("WiFi connected!")); Serial.println("IP address: "); diff --git a/examples/Open_Air/Open_Air.ino b/examples/Open_Air/Open_Air.ino index 6e70c71..8b3551c 100644 --- a/examples/Open_Air/Open_Air.ino +++ b/examples/Open_Air/Open_Air.ino @@ -35,6 +35,7 @@ CC BY-SA 4.0 Attribution-ShareAlike 4.0 International License */ +#include "EEPROM.h" #include "mqtt_client.h" #include #include @@ -145,12 +146,9 @@ private: class AgServer { public: void begin(void) { - inF = false; - inUSAQI = false; configFailed = false; serverFailed = false; - memset(models, 0, sizeof(models)); - memset(mqttBroker, 0, sizeof(mqttBroker)); + loadConfig(); } /** @@ -195,8 +193,11 @@ public: } /** Get "country" */ + bool inF = false; if (JSON.typeof_(root["country"]) == "string") { - String country = root["country"]; + String _country = root["country"]; + country = _country; + if (country == "US") { inF = true; } else { @@ -204,7 +205,8 @@ public: } } - /** Get "pmStandard" */ + /** Get "pmsStandard" */ + bool inUSAQI = false; if (JSON.typeof_(root["pmStandard"]) == "string") { String standard = root["pmStandard"]; if (standard == "ugm3") { @@ -217,9 +219,12 @@ public: /** Get "co2CalibrationRequested" */ if (JSON.typeof_(root["co2CalibrationRequested"]) == "boolean") { co2Calib = root["co2CalibrationRequested"]; + } else { + co2Calib = false; } /** Get "ledBarMode" */ + uint8_t ledBarMode = UseLedBarOff; if (JSON.typeof_(root["ledBarMode"]) == "string") { String mode = root["ledBarMode"]; if (mode == "co2") { @@ -234,13 +239,18 @@ public: } /** Get model */ + bool _saveConfig = false; if (JSON.typeof_(root["model"]) == "string") { String model = root["model"]; if (model.length()) { - int len = - model.length() < sizeof(models) ? model.length() : sizeof(models); - memset(models, 0, sizeof(models)); - memcpy(models, model.c_str(), len); + int len = model.length() < sizeof(config.models) + ? model.length() + : sizeof(config.models); + if (model != String(config.models)) { + memset(config.models, 0, sizeof(config.models)); + memcpy(config.models, model.c_str(), len); + _saveConfig = true; + } } } @@ -248,10 +258,14 @@ public: if (JSON.typeof_(root["mqttBrokerUrl"]) == "string") { String mqtt = root["mqttBrokerUrl"]; if (mqtt.length()) { - int len = mqtt.length() < sizeof(mqttBroker) ? mqtt.length() - : sizeof(mqttBroker); - memset(mqttBroker, 0, sizeof(mqttBroker)); - memcpy(mqttBroker, mqtt.c_str(), len); + int len = mqtt.length() < sizeof(config.mqttBrokers) + ? mqtt.length() + : sizeof(config.mqttBrokers); + if (mqtt != String(config.mqttBrokers)) { + memset(config.mqttBrokers, 0, sizeof(config.mqttBrokers)); + memcpy(config.mqttBrokers, mqtt.c_str(), len); + _saveConfig = true; + } } } @@ -262,8 +276,23 @@ public: co2AbcCalib = -1; } + /** Get "ledBarTestRequested" */ + if (JSON.typeof_(root["ledBarTestRequested"]) == "boolean") { + ledBarTestRequested = root["ledBarTestRequested"]; + } else { + ledBarTestRequested = false; + } + /** Show configuration */ showServerConfig(); + if (_saveConfig || (inF != config.inF) || (inUSAQI != config.inUSAQI) || + (ledBarMode != config.useRGBLedBar)) { + config.inF = inF; + config.inUSAQI = inUSAQI; + config.useRGBLedBar = ledBarMode; + + saveConfig(); + } return true; } @@ -304,7 +333,7 @@ public: * @return true F unit * @return false C Unit */ - bool isTemperatureUnitF(void) { return inF; } + bool isTemperatureUnitF(void) { return config.inF; } /** * @brief Get PMS standard unit @@ -312,7 +341,7 @@ public: * @return true USAQI * @return false ugm3 */ - bool isPMSinUSAQI(void) { return inUSAQI; } + bool isPMSinUSAQI(void) { return config.inUSAQI; } /** * @brief Get status of get server configuration is failed @@ -344,6 +373,20 @@ public: return ret; } + /** + * @brief Get request LedBar test + * + * @return true Requested. If result = true, it's clear after function call + * @return false Not-requested + */ + bool isLedBarTestRequested(void) { + bool ret = ledBarTestRequested; + if (ret) { + ledBarTestRequested = false; + } + return ret; + } + /** * @brief Get the Co2 auto calib period * @@ -356,26 +399,27 @@ public: * * @return String Model name, empty string if server failed */ - String getModelName(void) { return String(models); } + String getModelName(void) { return String(config.models); } /** * @brief Get mqttBroker url * * @return String Broker url, empty if server failed */ - String getMqttBroker(void) { return String(mqttBroker); } + String getMqttBroker(void) { return String(config.mqttBrokers); } /** * @brief Show server configuration parameter */ void showServerConfig(void) { Serial.println("Server configuration: "); - Serial.printf(" inF: %s\r\n", inF ? "true" : "false"); - Serial.printf(" inUSAQI: %s\r\n", inUSAQI ? "true" : "false"); - Serial.printf(" useRGBLedBar: %d\r\n", (int)ledBarMode); - Serial.printf(" Model: %s\r\n", models); - Serial.printf(" Mqtt Broker: %s\r\n", mqttBroker); - Serial.printf(" abcDays period: %d\r\n", co2AbcCalib); + Serial.printf(" inF: %s\r\n", config.inF ? "true" : "false"); + Serial.printf(" inUSAQI: %s\r\n", + config.inUSAQI ? "true" : "false"); + Serial.printf(" useRGBLedBar: %d\r\n", (int)config.useRGBLedBar); + Serial.printf(" Model: %s\r\n", config.models); + Serial.printf(" Mqtt Broker: %s\r\n", config.mqttBrokers); + Serial.printf(" S8 calib period: %d\r\n", co2AbcCalib); } /** @@ -383,18 +427,77 @@ public: * * @return UseLedBar */ - UseLedBar getLedBarMode(void) { return ledBarMode; } + UseLedBar getLedBarMode(void) { return (UseLedBar)config.useRGBLedBar; } + + /** + * @brief Get the Country + * + * @return String + */ + String getCountry(void) { return country; } private: - bool inF; /** Temperature unit, true: F, false: C */ - bool inUSAQI; /** PMS unit, true: USAQI, false: ugm3 */ - bool configFailed; /** Flag indicate get server configuration failed */ - bool serverFailed; /** Flag indicate post data to server failed */ - bool co2Calib; /** Is co2Ppmcalibration requset */ - int co2AbcCalib = -1; /** update auto calibration number of day */ - UseLedBar ledBarMode = UseLedBarCO2; /** */ - char models[20]; /** */ - char mqttBroker[256]; /** */ + bool configFailed; /** Flag indicate get server configuration failed */ + bool serverFailed; /** Flag indicate post data to server failed */ + bool co2Calib; /** Is co2Ppmcalibration requset */ + bool ledBarTestRequested; /** */ + int co2AbcCalib = -1; /** update auto calibration number of day */ + String country; /***/ + + struct config_s { + bool inF; + bool inUSAQI; + uint8_t useRGBLedBar; + char models[20]; + char mqttBrokers[256]; + uint32_t checksum; + }; + struct config_s config; + + void defaultConfig(void) { + config.inF = false; + config.inUSAQI = false; + memset(config.models, 0, sizeof(config.models)); + memset(config.mqttBrokers, 0, sizeof(config.mqttBrokers)); + + Serial.println("Load config default"); + saveConfig(); + } + + void loadConfig(void) { + if (EEPROM.readBytes(0, &config, sizeof(config)) != sizeof(config)) { + config.inF = false; + config.inUSAQI = false; + memset(config.models, 0, sizeof(config.models)); + memset(config.mqttBrokers, 0, sizeof(config.mqttBrokers)); + + Serial.println("Load configure failed"); + } else { + uint32_t sum = 0; + uint8_t *data = (uint8_t *)&config; + for (int i = 0; i < sizeof(config) - 4; i++) { + sum += data[i]; + } + if (sum != config.checksum) { + Serial.println("config checksum failed"); + defaultConfig(); + } + } + + showServerConfig(); + } + + void saveConfig(void) { + config.checksum = 0; + uint8_t *data = (uint8_t *)&config; + for (int i = 0; i < sizeof(config) - 4; i++) { + config.checksum += data[i]; + } + + EEPROM.writeBytes(0, &config, sizeof(config)); + EEPROM.commit(); + Serial.println("Save config"); + } }; AgServer agServer; @@ -411,6 +514,7 @@ private: int port; esp_mqtt_client_handle_t client; bool clientConnected = false; + int connectFailedCount = 0; public: AgMqtt() {} @@ -429,6 +533,12 @@ public: Serial.println("Mqtt already begin, call 'end' and try again"); return true; } + + if (uri.isEmpty()) { + Serial.println("Mqtt uri is empty"); + return false; + } + this->uri = uri; Serial.printf("mqtt init '%s'\r\n", uri.c_str()); @@ -495,7 +605,14 @@ public: */ String getUri(void) { return uri; } - void _connectionHandler(bool connected) { clientConnected = connected; } + void _connectionHandler(bool connected) { + clientConnected = connected; + if (clientConnected == false) { + connectFailedCount++; + } else { + connectFailedCount = 0; + } + } /** * @brief Mqtt client connect status @@ -504,6 +621,13 @@ public: * @return false Disconnected or Not initialize */ bool isConnected(void) { return (_isBegin && clientConnected); } + + /** + * @brief Get number of times connection failed + * + * @return int + */ + int connectionFailedCount(void) { return connectFailedCount; } }; AgMqtt agMqtt; @@ -588,6 +712,8 @@ AgSchedule pmsSchedule(SENSOR_PM_UPDATE_INTERVAL, pmPoll); AgSchedule tvocSchedule(SENSOR_TVOC_UPDATE_INTERVAL, tvocPoll); void setup() { + EEPROM.begin(512); + Serial.begin(115200); delay(100); /** For bester show log */ showNr(); @@ -604,6 +730,15 @@ void setup() { if (WiFi.isConnected()) { webServerInit(); + /** MQTT init */ + if (agServer.getMqttBroker().isEmpty() == false) { + if (agMqtt.begin(agServer.getMqttBroker())) { + Serial.println("MQTT client init success"); + } else { + Serial.println("MQTT client init failure"); + } + } + wifiHasConfig = true; sendPing(); From 2aab02940df017a92f72d295cb7a350c2722ce99 Mon Sep 17 00:00:00 2001 From: Phat Nguyen Date: Sun, 18 Feb 2024 15:20:31 +0700 Subject: [PATCH 22/26] add local webserver mDNS `airgradient_.local` --- examples/ONE_I-9PSL/ONE_I-9PSL.ino | 10 +++++++++- examples/Open_Air/Open_Air.ino | 10 +++++++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/examples/ONE_I-9PSL/ONE_I-9PSL.ino b/examples/ONE_I-9PSL/ONE_I-9PSL.ino index 8cd1177..7dc29e7 100644 --- a/examples/ONE_I-9PSL/ONE_I-9PSL.ino +++ b/examples/ONE_I-9PSL/ONE_I-9PSL.ino @@ -46,6 +46,7 @@ CC BY-SA 4.0 Attribution-ShareAlike 4.0 International License #include "EEPROM.h" #include #include +#include #include #include @@ -897,14 +898,21 @@ void webServerHandler(void *param) { } static void webServerInit(void) { + String host = "airgradient_" + getDevId(); + if (!MDNS.begin(host)) { + Serial.println("Init MDNS failed"); + return; + } + webServer.on("/measures/current", HTTP_GET, webServerMeasureCurrentGet); webServer.begin(); + MDNS.addService("http", "tcp", 80); if (xTaskCreate(webServerHandler, "webserver", 1024 * 4, NULL, 5, NULL) != pdTRUE) { Serial.println("Create task handle webserver failed"); } - Serial.println("Webserver init"); + Serial.printf("Webserver init: %s.local\r\n", host.c_str()); } static String getServerSyncData(bool localServer) { diff --git a/examples/Open_Air/Open_Air.ino b/examples/Open_Air/Open_Air.ino index 8b3551c..6838aa7 100644 --- a/examples/Open_Air/Open_Air.ino +++ b/examples/Open_Air/Open_Air.ino @@ -39,6 +39,7 @@ CC BY-SA 4.0 Attribution-ShareAlike 4.0 International License #include "mqtt_client.h" #include #include +#include #include #include #include @@ -1300,14 +1301,21 @@ void webServerHandler(void *param) { } static void webServerInit(void) { + String host = "airgradient_" + getDevId(); + if (!MDNS.begin(host)) { + Serial.println("Init MDNS failed"); + return; + } + webServer.on("/measures/current", HTTP_GET, webServerMeasureCurrentGet); webServer.begin(); + MDNS.addService("http", "tcp", 80); if (xTaskCreate(webServerHandler, "webserver", 1024 * 4, NULL, 5, NULL) != pdTRUE) { Serial.println("Create task handle webserver failed"); } - Serial.println("Webserver init"); + Serial.printf("Webserver init: %s.local\r\n", host.c_str()); } static String getServerSyncData(bool localServer) { From 14fb790e2a7922e5a3907731493a0db3da8606b4 Mon Sep 17 00:00:00 2001 From: Phat Nguyen Date: Tue, 20 Feb 2024 20:36:06 +0700 Subject: [PATCH 23/26] PMS5003 add failed count to 3 before show invalid value to display --- examples/BASIC_v4/BASIC_v4.ino | 8 +++++++- examples/ONE_I-9PSL/ONE_I-9PSL.ino | 22 ++++++++++++++-------- 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/examples/BASIC_v4/BASIC_v4.ino b/examples/BASIC_v4/BASIC_v4.ino index eac568f..18c166b 100644 --- a/examples/BASIC_v4/BASIC_v4.ino +++ b/examples/BASIC_v4/BASIC_v4.ino @@ -381,6 +381,7 @@ static void showNr(void); bool hasSensorS8 = true; bool hasSensorPMS = true; bool hasSensorSHT = true; +int pmFailCount = 0; AgSchedule configSchedule(SERVER_CONFIG_UPDATE_INTERVAL, serverConfigPoll); AgSchedule serverSchedule(SERVER_SYNC_INTERVAL, sendDataToServer); AgSchedule dispSchedule(DISP_UPDATE_INTERVAL, dispHandler); @@ -617,8 +618,13 @@ void pmPoll() { if (ag.pms5003.readData()) { pm25 = ag.pms5003.getPm25Ae(); Serial.printf("PMS2.5: %d\r\n", pm25); + pmFailCount = 0; } else { - pm25 = -1; + Seria.printf("PM read failed, %d", pmFailCount); + pmFailCount++; + if (pmFailCount >= 3) { + pm25 = -1; + } } } diff --git a/examples/ONE_I-9PSL/ONE_I-9PSL.ino b/examples/ONE_I-9PSL/ONE_I-9PSL.ino index 7dc29e7..9b2ff32 100644 --- a/examples/ONE_I-9PSL/ONE_I-9PSL.ino +++ b/examples/ONE_I-9PSL/ONE_I-9PSL.ino @@ -690,6 +690,7 @@ bool hasSensorS8 = true; bool hasSensorPMS = true; bool hasSensorSGP = true; bool hasSensorSHT = true; +int pmFailCount = 0; AgSchedule dispLedSchedule(DISP_UPDATE_INTERVAL, updateDispLedBar); AgSchedule configSchedule(SERVER_CONFIG_UPDATE_INTERVAL, serverConfigPoll); AgSchedule serverSchedule(SERVER_SYNC_INTERVAL, sendDataToServer); @@ -1035,7 +1036,7 @@ static void displayShowDashboard(String err) { /** Show temperature */ if (agServer.isTemperatureUnitF()) { - if (temp > -10001) { + if (temp > -1001) { float tempF = (temp * 9 / 5) + 32; sprintf(strBuf, "%.1f°F", tempF); } else { @@ -1043,7 +1044,7 @@ static void displayShowDashboard(String err) { } u8g2.drawUTF8(1, 10, strBuf); } else { - if (temp > -10001) { + if (temp > -1001) { sprintf(strBuf, "%.1f°C", temp); } else { sprintf(strBuf, "-°C"); @@ -1070,7 +1071,7 @@ static void displayShowDashboard(String err) { if (err == "WiFi N/A") { u8g2.setFont(u8g2_font_t0_12_tf); if (agServer.isTemperatureUnitF()) { - if (temp > -10001) { + if (temp > -1001) { float tempF = (temp * 9 / 5) + 32; sprintf(strBuf, "%.1f", tempF); } else { @@ -1078,7 +1079,7 @@ static void displayShowDashboard(String err) { } u8g2.drawUTF8(1, 10, strBuf); } else { - if (temp > -10001) { + if (temp > -1001) { sprintf(strBuf, "%.1f", temp); } else { sprintf(strBuf, "-"); @@ -1810,11 +1811,16 @@ static void pmPoll(void) { Serial.printf(" PMS2.5: %d\r\n", pm25); Serial.printf(" PMS10.0: %d\r\n", pm10); Serial.printf("PMS3.0 Count: %d\r\n", pm03PCount); + pmFailCount = 0; } else { - pm01 = -1; - pm25 = -1; - pm10 = -1; - pm03PCount = -1; + pmFailCount++; + Serial.printf("PM read failed: %d\r\n", pmFailCount); + if (pmFailCount >= 3) { + pm01 = -1; + pm25 = -1; + pm10 = -1; + pm03PCount = -1; + } } } From e79a798b885ec24ded1e5aabd922927539051d65 Mon Sep 17 00:00:00 2001 From: Phat Nguyen Date: Tue, 20 Feb 2024 21:05:04 +0700 Subject: [PATCH 24/26] Update show invalid value into display --- examples/BASIC_v4/BASIC_v4.ino | 38 ++++++++++++++++++++++++++++------ 1 file changed, 32 insertions(+), 6 deletions(-) diff --git a/examples/BASIC_v4/BASIC_v4.ino b/examples/BASIC_v4/BASIC_v4.ino index 18c166b..cc0dc1c 100644 --- a/examples/BASIC_v4/BASIC_v4.ino +++ b/examples/BASIC_v4/BASIC_v4.ino @@ -620,7 +620,7 @@ void pmPoll() { Serial.printf("PMS2.5: %d\r\n", pm25); pmFailCount = 0; } else { - Seria.printf("PM read failed, %d", pmFailCount); + Serial.printf("PM read failed, %d", pmFailCount); pmFailCount++; if (pmFailCount >= 3) { pm25 = -1; @@ -666,16 +666,42 @@ static void dispHandler() { String ln3 = ""; if (agServer.isPMSinUSAQI()) { - ln1 = "AQI:" + String(ag.pms5003.convertPm25ToUsAqi(pm25)); + if (pm25 < 0) { + ln1 = "AQI: -"; + } else { + ln1 = "AQI:" + String(ag.pms5003.convertPm25ToUsAqi(pm25)); + } } else { - ln1 = "PM :" + String(pm25) + " ug"; + if (pm25 < 0) { + ln1 = "PM :- ug"; + + } else { + ln1 = "PM :" + String(pm25) + " ug"; + } } - ln2 = "CO2:" + String(co2Ppm); + if (co2Ppm > -1001) { + ln2 = "CO2:" + String(co2Ppm); + } else { + ln2 = "CO2: -"; + } + + String _hum = "-"; + if (hum > 0) { + _hum = String(hum); + } + + String _temp = "-"; if (agServer.isTemperatureUnitF()) { - ln3 = String((temp * 9 / 5) + 32).substring(0, 4) + " " + String(hum) + "%"; + if (temp > -1001) { + _temp = String((temp * 9 / 5) + 32).substring(0, 4); + } + ln3 = _temp + " " + _hum + "%"; } else { - ln3 = String(temp).substring(0, 4) + " " + String(hum) + "%"; + if (temp > -1001) { + _temp = String(temp).substring(0, 4); + } + ln3 = _temp + " " + _hum + "%"; } displayShowText(ln1, ln2, ln3); } From af139331b1ed2b943371abdd018c8b5819edb510 Mon Sep 17 00:00:00 2001 From: Phat Nguyen Date: Tue, 20 Feb 2024 21:05:13 +0700 Subject: [PATCH 25/26] Show message when sensor module not found on display --- examples/ONE_I-9PSL/ONE_I-9PSL.ino | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/examples/ONE_I-9PSL/ONE_I-9PSL.ino b/examples/ONE_I-9PSL/ONE_I-9PSL.ino index 9b2ff32..10b10bd 100644 --- a/examples/ONE_I-9PSL/ONE_I-9PSL.ino +++ b/examples/ONE_I-9PSL/ONE_I-9PSL.ino @@ -1351,6 +1351,11 @@ static void setRGBledColor(char color) { ag.ledBar.setColor(r, g, b, ledNum); } +void dispSensorNotFound(String ss) { + displayShowText("Sensor init", "Error:", ss + " not found"); + delay(2000); +} + /** * @brief Initialize board */ @@ -1365,12 +1370,14 @@ static void boardInit(void) { if (ag.sgp41.begin(Wire) == false) { Serial.println("SGP41 sensor not found"); hasSensorSGP = false; + dispSensorNotFound("SGP41"); } /** INit SHT */ if (ag.sht.begin(Wire) == false) { Serial.println("SHTx sensor not found"); hasSensorSHT = false; + dispSensorNotFound("SHT"); } /** Init watchdog */ @@ -1381,12 +1388,15 @@ static void boardInit(void) { // failedHandler("Init SenseAirS8 failed"); Serial.println("CO2 S8 sensor not found"); hasSensorS8 = false; + dispSensorNotFound("S8"); } /** Init PMS5003 */ if (ag.pms5003.begin(Serial0) == false) { Serial.println("PMS sensor not found"); hasSensorPMS = false; + + dispSensorNotFound("PMS"); } } From 6afcf6d4c35daebb989a5f2c89651fb0e8a5eb1f Mon Sep 17 00:00:00 2001 From: Phat Nguyen Date: Tue, 20 Feb 2024 21:06:09 +0700 Subject: [PATCH 26/26] Udpate version: `3.0.4` --- library.properties | 2 +- src/AirGradient.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/library.properties b/library.properties index 5de192c..2941f5b 100644 --- a/library.properties +++ b/library.properties @@ -1,5 +1,5 @@ name=AirGradient Air Quality Sensor -version=3.0.3 +version=3.0.4 author=AirGradient maintainer=AirGradient sentence=ESP32-C3 / ESP8266 library for air quality monitor measuring PM, CO2, Temperature, TVOC and Humidity with OLED display. diff --git a/src/AirGradient.cpp b/src/AirGradient.cpp index c725bfc..44d7305 100644 --- a/src/AirGradient.cpp +++ b/src/AirGradient.cpp @@ -1,6 +1,6 @@ #include "AirGradient.h" -#define AG_LIB_VER "3.0.3" +#define AG_LIB_VER "3.0.4" AirGradient::AirGradient(BoardType type) : pms5003(type), pms5003t_1(type), pms5003t_2(type), s8(type), sgp41(type),