Library for the Measurement Specialties' HTU21D Humidity and Temperature sensor. Code includes device's heater on/off control, serial number access, dew point calculations and RTOS hooks. To date, code tested on GR-PEACH, K64F and KL25Z boards with and w/o RTOS, SDFlash and USB serial Rx interrupts.

Dependents:   BLE_soil_humidity

Library for the Measurement Specialties / Honeywell HTU21D Humidity and Temperature sensor. Code includes device's heater on/off control, serial number access, dew point calculations and RTOS hooks. To date, code tested on K64F and KL25Z boards with and without RTOS, SDFileSystem and USB serial Rx interrupts.

The HTU21D's serial number is an odd cookie. There are two 16 bit registers and a 32 bit register are combined to generate the serial number. Some of the serial number bit fields are fixed for all devices and some change from part to part.

Committer:
loopsva
Date:
Thu Apr 30 00:34:03 2015 +0000
Revision:
3:5c0f8e91d319
Parent:
1:d3ed713f8354
Removed RTOS mutex dependencies, put onus back on calling program.  Option to use hi-level i2c commands, needed for the GR-PEACH which has bugs using low-level i2c commands. Add the line #define HTU21Di2cLOWLEVEL   1  in htu21d.h to use low-level i2c

Who changed what in which revision?

