From 0b8408ef134c9569410270dd7e4f9db65c4222c8 Mon Sep 17 00:00:00 2001 From: Achim Date: Thu, 20 Jan 2022 08:26:27 +0700 Subject: [PATCH] improved CO2 code (details https://forum.airgradient.com/t/s8-co2-reading-of-1/69/15) --- AirGradient.cpp | 54 ++++++++++++++++--------------------------------- 1 file changed, 17 insertions(+), 37 deletions(-) diff --git a/AirGradient.cpp b/AirGradient.cpp index cf987e5..d615ac0 100644 --- a/AirGradient.cpp +++ b/AirGradient.cpp @@ -607,47 +607,27 @@ const char* AirGradient::getCO2(int retryLimit) { return Char_CO2; } int AirGradient::getCO2_Raw(){ - int retry = 0; - CO2_READ_RESULT result; - const byte CO2Command[] = {0xFE, 0X44, 0X00, 0X08, 0X02, 0X9F, 0X25}; - byte CO2Response[] = {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_CO2->available())) { - retry++; - // keep sending request until we start to get a response - _SoftSerial_CO2->write(CO2Command, 7); - delay(50); - if (retry > 10) { - return -1; - } - } - - int timeout = 0; - - while (_SoftSerial_CO2->available() < 7) { - timeout++; - if (timeout > 10) { - while(_SoftSerial_CO2->available()) - _SoftSerial_CO2->read(); - break; - } - delay(50); - } + _SoftSerial_CO2->write(CO2Command, 7); + delay(100); //give the sensor a bit of time to respond + if (_SoftSerial_CO2->available()){ for (int i=0; i < 7; i++) { - int byte = _SoftSerial_CO2->read(); - if (byte == -1) { - result.success = false; - return -1; - } - CO2Response[i] = byte; - } - int valMultiplier = 1; - int high = CO2Response[3]; - int low = CO2Response[4]; - unsigned long val = high*256 + low; - + int byte = _SoftSerial_CO2->read(); + CO2Response[i] = byte; + if (CO2Response[0] != 254) { + return -1; //error code for debugging + } + } + unsigned long val = CO2Response[3]*256 + CO2Response[4]; return val; + } + else + { + return -2; //error code for debugging + } } //END CO2 FUNCTIONS //