diff --git a/AirGradient.cpp b/AirGradient.cpp index 3557e22..94ad002 100644 --- a/AirGradient.cpp +++ b/AirGradient.cpp @@ -38,6 +38,7 @@ unsigned long lastRequest = 0; bool SerialConfigured = true; bool PwmConfigured = true; + AirGradient::AirGradient(bool displayMsg,int baudRate) { _debugMsg = displayMsg; @@ -81,16 +82,30 @@ void AirGradient::PMS_Init(int rx_pin,int tx_pin,int baudRate){ -int AirGradient::getPM2(){ -int pm02; -DATA data; +const char* AirGradient::getPM2(){ + if (getPM2_Raw()) { + int result_raw = getPM2_Raw(); + sprintf(Char_PM2,"%d", result_raw); + return Char_PM2; + } else { + //Serial.println("no PMS data"); + Char_PM2[0] = 'N'; + Char_PM2[1] = 'U'; + Char_PM2[2] = 'L'; + Char_PM2[3] = 'L'; + return Char_PM2; + } +} + +int AirGradient::getPM2_Raw(){ + int pm02; + DATA data; requestRead(); if (readUntil(data)) { pm02 = data.PM_AE_UG_2_5; return pm02; } else { - //Serial.println("no PMS data"); - return NULL; + return 0; } } @@ -260,15 +275,6 @@ void AirGradient::loop() //END PMS FUNCTIONS // //START TMP_RH FUNCTIONS// -uint32_t AirGradient::getTemp(){ - TMP_RH result = periodicFetchData(); - return result.t; -} -int AirGradient::getRhum(){ - TMP_RH result = periodicFetchData(); - return result.rh; - -} TMP_RH_ErrorCode AirGradient::TMP_RH_Init(uint8_t address) { if (_debugMsg) { @@ -287,9 +293,15 @@ TMP_RH_ErrorCode AirGradient::reset() TMP_RH AirGradient::periodicFetchData() // { + TMP_RH result; TMP_RH_ErrorCode error = writeCommand(SHT3XD_CMD_FETCH_DATA); - if (error == SHT3XD_NO_ERROR) - return readTemperatureAndHumidity(); + if (error == SHT3XD_NO_ERROR){ + result = readTemperatureAndHumidity(); + sprintf(result.t_char,"%d", result.t); + sprintf(result.rh_char,"%f", result.rh); + + return result; + } else returnError(error); } @@ -535,59 +547,75 @@ TMP_RH AirGradient::returnError(TMP_RH_ErrorCode error) { TMP_RH result; result.t = NULL; result.rh = NULL; + + result.t_char[0] = 'N'; + result.t_char[1] = 'U'; + result.t_char[2] = 'L'; + result.t_char[3] = 'L'; + + result.rh_char[0] = 'N'; + result.rh_char[1] = 'U'; + result.rh_char[2] = 'L'; + result.rh_char[3] = 'L'; + result.error = error; return result; } //END TMP_RH FUNCTIONS // -//START C02 FUNCTIONS // -void AirGradient::C02_Init(){ - C02_Init(D4,D3); +//START CO2 FUNCTIONS // +void AirGradient::CO2_Init(){ + CO2_Init(D4,D3); } -void AirGradient::C02_Init(int rx_pin,int tx_pin){ - C02_Init(rx_pin,tx_pin,9600); +void AirGradient::CO2_Init(int rx_pin,int tx_pin){ + CO2_Init(rx_pin,tx_pin,9600); } -void AirGradient::C02_Init(int rx_pin,int tx_pin,int baudRate){ +void AirGradient::CO2_Init(int rx_pin,int tx_pin,int baudRate){ if (_debugMsg) { - Serial.println("Initializing C02..."); + Serial.println("Initializing CO2..."); } - _SoftSerial_C02 = new SoftwareSerial(rx_pin,tx_pin); - _SoftSerial_C02->begin(baudRate); + _SoftSerial_CO2 = new SoftwareSerial(rx_pin,tx_pin); + _SoftSerial_CO2->begin(baudRate); - if(getC02() == -1){ + if(getCO2_Raw() == -1){ if (_debugMsg) { - Serial.println("C02 Sensor Failed to Initialize "); + Serial.println("CO2 Sensor Failed to Initialize "); } } else{ - Serial.println("C02 Successfully Initialized. Heating up for 10s"); + Serial.println("CO2 Successfully Initialized. Heating up for 10s"); delay(10000); } } -int AirGradient::getC02(int retryLimit) { +const char* AirGradient::getCO2(int retryLimit) { int ctr = 0; - int result_c02 = get_C02_values(); - while(result_c02 == -1){ - result_c02 = get_C02_values(); - if(ctr == retryLimit){ - return NULL; + int result_CO2 = getCO2_Raw(); + while(result_CO2 == -1){ + result_CO2 = getCO2_Raw(); + if((ctr == retryLimit) || (result_CO2 == -1)){ + Char_CO2[0] = 'N'; + Char_CO2[1] = 'U'; + Char_CO2[2] = 'L'; + Char_CO2[3] = 'L'; + return Char_CO2; } ctr++; } - return result_c02; + sprintf(Char_CO2,"%d", result_CO2); + return Char_CO2; } -int AirGradient::get_C02_values(){ +int AirGradient::getCO2_Raw(){ int retry = 0; CO2_READ_RESULT result; - const byte C02Command[] = {0xFE, 0X44, 0X00, 0X08, 0X02, 0X9F, 0X25}; - byte C02Response[] = {0,0,0,0,0,0,0}; + const byte CO2Command[] = {0xFE, 0X44, 0X00, 0X08, 0X02, 0X9F, 0X25}; + byte CO2Response[] = {0,0,0,0,0,0,0}; - while(!(_SoftSerial_C02->available())) { + while(!(_SoftSerial_CO2->available())) { retry++; // keep sending request until we start to get a response - _SoftSerial_C02->write(C02Command, 7); + _SoftSerial_CO2->write(CO2Command, 7); delay(50); if (retry > 10) { return -1; @@ -596,33 +624,33 @@ int AirGradient::get_C02_values(){ int timeout = 0; - while (_SoftSerial_C02->available() < 7) { + while (_SoftSerial_CO2->available() < 7) { timeout++; if (timeout > 10) { - while(_SoftSerial_C02->available()) - _SoftSerial_C02->read(); + while(_SoftSerial_CO2->available()) + _SoftSerial_CO2->read(); break; } delay(50); } for (int i=0; i < 7; i++) { - int byte = _SoftSerial_C02->read(); + int byte = _SoftSerial_CO2->read(); if (byte == -1) { result.success = false; return -1; } - C02Response[i] = byte; + CO2Response[i] = byte; } int valMultiplier = 1; - int high = C02Response[3]; - int low = C02Response[4]; + int high = CO2Response[3]; + int low = CO2Response[4]; unsigned long val = high*256 + low; return val; } -//END C02 FUNCTIONS // +//END CO2 FUNCTIONS // //START MHZ19 FUNCTIONS // void AirGradient::MHZ19_Init(uint8_t type) { @@ -638,7 +666,7 @@ void AirGradient::MHZ19_Init(int rx_pin,int tx_pin, int baudRate, uint8_t type) _SoftSerial_MHZ19 = new SoftwareSerial(rx_pin,tx_pin); _SoftSerial_MHZ19->begin(baudRate); - if(getC02() == -1){ + if(readMHZ19() == -1){ if (_debugMsg) { Serial.println("MHZ19 Sensor Failed to Initialize "); } diff --git a/AirGradient.h b/AirGradient.h index 6c78923..247ab04 100644 --- a/AirGradient.h +++ b/AirGradient.h @@ -134,16 +134,21 @@ typedef enum { struct TMP_RH { float t; int rh; + char t_char[10]; + char rh_char[10]; + TMP_RH_ErrorCode error; + }; + struct TMP_RH_Char { TMP_RH_ErrorCode error; }; // ENUMS AND STRUCTS FOR TMP_RH END -//ENUMS STRUCTS FOR C02 START +//ENUMS STRUCTS FOR CO2 START struct CO2_READ_RESULT { int co2 = -1; bool success = false; }; -//ENUMS STRUCTS FOR C02 END +//ENUMS STRUCTS FOR CO2 END // library interface description class AirGradient @@ -155,8 +160,8 @@ class AirGradient static void setOutput(Print& debugOut, bool verbose = true); - void beginC02(void); - void beginC02(int,int); + void beginCO2(void); + void beginCO2(int,int); void PMS_Init(void); void PMS_Init(int,int); void PMS_Init(int,int,int); @@ -192,14 +197,13 @@ class AirGradient void requestRead(); bool read_PMS(DATA& data); bool readUntil(DATA& data, uint16_t timeout = SINGLE_RESPONSE_TIME); - int getPM2(); + const char* getPM2(); + int getPM2_Raw(); //PMS VARIABLES PUBLIC_END //TMP_RH VARIABLES PUBLIC START void ClosedCube_TMP_RH(); - uint32_t getTemp(); - int getRhum(); TMP_RH_ErrorCode TMP_RH_Init(uint8_t address); TMP_RH_ErrorCode clearAll(); @@ -215,13 +219,13 @@ class AirGradient //TMP_RH VARIABLES PUBLIC END - //C02 VARIABLES PUBLIC START - void C02_Init(); - void C02_Init(int,int); - void C02_Init(int,int,int); - int getC02(int retryLimit = 5); - int get_C02_values(); - SoftwareSerial *_SoftSerial_C02; + //CO2 VARIABLES PUBLIC START + void CO2_Init(); + void CO2_Init(int,int); + void CO2_Init(int,int,int); + const char* getCO2(int retryLimit = 5); + int getCO2_Raw(); + SoftwareSerial *_SoftSerial_CO2; //CO2 VARIABLES PUBLIC END @@ -260,6 +264,7 @@ class AirGradient uint16_t _calculatedChecksum; SoftwareSerial *_SoftSerial_PMS; void loop(); + char Char_PM2[10]; //PMS VARIABLES PRIVATE END //TMP_RH VARIABLES PRIVATE START @@ -281,6 +286,10 @@ class AirGradient TMP_RH returnError(TMP_RH_ErrorCode command); //TMP_RH VARIABLES PRIVATE END + //CO2 VARABLES PUBLIC START + char Char_CO2[10]; + + //CO2 VARABLES PUBLIC END //MHZ19 VARABLES PUBLIC START int readInternal_MHZ19(); @@ -291,6 +300,7 @@ class AirGradient Stream * _serial_MHZ19; SoftwareSerial *_SoftSerial_MHZ19; uint8_t getCheckSum_MHZ19(unsigned char *packet); + //MHZ19 VARABLES PUBLIC END }; diff --git a/examples/C02_PM_SHT/C02_PM_SHT.ino b/examples/C02_PM_SHT/C02_PM_SHT.ino index 2b847f9..c3c7f14 100644 --- a/examples/C02_PM_SHT/C02_PM_SHT.ino +++ b/examples/C02_PM_SHT/C02_PM_SHT.ino @@ -4,19 +4,18 @@ AirGradient ag = AirGradient(); void setup(){ Serial.begin(9600); ag.PMS_Init(); - ag.C02_Init(); + ag.CO2_Init(); ag.TMP_RH_Init(0x44); //check for SHT sensor with address 0x44 } void loop(){ -int PM2 = ag.getPM2(); Serial.print("PM2: "); -Serial.println(PM2); +Serial.println(ag.getPM2()); -int CO2 = ag.getC02(); -Serial.print("C02: "); -Serial.println(CO2); + +Serial.print("CO2: "); +Serial.println(ag.getCO2()); TMP_RH result = ag.periodicFetchData(); Serial.print("Humidity: "); diff --git a/examples/C02_PM_SHT_OLED/C02_PM_SHT_OLED.ino b/examples/C02_PM_SHT_OLED/C02_PM_SHT_OLED.ino index 8b1c6f9..1aa47f9 100644 --- a/examples/C02_PM_SHT_OLED/C02_PM_SHT_OLED.ino +++ b/examples/C02_PM_SHT_OLED/C02_PM_SHT_OLED.ino @@ -10,17 +10,17 @@ void setup(){ Serial.begin(9600); display.begin(SSD1306_SWITCHCAPVCC, 0x3C); ag.PMS_Init(); - ag.C02_Init(); + ag.CO2_Init(); ag.TMP_RH_Init(0x44); //check for SHT sensor with address 0x44 showTextRectangle("Init", String(ESP.getChipId(),HEX),"AirGradient"); delay(2000); } void loop(){ - int PM2 = ag.getPM2(); - int CO2 = ag.getC02(); + int PM2 = ag.getPM2_Raw(); + int CO2 = ag.getCO2_Raw(); TMP_RH result = ag.periodicFetchData(); - showTextRectangle(String(result.t)+"c "+String(result.rh)+"%", "PM2: "+ String(PM2), "CO2: "+String(CO2)+""); + showTextRectangle(String(result.t)+"c "+String(result.rh)+"%", "PM2: "+ String(ag.getPM2()), "CO2: "+String(ag.getCO2())+""); delay(5000); } diff --git a/examples/C02_PM_SHT_OLED_WIFI/C02_PM_SHT_OLED_WIFI.ino b/examples/C02_PM_SHT_OLED_WIFI/C02_PM_SHT_OLED_WIFI.ino index 32389fd..a30bd58 100644 --- a/examples/C02_PM_SHT_OLED_WIFI/C02_PM_SHT_OLED_WIFI.ino +++ b/examples/C02_PM_SHT_OLED_WIFI/C02_PM_SHT_OLED_WIFI.ino @@ -15,7 +15,7 @@ void setup(){ Serial.begin(9600); display.begin(SSD1306_SWITCHCAPVCC, 0x3C); ag.PMS_Init(); - ag.C02_Init(); + ag.CO2_Init(); ag.TMP_RH_Init(0x44); //check for SHT sensor with address 0x44 showTextRectangle("Init", String(ESP.getChipId(),HEX),"AirGradient"); connectToWifi(); @@ -23,13 +23,13 @@ void setup(){ } void loop(){ - int PM2 = ag.getPM2(); - int CO2 = ag.getC02(); + int PM2 = ag.getPM2_Raw(); + int CO2 = ag.getCO2_Raw(); TMP_RH result = ag.periodicFetchData(); showTextRectangle(String(result.t)+"c "+String(result.rh)+"%", "PM2: "+ String(PM2), "CO2: "+String(CO2)+""); // send payload - String payload = "{\"pm02\":" + String(PM2) + ",\"wifi\":" + String(WiFi.RSSI()) + ",\"rco2\":" + String(CO2) + ",\"atmp\":" + String(result.t) + ",\"rhum\":" + String(result.rh) + "}"; + String payload = "{\"pm02\":" + String(ag.getPM2()) + ",\"wifi\":" + String(WiFi.RSSI()) + ",\"rco2\":" + String(ag.getCO2()) + ",\"atmp\":" + String(result.t) + ",\"rhum\":" + String(result.rh) + "}"; Serial.println(payload); String POSTURL = APIROOT + "sensors/airgradient:" + String(ESP.getChipId(),HEX) + "/measures"; Serial.println(POSTURL); diff --git a/examples/C02_Test/C02_Test.ino b/examples/C02_Test/C02_Test.ino index bcec75d..11b3489 100644 --- a/examples/C02_Test/C02_Test.ino +++ b/examples/C02_Test/C02_Test.ino @@ -3,14 +3,14 @@ AirGradient ag = AirGradient(); void setup(){ Serial.begin(9600); - ag.C02_Init(); + ag.CO2_Init(); } void loop(){ -int CO2 = ag.getC02(); +int CO2 = ag.getCO2_Raw(); Serial.print("C02: "); -Serial.println(CO2); +Serial.println(ag.getCO2()); delay(5000); -} \ No newline at end of file +} diff --git a/examples/PM2_Test/PM2_Test.ino b/examples/PM2_Test/PM2_Test.ino index 398d0bd..9f338aa 100644 --- a/examples/PM2_Test/PM2_Test.ino +++ b/examples/PM2_Test/PM2_Test.ino @@ -8,9 +8,9 @@ void setup(){ void loop(){ -int PM2 = ag.getPM2(); +int PM2 = ag.getPM2_Raw(); Serial.print("PM2: "); -Serial.println(PM2); +Serial.println(ag.getPM2()); delay(5000); -} \ No newline at end of file +} diff --git a/examples/TMP_RH_Test/TMP_RH_Test.ino b/examples/TMP_RH_Test/TMP_RH_Test.ino index 4d55bf6..26655fc 100644 --- a/examples/TMP_RH_Test/TMP_RH_Test.ino +++ b/examples/TMP_RH_Test/TMP_RH_Test.ino @@ -9,8 +9,8 @@ void setup(){ void loop(){ TMP_RH result = ag.periodicFetchData(); Serial.print("Humidity: "); - Serial.print(result.rh); + Serial.print(result.rh_char); Serial.print(" Temperature: "); - Serial.println(result.t); + Serial.println(result.t_char); delay(5000); } diff --git a/keywords.txt b/keywords.txt index 147783a..5fb0111 100644 --- a/keywords.txt +++ b/keywords.txt @@ -14,7 +14,7 @@ AirGradient KEYWORD1 ####################################### setOutput KEYWORD2 -beginC02 KEYWORD2 +beginCO2 KEYWORD2 PMS_Init KEYWORD2 PMS KEYWORD2 sleep KEYWORD2 @@ -41,9 +41,9 @@ periodicFetchData KEYWORD2 periodicStop KEYWORD2 -C02_Init KEYWORD2 -getC02 KEYWORD2 -get_C02_values KEYWORD2 +CO2_Init KEYWORD2 +getCO2 KEYWORD2 +get_CO2_values KEYWORD2 MHZ19_Init KEYWORD2