diff --git a/neosensor/libraries/neocampus_drivers/SCD4x.cpp b/neosensor/libraries/neocampus_drivers/SCD4x.cpp index a8bc977b332965bd9816098161d4df0060bd940e..8e0010bee9d264134d2a20dd491dfdc187a9c5f8 100644 --- a/neosensor/libraries/neocampus_drivers/SCD4x.cpp +++ b/neosensor/libraries/neocampus_drivers/SCD4x.cpp @@ -281,7 +281,7 @@ boolean SCD4x::getRH( float *pval ) { _tmp = (625 * _tmp) >> 12; *pval = (float)_tmp / 100.0f; - _rh_sensor = false; + _rh_sensor_valid = false; return true; } @@ -295,11 +295,16 @@ boolean SCD4x::getRH( float *pval ) { * Software reset through I2C command */ void SCD4x::sw_reset( uint8_t adr ) { + log_debug(F("\n[SCD4x] SOFT RESET action started ..."));log_flush(); + + _writeCmd( adr, static_cast<uint16_t>(scd4xCmd_t::stop_periodic_measurement) ); + delay(500); + _periodic_measure = false; + _writeCmd( adr, static_cast<uint16_t>(scd4xCmd_t::reinit) ); delay( 20 ); - _periodic_measure = false; } diff --git a/neosensor/libraries/neocampus_drivers/TSL2561.cpp b/neosensor/libraries/neocampus_drivers/TSL2561.cpp index a8185a43b85a75c41397bc66f3c3ca9fa8f3b64a..44be5d65e58ca1d946e35281a3262e13db868dbc 100644 --- a/neosensor/libraries/neocampus_drivers/TSL2561.cpp +++ b/neosensor/libraries/neocampus_drivers/TSL2561.cpp @@ -142,14 +142,12 @@ boolean TSL2561::begin( uint8_t addr=INVALID_I2CADDR ) { void TSL2561::powerON(void) { - // Enable the device by setting the control bit to 0x03 - write8(_i2caddr, TSL2561_COMMAND_BIT | TSL2561_CLEAR_BIT | TSL2561_REGISTER_CONTROL, TSL2561_CONTROL_POWERON); + _powerON( _i2caddr ); } void TSL2561::powerOFF(void) { - // Disable the device by setting the control bit to 0x03 - write8(_i2caddr, TSL2561_COMMAND_BIT | TSL2561_CLEAR_BIT | TSL2561_REGISTER_CONTROL, TSL2561_CONTROL_POWEROFF); + _powerOFF( _i2caddr ); } @@ -193,11 +191,28 @@ void TSL2561::setTiming(tsl2561IntegrationTime_t integration) { * Private methods */ +/* + * static PowerON/OFF (for static acquire) + */ +void TSL2561::_powerON( uint8_t a ) { + // Enable the device by setting the control bit to 0x03 + write8( a, TSL2561_COMMAND_BIT | TSL2561_CLEAR_BIT | TSL2561_REGISTER_CONTROL, TSL2561_CONTROL_POWERON); +} + +void TSL2561::_powerOFF( uint8_t a ) { + // Disable the device by setting the control bit to 0x03 + write8( a, TSL2561_COMMAND_BIT | TSL2561_CLEAR_BIT | TSL2561_REGISTER_CONTROL, TSL2561_CONTROL_POWEROFF); +} + /* * Check that device identity is what we expect! */ bool TSL2561::_check_identity( uint8_t a ) { + // stop'n start device + _powerOFF(a); delay(10); + _powerON(a); delay(10); + // check Register ID uint8_t _res = read8(a,TSL2561_REGISTER_ID); if( (_res&0xF0)!=REGISTER_ID_TSL2561 and (_res&0xF0)!=0x00 ) return false; diff --git a/neosensor/libraries/neocampus_drivers/TSL2561.h b/neosensor/libraries/neocampus_drivers/TSL2561.h index 37ebcd0367ebb8706e3abd571746769cf1de1dec..d604bf507840cc2b93a662e070a15421e546bbbf 100644 --- a/neosensor/libraries/neocampus_drivers/TSL2561.h +++ b/neosensor/libraries/neocampus_drivers/TSL2561.h @@ -221,6 +221,8 @@ class TSL2561 : public generic_driver { static const char *units; // methods + static void _powerON( uint8_t ); // power UP device + static void _powerOFF( uint8_t ); // power DOWN device static bool _check_identity( uint8_t ); // check device is what we expect! void _getData( uint16_t *broadband, uint16_t *ir ); }; diff --git a/neosensor/libraries/neocampus_modules/humidity.cpp b/neosensor/libraries/neocampus_modules/humidity.cpp index b1522848524ce2f7c0ef9edb494a16b188444583..badd125cbbb9a10123c528e1ea1de5524b82ca6e 100644 --- a/neosensor/libraries/neocampus_modules/humidity.cpp +++ b/neosensor/libraries/neocampus_modules/humidity.cpp @@ -108,6 +108,21 @@ boolean humidity::add_sensor( uint8_t adr ) { _sensor_added=true; } } + // check for SCD4x + else if( SCD4x::is_device( adr ) == true ) { + SCD4x *cur_sensor = new SCD4x( scd4xMeasureType_t::humidity ); // because it features several sensors + if( cur_sensor->begin( adr ) != true ) { + log_debug(F("\n[temperature] ###ERROR at SCD4x startup ... removing instance ..."));log_flush(); + free(cur_sensor); + cur_sensor = NULL; + } + else { + cur_sensor->powerON(); // remember that device is shared across several modules + cur_sensor->powerOFF(); // remember that device is shared across several modules + _sensor[_sensors_count++] = cur_sensor; + _sensor_added=true; + } + } // add check for additional device here diff --git a/neosensor/libraries/neocampus_modules/humidity.h b/neosensor/libraries/neocampus_modules/humidity.h index 1f28471e7e8320e88137d7d3b32cab341ac99a1f..f9d4ce7e14aad2f5e1a1400930fe99be0ab53637 100644 --- a/neosensor/libraries/neocampus_modules/humidity.h +++ b/neosensor/libraries/neocampus_modules/humidity.h @@ -25,6 +25,7 @@ #include "generic_driver.h" #include "SHT2x.h" #include "SHT3x.h" +#include "SCD4x.h" // Sensirion SCD4X CO2 sensor including temp + hygro diff --git a/neosensor/libraries/neocampus_modules/temperature.cpp b/neosensor/libraries/neocampus_modules/temperature.cpp index 9d90dc546183880f3e6391c5b91cd009d04315c1..b9fad5feb5377e808bd525165540525b8fe96860 100644 --- a/neosensor/libraries/neocampus_modules/temperature.cpp +++ b/neosensor/libraries/neocampus_modules/temperature.cpp @@ -129,7 +129,7 @@ boolean temperature::add_sensor( uint8_t adr ) { _sensor_added=true; } } - // check for SHT3x + // check for SCD4x else if( SCD4x::is_device( adr ) == true ) { SCD4x *cur_sensor = new SCD4x( scd4xMeasureType_t::temperature ); // because it features several sensors if( cur_sensor->begin( adr ) != true ) {