Digital Humidity Sensor SHT2x (RH/T)

Committer:
mcm
Date:
Tue Sep 04 11:07:22 2018 +0000
Revision:
2:5893455b8c6c
Parent:
1:9f1fcd1e4c9c
This driver was completed and tested ( NUCLEO-L152RE ), it works as expected.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mcm 0:c4740c726844 1 /**
mcm 0:c4740c726844 2 * @brief SHT2X.h
mcm 0:c4740c726844 3 * @details Humidity and Temperature Sensor IC.
mcm 0:c4740c726844 4 * Header file.
mcm 0:c4740c726844 5 *
mcm 0:c4740c726844 6 *
mcm 0:c4740c726844 7 * @return N/A
mcm 0:c4740c726844 8 *
mcm 0:c4740c726844 9 * @author Manuel Caballero
mcm 0:c4740c726844 10 * @date 3/September/2018
mcm 0:c4740c726844 11 * @version 3/September/2018 The ORIGIN
mcm 0:c4740c726844 12 * @pre N/A
mcm 0:c4740c726844 13 * @warning N/A
mcm 0:c4740c726844 14 * @pre This code belongs to Nimbus Centre ( http://www.nimbus.cit.ie ).
mcm 0:c4740c726844 15 */
mcm 0:c4740c726844 16 #ifndef SHT2X_H_
mcm 0:c4740c726844 17 #define SHT2X_H_
mcm 0:c4740c726844 18
mcm 0:c4740c726844 19 #include "mbed.h"
mcm 0:c4740c726844 20
mcm 0:c4740c726844 21
mcm 0:c4740c726844 22 /**
mcm 0:c4740c726844 23 Example:
mcm 0:c4740c726844 24
mcm 0:c4740c726844 25 @code
mcm 2:5893455b8c6c 26 #include "mbed.h"
mcm 2:5893455b8c6c 27 #include "SHT2X.h"
mcm 0:c4740c726844 28
mcm 2:5893455b8c6c 29 SHT2X mySHT2X ( I2C_SDA, I2C_SCL, SHT2X::SHT2X_ADDRESS, 400000 );
mcm 2:5893455b8c6c 30 Serial pc ( USBTX, USBRX ); // tx, rx
mcm 2:5893455b8c6c 31
mcm 2:5893455b8c6c 32 DigitalOut myled ( LED1 );
mcm 2:5893455b8c6c 33 Ticker newAction;
mcm 2:5893455b8c6c 34
mcm 2:5893455b8c6c 35
mcm 2:5893455b8c6c 36 //@brief Constants.
mcm 2:5893455b8c6c 37 //
mcm 2:5893455b8c6c 38 #define TX_BUFF_SIZE 64 // UART buffer size
mcm 2:5893455b8c6c 39
mcm 2:5893455b8c6c 40
mcm 2:5893455b8c6c 41 //@brief Variables.
mcm 2:5893455b8c6c 42 //
mcm 2:5893455b8c6c 43 volatile uint32_t myState; // State that indicates when to perform an ADC sample
mcm 2:5893455b8c6c 44
mcm 2:5893455b8c6c 45
mcm 2:5893455b8c6c 46 //
mcm 2:5893455b8c6c 47 // @brief FUNCTION PROTOTYPES
mcm 2:5893455b8c6c 48 //
mcm 2:5893455b8c6c 49 void changeDATA ( void );
mcm 2:5893455b8c6c 50
mcm 2:5893455b8c6c 51
mcm 2:5893455b8c6c 52 //@brief FUNCTION FOR APPLICATION MAIN ENTRY.
mcm 2:5893455b8c6c 53 //
mcm 2:5893455b8c6c 54 int main()
mcm 2:5893455b8c6c 55 {
mcm 2:5893455b8c6c 56 char myBatteryMessage[5] = "";
mcm 2:5893455b8c6c 57 uint32_t aux;
mcm 2:5893455b8c6c 58 SHT2X::SHT2X_vector_data_t mySHT2X_Data;
mcm 2:5893455b8c6c 59
mcm 2:5893455b8c6c 60 pc.baud ( 115200 );
mcm 2:5893455b8c6c 61
mcm 2:5893455b8c6c 62
mcm 2:5893455b8c6c 63 myled = 1;
mcm 2:5893455b8c6c 64 wait(3);
mcm 2:5893455b8c6c 65 myled = 0;
mcm 2:5893455b8c6c 66
mcm 2:5893455b8c6c 67 // Perform a software reset
mcm 2:5893455b8c6c 68 aux = mySHT2X.SHT2X_SoftReset ();
mcm 2:5893455b8c6c 69 wait_ms ( 15 );
mcm 2:5893455b8c6c 70
mcm 2:5893455b8c6c 71 // Configure the device: Resolution Temperature: 14-bit and Humidity: 12-bit, Heater is disabled
mcm 2:5893455b8c6c 72 aux = mySHT2X.SHT2X_Conf ( SHT2X::USER_REGISTER_RESOLUTION_12RH_14TEMP, SHT2X::USER_REGISTER_HEATER_DISABLED );
mcm 2:5893455b8c6c 73
mcm 2:5893455b8c6c 74 // Get the serial number
mcm 2:5893455b8c6c 75 aux = mySHT2X.SHT2X_GetSerialNumber ( &mySHT2X_Data );
mcm 2:5893455b8c6c 76
mcm 2:5893455b8c6c 77 // Transmit result through the UART
mcm 2:5893455b8c6c 78 pc.printf( "ID: %ld\r\n", mySHT2X_Data.SerialNumber );
mcm 2:5893455b8c6c 79
mcm 2:5893455b8c6c 80 myState = 0UL; // Reset the variable
mcm 2:5893455b8c6c 81 newAction.attach( &changeDATA, 0.5f ); // the address of the function to be attached ( changeDATA ) and the interval ( 0.5s )
mcm 2:5893455b8c6c 82
mcm 2:5893455b8c6c 83 // Let the callbacks take care of everything
mcm 2:5893455b8c6c 84 while(1) {
mcm 2:5893455b8c6c 85 sleep();
mcm 2:5893455b8c6c 86
mcm 2:5893455b8c6c 87 switch ( myState ) {
mcm 2:5893455b8c6c 88 default:
mcm 2:5893455b8c6c 89 case 1:
mcm 2:5893455b8c6c 90 myled = 1;
mcm 2:5893455b8c6c 91
mcm 2:5893455b8c6c 92 // Trigger a new temperature measurement
mcm 2:5893455b8c6c 93 aux = mySHT2X.SHT2X_TriggerTemperature ( SHT2X::SHT2X_NO_HOLD_MASTER_MODE );
mcm 2:5893455b8c6c 94 break;
mcm 2:5893455b8c6c 95
mcm 2:5893455b8c6c 96 case 2:
mcm 2:5893455b8c6c 97 // Get the temperature
mcm 2:5893455b8c6c 98 aux = mySHT2X.SHT2X_ReadTemperature ( &mySHT2X_Data );
mcm 2:5893455b8c6c 99
mcm 2:5893455b8c6c 100 // Trigger a new relative humidity measurement
mcm 2:5893455b8c6c 101 aux = mySHT2X.SHT2X_TriggerHumidity ( SHT2X::SHT2X_NO_HOLD_MASTER_MODE );
mcm 2:5893455b8c6c 102 break;
mcm 2:5893455b8c6c 103
mcm 2:5893455b8c6c 104 case 3:
mcm 2:5893455b8c6c 105 // Get the relative humidity
mcm 2:5893455b8c6c 106 aux = mySHT2X.SHT2X_ReadHumidity ( &mySHT2X_Data );
mcm 2:5893455b8c6c 107
mcm 2:5893455b8c6c 108 // Get the battery status
mcm 2:5893455b8c6c 109 aux = mySHT2X.SHT2X_BatteryStatus ( &mySHT2X_Data );
mcm 2:5893455b8c6c 110
mcm 2:5893455b8c6c 111 // Prepare the message for the battery status
mcm 2:5893455b8c6c 112 if ( ( mySHT2X_Data.BatteryStatus & SHT2X::USER_REGISTER_STATUS_END_BATTERY_MASK ) == SHT2X::USER_REGISTER_STATUS_END_BATTERY_HIGH_2V25 ) {
mcm 2:5893455b8c6c 113 strcpy( myBatteryMessage, "GOOD" );
mcm 2:5893455b8c6c 114 } else {
mcm 2:5893455b8c6c 115 strcpy( myBatteryMessage, "BAD" );
mcm 2:5893455b8c6c 116 }
mcm 2:5893455b8c6c 117
mcm 2:5893455b8c6c 118 // Transmit result through the UART
mcm 2:5893455b8c6c 119 pc.printf ( "Temperature: %0.2f C | RH: %0.2f | Battery: %s\r\n", mySHT2X_Data.Temperature, mySHT2X_Data.RelativeHumidity, myBatteryMessage );
mcm 2:5893455b8c6c 120
mcm 2:5893455b8c6c 121
mcm 2:5893455b8c6c 122 // Reset the variables
mcm 2:5893455b8c6c 123 myState = 0UL;
mcm 2:5893455b8c6c 124 myled = 0;
mcm 2:5893455b8c6c 125 break;
mcm 2:5893455b8c6c 126 }
mcm 2:5893455b8c6c 127 }
mcm 2:5893455b8c6c 128 }
mcm 2:5893455b8c6c 129
mcm 2:5893455b8c6c 130
mcm 2:5893455b8c6c 131 // @brief changeDATA ( void )
mcm 2:5893455b8c6c 132 //
mcm 2:5893455b8c6c 133 // @details It changes myState variable
mcm 2:5893455b8c6c 134 //
mcm 2:5893455b8c6c 135 // @param[in] N/A
mcm 2:5893455b8c6c 136 //
mcm 2:5893455b8c6c 137 // @param[out] N/A.
mcm 2:5893455b8c6c 138 //
mcm 2:5893455b8c6c 139 //
mcm 2:5893455b8c6c 140 // @return N/A..
mcm 2:5893455b8c6c 141 //
mcm 2:5893455b8c6c 142 //
mcm 2:5893455b8c6c 143 // @author Manuel Caballero
mcm 2:5893455b8c6c 144 // @date 3/September/2018
mcm 2:5893455b8c6c 145 // @version 3/September/2018 The ORIGIN
mcm 2:5893455b8c6c 146 // @pre N/A
mcm 2:5893455b8c6c 147 // @warning N/A.
mcm 2:5893455b8c6c 148 void changeDATA ( void )
mcm 2:5893455b8c6c 149 {
mcm 2:5893455b8c6c 150 myState++;
mcm 2:5893455b8c6c 151 }
mcm 0:c4740c726844 152 @endcode
mcm 0:c4740c726844 153 */
mcm 0:c4740c726844 154
mcm 0:c4740c726844 155
mcm 0:c4740c726844 156 /*!
mcm 0:c4740c726844 157 Library for the SHT2X Humidity and Temperature Sensor IC.
mcm 0:c4740c726844 158 */
mcm 0:c4740c726844 159 class SHT2X
mcm 0:c4740c726844 160 {
mcm 0:c4740c726844 161 public:
mcm 0:c4740c726844 162 /**
mcm 0:c4740c726844 163 * @brief DEFAULT ADDRESS
mcm 0:c4740c726844 164 */
mcm 0:c4740c726844 165 typedef enum {
mcm 1:9f1fcd1e4c9c 166 SHT2X_ADDRESS = ( 0b1000000 << 1U ) /*!< SHT2X I2C Address */
mcm 0:c4740c726844 167 } SHT2X_address_t;
mcm 0:c4740c726844 168
mcm 0:c4740c726844 169
mcm 0:c4740c726844 170
mcm 0:c4740c726844 171 /**
mcm 0:c4740c726844 172 * @brief COMMAND REGISTERS
mcm 0:c4740c726844 173 */
mcm 0:c4740c726844 174 typedef enum {
mcm 0:c4740c726844 175 SHT2X_TRIGGER_TEMPERATURE_MEASUREMENT_HOLD_MASTER = 0xE3, /*!< Hold master */
mcm 0:c4740c726844 176 SHT2X_TRIGGER_HUMIDITY_MEASUREMENT_HOLD_MASTER = 0xE5, /*!< Hold master */
mcm 0:c4740c726844 177 SHT2X_TRIGGER_TEMPERATURE_MEASUREMENT_NO_HOLD_MASTER = 0xF3, /*!< No Hold master */
mcm 0:c4740c726844 178 SHT2X_TRIGGER_HUMIDITY_MEASUREMENT_NO_HOLD_MASTER = 0xF5, /*!< No Hold master */
mcm 0:c4740c726844 179 SHT2X_WRITE_USER_REGISTER = 0xE6, /*!< Write user register */
mcm 0:c4740c726844 180 SHT2X_READ_USER_REGISTER = 0xE7, /*!< Read user register */
mcm 0:c4740c726844 181 SHT2X_SOFT_RESET = 0xFE, /*!< Software reset */
mcm 0:c4740c726844 182 SHT2X_SERIAL_NUMBER_FIRST_MEMORY_ACCESS_MSB = 0xFA, /*!< Serial number first memory access */
mcm 0:c4740c726844 183 SHT2X_SERIAL_NUMBER_FIRST_MEMORY_ACCESS_LSB = 0x0F, /*!< Serial number first memory access */
mcm 0:c4740c726844 184 SHT2X_SERIAL_NUMBER_SECOND_MEMORY_ACCESS_MSB = 0xFC, /*!< Serial number second memory access */
mcm 0:c4740c726844 185 SHT2X_SERIAL_NUMBER_SECOND_MEMORY_ACCESS_LSB = 0xC9 /*!< Serial number second memory access */
mcm 0:c4740c726844 186 } SHT2X_command_registers_t;
mcm 0:c4740c726844 187
mcm 0:c4740c726844 188
mcm 0:c4740c726844 189
mcm 0:c4740c726844 190 // MASTER MODE
mcm 0:c4740c726844 191 /**
mcm 0:c4740c726844 192 * @brief MODE
mcm 0:c4740c726844 193 */
mcm 0:c4740c726844 194 typedef enum {
mcm 0:c4740c726844 195 SHT2X_HOLD_MASTER_MODE = 0x01, /*!< SHT2X HOLD MASTER MODE enabled */
mcm 0:c4740c726844 196 SHT2X_NO_HOLD_MASTER_MODE = 0x00 /*!< SHT2X NO HOLD MASTER MODE enabled */
mcm 0:c4740c726844 197 } SHT2X_master_mode_t;
mcm 0:c4740c726844 198
mcm 0:c4740c726844 199
mcm 0:c4740c726844 200
mcm 0:c4740c726844 201 // USER REGISTER
mcm 0:c4740c726844 202 /*
mcm 0:c4740c726844 203 NOTE: Reserved bits must not be changed and default
mcm 0:c4740c726844 204 values of respective reserved bits may change over time without prior notice. Therefore, for any writing to user
mcm 0:c4740c726844 205 register, default values of reserved bits must be read first.
mcm 0:c4740c726844 206 */
mcm 0:c4740c726844 207 /**
mcm 0:c4740c726844 208 * @brief RESOLUTION
mcm 0:c4740c726844 209 */
mcm 0:c4740c726844 210 typedef enum {
mcm 0:c4740c726844 211 USER_REGISTER_RESOLUTION_MASK = 0x81, /*!< SHT2X Measurement Resolution */
mcm 0:c4740c726844 212 USER_REGISTER_RESOLUTION_12RH_14TEMP = 0x00, /*!< SHT2X 12b RH 14b Temp. */
mcm 0:c4740c726844 213 USER_REGISTER_RESOLUTION_8RH_12TEMP = 0x01, /*!< SHT2X 9b RH 12b Temp. */
mcm 0:c4740c726844 214 USER_REGISTER_RESOLUTION_10RH_13TEMP = 0x80, /*!< SHT2X 10b RH 13b Temp. */
mcm 0:c4740c726844 215 USER_REGISTER_RESOLUTION_11RH_11TEMP = 0x81 /*!< SHT2X 11b RH 11b Temp. */
mcm 0:c4740c726844 216 } SHT2X_measurement_resolution_t;
mcm 0:c4740c726844 217
mcm 0:c4740c726844 218
mcm 0:c4740c726844 219
mcm 0:c4740c726844 220 /**
mcm 0:c4740c726844 221 * @brief STATUS END OF BATTERY
mcm 0:c4740c726844 222 */
mcm 0:c4740c726844 223 typedef enum {
mcm 0:c4740c726844 224 USER_REGISTER_STATUS_END_BATTERY_MASK = 0x40, /*!< End battery mask */
mcm 0:c4740c726844 225 USER_REGISTER_STATUS_END_BATTERY_HIGH_2V25 = 0x00, /*!< VDD > 2.25V. */
mcm 0:c4740c726844 226 USER_REGISTER_STATUS_END_BATTERY_LOW_2V25 = 0x40 /*!< VDD < 2.25V. */
mcm 0:c4740c726844 227 } SHT2X_status_end_battery_t;
mcm 0:c4740c726844 228
mcm 0:c4740c726844 229
mcm 0:c4740c726844 230
mcm 0:c4740c726844 231 /**
mcm 0:c4740c726844 232 * @brief ON-CHIP HEATER
mcm 0:c4740c726844 233 */
mcm 0:c4740c726844 234 typedef enum {
mcm 0:c4740c726844 235 USER_REGISTER_HEATER_MASK = 0x04, /*!< ON-chip heater mask */
mcm 0:c4740c726844 236 USER_REGISTER_HEATER_ENABLED = 0x04, /*!< Heater enabled. */
mcm 0:c4740c726844 237 USER_REGISTER_HEATER_DISABLED = 0x00 /*!< Heater disabled. */
mcm 0:c4740c726844 238 } SHT2X_on_chip_heater_t;
mcm 0:c4740c726844 239
mcm 0:c4740c726844 240
mcm 0:c4740c726844 241
mcm 0:c4740c726844 242 /**
mcm 0:c4740c726844 243 * @brief OTP RELOAD
mcm 0:c4740c726844 244 */
mcm 0:c4740c726844 245 typedef enum {
mcm 0:c4740c726844 246 USER_REGISTER_OTP_MASK = 0x02, /*!< OTP heater mask */
mcm 0:c4740c726844 247 USER_REGISTER_OTP_ENABLED = 0x00, /*!< OTP enabled. */
mcm 0:c4740c726844 248 USER_REGISTER_OTP_DISABLED = 0x02 /*!< OTP disabled. */
mcm 0:c4740c726844 249 } SHT2X_otp_t;
mcm 0:c4740c726844 250
mcm 0:c4740c726844 251
mcm 0:c4740c726844 252
mcm 0:c4740c726844 253 #ifndef SHT2X_VECTOR_STRUCT_H
mcm 0:c4740c726844 254 #define SHT2X_VECTOR_STRUCT_H
mcm 0:c4740c726844 255 typedef struct {
mcm 0:c4740c726844 256 float RelativeHumidity;
mcm 0:c4740c726844 257 float Temperature;
mcm 0:c4740c726844 258
mcm 0:c4740c726844 259 uint16_t RawRelativeHumidity;
mcm 0:c4740c726844 260 uint16_t RawTemperature;
mcm 0:c4740c726844 261
mcm 0:c4740c726844 262 uint8_t BatteryStatus;
mcm 0:c4740c726844 263 uint64_t SerialNumber;
mcm 0:c4740c726844 264 } SHT2X_vector_data_t;
mcm 0:c4740c726844 265 #endif
mcm 0:c4740c726844 266
mcm 0:c4740c726844 267
mcm 0:c4740c726844 268 /**
mcm 0:c4740c726844 269 * @brief INTERNAL CONSTANTS
mcm 0:c4740c726844 270 */
mcm 0:c4740c726844 271 typedef enum {
mcm 0:c4740c726844 272 SHT2X_SUCCESS = 0,
mcm 0:c4740c726844 273 SHT2X_FAILURE = 1,
mcm 0:c4740c726844 274 I2C_SUCCESS = 0 /*!< I2C communication was fine */
mcm 0:c4740c726844 275 } SHT2X_status_t;
mcm 0:c4740c726844 276
mcm 0:c4740c726844 277
mcm 0:c4740c726844 278
mcm 0:c4740c726844 279
mcm 0:c4740c726844 280 /** Create an SHT2X object connected to the specified I2C pins.
mcm 0:c4740c726844 281 *
mcm 0:c4740c726844 282 * @param sda I2C data pin
mcm 0:c4740c726844 283 * @param scl I2C clock pin
mcm 0:c4740c726844 284 * @param addr I2C slave address
mcm 0:c4740c726844 285 * @param freq I2C frequency in Hz.
mcm 0:c4740c726844 286 */
mcm 0:c4740c726844 287 SHT2X ( PinName sda, PinName scl, uint32_t addr, uint32_t freq );
mcm 0:c4740c726844 288
mcm 0:c4740c726844 289 /** Delete SHT2X object.
mcm 0:c4740c726844 290 */
mcm 0:c4740c726844 291 ~SHT2X();
mcm 0:c4740c726844 292
mcm 0:c4740c726844 293 /** It configures the SHT2X device.
mcm 0:c4740c726844 294 */
mcm 0:c4740c726844 295 SHT2X_status_t SHT2X_Conf ( SHT2X_measurement_resolution_t myResolution, SHT2X_on_chip_heater_t myHeater );
mcm 0:c4740c726844 296
mcm 0:c4740c726844 297 /** Rebooting the SHT2X sensor switching the power off and on again.
mcm 0:c4740c726844 298 */
mcm 0:c4740c726844 299 SHT2X_status_t SHT2X_SoftReset ( void );
mcm 0:c4740c726844 300
mcm 0:c4740c726844 301 /** It triggers a new temperature measurement.
mcm 0:c4740c726844 302 */
mcm 0:c4740c726844 303 SHT2X_status_t SHT2X_TriggerTemperature ( SHT2X_master_mode_t myMode );
mcm 0:c4740c726844 304
mcm 0:c4740c726844 305 /** It reads a new temperature measurement.
mcm 0:c4740c726844 306 */
mcm 0:c4740c726844 307 SHT2X_status_t SHT2X_ReadTemperature ( SHT2X_vector_data_t* myTemperature );
mcm 0:c4740c726844 308
mcm 0:c4740c726844 309 /** It reads a new raw temperature measurement.
mcm 0:c4740c726844 310 */
mcm 0:c4740c726844 311 SHT2X_status_t SHT2X_ReadRawTemperature ( SHT2X_vector_data_t* myRawTemperature );
mcm 0:c4740c726844 312
mcm 0:c4740c726844 313 /** It triggers a new humidity measurement.
mcm 0:c4740c726844 314 */
mcm 0:c4740c726844 315 SHT2X_status_t SHT2X_TriggerHumidity ( SHT2X_master_mode_t myMode );
mcm 0:c4740c726844 316
mcm 0:c4740c726844 317 /** It reads a new humidity measurement.
mcm 0:c4740c726844 318 */
mcm 0:c4740c726844 319 SHT2X_status_t SHT2X_ReadHumidity ( SHT2X_vector_data_t* myHumidity );
mcm 0:c4740c726844 320
mcm 0:c4740c726844 321 /** It reads a new raw humidity measurement.
mcm 0:c4740c726844 322 */
mcm 0:c4740c726844 323 SHT2X_status_t SHT2X_ReadRawHumidity ( SHT2X_vector_data_t* myRawHumidity );
mcm 0:c4740c726844 324
mcm 0:c4740c726844 325 /** It reads the user register to check the battery status.
mcm 0:c4740c726844 326 */
mcm 0:c4740c726844 327 SHT2X_status_t SHT2X_BatteryStatus ( SHT2X_vector_data_t* myBattStatus );
mcm 0:c4740c726844 328
mcm 0:c4740c726844 329 /** It gets the serial number ( Electronic Identification Code ).
mcm 0:c4740c726844 330 */
mcm 0:c4740c726844 331 SHT2X_status_t SHT2X_GetSerialNumber ( SHT2X_vector_data_t* mySerialNumber );
mcm 0:c4740c726844 332
mcm 0:c4740c726844 333 private:
mcm 1:9f1fcd1e4c9c 334 I2C _i2c;
mcm 1:9f1fcd1e4c9c 335 uint32_t _SHT2X_Addr;
mcm 0:c4740c726844 336 };
mcm 0:c4740c726844 337
mcm 0:c4740c726844 338 #endif /* SHT2X_H */