htu21d_for_weather_shield

Dependents:   SPARKFUN_WEATHER_SHIELD

Fork of htu21d by Kevin Braun

Committer:
loopsva
Date:
Thu Apr 30 00:34:03 2015 +0000
Revision:
3:5c0f8e91d319
Parent:
1:d3ed713f8354
Child:
4:fe060047cc24
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