Quick sample to return float temp in C.

Dependents:   mbed-IBooth-ETH

Fork of htu21d by Kevin Braun

Committer:
andcor02
Date:
Thu Apr 16 13:07:52 2015 +0000
Revision:
3:396c0b63392e
Parent:
1:d3ed713f8354
Fit for purpose

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