-Changed getCO2 to return a char and if sensor is non existent will return NULL
-Changed getPM2 to return a char and if sensor is non existent will return NULL
-Added a new function getPM2_Raw which will return the value of PM2 as an integer
-Added a new function getCO2_Raw which will return the value of CO2 as an integer
-Added 2 new variables in the TMP_Raw Struct:
1. t_Char
2. rh_Char
These variables will be used to store the corresponding values as char and if sensor is nonexistent should be NULL
This commit is contained in:
Cristhian Macoh Musada
2020-07-25 14:28:18 +08:00
parent 3775be0034
commit e6d886c00e
9 changed files with 127 additions and 90 deletions

View File

@ -38,6 +38,7 @@ unsigned long lastRequest = 0;
bool SerialConfigured = true; bool SerialConfigured = true;
bool PwmConfigured = true; bool PwmConfigured = true;
AirGradient::AirGradient(bool displayMsg,int baudRate) AirGradient::AirGradient(bool displayMsg,int baudRate)
{ {
_debugMsg = displayMsg; _debugMsg = displayMsg;
@ -81,16 +82,30 @@ void AirGradient::PMS_Init(int rx_pin,int tx_pin,int baudRate){
int AirGradient::getPM2(){ const char* AirGradient::getPM2(){
int pm02; if (getPM2_Raw()) {
DATA data; 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(); requestRead();
if (readUntil(data)) { if (readUntil(data)) {
pm02 = data.PM_AE_UG_2_5; pm02 = data.PM_AE_UG_2_5;
return pm02; return pm02;
} else { } else {
//Serial.println("no PMS data"); return 0;
return NULL;
} }
} }
@ -260,15 +275,6 @@ void AirGradient::loop()
//END PMS FUNCTIONS // //END PMS FUNCTIONS //
//START TMP_RH 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) { TMP_RH_ErrorCode AirGradient::TMP_RH_Init(uint8_t address) {
if (_debugMsg) { if (_debugMsg) {
@ -287,9 +293,15 @@ TMP_RH_ErrorCode AirGradient::reset()
TMP_RH AirGradient::periodicFetchData() // TMP_RH AirGradient::periodicFetchData() //
{ {
TMP_RH result;
TMP_RH_ErrorCode error = writeCommand(SHT3XD_CMD_FETCH_DATA); TMP_RH_ErrorCode error = writeCommand(SHT3XD_CMD_FETCH_DATA);
if (error == SHT3XD_NO_ERROR) if (error == SHT3XD_NO_ERROR){
return readTemperatureAndHumidity(); result = readTemperatureAndHumidity();
sprintf(result.t_char,"%d", result.t);
sprintf(result.rh_char,"%f", result.rh);
return result;
}
else else
returnError(error); returnError(error);
} }
@ -535,59 +547,75 @@ TMP_RH AirGradient::returnError(TMP_RH_ErrorCode error) {
TMP_RH result; TMP_RH result;
result.t = NULL; result.t = NULL;
result.rh = 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; result.error = error;
return result; return result;
} }
//END TMP_RH FUNCTIONS // //END TMP_RH FUNCTIONS //
//START C02 FUNCTIONS // //START CO2 FUNCTIONS //
void AirGradient::C02_Init(){ void AirGradient::CO2_Init(){
C02_Init(D4,D3); CO2_Init(D4,D3);
} }
void AirGradient::C02_Init(int rx_pin,int tx_pin){ void AirGradient::CO2_Init(int rx_pin,int tx_pin){
C02_Init(rx_pin,tx_pin,9600); 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) { if (_debugMsg) {
Serial.println("Initializing C02..."); Serial.println("Initializing CO2...");
} }
_SoftSerial_C02 = new SoftwareSerial(rx_pin,tx_pin); _SoftSerial_CO2 = new SoftwareSerial(rx_pin,tx_pin);
_SoftSerial_C02->begin(baudRate); _SoftSerial_CO2->begin(baudRate);
if(getC02() == -1){ if(getCO2_Raw() == -1){
if (_debugMsg) { if (_debugMsg) {
Serial.println("C02 Sensor Failed to Initialize "); Serial.println("CO2 Sensor Failed to Initialize ");
} }
} }
else{ else{
Serial.println("C02 Successfully Initialized. Heating up for 10s"); Serial.println("CO2 Successfully Initialized. Heating up for 10s");
delay(10000); delay(10000);
} }
} }
int AirGradient::getC02(int retryLimit) { const char* AirGradient::getCO2(int retryLimit) {
int ctr = 0; int ctr = 0;
int result_c02 = get_C02_values(); int result_CO2 = getCO2_Raw();
while(result_c02 == -1){ while(result_CO2 == -1){
result_c02 = get_C02_values(); result_CO2 = getCO2_Raw();
if(ctr == retryLimit){ if((ctr == retryLimit) || (result_CO2 == -1)){
return NULL; Char_CO2[0] = 'N';
Char_CO2[1] = 'U';
Char_CO2[2] = 'L';
Char_CO2[3] = 'L';
return Char_CO2;
} }
ctr++; 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; int retry = 0;
CO2_READ_RESULT result; CO2_READ_RESULT result;
const byte C02Command[] = {0xFE, 0X44, 0X00, 0X08, 0X02, 0X9F, 0X25}; const byte CO2Command[] = {0xFE, 0X44, 0X00, 0X08, 0X02, 0X9F, 0X25};
byte C02Response[] = {0,0,0,0,0,0,0}; byte CO2Response[] = {0,0,0,0,0,0,0};
while(!(_SoftSerial_C02->available())) { while(!(_SoftSerial_CO2->available())) {
retry++; retry++;
// keep sending request until we start to get a response // keep sending request until we start to get a response
_SoftSerial_C02->write(C02Command, 7); _SoftSerial_CO2->write(CO2Command, 7);
delay(50); delay(50);
if (retry > 10) { if (retry > 10) {
return -1; return -1;
@ -596,33 +624,33 @@ int AirGradient::get_C02_values(){
int timeout = 0; int timeout = 0;
while (_SoftSerial_C02->available() < 7) { while (_SoftSerial_CO2->available() < 7) {
timeout++; timeout++;
if (timeout > 10) { if (timeout > 10) {
while(_SoftSerial_C02->available()) while(_SoftSerial_CO2->available())
_SoftSerial_C02->read(); _SoftSerial_CO2->read();
break; break;
} }
delay(50); delay(50);
} }
for (int i=0; i < 7; i++) { for (int i=0; i < 7; i++) {
int byte = _SoftSerial_C02->read(); int byte = _SoftSerial_CO2->read();
if (byte == -1) { if (byte == -1) {
result.success = false; result.success = false;
return -1; return -1;
} }
C02Response[i] = byte; CO2Response[i] = byte;
} }
int valMultiplier = 1; int valMultiplier = 1;
int high = C02Response[3]; int high = CO2Response[3];
int low = C02Response[4]; int low = CO2Response[4];
unsigned long val = high*256 + low; unsigned long val = high*256 + low;
return val; return val;
} }
//END C02 FUNCTIONS // //END CO2 FUNCTIONS //
//START MHZ19 FUNCTIONS // //START MHZ19 FUNCTIONS //
void AirGradient::MHZ19_Init(uint8_t type) { 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 = new SoftwareSerial(rx_pin,tx_pin);
_SoftSerial_MHZ19->begin(baudRate); _SoftSerial_MHZ19->begin(baudRate);
if(getC02() == -1){ if(readMHZ19() == -1){
if (_debugMsg) { if (_debugMsg) {
Serial.println("MHZ19 Sensor Failed to Initialize "); Serial.println("MHZ19 Sensor Failed to Initialize ");
} }

View File

@ -134,16 +134,21 @@ typedef enum {
struct TMP_RH { struct TMP_RH {
float t; float t;
int rh; int rh;
char t_char[10];
char rh_char[10];
TMP_RH_ErrorCode error;
};
struct TMP_RH_Char {
TMP_RH_ErrorCode error; TMP_RH_ErrorCode error;
}; };
// ENUMS AND STRUCTS FOR TMP_RH END // ENUMS AND STRUCTS FOR TMP_RH END
//ENUMS STRUCTS FOR C02 START //ENUMS STRUCTS FOR CO2 START
struct CO2_READ_RESULT { struct CO2_READ_RESULT {
int co2 = -1; int co2 = -1;
bool success = false; bool success = false;
}; };
//ENUMS STRUCTS FOR C02 END //ENUMS STRUCTS FOR CO2 END
// library interface description // library interface description
class AirGradient class AirGradient
@ -155,8 +160,8 @@ class AirGradient
static void setOutput(Print& debugOut, bool verbose = true); static void setOutput(Print& debugOut, bool verbose = true);
void beginC02(void); void beginCO2(void);
void beginC02(int,int); void beginCO2(int,int);
void PMS_Init(void); void PMS_Init(void);
void PMS_Init(int,int); void PMS_Init(int,int);
void PMS_Init(int,int,int); void PMS_Init(int,int,int);
@ -192,14 +197,13 @@ class AirGradient
void requestRead(); void requestRead();
bool read_PMS(DATA& data); bool read_PMS(DATA& data);
bool readUntil(DATA& data, uint16_t timeout = SINGLE_RESPONSE_TIME); bool readUntil(DATA& data, uint16_t timeout = SINGLE_RESPONSE_TIME);
int getPM2(); const char* getPM2();
int getPM2_Raw();
//PMS VARIABLES PUBLIC_END //PMS VARIABLES PUBLIC_END
//TMP_RH VARIABLES PUBLIC START //TMP_RH VARIABLES PUBLIC START
void ClosedCube_TMP_RH(); void ClosedCube_TMP_RH();
uint32_t getTemp();
int getRhum();
TMP_RH_ErrorCode TMP_RH_Init(uint8_t address); TMP_RH_ErrorCode TMP_RH_Init(uint8_t address);
TMP_RH_ErrorCode clearAll(); TMP_RH_ErrorCode clearAll();
@ -215,13 +219,13 @@ class AirGradient
//TMP_RH VARIABLES PUBLIC END //TMP_RH VARIABLES PUBLIC END
//C02 VARIABLES PUBLIC START //CO2 VARIABLES PUBLIC START
void C02_Init(); void CO2_Init();
void C02_Init(int,int); void CO2_Init(int,int);
void C02_Init(int,int,int); void CO2_Init(int,int,int);
int getC02(int retryLimit = 5); const char* getCO2(int retryLimit = 5);
int get_C02_values(); int getCO2_Raw();
SoftwareSerial *_SoftSerial_C02; SoftwareSerial *_SoftSerial_CO2;
//CO2 VARIABLES PUBLIC END //CO2 VARIABLES PUBLIC END
@ -260,6 +264,7 @@ class AirGradient
uint16_t _calculatedChecksum; uint16_t _calculatedChecksum;
SoftwareSerial *_SoftSerial_PMS; SoftwareSerial *_SoftSerial_PMS;
void loop(); void loop();
char Char_PM2[10];
//PMS VARIABLES PRIVATE END //PMS VARIABLES PRIVATE END
//TMP_RH VARIABLES PRIVATE START //TMP_RH VARIABLES PRIVATE START
@ -281,6 +286,10 @@ class AirGradient
TMP_RH returnError(TMP_RH_ErrorCode command); TMP_RH returnError(TMP_RH_ErrorCode command);
//TMP_RH VARIABLES PRIVATE END //TMP_RH VARIABLES PRIVATE END
//CO2 VARABLES PUBLIC START
char Char_CO2[10];
//CO2 VARABLES PUBLIC END
//MHZ19 VARABLES PUBLIC START //MHZ19 VARABLES PUBLIC START
int readInternal_MHZ19(); int readInternal_MHZ19();
@ -291,6 +300,7 @@ class AirGradient
Stream * _serial_MHZ19; Stream * _serial_MHZ19;
SoftwareSerial *_SoftSerial_MHZ19; SoftwareSerial *_SoftSerial_MHZ19;
uint8_t getCheckSum_MHZ19(unsigned char *packet); uint8_t getCheckSum_MHZ19(unsigned char *packet);
//MHZ19 VARABLES PUBLIC END //MHZ19 VARABLES PUBLIC END
}; };

View File

@ -4,19 +4,18 @@ AirGradient ag = AirGradient();
void setup(){ void setup(){
Serial.begin(9600); Serial.begin(9600);
ag.PMS_Init(); ag.PMS_Init();
ag.C02_Init(); ag.CO2_Init();
ag.TMP_RH_Init(0x44); //check for SHT sensor with address 0x44 ag.TMP_RH_Init(0x44); //check for SHT sensor with address 0x44
} }
void loop(){ void loop(){
int PM2 = ag.getPM2();
Serial.print("PM2: "); Serial.print("PM2: ");
Serial.println(PM2); Serial.println(ag.getPM2());
int CO2 = ag.getC02();
Serial.print("C02: "); Serial.print("CO2: ");
Serial.println(CO2); Serial.println(ag.getCO2());
TMP_RH result = ag.periodicFetchData(); TMP_RH result = ag.periodicFetchData();
Serial.print("Humidity: "); Serial.print("Humidity: ");

View File

@ -10,17 +10,17 @@ void setup(){
Serial.begin(9600); Serial.begin(9600);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
ag.PMS_Init(); ag.PMS_Init();
ag.C02_Init(); ag.CO2_Init();
ag.TMP_RH_Init(0x44); //check for SHT sensor with address 0x44 ag.TMP_RH_Init(0x44); //check for SHT sensor with address 0x44
showTextRectangle("Init", String(ESP.getChipId(),HEX),"AirGradient"); showTextRectangle("Init", String(ESP.getChipId(),HEX),"AirGradient");
delay(2000); delay(2000);
} }
void loop(){ void loop(){
int PM2 = ag.getPM2(); int PM2 = ag.getPM2_Raw();
int CO2 = ag.getC02(); int CO2 = ag.getCO2_Raw();
TMP_RH result = ag.periodicFetchData(); 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); delay(5000);
} }

View File

@ -15,7 +15,7 @@ void setup(){
Serial.begin(9600); Serial.begin(9600);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
ag.PMS_Init(); ag.PMS_Init();
ag.C02_Init(); ag.CO2_Init();
ag.TMP_RH_Init(0x44); //check for SHT sensor with address 0x44 ag.TMP_RH_Init(0x44); //check for SHT sensor with address 0x44
showTextRectangle("Init", String(ESP.getChipId(),HEX),"AirGradient"); showTextRectangle("Init", String(ESP.getChipId(),HEX),"AirGradient");
connectToWifi(); connectToWifi();
@ -23,13 +23,13 @@ void setup(){
} }
void loop(){ void loop(){
int PM2 = ag.getPM2(); int PM2 = ag.getPM2_Raw();
int CO2 = ag.getC02(); int CO2 = ag.getCO2_Raw();
TMP_RH result = ag.periodicFetchData(); 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(PM2), "CO2: "+String(CO2)+"");
// send payload // 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); Serial.println(payload);
String POSTURL = APIROOT + "sensors/airgradient:" + String(ESP.getChipId(),HEX) + "/measures"; String POSTURL = APIROOT + "sensors/airgradient:" + String(ESP.getChipId(),HEX) + "/measures";
Serial.println(POSTURL); Serial.println(POSTURL);

View File

@ -3,14 +3,14 @@ AirGradient ag = AirGradient();
void setup(){ void setup(){
Serial.begin(9600); Serial.begin(9600);
ag.C02_Init(); ag.CO2_Init();
} }
void loop(){ void loop(){
int CO2 = ag.getC02(); int CO2 = ag.getCO2_Raw();
Serial.print("C02: "); Serial.print("C02: ");
Serial.println(CO2); Serial.println(ag.getCO2());
delay(5000); delay(5000);
} }

View File

@ -8,9 +8,9 @@ void setup(){
void loop(){ void loop(){
int PM2 = ag.getPM2(); int PM2 = ag.getPM2_Raw();
Serial.print("PM2: "); Serial.print("PM2: ");
Serial.println(PM2); Serial.println(ag.getPM2());
delay(5000); delay(5000);
} }

View File

@ -9,8 +9,8 @@ void setup(){
void loop(){ void loop(){
TMP_RH result = ag.periodicFetchData(); TMP_RH result = ag.periodicFetchData();
Serial.print("Humidity: "); Serial.print("Humidity: ");
Serial.print(result.rh); Serial.print(result.rh_char);
Serial.print(" Temperature: "); Serial.print(" Temperature: ");
Serial.println(result.t); Serial.println(result.t_char);
delay(5000); delay(5000);
} }

View File

@ -14,7 +14,7 @@ AirGradient KEYWORD1
####################################### #######################################
setOutput KEYWORD2 setOutput KEYWORD2
beginC02 KEYWORD2 beginCO2 KEYWORD2
PMS_Init KEYWORD2 PMS_Init KEYWORD2
PMS KEYWORD2 PMS KEYWORD2
sleep KEYWORD2 sleep KEYWORD2
@ -41,9 +41,9 @@ periodicFetchData KEYWORD2
periodicStop KEYWORD2 periodicStop KEYWORD2
C02_Init KEYWORD2 CO2_Init KEYWORD2
getC02 KEYWORD2 getCO2 KEYWORD2
get_C02_values KEYWORD2 get_CO2_values KEYWORD2
MHZ19_Init KEYWORD2 MHZ19_Init KEYWORD2