@ -129,6 +129,8 @@ struct sensordata
MHZ19 mhz19 ;
bool mhz19_ready = false ;
int value_co2 = - 1 ; //[ppm]
int mhz19_readValue_reimplemented ( Stream * _streamRef , MHZ19 * _mhz19Ref ) ; //declare function
# endif
// data/homie/config.json hochladen mit platformio run --target uploadfs
@ -517,8 +519,9 @@ void loop_MHZ19()
bool _changed = false ;
if ( millis ( ) > = ( d . lastreadtime + d . readdelay ) ) {
mhz19_ready = mhz19 . isReady ( ) ;
value_co2 = mhz19 . readValue ( ) ; //[ppm]
//Homie.getLogger() << "co2 " << ": " << value_co2 << " status=" << mhz19_ready << endl;
//value_co2=mhz19.readValue(); //[ppm]
value_co2 = mhz19_readValue_reimplemented ( & mhz19_swSerial , & mhz19 ) ; //[ppm] reimplemented function to fix no response issue
Homie . getLogger ( ) < < " read co2 " < < " : " < < value_co2 < < " status= " < < mhz19_ready < < endl ;
if ( fabs ( d . lastsentvalue - value_co2 ) > = d . minchange ) {
_changed = true ;
}
@ -628,4 +631,44 @@ int get_lux(const unsigned int* _in, const unsigned int* _out, byte size)
// interpolate in the right segment for the rest
return map ( val , _in [ pos - 1 ] , _in [ pos ] , _out [ pos - 1 ] , _out [ pos ] ) ;
}
# endif
# ifdef SENSOR_MHZ19
byte mhz19_getCheckSum ( byte * packet ) {
byte checksum = 0 ;
for ( uint8_t i = 1 ; i < 8 ; i + + ) {
checksum + = packet [ i ] ;
}
checksum = 0xff - checksum ;
checksum + = 1 ;
return checksum ;
}
int mhz19_readValue_reimplemented ( Stream * _streamRef , MHZ19 * _mhz19Ref ) { //same function as in mhz19 library from klevytskyi, but with delay between cmd send and response check
byte CMD_READ [ 9 ] = { 0xFF , 0x01 , 0x86 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x79 } ; // Read command
unsigned int co2 = - 1 ;
unsigned char response [ 9 ] ;
_streamRef - > write ( CMD_READ , 9 ) ;
unsigned long _startwait = millis ( ) ;
while ( millis ( ) - _startwait < 100 ) { //wait for mhz19 to send response
//wait
}
if ( _streamRef - > available ( ) ) {
_streamRef - > readBytes ( response , 9 ) ;
byte crc = mhz19_getCheckSum ( response ) ;
if ( response [ 0 ] = = 0xFF & & response [ 1 ] = = CMD_READ [ 2 ] & & response [ 8 ] = = crc ) {
unsigned int responseHigh = ( unsigned int ) response [ 2 ] ;
unsigned int responseLow = ( unsigned int ) response [ 3 ] ;
unsigned int ppm = ( 256 * responseHigh ) + responseLow ;
co2 = ppm ;
}
}
return co2 ;
}
# endif