Skip to content
Snippets Groups Projects
Commit 57903585 authored by thiebolt's avatar thiebolt
Browse files

update

parent 9a5891e1
No related branches found
No related tags found
No related merge requests found
...@@ -42,22 +42,18 @@ ...@@ -42,22 +42,18 @@
const uint8_t SCD4x::i2c_addrs[] = { 0x69 }; const uint8_t SCD4x::i2c_addrs[] = { 0x69 };
#if 0
TO BE CONTINUED
/**************************************************************************/ /**************************************************************************/
/*! /*!
@brief Test if device at 'adr' is really what we think of @brief Test if device at 'adr' is really what we think of
*/ */
/**************************************************************************/ /**************************************************************************/
boolean SHT3x::is_device( uint8_t a ) { boolean SCD4x::is_device( uint8_t a ) {
// First step, parse all addresses // First step, parse all addresses
boolean found = false; boolean found = false;
for( uint8_t i=0; i < sizeof(SHT3x::i2c_addrs); i++ ) { for( uint8_t i=0; i < sizeof(SCD4x::i2c_addrs); i++ ) {
if( SHT3x::i2c_addrs[i] == a) { if( SCD4x::i2c_addrs[i] == a) {
found = true; found = true;
break; break;
} }
...@@ -77,21 +73,22 @@ boolean SHT3x::is_device( uint8_t a ) { ...@@ -77,21 +73,22 @@ boolean SHT3x::is_device( uint8_t a ) {
@brief Instantiates a new class @brief Instantiates a new class
*/ */
/**************************************************************************/ /**************************************************************************/
SHT3x::SHT3x( sht3xMeasureType_t kindness ) : generic_driver() { SCD4x::SCD4x( scd4xMeasureType_t kindness ) : generic_driver() {
_i2caddr = -1; _i2caddr = -1;
_measureType = kindness; _measureType = kindness;
_resolution = SHT3X_DEFL_RESOLUTION;
} }
/* declare kind of units */ /* declare kind of units */
const char *SHT3x::_t_units = "celsius"; const char *SCD4x::units_co2 = "ppm";
const char *SHT3x::_rh_units = "%r.H."; const char *SCD4x::units_temp = "celsius";
const char *SCD4x::units_rh = "%r.H.";
/* declare others static vars */ /* declare others static vars */
unsigned long SHT3x::_lastMsRead = 0; unsigned long SCD4x::_lastMsRead = 0;
uint16_t SHT3x::_t_sensor = (uint16_t)(-1); uint16_t SCD4x::_co2_sensor = (uint16_t)(-1);
uint16_t SHT3x::_rh_sensor = (uint16_t)(-1); uint16_t SCD4x::_t_sensor = (uint16_t)(-1);
uint16_t SCD4x::_rh_sensor = (uint16_t)(-1);
/**************************************************************************/ /**************************************************************************/
...@@ -99,17 +96,20 @@ uint16_t SHT3x::_rh_sensor = (uint16_t)(-1); ...@@ -99,17 +96,20 @@ uint16_t SHT3x::_rh_sensor = (uint16_t)(-1);
@brief send back units @brief send back units
*/ */
/**************************************************************************/ /**************************************************************************/
const char * SHT3x::sensorUnits( uint8_t idx ) { const char * SCD4x::sensorUnits( uint8_t idx ) {
switch( _measureType ) { switch( _measureType ) {
case sht3xMeasureType_t::temperature: case scd4xMeasureType_t::co2:
return _t_units; return units_co2;
break; break;
case sht3xMeasureType_t::humidity: case scd4xMeasureType_t::temperature:
return _rh_units; return units_temp;
break;
case scd4xMeasureType_t::humidity:
return units_rh;
break; break;
default: default:
log_error(F("\n[SHT3x] unknown kind of measureType ?!?")); log_flush(); log_error(F("\n[SCD4x] unknown kind of measureType ?!?")); log_flush();
return nullptr; return nullptr;
} }
} }
...@@ -120,7 +120,7 @@ const char * SHT3x::sensorUnits( uint8_t idx ) { ...@@ -120,7 +120,7 @@ const char * SHT3x::sensorUnits( uint8_t idx ) {
@brief Setups the HW @brief Setups the HW
*/ */
/**************************************************************************/ /**************************************************************************/
boolean SHT3x::begin( uint8_t addr=-1) { boolean SCD4x::begin( uint8_t addr=-1) {
// get i2caddr // get i2caddr
if( (addr < (uint8_t)(I2C_ADDR_START)) or (addr > (uint8_t)(I2C_ADDR_STOP)) ) return false; if( (addr < (uint8_t)(I2C_ADDR_START)) or (addr > (uint8_t)(I2C_ADDR_STOP)) ) return false;
_i2caddr = addr; _i2caddr = addr;
...@@ -134,7 +134,6 @@ boolean SHT3x::begin( uint8_t addr=-1) { ...@@ -134,7 +134,6 @@ boolean SHT3x::begin( uint8_t addr=-1) {
*/ */
// define defaults parameters // define defaults parameters
setResolution( _resolution );
/* start lastmsg time measurement. /* start lastmsg time measurement.
* This way, we get sure to have at least a first acquisition! */ * This way, we get sure to have at least a first acquisition! */
...@@ -147,16 +146,17 @@ boolean SHT3x::begin( uint8_t addr=-1) { ...@@ -147,16 +146,17 @@ boolean SHT3x::begin( uint8_t addr=-1) {
/* /*
* Power modes: ON or powerOFF * Power modes: ON or powerOFF
*/ */
void SHT3x::powerOFF( void ) void SCD4x::powerOFF( void )
{ {
// device does not feature continuous integration so nothing to start or stop // device does not feature continuous integration so nothing to start or stop
} }
void SHT3x::powerON( void ) void SCD4x::powerON( void )
{ {
// device does not feature continuous integration so nothing to start or stop // device does not feature continuous integration so nothing to start or stop
} }
TO BE CONTINUED
/**************************************************************************/ /**************************************************************************/
/*! /*!
...@@ -505,5 +505,3 @@ bool SHT3x::_check_identity( uint8_t a ) { ...@@ -505,5 +505,3 @@ bool SHT3x::_check_identity( uint8_t a ) {
return true; return true;
} }
#endif /* 0 */
...@@ -50,7 +50,7 @@ ...@@ -50,7 +50,7 @@
* - CO2, temp and humidity are measured and sent in a single 9bytes frame * - CO2, temp and humidity are measured and sent in a single 9bytes frame
* 16bits C02 + CRC + 16bits T + CRC + 16bits RH + CRC * 16bits C02 + CRC + 16bits T + CRC + 16bits RH + CRC
* - every 16bits frames are CRC protected * - every 16bits frames are CRC protected
* - CRC8 0x31, initial=0xFF for 16bits data (first is ) * - CRC8 0x31, initial=0xFF, final xor=0x00 for 16bits data (first is )
*/ */
enum class sht3xCmd_t : uint16_t { enum class sht3xCmd_t : uint16_t {
...@@ -74,73 +74,37 @@ enum class sht3xCmd_t : uint16_t { ...@@ -74,73 +74,37 @@ enum class sht3xCmd_t : uint16_t {
// low-power operations // low-power operations
start_low_power_periodoc_measurement = 0x21ac, // 30s measurement delay start_low_power_periodoc_measurement = 0x21ac, // 30s measurement delay
get_data_ready_status = 0xe4b8, // execution time: 1ms get_data_ready_status = 0xe4b8, // execution time: 1ms
// stop_periodic_measurement to stop low_power periodic measurement
TO BE CONTINUED
// advanced features
//Advanced features persist_settings = 0x3615, // execution time: 800ms
#define SCD4x_COMMAND_PERSIST_SETTINGS 0x3615 // execution time: 800ms get_serial_number = 0x3682, // execution time: 1ms
#define SCD4x_COMMAND_GET_SERIAL_NUMBER 0x3682 // execution time: 1ms perform_self_test = 0x3639, // execution time: 10000ms
#define SCD4x_COMMAND_PERFORM_SELF_TEST 0x3639 // execution time: 10000ms perform_factory_reset = 0x3632, // execution time: 1200ms
#define SCD4x_COMMAND_PERFORM_FACTORY_RESET 0x3632 // execution time: 1200ms reinit = 0x3646, // execution time: 20ms
#define SCD4x_COMMAND_REINIT 0x3646 // execution time: 20ms
// low-power single shot - SCD41 only
//Low power single shot - SCD41 only measure_single_shot = 0x219d, // execution time: 5000ms
#define SCD4x_COMMAND_MEASURE_SINGLE_SHOT 0x219d // execution time: 5000ms measure_single_shot_rht_only = 0x2196, // execution time: 50ms
#define SCD4x_COMMAND_MEASURE_SINGLE_SHOT_RHT_ONLY 0x2196 // execution time: 50ms
soft_reset = 0X30A2, // software reset
heater_enable = 0x306D, // on-chip heater enable
heater_disable = 0x3066, // on-chip heater disable
get_status = 0xF32D, // read Status Register
clear_status = 0x3041, // clear Status Register
meas_highRes_stretch = 0x2C06, // Measurement High Repeatability (resolution) with Clock Stretch Enabled
meas_medRes_stretch = 0x2C0D, // Measurement Medium Repeatability (resolution) with Clock Stretch Enabled
meas_lowRes_stretch = 0x2C10, // Measurement Low Repeatability (resolution) with Clock Stretch Enabled
meas_highRes = 0x2400, // Measurement High Repeatability (resolution) WITHOUT clock stretching
meas_medRes = 0x240B, // Measurement Medium Repeatability (resolution) WITHOUT clock stretching
meas_lowRes = 0x2416, // Measurement Low Repeatability (resolution) WITHOUT clock stretching
}; };
// status
#define SHT3X_STATUS_REG_MASK 0xFC1F // removed bit 9:5 because of their unspecified value
#define SHT3X_STATUS_REG_DEFL 0x8010 // expected default value (apply MASK for value checking)
// type of measure // type of measure
enum class sht3xMeasureType_t : uint8_t { enum class scd4xMeasureType_t : uint8_t {
co2 = 0x00,
humidity = 0x10, humidity = 0x10,
temperature = 0x20 temperature = 0x20
}; };
// resolution
enum class sht3xResolution_t : uint8_t {
high_res,
medium_res,
low_res
};
#define SHT3X_DEFL_RESOLUTION sht3xResolution_t::high_res
// integration time (ms)
enum class sht3xIntegration_t : uint8_t {
ms_integrate_high = 16, // integraion time (ms) for high resolution measure
ms_integrate_medium = 7, // integraion time (ms) for medium resolution measure
ms_integrate_low = 5 // integraion time (ms) for low resolution measure
};
#define SHT3X_INTEGRATION_TIME_CTE 5 // additionnal ms delay to all timings (total <= 255 ---uint8_t)
/* /*
* Class * Class
*/ */
class SHT3x : public generic_driver { class SCD4x : public generic_driver {
public: public:
SHT3x( sht3xMeasureType_t ); SCD4x( scd4xMeasureType_t );
boolean begin( uint8_t ); // start with an i2c address boolean begin( uint8_t ); // start with an i2c address
bool setResolution( sht3xResolution_t );
void powerON( void ); // switch ON void powerON( void ); // switch ON
void powerOFF( void ); // switch OFF void powerOFF( void ); // switch OFF
...@@ -150,17 +114,18 @@ class SHT3x : public generic_driver { ...@@ -150,17 +114,18 @@ class SHT3x : public generic_driver {
String subID( uint8_t=0 ) { return String(_i2caddr); }; String subID( uint8_t=0 ) { return String(_i2caddr); };
// read sensor's values // read sensor's values
boolean getCO2( float* ); // retroieve co2
boolean getRH( float* ); // retrieve humidity boolean getRH( float* ); // retrieve humidity
boolean getTemp( float* ); // retrieve temperature boolean getTemp( float* ); // retrieve temperature
// --- static methods / constants ----------------------- // --- static methods / constants -----------------------
// list of possibles I2C addrs // list of possibles I2C addrs
static const uint8_t i2c_addrs[]; static const uint8_t i2c_addrs[];
// device detection // device detection
static boolean is_device( uint8_t ); static boolean is_device( uint8_t );
private: private:
// -- private methods // -- private methods
bool _readSensor( uint16_t* ); // low-level function to read value registers bool _readSensor( uint16_t* ); // low-level function to read value registers
...@@ -171,22 +136,23 @@ class SHT3x : public generic_driver { ...@@ -171,22 +136,23 @@ class SHT3x : public generic_driver {
// --- private attributes // --- private attributes
uint8_t _i2caddr; uint8_t _i2caddr;
sht3xResolution_t _resolution; scd4xMeasureType_t _measureType;
sht3xMeasureType_t _measureType; static const char *units_co2;
static const char *_t_units; static const char *units_temp;
static const char *_rh_units; static const char *units_rh;
uint8_t _integrationTime; // ms time to integrate a measure (for non continuous mode) uint16_t _integrationTime; // ms time to integrate a measure
/* both TEMP and RH are read at the same time ==> hence we store them /* CO2, TEMP and RH are read at the same time ==> hence we store them
as shared attributes across all instances */ as shared attributes across all instances */
static unsigned long _lastMsRead; // last time data have been read (elapsed ms from beginning) static unsigned long _lastMsRead; // last time data have been read (elapsed ms from beginning)
static uint16_t _t_sensor; // shared across all instances (for both humidity and temperature modules) static uint16_t _co2_sensor; // shared across all instances
static uint16_t _rh_sensor; // shared across all instances (for both humidity and temperature modules) static uint16_t _t_sensor; // shared across all instances
static uint16_t _rh_sensor; // shared across all instances
// CRC computation // CRC computation
static const uint8_t _crc8_polynom; // crc P(x)=x^8+x^5+x^4+1 (0x31) 1.00110001, init=0xFF static const uint8_t _crc8_polynom; // crc P(x)=x^8+x^5+x^4+1 (0x31) 1.00110001, init=0xFF
#ifdef SHT3X_CRC_LOOKUP_TABLE #ifdef SCD4X_CRC_LOOKUP_TABLE
static const uint8_t _crc8_table[256]; static const uint8_t _crc8_table[256];
#endif /* SHT3X_CRC_LOOKUP_TABLE */ #endif /* SCD4X_CRC_LOOKUP_TABLE */
}; };
#endif /* _SCD4X_H_ */ #endif /* _SCD4X_H_ */
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment