diff --git a/neosensor/libraries/boards/neosensor.h b/neosensor/libraries/boards/neosensor.h index 53719d7b5df03ce2405e97bd9a9987f9c2f2fe4d..1605517e6be9e52362b0837ce1f8c1ab98260844 100644 --- a/neosensor/libraries/boards/neosensor.h +++ b/neosensor/libraries/boards/neosensor.h @@ -42,7 +42,7 @@ */ #define BOARD_NAME "neOSensor" #define BOARD_REVISION 1.2 -#define BOARD_FWREV 211129 // Firmware revision <year><month><day> in 2 digits each +#define BOARD_FWREV 220314 // Firmware revision <year><month><day> in 2 digits each /* ############################################################################# diff --git a/neosensor/libraries/neocampus_drivers/MCP47X6.cpp b/neosensor/libraries/neocampus_drivers/MCP47X6.cpp index f3855949b52990b564aa646aa098c9558c3fcac7..67d50242aa82dabf1252311a49e8960627a93c01 100644 --- a/neosensor/libraries/neocampus_drivers/MCP47X6.cpp +++ b/neosensor/libraries/neocampus_drivers/MCP47X6.cpp @@ -11,6 +11,8 @@ @section HISTORY + F.Thiebolt mar.22 added early detection support to distinguish with + newer SCD4x (0x62) chips 2017-July - F.Thiebolt Initial release */ @@ -52,10 +54,14 @@ boolean MCP47X6::is_device( uint8_t a ) { if( found == false ) return false; /* - * UNABLE to read MCP47X6 devices because of the specific I2C protocol that does not match - * those used at arduino :( + * WARNING: custom I2C reading !!! + * We'll ONLY read ONE byte (we don't care about the others) */ - // unable to read anything so we assume it is ok :s + #warning "Please confirm MCP47X06 eading code" + uint8_t status,_res; + _res = readList_ll( a, &status, 1); + if( _res!=1 ) return false; + if( (status & 0xE0) != (uint8_t)0xC0 ) return false; // ... okay return true; diff --git a/neosensor/libraries/neocampus_drivers/SCD4x.cpp b/neosensor/libraries/neocampus_drivers/SCD4x.cpp index 0fab7df92adc57ef1dfce088689cc9174f7c1057..a8bc977b332965bd9816098161d4df0060bd940e 100644 --- a/neosensor/libraries/neocampus_drivers/SCD4x.cpp +++ b/neosensor/libraries/neocampus_drivers/SCD4x.cpp @@ -33,13 +33,22 @@ #include "SCD4x.h" +/* + * Definitions + * Time to obtain a new data point = _MAX_MEASURES * (5s or 30s) if periodic or low-power periodic) + */ +#define _MEASURES_INTERLEAVE_MS DEFL_READ_MSINTERVAL // delay between two measures in the 'measuring' state +#define _MAX_MEASURES 3 // max. number of measures during a single campaign +//#define _MAX_MEASURES DEFL_THRESHOLD_CPT // max. number of measures during a single campaign + + /**************************************************************************/ /*! @brief Declare list of possible I2C addrs */ /**************************************************************************/ -const uint8_t SCD4x::i2c_addrs[] = { 0x69 }; +const uint8_t SCD4x::i2c_addrs[] = { 0x62 }; /* [static] declare kind of units */ @@ -91,7 +100,8 @@ boolean SCD4x::is_device( uint8_t a ) { @brief Instantiates a new class */ /**************************************************************************/ -SCD4x::SCD4x( scd4xMeasureType_t kindness ) : generic_driver() { +SCD4x::SCD4x( scd4xMeasureType_t kindness ) : generic_driver( _MEASURES_INTERLEAVE_MS, + _MAX_MEASURES ) { _i2caddr = -1; _measureType = kindness; } @@ -323,7 +333,7 @@ bool SCD4x::_readSensor( void ) { // DEBUG hex_dump( (char*)buf, sizeof(buf) ); - break; + //break; // CO2 + CRC if( crc_check(buf, 2, buf[2]) ) { @@ -504,8 +514,8 @@ bool SCD4x::_check_identity( uint8_t a ) { } // DEBUG - hex_dump( (char*)buf, sizeof(buf) ); - break; + //hex_dump( (char*)buf, sizeof(buf) ); + //break; // check answer's CRC if( not crc_check(buf, 2, buf[2]) ) { @@ -526,8 +536,8 @@ bool SCD4x::_check_identity( uint8_t a ) { // DISPLAY retrieved serial number :) { - char tmp[48]; - snprintf(tmp, sizeof(tmp),"\n[SCD4x] serial number = 0x%02X%02X %02X%02X %02X%02X", + char tmp[64]; + snprintf(tmp, sizeof(tmp),"\n[SCD4x] detected serial number = 0x%02X%02X %02X%02X %02X%02X", buf[7],buf[6],buf[4],buf[3],buf[1],buf[0]); log_debug(tmp); log_flush(); } diff --git a/neosensor/libraries/neocampus_modules/temperature.cpp b/neosensor/libraries/neocampus_modules/temperature.cpp index 5d8e5df54c6993c9d16eaf97293742826b976688..9d90dc546183880f3e6391c5b91cd009d04315c1 100644 --- a/neosensor/libraries/neocampus_modules/temperature.cpp +++ b/neosensor/libraries/neocampus_modules/temperature.cpp @@ -9,6 +9,7 @@ * TODO: * - convert all 'frequency' parameters & define into 'cooldown' ones * --- + * F.Thiebolt mar.22 add support for SCD4x sensor * F.Thiebolt aug.20 switched to intelligent data sending vs timer based data sending * Thiebolt.F nov.20 previous 'force data as float' didn't work! we need to * use serialized(String(1.0,6)); // 1.000000 @@ -128,6 +129,21 @@ boolean temperature::add_sensor( uint8_t adr ) { _sensor_added=true; } } + // check for SHT3x + 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 ) { + 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; + } + } //else if( TCN75A::is_device( adr ) == true ) { // add check for additional device here diff --git a/neosensor/libraries/neocampus_modules/temperature.h b/neosensor/libraries/neocampus_modules/temperature.h index fedb708d14c28bf66dbb02af2830b778c350b0ce..d2550d6111cf5b871efca1e30adeb71640058b39 100644 --- a/neosensor/libraries/neocampus_modules/temperature.h +++ b/neosensor/libraries/neocampus_modules/temperature.h @@ -27,6 +27,7 @@ #include "Adafruit_MCP9808.h" #include "SHT2x.h" #include "SHT3x.h" +#include "SCD4x.h" // Sensirion SCD4X CO2 sensor including temp + hygro //#include "TCN75A.h" later maybe