UserRevisionLine numberNew contents of line
loopsva 0:2dab43acb3a4 1 /**
loopsva 1:d3ed713f8354 2 HTU21D / HPP828E031 driver for mbed.
loopsva 1:d3ed713f8354 3 - Includes RTOS hooks if RTOS is detected during compile.
loopsva 1:d3ed713f8354 4 Author: Kevin Braun
loopsva 1:d3ed713f8354 5 **/
loopsva 0:2dab43acb3a4 6
loopsva 0:2dab43acb3a4 7 #ifndef HTU21D_H
loopsva 0:2dab43acb3a4 8 #define HTU21D_H
loopsva 0:2dab43acb3a4 9
loopsva 0:2dab43acb3a4 10 #include "mbed.h"
loopsva 0:2dab43acb3a4 11
loopsva 3:5c0f8e91d319 12 #if(defined(TARGET_KL25Z) )//|| defined(TARGET_K64F))
loopsva 3:5c0f8e91d319 13
loopsva 3:5c0f8e91d319 14 #define HTU21Di2cLOWLEVEL 1 //if the use of low-level I2C routines is needed
loopsva 3:5c0f8e91d319 15 #warning "HTU21D using low level I2C routines"
loopsva 3:5c0f8e91d319 16
loopsva 3:5c0f8e91d319 17 #endif
loopsva 3:5c0f8e91d319 18
loopsva 0:2dab43acb3a4 19 //Defines for HTU21D
loopsva 0:2dab43acb3a4 20 #define HTU21Di2cWRITE 0x80
loopsva 0:2dab43acb3a4 21 #define HTU21Di2cREAD 0x81
loopsva 0:2dab43acb3a4 22
loopsva 0:2dab43acb3a4 23 #define HTU21DWRITEUSER 0xE6
loopsva 0:2dab43acb3a4 24 #define HTU21DREADUSER 0xE7
loopsva 0:2dab43acb3a4 25 #define HTU21DtempNOHOLD 0xF3
loopsva 0:2dab43acb3a4 26 #define HTU21DhumNOHOLD 0xF5
loopsva 0:2dab43acb3a4 27 #define HTU21DRESET 0xFE
loopsva 0:2dab43acb3a4 28
loopsva 1:d3ed713f8354 29 #define HTU21SNAC1 0xFC
loopsva 1:d3ed713f8354 30 #define HTU21SNAC2 0xC9
loopsva 1:d3ed713f8354 31 #define HTU21SNB1 0xFA
loopsva 1:d3ed713f8354 32 #define HTU21SNB2 0x0F
loopsva 1:d3ed713f8354 33
loopsva 0:2dab43acb3a4 34 #define HTU21DHEATER 0x04
loopsva 0:2dab43acb3a4 35
loopsva 0:2dab43acb3a4 36
loopsva 1:d3ed713f8354 37 /**
loopsva 1:d3ed713f8354 38 * measurement specialties / Honeywell HTU21D digital humidity and temperature sensor.
loopsva 1:d3ed713f8354 39 * - Web site: http://www.meas-spec.com
loopsva 1:d3ed713f8354 40 * - Part Number: HPP828E031
loopsva 1:d3ed713f8354 41 * - HTU21D = +-3% rh error at 55%
loopsva 1:d3ed713f8354 42 * - HTU20D = +-5% rh error at 55%
loopsva 1:d3ed713f8354 43 * - Main code generated from datasheet dated October 2013
loopsva 1:d3ed713f8354 44 * - Serial number code generated from App Note "HTU2X Serial Number Reading", dated Februrary 2014
loopsva 1:d3ed713f8354 45 * - No checksum checking is performed in this code
loopsva 1:d3ed713f8354 46 *
loopsva 1:d3ed713f8354 47 * @code
loopsva 1:d3ed713f8354 48 * //Tested on FRDM-K64F
loopsva 1:d3ed713f8354 49 *
loopsva 1:d3ed713f8354 50 * #include "mbed.h"
loopsva 1:d3ed713f8354 51 * #include "htu21d.h"
loopsva 1:d3ed713f8354 52 *
loopsva 1:d3ed713f8354 53 * #define SDA PTE25
loopsva 1:d3ed713f8354 54 * #define SCL PTE24
loopsva 1:d3ed713f8354 55 *
loopsva 1:d3ed713f8354 56 * Serial pc(USBTX, USBRX); //local terminal
loopsva 1:d3ed713f8354 57 * htu21d htu(SDA, SCL); //Temp Hum || sda, scl
loopsva 1:d3ed713f8354 58 *
loopsva 1:d3ed713f8354 59 * float H21Temp = 0.0; //Temperture from HTU21D
loopsva 1:d3ed713f8354 60 * float H21Hum = 0.0; //Humidity from HTU21D
loopsva 1:d3ed713f8354 61 * float H21Dew = 0.0; //Dew Point from HTU21D
loopsva 1:d3ed713f8354 62 *
loopsva 1:d3ed713f8354 63 * //Note: If RTOS is used, Mutex for I2C must be initialized
loopsva 1:d3ed713f8354 64 * #ifdef RTOS_H
loopsva 1:d3ed713f8354 65 * Mutex MutexI2cWait;
loopsva 1:d3ed713f8354 66 * #endif
loopsva 1:d3ed713f8354 67 *
loopsva 1:d3ed713f8354 68 * int main() {
loopsva 1:d3ed713f8354 69 * pc.baud(230400); //local terminal baud
loopsva 1:d3ed713f8354 70 * pc.printf("\r\n\r\nK64F_HTU21D basic operation\r\n");
loopsva 1:d3ed713f8354 71 *
loopsva 1:d3ed713f8354 72 * //initialize the HTU21D
loopsva 1:d3ed713f8354 73 * int htu21 = htu.softReset();
loopsva 1:d3ed713f8354 74 * if(htu21 == 0) {
loopsva 1:d3ed713f8354 75 * pc.printf(" - HTU21D broken...\r\n");
loopsva 1:d3ed713f8354 76 * } else {
loopsva 1:d3ed713f8354 77 * uint8_t HTU21DuserReg = htu.getUserReg();
loopsva 1:d3ed713f8354 78 * pc.printf("HTU21D UserReg: 0x%02x SN: 0x%04x %08x %04x\r\n",
loopsva 1:d3ed713f8354 79 * HTU21DuserReg, htu.HTU21sn.HTU21D_sna, htu.HTU21sn.HTU21D_snb, htu.HTU21sn.HTU21D_snc);
loopsva 1:d3ed713f8354 80 * }
loopsva 1:d3ed713f8354 81 *
loopsva 1:d3ed713f8354 82 * while(true) {
loopsva 1:d3ed713f8354 83 * //get humidity, temperature and dew point from HTU21D
loopsva 1:d3ed713f8354 84 * if(htu21 == 1) { //if HTU21D didn't initialize, don't access HTU21D anymore
loopsva 1:d3ed713f8354 85 * H21Hum = htu.getHum();
loopsva 1:d3ed713f8354 86 * if((double)H21Hum == 255.0) pc.printf("\r\n*** HTU21D Hum error!!\r\n");
loopsva 1:d3ed713f8354 87 * H21Temp = htu.getTemp();
loopsva 1:d3ed713f8354 88 * if((double)H21Temp == 255.0) pc.printf("\r\n*** HTU21D Temp error!!\r\n");
loopsva 1:d3ed713f8354 89 * H21Dew = htu.getDewPtFast();
loopsva 1:d3ed713f8354 90 * }
loopsva 1:d3ed713f8354 91 * pc.printf("Temp: %7.2f C %7.2f F Hum: %4.1f %% DewPt: %7.2f C\r\n", H21Temp, H21Hum, H21Dew);
loopsva 1:d3ed713f8354 92 * wait(1.0);
loopsva 1:d3ed713f8354 93 * }
loopsva 1:d3ed713f8354 94 * }
loopsva 1:d3ed713f8354 95 * @endcode
loopsva 1:d3ed713f8354 96 **/
loopsva 0:2dab43acb3a4 97 class htu21d {
loopsva 0:2dab43acb3a4 98
loopsva 0:2dab43acb3a4 99 public:
loopsva 0:2dab43acb3a4 100 /**
loopsva 1:d3ed713f8354 101 * Constructor
loopsva 1:d3ed713f8354 102 * - Fixed at I2C address 0x80
loopsva 1:d3ed713f8354 103 * - I2C speed set to 400000
loopsva 0:2dab43acb3a4 104 *
loopsva 1:d3ed713f8354 105 * @param PinName sda and scl, mbed I2C interface pins
loopsva 0:2dab43acb3a4 106 */
loopsva 0:2dab43acb3a4 107 htu21d(PinName sda, PinName scl);
loopsva 0:2dab43acb3a4 108 /**
loopsva 1:d3ed713f8354 109 * Constructor
loopsva 1:d3ed713f8354 110 * - Fixed at I2C address 0x80
loopsva 1:d3ed713f8354 111 * - I2C speed set by user
loopsva 0:2dab43acb3a4 112 *
loopsva 1:d3ed713f8354 113 * @param PinName sda and scl, mbed I2C interface pins
loopsva 1:d3ed713f8354 114 * @param int I2C frequency
loopsva 1:d3ed713f8354 115 */
loopsva 1:d3ed713f8354 116 htu21d(PinName sda, PinName scl, int i2cFrequency);
loopsva 1:d3ed713f8354 117 /**
loopsva 1:d3ed713f8354 118 * Destructor
loopsva 1:d3ed713f8354 119 *
loopsva 1:d3ed713f8354 120 * @param --none--
loopsva 0:2dab43acb3a4 121 */
loopsva 0:2dab43acb3a4 122 ~htu21d();
loopsva 0:2dab43acb3a4 123 /**
loopsva 1:d3ed713f8354 124 * Reset the HTU21D chip
loopsva 1:d3ed713f8354 125 * - Waits 15mS before exiting, allowing the chip reset to finish
loopsva 1:d3ed713f8354 126 * - Executes getSNReg() which loads up HTU21D serial number structure
loopsva 0:2dab43acb3a4 127 *
loopsva 1:d3ed713f8354 128 * @param --none-- NOTE: run softReset() once at initialization time
loopsva 0:2dab43acb3a4 129 *
loopsva 1:d3ed713f8354 130 * @return success / failure of HTU21D i2c access. 1 = ok, 0 = error
loopsva 0:2dab43acb3a4 131 */
loopsva 0:2dab43acb3a4 132 int softReset();
loopsva 0:2dab43acb3a4 133 /**
loopsva 1:d3ed713f8354 134 * Get HTU21D user register
loopsva 0:2dab43acb3a4 135 *
loopsva 1:d3ed713f8354 136 * @param --none--
loopsva 0:2dab43acb3a4 137 *
loopsva 1:d3ed713f8354 138 * @return 8 bit user register value
loopsva 0:2dab43acb3a4 139 */
loopsva 0:2dab43acb3a4 140 uint8_t getUserReg();
loopsva 0:2dab43acb3a4 141 /**
loopsva 1:d3ed713f8354 142 * Turn ON the heater on the HTU21D
loopsva 0:2dab43acb3a4 143 *
loopsva 1:d3ed713f8354 144 * @param --none--
loopsva 0:2dab43acb3a4 145 *
loopsva 1:d3ed713f8354 146 * @return success / failure of HTU21D i2c access. 1 = ok, 0 = error
loopsva 0:2dab43acb3a4 147 */
loopsva 0:2dab43acb3a4 148 int heaterOn();
loopsva 0:2dab43acb3a4 149 /**
loopsva 1:d3ed713f8354 150 * Turn OFF the heater on the HTU21D
loopsva 0:2dab43acb3a4 151 *
loopsva 1:d3ed713f8354 152 * @param --none--
loopsva 0:2dab43acb3a4 153 *
loopsva 1:d3ed713f8354 154 * @return success / failure of HTU21D i2c access. 1 = ok, 0 = error
loopsva 0:2dab43acb3a4 155 */
loopsva 0:2dab43acb3a4 156 int heaterOff();
loopsva 0:2dab43acb3a4 157 /**
loopsva 1:d3ed713f8354 158 * Get heater on/off status of the HTU21D
loopsva 0:2dab43acb3a4 159 *
loopsva 1:d3ed713f8354 160 * @param --none--
loopsva 0:2dab43acb3a4 161 *
loopsva 1:d3ed713f8354 162 * @return 0x04 = on, 0 = off
loopsva 0:2dab43acb3a4 163 */
loopsva 0:2dab43acb3a4 164 uint8_t getHeater();
loopsva 0:2dab43acb3a4 165 /**
loopsva 1:d3ed713f8354 166 * Get HTU21D Temperature
loopsva 0:2dab43acb3a4 167 *
loopsva 1:d3ed713f8354 168 * @param --none--
loopsva 0:2dab43acb3a4 169 *
loopsva 1:d3ed713f8354 170 * @return float of Temperature in degrees C. 255.0 if error
loopsva 0:2dab43acb3a4 171 */
loopsva 0:2dab43acb3a4 172 float getTemp();
loopsva 0:2dab43acb3a4 173 /**
loopsva 1:d3ed713f8354 174 * Get HTU21D Humidity
loopsva 0:2dab43acb3a4 175 *
loopsva 1:d3ed713f8354 176 * @param --none--
loopsva 0:2dab43acb3a4 177 *
loopsva 1:d3ed713f8354 178 * @return float of Humidity in percentage. 255.0 if error
loopsva 0:2dab43acb3a4 179 */
loopsva 0:2dab43acb3a4 180 float getHum();
loopsva 0:2dab43acb3a4 181 /**
loopsva 1:d3ed713f8354 182 * Calculate the Dew Point
loopsva 0:2dab43acb3a4 183 *
loopsva 1:d3ed713f8354 184 * @param --none-- NOTE: You MUST run getTemp() and getHum() first!!
loopsva 0:2dab43acb3a4 185 *
loopsva 1:d3ed713f8354 186 * @return float of Dew Point
loopsva 0:2dab43acb3a4 187 */
loopsva 0:2dab43acb3a4 188 float getDewPt();
loopsva 0:2dab43acb3a4 189 /**
loopsva 1:d3ed713f8354 190 * Calculate the Dew Point fast
loopsva 1:d3ed713f8354 191 * - 5x faster than getDewPt()
loopsva 1:d3ed713f8354 192 * - slightly less accurate than getDewPt()
loopsva 0:2dab43acb3a4 193 *
loopsva 1:d3ed713f8354 194 * @param --none-- NOTE: You MUST run getTemp() and getHum() first!!
loopsva 0:2dab43acb3a4 195 *
loopsva 1:d3ed713f8354 196 * @return float of Dew Point
loopsva 0:2dab43acb3a4 197 */
loopsva 0:2dab43acb3a4 198 float getDewPtFast();
loopsva 1:d3ed713f8354 199 /**
loopsva 1:d3ed713f8354 200 * Structure to access HTU21D's serial number
loopsva 1:d3ed713f8354 201 * - HTU21D_sna is the hi 16 bit word of the s/n, always is 0x4854
loopsva 1:d3ed713f8354 202 * - HTU21D_snb is the mid 32 bit word of the s/n, 0x00--------
loopsva 1:d3ed713f8354 203 * - HTU21D_snc is the low 16 bit word of the s/n, 0x32--
loopsva 1:d3ed713f8354 204 * - The complete 64 bit s/n value is: 0x48 54 00 -- -- -- 32 --
loopsva 1:d3ed713f8354 205 * - The numbers shown are fixed fields
loopsva 1:d3ed713f8354 206 * - The '-' numbers are variable
loopsva 1:d3ed713f8354 207 * - For reference, the CRC values for the s/n are included
loopsva 1:d3ed713f8354 208 */
loopsva 1:d3ed713f8354 209 struct HTU21snStruct {
loopsva 1:d3ed713f8354 210 uint16_t HTU21D_sna; /**< Highest order 16 bit word of SN
loopsva 1:d3ed713f8354 211 - Value always = 0x4854
loopsva 1:d3ed713f8354 212 */
loopsva 1:d3ed713f8354 213 uint32_t HTU21D_snb; /**< Middle order 32 bit word of SN
loopsva 1:d3ed713f8354 214 - Value = 0x00--------
loopsva 1:d3ed713f8354 215 - Highest byte always = 0x00
loopsva 1:d3ed713f8354 216 - Lower 3 bytes are variable
loopsva 1:d3ed713f8354 217 */
loopsva 1:d3ed713f8354 218 uint16_t HTU21D_snc; /**< Lowest order 16 bit word of SN
loopsva 1:d3ed713f8354 219 - Value = 0x32--
loopsva 1:d3ed713f8354 220 - Highest byte always = 0x32
loopsva 1:d3ed713f8354 221 - Lowest byte is variable
loopsva 1:d3ed713f8354 222 */
loopsva 1:d3ed713f8354 223 uint8_t HTU21D_crca; /**< Single byte checksum from HTU21D_sna
loopsva 1:d3ed713f8354 224 */
loopsva 1:d3ed713f8354 225 uint32_t HTU21D_crcb; /**< Four byte checksum from HTU21D_snb
loopsva 1:d3ed713f8354 226 */
loopsva 1:d3ed713f8354 227 uint8_t HTU21D_crcc; /**< Single byte checksum from HTU21D_snc
loopsva 1:d3ed713f8354 228 */
loopsva 1:d3ed713f8354 229 HTU21snStruct() {
loopsva 1:d3ed713f8354 230 HTU21D_sna = 0;
loopsva 1:d3ed713f8354 231 HTU21D_snb = 0;
loopsva 1:d3ed713f8354 232 HTU21D_snc = 0;
loopsva 1:d3ed713f8354 233 HTU21D_crca = 0;
loopsva 1:d3ed713f8354 234 HTU21D_crcb = 0;
loopsva 1:d3ed713f8354 235 HTU21D_crcc = 0;
loopsva 1:d3ed713f8354 236 }
loopsva 1:d3ed713f8354 237 } HTU21sn;
loopsva 0:2dab43acb3a4 238
loopsva 0:2dab43acb3a4 239 private:
loopsva 0:2dab43acb3a4 240 I2C _i2c;
loopsva 0:2dab43acb3a4 241 /**
loopsva 1:d3ed713f8354 242 * I2C access for getting raw Temperature and Humidity data
loopsva 0:2dab43acb3a4 243 *
loopsva 1:d3ed713f8354 244 * @param 8 bit HTU21D register to get data from. Must use non-blocking regs
loopsva 0:2dab43acb3a4 245 *
loopsva 1:d3ed713f8354 246 * @return 16 bit raw i2c data, ANDed to 14 bits 0xFFFC. 0000 if error
loopsva 0:2dab43acb3a4 247 */
loopsva 0:2dab43acb3a4 248 uint16_t getData(uint8_t reg);
loopsva 1:d3ed713f8354 249 /**
loopsva 1:d3ed713f8354 250 * Get the HTU21D's serial number.
loopsva 1:d3ed713f8354 251 * - Number returned is 0x4854 00-- ---- 32--
loopsva 1:d3ed713f8354 252 * - The numbers shown are fixed fields
loopsva 1:d3ed713f8354 253 * - The '-' numbers are variable
loopsva 1:d3ed713f8354 254 *
loopsva 1:d3ed713f8354 255 * @param --none--
loopsva 1:d3ed713f8354 256 *
loopsva 1:d3ed713f8354 257 * @return --none--
loopsva 1:d3ed713f8354 258 */
loopsva 3:5c0f8e91d319 259 #if not defined HTU21Di2cLOWLEVEL
loopsva 3:5c0f8e91d319 260 char htuBuffer[8];
loopsva 3:5c0f8e91d319 261 #endif
loopsva 1:d3ed713f8354 262 void getSNReg();
loopsva 0:2dab43acb3a4 263 double theTempIs;
loopsva 0:2dab43acb3a4 264 double theHumIs;
loopsva 0:2dab43acb3a4 265 };
loopsva 0:2dab43acb3a4 266
loopsva 0:2dab43acb3a4 267 #endif