Capacitive digital sensor for relative humidity and temperature

Dependents:   Arduino_Nano33BLESense_examples

Committer:
mcm
Date:
Fri May 31 14:26:29 2019 +0000
Revision:
3:1fc3a35d731a
Parent:
1:ab60d7a79df0
The driver was completed and tested ( NUCLEO-L152RE ), it works as expected.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mcm 1:ab60d7a79df0 1 /**
mcm 1:ab60d7a79df0 2 * @brief HTS221.h
mcm 1:ab60d7a79df0 3 * @details Capacitive digital sensor for relative humidity and temperature.
mcm 1:ab60d7a79df0 4 * Header file.
mcm 1:ab60d7a79df0 5 *
mcm 1:ab60d7a79df0 6 *
mcm 1:ab60d7a79df0 7 * @return N/A
mcm 1:ab60d7a79df0 8 *
mcm 1:ab60d7a79df0 9 * @author Manuel Caballero
mcm 1:ab60d7a79df0 10 * @date 31/May/2019
mcm 1:ab60d7a79df0 11 * @version 31/May/2019 The ORIGIN
mcm 1:ab60d7a79df0 12 * @pre N/A.
mcm 1:ab60d7a79df0 13 * @warning N/A
mcm 1:ab60d7a79df0 14 * @pre This code belongs to AqueronteBlog ( http://unbarquero.blogspot.com ). All rights reserved.
mcm 1:ab60d7a79df0 15 */
mcm 1:ab60d7a79df0 16 #ifndef HTS221_H
mcm 1:ab60d7a79df0 17 #define HTS221_H
mcm 1:ab60d7a79df0 18
mcm 1:ab60d7a79df0 19 #include "mbed.h"
mcm 1:ab60d7a79df0 20
mcm 1:ab60d7a79df0 21
mcm 1:ab60d7a79df0 22 /**
mcm 1:ab60d7a79df0 23 Example:
mcm 1:ab60d7a79df0 24 @code
mcm 3:1fc3a35d731a 25 #include "mbed.h"
mcm 3:1fc3a35d731a 26 #include "HTS221.h"
mcm 1:ab60d7a79df0 27
mcm 3:1fc3a35d731a 28 HTS221 myHTS221 ( I2C_SDA, I2C_SCL, HTS221::HTS221_ADDRESS, 400000 ); // I2C_SDA | I2C_SCL
mcm 3:1fc3a35d731a 29 Serial pc ( USBTX, USBRX ); // tx, rx
mcm 3:1fc3a35d731a 30
mcm 3:1fc3a35d731a 31 DigitalOut myled ( LED1 );
mcm 3:1fc3a35d731a 32 Ticker newAction;
mcm 3:1fc3a35d731a 33
mcm 3:1fc3a35d731a 34
mcm 3:1fc3a35d731a 35 //@brief Constants.
mcm 3:1fc3a35d731a 36
mcm 3:1fc3a35d731a 37
mcm 3:1fc3a35d731a 38 //@brief Variables.
mcm 3:1fc3a35d731a 39 volatile uint32_t myState; // State that indicates when to perform a new sample
mcm 3:1fc3a35d731a 40
mcm 3:1fc3a35d731a 41
mcm 3:1fc3a35d731a 42 // @brief FUNCTION PROTOTYPES
mcm 3:1fc3a35d731a 43 void changeDATA ( void );
mcm 3:1fc3a35d731a 44
mcm 3:1fc3a35d731a 45
mcm 3:1fc3a35d731a 46 //@brief FUNCTION FOR APPLICATION MAIN ENTRY.
mcm 3:1fc3a35d731a 47 int main()
mcm 3:1fc3a35d731a 48 {
mcm 3:1fc3a35d731a 49 HTS221::HTS221_status_t aux;
mcm 3:1fc3a35d731a 50 HTS221::HTS221_data_t myHTS221_Data;
mcm 3:1fc3a35d731a 51
mcm 3:1fc3a35d731a 52 pc.baud ( 115200 );
mcm 3:1fc3a35d731a 53
mcm 3:1fc3a35d731a 54
mcm 3:1fc3a35d731a 55 myled = 1;
mcm 3:1fc3a35d731a 56 wait(3);
mcm 3:1fc3a35d731a 57 myled = 0;
mcm 3:1fc3a35d731a 58
mcm 3:1fc3a35d731a 59 // Get device ID
mcm 3:1fc3a35d731a 60 aux = myHTS221.HTS221_GetDeviceID ( &myHTS221_Data );
mcm 3:1fc3a35d731a 61
mcm 3:1fc3a35d731a 62 // Boot the device
mcm 3:1fc3a35d731a 63 aux = myHTS221.HTS221_SetBoot ();
mcm 3:1fc3a35d731a 64
mcm 3:1fc3a35d731a 65 // Set device in ACTIVE mode
mcm 3:1fc3a35d731a 66 aux = myHTS221.HTS221_SetPowerDown ( HTS221::CTRL_REG1_PD_ACTIVE_MODE );
mcm 3:1fc3a35d731a 67
mcm 3:1fc3a35d731a 68 // Get calibration coefficients
mcm 3:1fc3a35d731a 69 aux = myHTS221.HTS221_GetCalibrationCoefficients ( &myHTS221_Data );
mcm 3:1fc3a35d731a 70
mcm 3:1fc3a35d731a 71 // Output registers not updated until MSB and LSB reading
mcm 3:1fc3a35d731a 72 myHTS221_Data.bdu = HTS221::CTRL_REG1_BDU_DEFAULT_MODE;
mcm 3:1fc3a35d731a 73 aux = myHTS221.HTS221_SetBlockDataUpdate ( myHTS221_Data );
mcm 3:1fc3a35d731a 74
mcm 3:1fc3a35d731a 75 // Set resolution: 16 AVGT, 32 AVGH
mcm 3:1fc3a35d731a 76 myHTS221_Data.temperatureResolution = HTS221::AV_CONF_AVGT_16;
mcm 3:1fc3a35d731a 77 myHTS221_Data.humidityResolution = HTS221::AV_CONF_AVGH_32;
mcm 3:1fc3a35d731a 78 aux = myHTS221.HTS221_SetResolution ( myHTS221_Data );
mcm 3:1fc3a35d731a 79
mcm 3:1fc3a35d731a 80 // ODR
mcm 3:1fc3a35d731a 81 myHTS221_Data.odr = HTS221::CTRL_REG1_ODR_ONE_SHOT;
mcm 3:1fc3a35d731a 82 aux = myHTS221.HTS221_SetOutputDataRate ( myHTS221_Data );
mcm 3:1fc3a35d731a 83
mcm 3:1fc3a35d731a 84
mcm 3:1fc3a35d731a 85 myState = 0UL; // Reset the variable
mcm 3:1fc3a35d731a 86 newAction.attach( &changeDATA, 1U ); // the address of the function to be attached ( changeDATA ) and the interval ( 1s )
mcm 3:1fc3a35d731a 87
mcm 3:1fc3a35d731a 88
mcm 3:1fc3a35d731a 89 // Let the callbacks take care of everything
mcm 3:1fc3a35d731a 90 while(1) {
mcm 3:1fc3a35d731a 91 sleep();
mcm 3:1fc3a35d731a 92
mcm 3:1fc3a35d731a 93 if ( myState == 1UL ) {
mcm 3:1fc3a35d731a 94 myled = 1U;
mcm 3:1fc3a35d731a 95
mcm 3:1fc3a35d731a 96 // Trigger to get a new data value
mcm 3:1fc3a35d731a 97 aux = myHTS221.HTS221_SetOneShot ();
mcm 3:1fc3a35d731a 98
mcm 3:1fc3a35d731a 99 // Wait until there is a new data
mcm 3:1fc3a35d731a 100 do {
mcm 3:1fc3a35d731a 101 aux = myHTS221.HTS221_GetOneShot ( &myHTS221_Data );
mcm 3:1fc3a35d731a 102 } while( myHTS221_Data.one_shot == HTS221::CTRL_REG2_ONE_SHOT_WAITING );
mcm 3:1fc3a35d731a 103
mcm 3:1fc3a35d731a 104
mcm 3:1fc3a35d731a 105 aux = myHTS221.HTS221_GetCalibrationCoefficients ( &myHTS221_Data );
mcm 3:1fc3a35d731a 106
mcm 3:1fc3a35d731a 107 // Get temperature
mcm 3:1fc3a35d731a 108 do {
mcm 3:1fc3a35d731a 109 aux = myHTS221.HTS221_GetTemperatureDataAvailable ( &myHTS221_Data );
mcm 3:1fc3a35d731a 110 } while( myHTS221_Data.t_da == HTS221::STATUS_REGISTER_T_DA_DATA_NOT_AVAILABLE );
mcm 3:1fc3a35d731a 111
mcm 3:1fc3a35d731a 112 aux = myHTS221.HTS221_GetTemperature ( &myHTS221_Data );
mcm 3:1fc3a35d731a 113
mcm 3:1fc3a35d731a 114 // Get humidity
mcm 3:1fc3a35d731a 115 aux = myHTS221.HTS221_GetHumidity ( &myHTS221_Data );
mcm 3:1fc3a35d731a 116
mcm 3:1fc3a35d731a 117 // Send data through the UART
mcm 3:1fc3a35d731a 118 pc.printf ( "T: %0.1f C, RH: %0.1f %%\r\n", myHTS221_Data.temperature, myHTS221_Data.humidity );
mcm 3:1fc3a35d731a 119
mcm 3:1fc3a35d731a 120
mcm 3:1fc3a35d731a 121 // Reset the variables
mcm 3:1fc3a35d731a 122 myState = 0UL;
mcm 3:1fc3a35d731a 123 myled = 0U;
mcm 3:1fc3a35d731a 124 }
mcm 3:1fc3a35d731a 125 }
mcm 3:1fc3a35d731a 126 }
mcm 3:1fc3a35d731a 127
mcm 3:1fc3a35d731a 128
mcm 3:1fc3a35d731a 129 // @brief changeDATA ( void )
mcm 3:1fc3a35d731a 130 //
mcm 3:1fc3a35d731a 131 // @details It changes myState variable
mcm 3:1fc3a35d731a 132 //
mcm 3:1fc3a35d731a 133 // @param[in] N/A
mcm 3:1fc3a35d731a 134 //
mcm 3:1fc3a35d731a 135 // @param[out] N/A.
mcm 3:1fc3a35d731a 136 //
mcm 3:1fc3a35d731a 137 // @return N/A.
mcm 3:1fc3a35d731a 138 //
mcm 3:1fc3a35d731a 139 // @author Manuel Caballero
mcm 3:1fc3a35d731a 140 // @date 31/May/2019
mcm 3:1fc3a35d731a 141 // @version 31/May/2019 The ORIGIN
mcm 3:1fc3a35d731a 142 // @pre N/A
mcm 3:1fc3a35d731a 143 // @warning N/A.
mcm 3:1fc3a35d731a 144 void changeDATA ( void )
mcm 3:1fc3a35d731a 145 {
mcm 3:1fc3a35d731a 146 myState = 1UL;
mcm 3:1fc3a35d731a 147 }
mcm 1:ab60d7a79df0 148 @endcode
mcm 1:ab60d7a79df0 149 */
mcm 1:ab60d7a79df0 150
mcm 1:ab60d7a79df0 151
mcm 1:ab60d7a79df0 152 /*!
mcm 1:ab60d7a79df0 153 Library for the HTS221 Capacitive digital sensor for relative humidity and temperature.
mcm 1:ab60d7a79df0 154 */
mcm 1:ab60d7a79df0 155 class HTS221
mcm 1:ab60d7a79df0 156 {
mcm 1:ab60d7a79df0 157 public:
mcm 1:ab60d7a79df0 158 typedef enum {
mcm 1:ab60d7a79df0 159 HTS221_ADDRESS = ( 0b1011111 << 1U ) /*!< I2C slave address byte */
mcm 1:ab60d7a79df0 160 } HTS221_address_t;
mcm 1:ab60d7a79df0 161
mcm 1:ab60d7a79df0 162
mcm 1:ab60d7a79df0 163
mcm 1:ab60d7a79df0 164 /**
mcm 1:ab60d7a79df0 165 * @brief REGISTERS
mcm 1:ab60d7a79df0 166 */
mcm 1:ab60d7a79df0 167 typedef enum {
mcm 1:ab60d7a79df0 168 HTS221_WHO_AM_I = 0x0F, /*!< Device identification */
mcm 1:ab60d7a79df0 169 HTS221_AV_CONF = 0x10, /*!< Humidity and temperature resolution mode */
mcm 1:ab60d7a79df0 170 HTS221_CTRL_REG1 = 0x20, /*!< Control register 1 */
mcm 1:ab60d7a79df0 171 HTS221_CTRL_REG2 = 0x21, /*!< Control register 2 */
mcm 1:ab60d7a79df0 172 HTS221_CTRL_REG3 = 0x22, /*!< Control register 3 */
mcm 1:ab60d7a79df0 173 HTS221_STATUS_REG = 0x27, /*!< Status register */
mcm 1:ab60d7a79df0 174 HTS221_HUMIDITY_OUT_L = 0x28, /*!< Relative humidity data (LSB) */
mcm 1:ab60d7a79df0 175 HTS221_HUMIDITY_OUT_H = 0x29, /*!< Relative humidity data (MSB) */
mcm 1:ab60d7a79df0 176 HTS221_TEMP_OUT_L = 0x2A, /*!< Temperature data (LSB) */
mcm 1:ab60d7a79df0 177 HTS221_TEMP_OUT_H = 0x2B, /*!< Temperature data (MSB) */
mcm 1:ab60d7a79df0 178 HTS221_CALIB_0 = 0x30, /*!< Calibration register */
mcm 1:ab60d7a79df0 179 HTS221_CALIB_1 = 0x31, /*!< Calibration register */
mcm 1:ab60d7a79df0 180 HTS221_CALIB_2 = 0x32, /*!< Calibration register */
mcm 1:ab60d7a79df0 181 HTS221_CALIB_3 = 0x33, /*!< Calibration register */
mcm 1:ab60d7a79df0 182 HTS221_CALIB_4 = 0x34, /*!< Calibration register */
mcm 1:ab60d7a79df0 183 HTS221_CALIB_5 = 0x35, /*!< Calibration register */
mcm 1:ab60d7a79df0 184 HTS221_CALIB_6 = 0x36, /*!< Calibration register */
mcm 1:ab60d7a79df0 185 HTS221_CALIB_7 = 0x37, /*!< Calibration register */
mcm 1:ab60d7a79df0 186 HTS221_CALIB_8 = 0x38, /*!< Calibration register */
mcm 1:ab60d7a79df0 187 HTS221_CALIB_9 = 0x39, /*!< Calibration register */
mcm 1:ab60d7a79df0 188 HTS221_CALIB_A = 0x3A, /*!< Calibration register */
mcm 1:ab60d7a79df0 189 HTS221_CALIB_B = 0x3B, /*!< Calibration register */
mcm 1:ab60d7a79df0 190 HTS221_CALIB_C = 0x3C, /*!< Calibration register */
mcm 1:ab60d7a79df0 191 HTS221_CALIB_D = 0x3D, /*!< Calibration register */
mcm 1:ab60d7a79df0 192 HTS221_CALIB_E = 0x3E, /*!< Calibration register */
mcm 1:ab60d7a79df0 193 HTS221_CALIB_F = 0x3F /*!< Calibration register */
mcm 1:ab60d7a79df0 194 } HTS221_registers_t;
mcm 1:ab60d7a79df0 195
mcm 1:ab60d7a79df0 196
mcm 1:ab60d7a79df0 197
mcm 1:ab60d7a79df0 198 /**
mcm 1:ab60d7a79df0 199 * @brief WHO_AM_I REGISTER
mcm 1:ab60d7a79df0 200 */
mcm 1:ab60d7a79df0 201 typedef enum {
mcm 1:ab60d7a79df0 202 WHO_AM_I_MASK = 0xFF, /*!< WHO_AM_I mask */
mcm 1:ab60d7a79df0 203 WHO_AM_I_VALUE = 0xBC /*!< WHO_AM_I value */
mcm 1:ab60d7a79df0 204 } HTS221_who_am_i_t;
mcm 1:ab60d7a79df0 205
mcm 1:ab60d7a79df0 206
mcm 1:ab60d7a79df0 207
mcm 1:ab60d7a79df0 208 /**
mcm 1:ab60d7a79df0 209 * @brief AV_CONF REGISTER
mcm 1:ab60d7a79df0 210 */
mcm 1:ab60d7a79df0 211 /* AVGT <5:3>
mcm 1:ab60d7a79df0 212 * NOTE: Numbers of averaged temperature samples ( 2-256 ).
mcm 1:ab60d7a79df0 213 */
mcm 1:ab60d7a79df0 214 typedef enum {
mcm 1:ab60d7a79df0 215 AV_CONF_AVGT_MASK = ( 0b111 << 3U ), /*!< AVGT mask */
mcm 1:ab60d7a79df0 216 AV_CONF_AVGT_2 = ( 0b000 << 3U ), /*!< AVGT Nr. internal average 2 */
mcm 1:ab60d7a79df0 217 AV_CONF_AVGT_4 = ( 0b001 << 3U ), /*!< AVGT Nr. internal average 4 */
mcm 1:ab60d7a79df0 218 AV_CONF_AVGT_8 = ( 0b010 << 3U ), /*!< AVGT Nr. internal average 8 */
mcm 1:ab60d7a79df0 219 AV_CONF_AVGT_16 = ( 0b011 << 3U ), /*!< AVGT Nr. internal average 16 [ Default ] */
mcm 1:ab60d7a79df0 220 AV_CONF_AVGT_32 = ( 0b100 << 3U ), /*!< AVGT Nr. internal average 32 */
mcm 1:ab60d7a79df0 221 AV_CONF_AVGT_64 = ( 0b101 << 3U ), /*!< AVGT Nr. internal average 64 */
mcm 1:ab60d7a79df0 222 AV_CONF_AVGT_128 = ( 0b110 << 3U ), /*!< AVGT Nr. internal average 128 */
mcm 1:ab60d7a79df0 223 AV_CONF_AVGT_256 = ( 0b111 << 3U ) /*!< AVGT Nr. internal average 256 */
mcm 1:ab60d7a79df0 224 } HTS221_av_config_avgt_t;
mcm 1:ab60d7a79df0 225
mcm 1:ab60d7a79df0 226
mcm 1:ab60d7a79df0 227 /* AVGH <2:0>
mcm 1:ab60d7a79df0 228 * NOTE: Numbers of averaged humidity samples ( 4-512 ).
mcm 1:ab60d7a79df0 229 */
mcm 1:ab60d7a79df0 230 typedef enum {
mcm 1:ab60d7a79df0 231 AV_CONF_AVGH_MASK = ( 0b111 << 0U ), /*!< AVGH mask */
mcm 1:ab60d7a79df0 232 AV_CONF_AVGH_4 = ( 0b000 << 0U ), /*!< AVGH Nr. internal average 4 */
mcm 1:ab60d7a79df0 233 AV_CONF_AVGH_8 = ( 0b001 << 0U ), /*!< AVGH Nr. internal average 8 */
mcm 1:ab60d7a79df0 234 AV_CONF_AVGH_16 = ( 0b010 << 0U ), /*!< AVGH Nr. internal average 16 */
mcm 1:ab60d7a79df0 235 AV_CONF_AVGH_32 = ( 0b011 << 0U ), /*!< AVGH Nr. internal average 32 [ Default ] */
mcm 1:ab60d7a79df0 236 AV_CONF_AVGH_64 = ( 0b100 << 0U ), /*!< AVGH Nr. internal average 64 */
mcm 1:ab60d7a79df0 237 AV_CONF_AVGH_128 = ( 0b101 << 0U ), /*!< AVGH Nr. internal average 128 */
mcm 1:ab60d7a79df0 238 AV_CONF_AVGH_256 = ( 0b110 << 0U ), /*!< AVGH Nr. internal average 256 */
mcm 1:ab60d7a79df0 239 AV_CONF_AVGH_512 = ( 0b111 << 0U ) /*!< AVGH Nr. internal average 512 */
mcm 1:ab60d7a79df0 240 } HTS221_av_config_avgh_t;
mcm 1:ab60d7a79df0 241
mcm 1:ab60d7a79df0 242
mcm 1:ab60d7a79df0 243
mcm 1:ab60d7a79df0 244 /**
mcm 1:ab60d7a79df0 245 * @brief CTRL_REG1 REGISTER
mcm 1:ab60d7a79df0 246 */
mcm 1:ab60d7a79df0 247 /* PD <7>
mcm 1:ab60d7a79df0 248 * NOTE: Power-down control.
mcm 1:ab60d7a79df0 249 */
mcm 1:ab60d7a79df0 250 typedef enum {
mcm 1:ab60d7a79df0 251 CTRL_REG1_PD_MASK = ( 1U << 7U ), /*!< PD mask */
mcm 1:ab60d7a79df0 252 CTRL_REG1_PD_POWER_DOWN_MODE = ( 0U << 7U ), /*!< PD power-down mode [ Default ] */
mcm 1:ab60d7a79df0 253 CTRL_REG1_PD_ACTIVE_MODE = ( 1U << 7U ) /*!< PD active mode */
mcm 1:ab60d7a79df0 254 } HTS221_ctrl_reg1_pd_t;
mcm 1:ab60d7a79df0 255
mcm 1:ab60d7a79df0 256
mcm 1:ab60d7a79df0 257 /* BDU <2>
mcm 1:ab60d7a79df0 258 * NOTE: Block data update.
mcm 1:ab60d7a79df0 259 */
mcm 1:ab60d7a79df0 260 typedef enum {
mcm 1:ab60d7a79df0 261 CTRL_REG1_BDU_MASK = ( 1U << 2U ), /*!< BDU mask */
mcm 1:ab60d7a79df0 262 CTRL_REG1_BDU_CONTINUOUS_UPDATE = ( 0U << 2U ), /*!< Continuous update */
mcm 1:ab60d7a79df0 263 CTRL_REG1_BDU_DEFAULT_MODE = ( 1U << 2U ) /*!< Output registers not updated until MSB and LSB reading [ Default ] */
mcm 1:ab60d7a79df0 264 } HTS221_ctrl_reg1_bdu_t;
mcm 1:ab60d7a79df0 265
mcm 1:ab60d7a79df0 266
mcm 1:ab60d7a79df0 267 /* ODR <1:0>
mcm 1:ab60d7a79df0 268 * NOTE: Output data rate selection.
mcm 1:ab60d7a79df0 269 */
mcm 1:ab60d7a79df0 270 typedef enum {
mcm 1:ab60d7a79df0 271 CTRL_REG1_ODR_MASK = ( 0b11 << 0U ), /*!< ODR mask */
mcm 1:ab60d7a79df0 272 CTRL_REG1_ODR_ONE_SHOT = ( 0b00 << 0U ), /*!< One-shot */
mcm 1:ab60d7a79df0 273 CTRL_REG1_ODR_1_HZ = ( 0b01 << 0U ), /*!< 1 Hz */
mcm 1:ab60d7a79df0 274 CTRL_REG1_ODR_7_HZ = ( 0b10 << 0U ), /*!< 7 Hz */
mcm 1:ab60d7a79df0 275 CTRL_REG1_ODR_12_5_HZ = ( 0b11 << 0U ) /*!< 12.5 Hz */
mcm 1:ab60d7a79df0 276 } HTS221_ctrl_reg1_odr_t;
mcm 1:ab60d7a79df0 277
mcm 1:ab60d7a79df0 278
mcm 1:ab60d7a79df0 279
mcm 1:ab60d7a79df0 280 /**
mcm 1:ab60d7a79df0 281 * @brief CTRL_REG2 REGISTER
mcm 1:ab60d7a79df0 282 */
mcm 1:ab60d7a79df0 283 /* BOOT <7>
mcm 1:ab60d7a79df0 284 * NOTE: Reboot memory content.
mcm 1:ab60d7a79df0 285 */
mcm 1:ab60d7a79df0 286 typedef enum {
mcm 1:ab60d7a79df0 287 CTRL_REG2_BOOT_MASK = ( 1U << 7U ), /*!< BOOT mask */
mcm 1:ab60d7a79df0 288 CTRL_REG2_BOOT_NORMAL_MODE = ( 0U << 7U ), /*!< normal mode [ Default ] */
mcm 1:ab60d7a79df0 289 CTRL_REG2_BOOT_REBOOT_MEMORY_CONTENT = ( 1U << 7U ) /*!< reboot memory content */
mcm 1:ab60d7a79df0 290 } HTS221_ctrl_reg2_boot_t;
mcm 1:ab60d7a79df0 291
mcm 1:ab60d7a79df0 292
mcm 1:ab60d7a79df0 293 /* Heater <1>
mcm 1:ab60d7a79df0 294 * NOTE: Controling an internal heating element.
mcm 1:ab60d7a79df0 295 */
mcm 1:ab60d7a79df0 296 typedef enum {
mcm 1:ab60d7a79df0 297 CTRL_REG2_HEATER_MASK = ( 1U << 1U ), /*!< Heater mask */
mcm 1:ab60d7a79df0 298 CTRL_REG2_HEATER_HEATER_DISABLED = ( 0U << 1U ), /*!< Heater disabled [ Default ] */
mcm 1:ab60d7a79df0 299 CTRL_REG2_HEATER_HEATER_ENABLED = ( 1U << 1U ) /*!< Heater enabled */
mcm 1:ab60d7a79df0 300 } HTS221_ctrl_reg2_heater_t;
mcm 1:ab60d7a79df0 301
mcm 1:ab60d7a79df0 302
mcm 1:ab60d7a79df0 303 /* ONE_SHOT <0>
mcm 1:ab60d7a79df0 304 * NOTE: One-shot enable.
mcm 1:ab60d7a79df0 305 */
mcm 1:ab60d7a79df0 306 typedef enum {
mcm 1:ab60d7a79df0 307 CTRL_REG2_ONE_SHOT_MASK = ( 1U << 0U ), /*!< ONE_SHOT mask */
mcm 1:ab60d7a79df0 308 CTRL_REG2_ONE_SHOT_WAITING = ( 0U << 0U ), /*!< waiting for start of conversion [ Default ] */
mcm 1:ab60d7a79df0 309 CTRL_REG2_ONE_SHOT_START = ( 1U << 0U ) /*!< start for a new dataset */
mcm 1:ab60d7a79df0 310 } HTS221_ctrl_reg2_one_shot_t;
mcm 1:ab60d7a79df0 311
mcm 1:ab60d7a79df0 312
mcm 1:ab60d7a79df0 313
mcm 1:ab60d7a79df0 314 /**
mcm 1:ab60d7a79df0 315 * @brief CTRL_REG3 REGISTER
mcm 1:ab60d7a79df0 316 */
mcm 1:ab60d7a79df0 317 /* DRDY_H_L <7>
mcm 1:ab60d7a79df0 318 * NOTE: Data Ready output signal active high, low.
mcm 1:ab60d7a79df0 319 */
mcm 1:ab60d7a79df0 320 typedef enum {
mcm 1:ab60d7a79df0 321 CTRL_REG3_DRDY_H_L_MASK = ( 1U << 7U ), /*!< DRDY_H_L mask */
mcm 1:ab60d7a79df0 322 CTRL_REG3_DRDY_H_L_ACTIVE_HIGH = ( 0U << 7U ), /*!< active high [ Default ] */
mcm 1:ab60d7a79df0 323 CTRL_REG3_DRDY_H_L_ACTIVE_LOW = ( 1U << 7U ) /*!< active low */
mcm 1:ab60d7a79df0 324 } HTS221_ctrl_reg3_drdy_h_l_t;
mcm 1:ab60d7a79df0 325
mcm 1:ab60d7a79df0 326
mcm 1:ab60d7a79df0 327 /* PP_OD <6>
mcm 1:ab60d7a79df0 328 * NOTE: Push-pull / Open Drain selection on pin 3 (DRDY).
mcm 1:ab60d7a79df0 329 */
mcm 1:ab60d7a79df0 330 typedef enum {
mcm 1:ab60d7a79df0 331 CTRL_REG3_PP_OD_MASK = ( 1U << 6U ), /*!< PP_OD mask */
mcm 1:ab60d7a79df0 332 CTRL_REG3_PP_OD_PUSH_PULL = ( 0U << 6U ), /*!< push-pull [ Default ] */
mcm 1:ab60d7a79df0 333 CTRL_REG3_PP_OD_OPEN_DRAIN = ( 1U << 6U ) /*!< open drain */
mcm 1:ab60d7a79df0 334 } HTS221_ctrl_reg3_pp_od_t;
mcm 1:ab60d7a79df0 335
mcm 1:ab60d7a79df0 336
mcm 1:ab60d7a79df0 337 /* DRDY_EN <2>
mcm 1:ab60d7a79df0 338 * NOTE: Data Ready enable.
mcm 1:ab60d7a79df0 339 */
mcm 1:ab60d7a79df0 340 typedef enum {
mcm 1:ab60d7a79df0 341 CTRL_REG3_DRDY_EN_MASK = ( 1U << 2U ), /*!< DRDY_EN mask */
mcm 1:ab60d7a79df0 342 CTRL_REG3_DRDY_DATA_READY_DISABLED = ( 0U << 2U ), /*!< Data Ready disabled [ Default ] */
mcm 1:ab60d7a79df0 343 CTRL_REG3_DRDY_DATA_READY_ENABLED = ( 1U << 2U ) /*!< Data Ready signal available on pin 3 */
mcm 1:ab60d7a79df0 344 } HTS221_ctrl_reg3_drdy_en_t;
mcm 1:ab60d7a79df0 345
mcm 1:ab60d7a79df0 346
mcm 1:ab60d7a79df0 347
mcm 1:ab60d7a79df0 348 /**
mcm 1:ab60d7a79df0 349 * @brief STATUS_REG REGISTER
mcm 1:ab60d7a79df0 350 *
mcm 1:ab60d7a79df0 351 * NOTE: H_DA is set to 1 whenever a new humidity sample is available. H_DA is cleared anytime
mcm 1:ab60d7a79df0 352 * 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.
mcm 1:ab60d7a79df0 353 */
mcm 1:ab60d7a79df0 354 /* H_DA <1>
mcm 1:ab60d7a79df0 355 * NOTE: Humidity data available.
mcm 1:ab60d7a79df0 356 */
mcm 1:ab60d7a79df0 357 typedef enum {
mcm 1:ab60d7a79df0 358 STATUS_REGISTER_H_DA_MASK = ( 1U << 1U ), /*!< H_DA mask */
mcm 1:ab60d7a79df0 359 STATUS_REGISTER_H_DA_DATA_NOT_AVAILABLE = ( 0U << 1U ), /*!< new data for humidity is not yet available */
mcm 1:ab60d7a79df0 360 STATUS_REGISTER_H_DA_DATA_AVAILABLE = ( 1U << 1U ) /*!< new data for humidity is available */
mcm 1:ab60d7a79df0 361 } HTS221_status_reg_h_da_t;
mcm 1:ab60d7a79df0 362
mcm 1:ab60d7a79df0 363
mcm 1:ab60d7a79df0 364 /* T_DA <0>
mcm 1:ab60d7a79df0 365 * NOTE: Temperature data available.
mcm 1:ab60d7a79df0 366 */
mcm 1:ab60d7a79df0 367 typedef enum {
mcm 1:ab60d7a79df0 368 STATUS_REGISTER_T_DA_MASK = ( 1U << 0U ), /*!< T_DA mask */
mcm 1:ab60d7a79df0 369 STATUS_REGISTER_T_DA_DATA_NOT_AVAILABLE = ( 0U << 0U ), /*!< new data for temperature is not yet available */
mcm 1:ab60d7a79df0 370 STATUS_REGISTER_T_DA_DATA_AVAILABLE = ( 1U << 0U ) /*!< new data for temperature is available */
mcm 1:ab60d7a79df0 371 } HTS221_status_reg_t_da_t;
mcm 1:ab60d7a79df0 372
mcm 1:ab60d7a79df0 373
mcm 1:ab60d7a79df0 374
mcm 1:ab60d7a79df0 375 /**
mcm 1:ab60d7a79df0 376 * @brief HUMIDITY_OUT_L REGISTER
mcm 1:ab60d7a79df0 377 *
mcm 1:ab60d7a79df0 378 * NOTE: Relative humidity data (LSB)
mcm 1:ab60d7a79df0 379 . *
mcm 1:ab60d7a79df0 380 */
mcm 1:ab60d7a79df0 381 typedef enum {
mcm 1:ab60d7a79df0 382 HUMIDITY_OUT_L_MASK = 0xFF /*!< Humidity data LSB mask */
mcm 1:ab60d7a79df0 383 } HTS221_humidity_out_l_t;
mcm 1:ab60d7a79df0 384
mcm 1:ab60d7a79df0 385
mcm 1:ab60d7a79df0 386
mcm 1:ab60d7a79df0 387 /**
mcm 1:ab60d7a79df0 388 * @brief HUMIDITY_OUT_H REGISTER
mcm 1:ab60d7a79df0 389 *
mcm 1:ab60d7a79df0 390 * NOTE: Relative humidity data (LSB)
mcm 1:ab60d7a79df0 391 . *
mcm 1:ab60d7a79df0 392 */
mcm 1:ab60d7a79df0 393 typedef enum {
mcm 1:ab60d7a79df0 394 HUMIDITY_OUT_H_MASK = 0xFF /*!< Humidity data MSB mask */
mcm 1:ab60d7a79df0 395 } HTS221_humidity_out_h_t;
mcm 1:ab60d7a79df0 396
mcm 1:ab60d7a79df0 397
mcm 1:ab60d7a79df0 398
mcm 1:ab60d7a79df0 399 /**
mcm 1:ab60d7a79df0 400 * @brief TEMP_OUT_L REGISTER
mcm 1:ab60d7a79df0 401 *
mcm 1:ab60d7a79df0 402 * NOTE: Temperature data (LSB)
mcm 1:ab60d7a79df0 403 . *
mcm 1:ab60d7a79df0 404 */
mcm 1:ab60d7a79df0 405 typedef enum {
mcm 1:ab60d7a79df0 406 TEMP_OUT_L_MASK = 0xFF /*!< Temperature data LSB mask */
mcm 1:ab60d7a79df0 407 } HTS221_temp_out_l_t;
mcm 1:ab60d7a79df0 408
mcm 1:ab60d7a79df0 409
mcm 1:ab60d7a79df0 410
mcm 1:ab60d7a79df0 411 /**
mcm 1:ab60d7a79df0 412 * @brief TEMP_OUT_H REGISTER
mcm 1:ab60d7a79df0 413 *
mcm 1:ab60d7a79df0 414 * NOTE: Temperature data (MSB)
mcm 1:ab60d7a79df0 415 . *
mcm 1:ab60d7a79df0 416 */
mcm 1:ab60d7a79df0 417 typedef enum {
mcm 1:ab60d7a79df0 418 TEMP_OUT_H_MASK = 0xFF /*!< Temperature data MSB mask */
mcm 1:ab60d7a79df0 419 } HTS221_temp_out_h_t;
mcm 1:ab60d7a79df0 420
mcm 1:ab60d7a79df0 421
mcm 1:ab60d7a79df0 422
mcm 1:ab60d7a79df0 423
mcm 1:ab60d7a79df0 424
mcm 1:ab60d7a79df0 425 #ifndef HTS221_VECTOR_STRUCT_H
mcm 1:ab60d7a79df0 426 #define HTS221_VECTOR_STRUCT_H
mcm 1:ab60d7a79df0 427 typedef struct {
mcm 1:ab60d7a79df0 428 /* Output registers */
mcm 1:ab60d7a79df0 429 int16_t rawHumidity; /*!< Raw humidity */
mcm 1:ab60d7a79df0 430 int16_t rawTemperature; /*!< Raw temperature */
mcm 1:ab60d7a79df0 431
mcm 1:ab60d7a79df0 432 float humidity; /*!< Humidity value */
mcm 1:ab60d7a79df0 433 float temperature; /*!< Temperature value */
mcm 1:ab60d7a79df0 434
mcm 1:ab60d7a79df0 435 /* Calibration registers */
mcm 1:ab60d7a79df0 436 uint8_t h0_rH_x2; /*!< Calibration register */
mcm 1:ab60d7a79df0 437 uint8_t h1_rH_x2; /*!< Calibration register */
mcm 1:ab60d7a79df0 438 uint8_t t0_degC_x8; /*!< Calibration register */
mcm 1:ab60d7a79df0 439 uint8_t t1_degC_x8; /*!< Calibration register */
mcm 1:ab60d7a79df0 440 uint8_t t1_T0_msb; /*!< Calibration register */
mcm 1:ab60d7a79df0 441 int16_t h0_T0_OUT; /*!< Calibration register */
mcm 1:ab60d7a79df0 442 int16_t h1_T0_OUT; /*!< Calibration register */
mcm 1:ab60d7a79df0 443 int16_t t0_OUT; /*!< Calibration register */
mcm 1:ab60d7a79df0 444 int16_t t1_OUT; /*!< Calibration register */
mcm 1:ab60d7a79df0 445
mcm 1:ab60d7a79df0 446 int16_t t0_degC; /*!< Calibration result */
mcm 1:ab60d7a79df0 447 int16_t t1_degC; /*!< Calibration result */
mcm 1:ab60d7a79df0 448 int16_t h0_RH; /*!< Calibration result */
mcm 1:ab60d7a79df0 449 int16_t h1_RH; /*!< Calibration result */
mcm 1:ab60d7a79df0 450
mcm 1:ab60d7a79df0 451 /* Device identification */
mcm 1:ab60d7a79df0 452 uint8_t deviceID; /*!< Device ID */
mcm 1:ab60d7a79df0 453
mcm 1:ab60d7a79df0 454 /* Device configuration */
mcm 1:ab60d7a79df0 455 HTS221_av_config_avgt_t temperatureResolution; /*!< Temperature resolution */
mcm 1:ab60d7a79df0 456 HTS221_av_config_avgh_t humidityResolution; /*!< Humidity resolution */
mcm 1:ab60d7a79df0 457
mcm 1:ab60d7a79df0 458 HTS221_ctrl_reg1_bdu_t bdu; /*!< Block data update */
mcm 1:ab60d7a79df0 459 HTS221_ctrl_reg1_odr_t odr; /*!< Output data rate */
mcm 1:ab60d7a79df0 460 HTS221_ctrl_reg2_boot_t boot; /*!< Reboot mode content */
mcm 1:ab60d7a79df0 461 HTS221_ctrl_reg2_heater_t heater; /*!< Heater */
mcm 1:ab60d7a79df0 462 HTS221_ctrl_reg2_one_shot_t one_shot; /*!< One-Shot */
mcm 1:ab60d7a79df0 463
mcm 1:ab60d7a79df0 464 /* Device status */
mcm 1:ab60d7a79df0 465 HTS221_status_reg_h_da_t h_da; /*!< Humidity data available */
mcm 1:ab60d7a79df0 466 HTS221_status_reg_t_da_t t_da; /*!< Temperature data available */
mcm 1:ab60d7a79df0 467 } HTS221_data_t;
mcm 1:ab60d7a79df0 468 #endif
mcm 1:ab60d7a79df0 469
mcm 1:ab60d7a79df0 470
mcm 1:ab60d7a79df0 471 /**
mcm 1:ab60d7a79df0 472 * @brief INTERNAL CONSTANTS
mcm 1:ab60d7a79df0 473 */
mcm 1:ab60d7a79df0 474 typedef enum {
mcm 1:ab60d7a79df0 475 HTS221_SUCCESS = 0U,
mcm 1:ab60d7a79df0 476 HTS221_FAILURE = 1U,
mcm 1:ab60d7a79df0 477 I2C_SUCCESS = 0U /*!< I2C communication was fine */
mcm 1:ab60d7a79df0 478 } HTS221_status_t;
mcm 1:ab60d7a79df0 479
mcm 1:ab60d7a79df0 480
mcm 1:ab60d7a79df0 481
mcm 1:ab60d7a79df0 482
mcm 1:ab60d7a79df0 483 /** Create an HTS221 object connected to the specified I2C pins.
mcm 1:ab60d7a79df0 484 *
mcm 1:ab60d7a79df0 485 * @param sda I2C data pin
mcm 1:ab60d7a79df0 486 * @param scl I2C clock pin
mcm 1:ab60d7a79df0 487 * @param addr I2C slave address
mcm 1:ab60d7a79df0 488 * @param freq I2C frequency
mcm 1:ab60d7a79df0 489 */
mcm 1:ab60d7a79df0 490 HTS221 ( PinName sda, PinName scl, uint32_t addr, uint32_t freq );
mcm 1:ab60d7a79df0 491
mcm 1:ab60d7a79df0 492 /** Delete HTS221 object.
mcm 1:ab60d7a79df0 493 */
mcm 1:ab60d7a79df0 494 ~HTS221();
mcm 1:ab60d7a79df0 495
mcm 1:ab60d7a79df0 496 /** It gets the device identification.
mcm 1:ab60d7a79df0 497 */
mcm 1:ab60d7a79df0 498 HTS221_status_t HTS221_GetDeviceID ( HTS221_data_t* myDeviceID );
mcm 1:ab60d7a79df0 499
mcm 1:ab60d7a79df0 500 /** It sets humidity and temperature resolution mode.
mcm 1:ab60d7a79df0 501 */
mcm 1:ab60d7a79df0 502 HTS221_status_t HTS221_SetResolution ( HTS221_data_t myTempHumResolution );
mcm 1:ab60d7a79df0 503
mcm 1:ab60d7a79df0 504 /** It gets humidity and temperature resolution mode.
mcm 1:ab60d7a79df0 505 */
mcm 1:ab60d7a79df0 506 HTS221_status_t HTS221_GetResolution ( HTS221_data_t* myTempHumResolution );
mcm 1:ab60d7a79df0 507
mcm 1:ab60d7a79df0 508 /** It sets power-down control mode.
mcm 1:ab60d7a79df0 509 */
mcm 1:ab60d7a79df0 510 HTS221_status_t HTS221_SetPowerDown ( HTS221_ctrl_reg1_pd_t myPowerMode );
mcm 1:ab60d7a79df0 511
mcm 1:ab60d7a79df0 512 /** It sets the block data update.
mcm 1:ab60d7a79df0 513 */
mcm 1:ab60d7a79df0 514 HTS221_status_t HTS221_SetBlockDataUpdate ( HTS221_data_t myBDU );
mcm 1:ab60d7a79df0 515
mcm 1:ab60d7a79df0 516 /** It gets the block data update.
mcm 1:ab60d7a79df0 517 */
mcm 1:ab60d7a79df0 518 HTS221_status_t HTS221_GetBlockDataUpdate ( HTS221_data_t* myBDU );
mcm 1:ab60d7a79df0 519
mcm 1:ab60d7a79df0 520 /** It sets the output data rate ( ODR ).
mcm 1:ab60d7a79df0 521 */
mcm 1:ab60d7a79df0 522 HTS221_status_t HTS221_SetOutputDataRate ( HTS221_data_t myODR );
mcm 1:ab60d7a79df0 523
mcm 1:ab60d7a79df0 524 /** It gets the output data rate ( ODR ).
mcm 1:ab60d7a79df0 525 */
mcm 1:ab60d7a79df0 526 HTS221_status_t HTS221_GetOutputDataRate ( HTS221_data_t* myODR );
mcm 1:ab60d7a79df0 527
mcm 1:ab60d7a79df0 528 /** It sets reboot memory content.
mcm 1:ab60d7a79df0 529 */
mcm 1:ab60d7a79df0 530 HTS221_status_t HTS221_SetBoot ( void );
mcm 1:ab60d7a79df0 531
mcm 1:ab60d7a79df0 532 /** It gets reboot memory content.
mcm 1:ab60d7a79df0 533 */
mcm 1:ab60d7a79df0 534 HTS221_status_t HTS221_GetBoot ( HTS221_data_t* myBOOT );
mcm 1:ab60d7a79df0 535
mcm 1:ab60d7a79df0 536 /** It sets heater mode: Enabled/Disabled.
mcm 1:ab60d7a79df0 537 */
mcm 1:ab60d7a79df0 538 HTS221_status_t HTS221_SetHeater ( HTS221_data_t myHeater );
mcm 1:ab60d7a79df0 539
mcm 1:ab60d7a79df0 540 /** It gets heater mode.
mcm 1:ab60d7a79df0 541 */
mcm 1:ab60d7a79df0 542 HTS221_status_t HTS221_GetHeater ( HTS221_data_t* myHeater );
mcm 1:ab60d7a79df0 543
mcm 1:ab60d7a79df0 544 /** It sets one-shot, new data set.
mcm 1:ab60d7a79df0 545 */
mcm 1:ab60d7a79df0 546 HTS221_status_t HTS221_SetOneShot ( void );
mcm 1:ab60d7a79df0 547
mcm 1:ab60d7a79df0 548 /** It gets one-shot flag.
mcm 1:ab60d7a79df0 549 */
mcm 1:ab60d7a79df0 550 HTS221_status_t HTS221_GetOneShot ( HTS221_data_t* myOneShot );
mcm 1:ab60d7a79df0 551
mcm 1:ab60d7a79df0 552 /** It sets data ready output signal active high/low.
mcm 1:ab60d7a79df0 553 */
mcm 1:ab60d7a79df0 554 HTS221_status_t HTS221_SetDataReadyOuput ( HTS221_ctrl_reg3_drdy_h_l_t myDRDY_H_L );
mcm 1:ab60d7a79df0 555
mcm 1:ab60d7a79df0 556 /** It sets Push-pull/Open Drain selection on pin 3 ( DRDY ).
mcm 1:ab60d7a79df0 557 */
mcm 1:ab60d7a79df0 558 HTS221_status_t HTS221_SetSelectionOnPin3 ( HTS221_ctrl_reg3_pp_od_t myDRDY );
mcm 1:ab60d7a79df0 559
mcm 1:ab60d7a79df0 560 /** It sets data ready enable.
mcm 1:ab60d7a79df0 561 */
mcm 1:ab60d7a79df0 562 HTS221_status_t HTS221_SetDataReadyEnable ( HTS221_ctrl_reg3_drdy_en_t myDRDY_EN );
mcm 1:ab60d7a79df0 563
mcm 1:ab60d7a79df0 564 /** It gets humidity data available flag.
mcm 1:ab60d7a79df0 565 */
mcm 1:ab60d7a79df0 566 HTS221_status_t HTS221_GetHumidityDataAvailable ( HTS221_data_t* myHumidityFlag );
mcm 1:ab60d7a79df0 567
mcm 1:ab60d7a79df0 568 /** It gets temperature data available flag.
mcm 1:ab60d7a79df0 569 */
mcm 1:ab60d7a79df0 570 HTS221_status_t HTS221_GetTemperatureDataAvailable ( HTS221_data_t* myTemperatureFlag );
mcm 1:ab60d7a79df0 571
mcm 1:ab60d7a79df0 572 /** It gets raw humidity.
mcm 1:ab60d7a79df0 573 */
mcm 1:ab60d7a79df0 574 HTS221_status_t HTS221_GetRawHumidity ( HTS221_data_t* myRawHumidity );
mcm 1:ab60d7a79df0 575
mcm 1:ab60d7a79df0 576 /** It gets raw temperature.
mcm 1:ab60d7a79df0 577 */
mcm 1:ab60d7a79df0 578 HTS221_status_t HTS221_GetRawTemperature ( HTS221_data_t* myRawTemperature );
mcm 1:ab60d7a79df0 579
mcm 1:ab60d7a79df0 580 /** It gets calibration coefficients.
mcm 1:ab60d7a79df0 581 */
mcm 1:ab60d7a79df0 582 HTS221_status_t HTS221_GetCalibrationCoefficients ( HTS221_data_t* myCoeff );
mcm 1:ab60d7a79df0 583
mcm 1:ab60d7a79df0 584 /** It gets the current temperature value in Celsius degrees.
mcm 1:ab60d7a79df0 585 */
mcm 1:ab60d7a79df0 586 HTS221_status_t HTS221_GetTemperature ( HTS221_data_t* myTemperature );
mcm 1:ab60d7a79df0 587
mcm 1:ab60d7a79df0 588 /** It gets the current humidity value.
mcm 1:ab60d7a79df0 589 */
mcm 1:ab60d7a79df0 590 HTS221_status_t HTS221_GetHumidity ( HTS221_data_t* myHumidity );
mcm 1:ab60d7a79df0 591
mcm 1:ab60d7a79df0 592
mcm 1:ab60d7a79df0 593
mcm 1:ab60d7a79df0 594 private:
mcm 1:ab60d7a79df0 595 I2C _i2c;
mcm 1:ab60d7a79df0 596 uint32_t _HTS221_Addr;
mcm 1:ab60d7a79df0 597 };
mcm 1:ab60d7a79df0 598
mcm 1:ab60d7a79df0 599 #endif