Capacitive digital sensor for relative humidity and temperature
Dependents: Arduino_Nano33BLESense_examples
HTS221.h
- Committer:
- mcm
- Date:
- 2019-05-31
- Revision:
- 3:1fc3a35d731a
- Parent:
- 1:ab60d7a79df0
File content as of revision 3:1fc3a35d731a:
/** * @brief HTS221.h * @details Capacitive digital sensor for relative humidity and temperature. * Header file. * * * @return N/A * * @author Manuel Caballero * @date 31/May/2019 * @version 31/May/2019 The ORIGIN * @pre N/A. * @warning N/A * @pre This code belongs to AqueronteBlog ( http://unbarquero.blogspot.com ). All rights reserved. */ #ifndef HTS221_H #define HTS221_H #include "mbed.h" /** Example: @code #include "mbed.h" #include "HTS221.h" HTS221 myHTS221 ( I2C_SDA, I2C_SCL, HTS221::HTS221_ADDRESS, 400000 ); // I2C_SDA | I2C_SCL Serial pc ( USBTX, USBRX ); // tx, rx DigitalOut myled ( LED1 ); Ticker newAction; //@brief Constants. //@brief Variables. volatile uint32_t myState; // State that indicates when to perform a new sample // @brief FUNCTION PROTOTYPES void changeDATA ( void ); //@brief FUNCTION FOR APPLICATION MAIN ENTRY. int main() { HTS221::HTS221_status_t aux; HTS221::HTS221_data_t myHTS221_Data; pc.baud ( 115200 ); myled = 1; wait(3); myled = 0; // Get device ID aux = myHTS221.HTS221_GetDeviceID ( &myHTS221_Data ); // Boot the device aux = myHTS221.HTS221_SetBoot (); // Set device in ACTIVE mode aux = myHTS221.HTS221_SetPowerDown ( HTS221::CTRL_REG1_PD_ACTIVE_MODE ); // Get calibration coefficients aux = myHTS221.HTS221_GetCalibrationCoefficients ( &myHTS221_Data ); // Output registers not updated until MSB and LSB reading myHTS221_Data.bdu = HTS221::CTRL_REG1_BDU_DEFAULT_MODE; aux = myHTS221.HTS221_SetBlockDataUpdate ( myHTS221_Data ); // Set resolution: 16 AVGT, 32 AVGH myHTS221_Data.temperatureResolution = HTS221::AV_CONF_AVGT_16; myHTS221_Data.humidityResolution = HTS221::AV_CONF_AVGH_32; aux = myHTS221.HTS221_SetResolution ( myHTS221_Data ); // ODR myHTS221_Data.odr = HTS221::CTRL_REG1_ODR_ONE_SHOT; aux = myHTS221.HTS221_SetOutputDataRate ( myHTS221_Data ); myState = 0UL; // Reset the variable newAction.attach( &changeDATA, 1U ); // the address of the function to be attached ( changeDATA ) and the interval ( 1s ) // Let the callbacks take care of everything while(1) { sleep(); if ( myState == 1UL ) { myled = 1U; // Trigger to get a new data value aux = myHTS221.HTS221_SetOneShot (); // Wait until there is a new data do { aux = myHTS221.HTS221_GetOneShot ( &myHTS221_Data ); } while( myHTS221_Data.one_shot == HTS221::CTRL_REG2_ONE_SHOT_WAITING ); aux = myHTS221.HTS221_GetCalibrationCoefficients ( &myHTS221_Data ); // Get temperature do { aux = myHTS221.HTS221_GetTemperatureDataAvailable ( &myHTS221_Data ); } while( myHTS221_Data.t_da == HTS221::STATUS_REGISTER_T_DA_DATA_NOT_AVAILABLE ); aux = myHTS221.HTS221_GetTemperature ( &myHTS221_Data ); // Get humidity aux = myHTS221.HTS221_GetHumidity ( &myHTS221_Data ); // Send data through the UART pc.printf ( "T: %0.1f C, RH: %0.1f %%\r\n", myHTS221_Data.temperature, myHTS221_Data.humidity ); // Reset the variables myState = 0UL; myled = 0U; } } } // @brief changeDATA ( void ) // // @details It changes myState variable // // @param[in] N/A // // @param[out] N/A. // // @return N/A. // // @author Manuel Caballero // @date 31/May/2019 // @version 31/May/2019 The ORIGIN // @pre N/A // @warning N/A. void changeDATA ( void ) { myState = 1UL; } @endcode */ /*! Library for the HTS221 Capacitive digital sensor for relative humidity and temperature. */ class HTS221 { public: typedef enum { HTS221_ADDRESS = ( 0b1011111 << 1U ) /*!< I2C slave address byte */ } HTS221_address_t; /** * @brief REGISTERS */ typedef enum { HTS221_WHO_AM_I = 0x0F, /*!< Device identification */ HTS221_AV_CONF = 0x10, /*!< Humidity and temperature resolution mode */ HTS221_CTRL_REG1 = 0x20, /*!< Control register 1 */ HTS221_CTRL_REG2 = 0x21, /*!< Control register 2 */ HTS221_CTRL_REG3 = 0x22, /*!< Control register 3 */ HTS221_STATUS_REG = 0x27, /*!< Status register */ HTS221_HUMIDITY_OUT_L = 0x28, /*!< Relative humidity data (LSB) */ HTS221_HUMIDITY_OUT_H = 0x29, /*!< Relative humidity data (MSB) */ HTS221_TEMP_OUT_L = 0x2A, /*!< Temperature data (LSB) */ HTS221_TEMP_OUT_H = 0x2B, /*!< Temperature data (MSB) */ HTS221_CALIB_0 = 0x30, /*!< Calibration register */ HTS221_CALIB_1 = 0x31, /*!< Calibration register */ HTS221_CALIB_2 = 0x32, /*!< Calibration register */ HTS221_CALIB_3 = 0x33, /*!< Calibration register */ HTS221_CALIB_4 = 0x34, /*!< Calibration register */ HTS221_CALIB_5 = 0x35, /*!< Calibration register */ HTS221_CALIB_6 = 0x36, /*!< Calibration register */ HTS221_CALIB_7 = 0x37, /*!< Calibration register */ HTS221_CALIB_8 = 0x38, /*!< Calibration register */ HTS221_CALIB_9 = 0x39, /*!< Calibration register */ HTS221_CALIB_A = 0x3A, /*!< Calibration register */ HTS221_CALIB_B = 0x3B, /*!< Calibration register */ HTS221_CALIB_C = 0x3C, /*!< Calibration register */ HTS221_CALIB_D = 0x3D, /*!< Calibration register */ HTS221_CALIB_E = 0x3E, /*!< Calibration register */ HTS221_CALIB_F = 0x3F /*!< Calibration register */ } HTS221_registers_t; /** * @brief WHO_AM_I REGISTER */ typedef enum { WHO_AM_I_MASK = 0xFF, /*!< WHO_AM_I mask */ WHO_AM_I_VALUE = 0xBC /*!< WHO_AM_I value */ } HTS221_who_am_i_t; /** * @brief AV_CONF REGISTER */ /* AVGT <5:3> * NOTE: Numbers of averaged temperature samples ( 2-256 ). */ typedef enum { AV_CONF_AVGT_MASK = ( 0b111 << 3U ), /*!< AVGT mask */ AV_CONF_AVGT_2 = ( 0b000 << 3U ), /*!< AVGT Nr. internal average 2 */ AV_CONF_AVGT_4 = ( 0b001 << 3U ), /*!< AVGT Nr. internal average 4 */ AV_CONF_AVGT_8 = ( 0b010 << 3U ), /*!< AVGT Nr. internal average 8 */ AV_CONF_AVGT_16 = ( 0b011 << 3U ), /*!< AVGT Nr. internal average 16 [ Default ] */ AV_CONF_AVGT_32 = ( 0b100 << 3U ), /*!< AVGT Nr. internal average 32 */ AV_CONF_AVGT_64 = ( 0b101 << 3U ), /*!< AVGT Nr. internal average 64 */ AV_CONF_AVGT_128 = ( 0b110 << 3U ), /*!< AVGT Nr. internal average 128 */ AV_CONF_AVGT_256 = ( 0b111 << 3U ) /*!< AVGT Nr. internal average 256 */ } HTS221_av_config_avgt_t; /* AVGH <2:0> * NOTE: Numbers of averaged humidity samples ( 4-512 ). */ typedef enum { AV_CONF_AVGH_MASK = ( 0b111 << 0U ), /*!< AVGH mask */ AV_CONF_AVGH_4 = ( 0b000 << 0U ), /*!< AVGH Nr. internal average 4 */ AV_CONF_AVGH_8 = ( 0b001 << 0U ), /*!< AVGH Nr. internal average 8 */ AV_CONF_AVGH_16 = ( 0b010 << 0U ), /*!< AVGH Nr. internal average 16 */ AV_CONF_AVGH_32 = ( 0b011 << 0U ), /*!< AVGH Nr. internal average 32 [ Default ] */ AV_CONF_AVGH_64 = ( 0b100 << 0U ), /*!< AVGH Nr. internal average 64 */ AV_CONF_AVGH_128 = ( 0b101 << 0U ), /*!< AVGH Nr. internal average 128 */ AV_CONF_AVGH_256 = ( 0b110 << 0U ), /*!< AVGH Nr. internal average 256 */ AV_CONF_AVGH_512 = ( 0b111 << 0U ) /*!< AVGH Nr. internal average 512 */ } HTS221_av_config_avgh_t; /** * @brief CTRL_REG1 REGISTER */ /* PD <7> * NOTE: Power-down control. */ typedef enum { CTRL_REG1_PD_MASK = ( 1U << 7U ), /*!< PD mask */ CTRL_REG1_PD_POWER_DOWN_MODE = ( 0U << 7U ), /*!< PD power-down mode [ Default ] */ CTRL_REG1_PD_ACTIVE_MODE = ( 1U << 7U ) /*!< PD active mode */ } HTS221_ctrl_reg1_pd_t; /* BDU <2> * NOTE: Block data update. */ typedef enum { CTRL_REG1_BDU_MASK = ( 1U << 2U ), /*!< BDU mask */ CTRL_REG1_BDU_CONTINUOUS_UPDATE = ( 0U << 2U ), /*!< Continuous update */ CTRL_REG1_BDU_DEFAULT_MODE = ( 1U << 2U ) /*!< Output registers not updated until MSB and LSB reading [ Default ] */ } HTS221_ctrl_reg1_bdu_t; /* ODR <1:0> * NOTE: Output data rate selection. */ typedef enum { CTRL_REG1_ODR_MASK = ( 0b11 << 0U ), /*!< ODR mask */ CTRL_REG1_ODR_ONE_SHOT = ( 0b00 << 0U ), /*!< One-shot */ CTRL_REG1_ODR_1_HZ = ( 0b01 << 0U ), /*!< 1 Hz */ CTRL_REG1_ODR_7_HZ = ( 0b10 << 0U ), /*!< 7 Hz */ CTRL_REG1_ODR_12_5_HZ = ( 0b11 << 0U ) /*!< 12.5 Hz */ } HTS221_ctrl_reg1_odr_t; /** * @brief CTRL_REG2 REGISTER */ /* BOOT <7> * NOTE: Reboot memory content. */ typedef enum { CTRL_REG2_BOOT_MASK = ( 1U << 7U ), /*!< BOOT mask */ CTRL_REG2_BOOT_NORMAL_MODE = ( 0U << 7U ), /*!< normal mode [ Default ] */ CTRL_REG2_BOOT_REBOOT_MEMORY_CONTENT = ( 1U << 7U ) /*!< reboot memory content */ } HTS221_ctrl_reg2_boot_t; /* Heater <1> * NOTE: Controling an internal heating element. */ typedef enum { CTRL_REG2_HEATER_MASK = ( 1U << 1U ), /*!< Heater mask */ CTRL_REG2_HEATER_HEATER_DISABLED = ( 0U << 1U ), /*!< Heater disabled [ Default ] */ CTRL_REG2_HEATER_HEATER_ENABLED = ( 1U << 1U ) /*!< Heater enabled */ } HTS221_ctrl_reg2_heater_t; /* ONE_SHOT <0> * NOTE: One-shot enable. */ typedef enum { CTRL_REG2_ONE_SHOT_MASK = ( 1U << 0U ), /*!< ONE_SHOT mask */ CTRL_REG2_ONE_SHOT_WAITING = ( 0U << 0U ), /*!< waiting for start of conversion [ Default ] */ CTRL_REG2_ONE_SHOT_START = ( 1U << 0U ) /*!< start for a new dataset */ } HTS221_ctrl_reg2_one_shot_t; /** * @brief CTRL_REG3 REGISTER */ /* DRDY_H_L <7> * NOTE: Data Ready output signal active high, low. */ typedef enum { CTRL_REG3_DRDY_H_L_MASK = ( 1U << 7U ), /*!< DRDY_H_L mask */ CTRL_REG3_DRDY_H_L_ACTIVE_HIGH = ( 0U << 7U ), /*!< active high [ Default ] */ CTRL_REG3_DRDY_H_L_ACTIVE_LOW = ( 1U << 7U ) /*!< active low */ } HTS221_ctrl_reg3_drdy_h_l_t; /* PP_OD <6> * NOTE: Push-pull / Open Drain selection on pin 3 (DRDY). */ typedef enum { CTRL_REG3_PP_OD_MASK = ( 1U << 6U ), /*!< PP_OD mask */ CTRL_REG3_PP_OD_PUSH_PULL = ( 0U << 6U ), /*!< push-pull [ Default ] */ CTRL_REG3_PP_OD_OPEN_DRAIN = ( 1U << 6U ) /*!< open drain */ } HTS221_ctrl_reg3_pp_od_t; /* DRDY_EN <2> * NOTE: Data Ready enable. */ typedef enum { CTRL_REG3_DRDY_EN_MASK = ( 1U << 2U ), /*!< DRDY_EN mask */ CTRL_REG3_DRDY_DATA_READY_DISABLED = ( 0U << 2U ), /*!< Data Ready disabled [ Default ] */ CTRL_REG3_DRDY_DATA_READY_ENABLED = ( 1U << 2U ) /*!< Data Ready signal available on pin 3 */ } HTS221_ctrl_reg3_drdy_en_t; /** * @brief STATUS_REG REGISTER * * NOTE: H_DA is set to 1 whenever a new humidity sample is available. H_DA is cleared anytime * HUMIDITY_OUT_H (29h) register is read. T_DA is set to 1 whenever a new temperature sample is available. T_DA is cleared anytime TEMP_OUT_H (2Bh) register is read. */ /* H_DA <1> * NOTE: Humidity data available. */ typedef enum { STATUS_REGISTER_H_DA_MASK = ( 1U << 1U ), /*!< H_DA mask */ STATUS_REGISTER_H_DA_DATA_NOT_AVAILABLE = ( 0U << 1U ), /*!< new data for humidity is not yet available */ STATUS_REGISTER_H_DA_DATA_AVAILABLE = ( 1U << 1U ) /*!< new data for humidity is available */ } HTS221_status_reg_h_da_t; /* T_DA <0> * NOTE: Temperature data available. */ typedef enum { STATUS_REGISTER_T_DA_MASK = ( 1U << 0U ), /*!< T_DA mask */ STATUS_REGISTER_T_DA_DATA_NOT_AVAILABLE = ( 0U << 0U ), /*!< new data for temperature is not yet available */ STATUS_REGISTER_T_DA_DATA_AVAILABLE = ( 1U << 0U ) /*!< new data for temperature is available */ } HTS221_status_reg_t_da_t; /** * @brief HUMIDITY_OUT_L REGISTER * * NOTE: Relative humidity data (LSB) . * */ typedef enum { HUMIDITY_OUT_L_MASK = 0xFF /*!< Humidity data LSB mask */ } HTS221_humidity_out_l_t; /** * @brief HUMIDITY_OUT_H REGISTER * * NOTE: Relative humidity data (LSB) . * */ typedef enum { HUMIDITY_OUT_H_MASK = 0xFF /*!< Humidity data MSB mask */ } HTS221_humidity_out_h_t; /** * @brief TEMP_OUT_L REGISTER * * NOTE: Temperature data (LSB) . * */ typedef enum { TEMP_OUT_L_MASK = 0xFF /*!< Temperature data LSB mask */ } HTS221_temp_out_l_t; /** * @brief TEMP_OUT_H REGISTER * * NOTE: Temperature data (MSB) . * */ typedef enum { TEMP_OUT_H_MASK = 0xFF /*!< Temperature data MSB mask */ } HTS221_temp_out_h_t; #ifndef HTS221_VECTOR_STRUCT_H #define HTS221_VECTOR_STRUCT_H typedef struct { /* Output registers */ int16_t rawHumidity; /*!< Raw humidity */ int16_t rawTemperature; /*!< Raw temperature */ float humidity; /*!< Humidity value */ float temperature; /*!< Temperature value */ /* Calibration registers */ uint8_t h0_rH_x2; /*!< Calibration register */ uint8_t h1_rH_x2; /*!< Calibration register */ uint8_t t0_degC_x8; /*!< Calibration register */ uint8_t t1_degC_x8; /*!< Calibration register */ uint8_t t1_T0_msb; /*!< Calibration register */ int16_t h0_T0_OUT; /*!< Calibration register */ int16_t h1_T0_OUT; /*!< Calibration register */ int16_t t0_OUT; /*!< Calibration register */ int16_t t1_OUT; /*!< Calibration register */ int16_t t0_degC; /*!< Calibration result */ int16_t t1_degC; /*!< Calibration result */ int16_t h0_RH; /*!< Calibration result */ int16_t h1_RH; /*!< Calibration result */ /* Device identification */ uint8_t deviceID; /*!< Device ID */ /* Device configuration */ HTS221_av_config_avgt_t temperatureResolution; /*!< Temperature resolution */ HTS221_av_config_avgh_t humidityResolution; /*!< Humidity resolution */ HTS221_ctrl_reg1_bdu_t bdu; /*!< Block data update */ HTS221_ctrl_reg1_odr_t odr; /*!< Output data rate */ HTS221_ctrl_reg2_boot_t boot; /*!< Reboot mode content */ HTS221_ctrl_reg2_heater_t heater; /*!< Heater */ HTS221_ctrl_reg2_one_shot_t one_shot; /*!< One-Shot */ /* Device status */ HTS221_status_reg_h_da_t h_da; /*!< Humidity data available */ HTS221_status_reg_t_da_t t_da; /*!< Temperature data available */ } HTS221_data_t; #endif /** * @brief INTERNAL CONSTANTS */ typedef enum { HTS221_SUCCESS = 0U, HTS221_FAILURE = 1U, I2C_SUCCESS = 0U /*!< I2C communication was fine */ } HTS221_status_t; /** Create an HTS221 object connected to the specified I2C pins. * * @param sda I2C data pin * @param scl I2C clock pin * @param addr I2C slave address * @param freq I2C frequency */ HTS221 ( PinName sda, PinName scl, uint32_t addr, uint32_t freq ); /** Delete HTS221 object. */ ~HTS221(); /** It gets the device identification. */ HTS221_status_t HTS221_GetDeviceID ( HTS221_data_t* myDeviceID ); /** It sets humidity and temperature resolution mode. */ HTS221_status_t HTS221_SetResolution ( HTS221_data_t myTempHumResolution ); /** It gets humidity and temperature resolution mode. */ HTS221_status_t HTS221_GetResolution ( HTS221_data_t* myTempHumResolution ); /** It sets power-down control mode. */ HTS221_status_t HTS221_SetPowerDown ( HTS221_ctrl_reg1_pd_t myPowerMode ); /** It sets the block data update. */ HTS221_status_t HTS221_SetBlockDataUpdate ( HTS221_data_t myBDU ); /** It gets the block data update. */ HTS221_status_t HTS221_GetBlockDataUpdate ( HTS221_data_t* myBDU ); /** It sets the output data rate ( ODR ). */ HTS221_status_t HTS221_SetOutputDataRate ( HTS221_data_t myODR ); /** It gets the output data rate ( ODR ). */ HTS221_status_t HTS221_GetOutputDataRate ( HTS221_data_t* myODR ); /** It sets reboot memory content. */ HTS221_status_t HTS221_SetBoot ( void ); /** It gets reboot memory content. */ HTS221_status_t HTS221_GetBoot ( HTS221_data_t* myBOOT ); /** It sets heater mode: Enabled/Disabled. */ HTS221_status_t HTS221_SetHeater ( HTS221_data_t myHeater ); /** It gets heater mode. */ HTS221_status_t HTS221_GetHeater ( HTS221_data_t* myHeater ); /** It sets one-shot, new data set. */ HTS221_status_t HTS221_SetOneShot ( void ); /** It gets one-shot flag. */ HTS221_status_t HTS221_GetOneShot ( HTS221_data_t* myOneShot ); /** It sets data ready output signal active high/low. */ HTS221_status_t HTS221_SetDataReadyOuput ( HTS221_ctrl_reg3_drdy_h_l_t myDRDY_H_L ); /** It sets Push-pull/Open Drain selection on pin 3 ( DRDY ). */ HTS221_status_t HTS221_SetSelectionOnPin3 ( HTS221_ctrl_reg3_pp_od_t myDRDY ); /** It sets data ready enable. */ HTS221_status_t HTS221_SetDataReadyEnable ( HTS221_ctrl_reg3_drdy_en_t myDRDY_EN ); /** It gets humidity data available flag. */ HTS221_status_t HTS221_GetHumidityDataAvailable ( HTS221_data_t* myHumidityFlag ); /** It gets temperature data available flag. */ HTS221_status_t HTS221_GetTemperatureDataAvailable ( HTS221_data_t* myTemperatureFlag ); /** It gets raw humidity. */ HTS221_status_t HTS221_GetRawHumidity ( HTS221_data_t* myRawHumidity ); /** It gets raw temperature. */ HTS221_status_t HTS221_GetRawTemperature ( HTS221_data_t* myRawTemperature ); /** It gets calibration coefficients. */ HTS221_status_t HTS221_GetCalibrationCoefficients ( HTS221_data_t* myCoeff ); /** It gets the current temperature value in Celsius degrees. */ HTS221_status_t HTS221_GetTemperature ( HTS221_data_t* myTemperature ); /** It gets the current humidity value. */ HTS221_status_t HTS221_GetHumidity ( HTS221_data_t* myHumidity ); private: I2C _i2c; uint32_t _HTS221_Addr; }; #endif