htu21d_for_weather_shield

Dependents:   SPARKFUN_WEATHER_SHIELD

Fork of htu21d by Kevin Braun

Committer:
isaackod
Date:
Thu Oct 20 16:47:38 2016 +0000
Revision:
4:fe060047cc24
Parent:
3:5c0f8e91d319
Changes to use with weather shield;

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 */
isaackod 4:fe060047cc24 107 htu21d(I2C i2c);
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 /**
loopsva 1:d3ed713f8354 117 * Destructor
loopsva 1:d3ed713f8354 118 *
loopsva 1:d3ed713f8354 119 * @param --none--
loopsva 0:2dab43acb3a4 120 */
loopsva 0:2dab43acb3a4 121 ~htu21d();
loopsva 0:2dab43acb3a4 122 /**
loopsva 1:d3ed713f8354 123 * Reset the HTU21D chip
loopsva 1:d3ed713f8354 124 * - Waits 15mS before exiting, allowing the chip reset to finish
loopsva 1:d3ed713f8354 125 * - Executes getSNReg() which loads up HTU21D serial number structure
loopsva 0:2dab43acb3a4 126 *
loopsva 1:d3ed713f8354 127 * @param --none-- NOTE: run softReset() once at initialization time
loopsva 0:2dab43acb3a4 128 *
loopsva 1:d3ed713f8354 129 * @return success / failure of HTU21D i2c access. 1 = ok, 0 = error
loopsva 0:2dab43acb3a4 130 */
loopsva 0:2dab43acb3a4 131 int softReset();
loopsva 0:2dab43acb3a4 132 /**
loopsva 1:d3ed713f8354 133 * Get HTU21D user register
loopsva 0:2dab43acb3a4 134 *
loopsva 1:d3ed713f8354 135 * @param --none--
loopsva 0:2dab43acb3a4 136 *
loopsva 1:d3ed713f8354 137 * @return 8 bit user register value
loopsva 0:2dab43acb3a4 138 */
loopsva 0:2dab43acb3a4 139 uint8_t getUserReg();
loopsva 0:2dab43acb3a4 140 /**
loopsva 1:d3ed713f8354 141 * Turn ON the heater on the HTU21D
loopsva 0:2dab43acb3a4 142 *
loopsva 1:d3ed713f8354 143 * @param --none--
loopsva 0:2dab43acb3a4 144 *
loopsva 1:d3ed713f8354 145 * @return success / failure of HTU21D i2c access. 1 = ok, 0 = error
loopsva 0:2dab43acb3a4 146 */
loopsva 0:2dab43acb3a4 147 int heaterOn();
loopsva 0:2dab43acb3a4 148 /**
loopsva 1:d3ed713f8354 149 * Turn OFF the heater on the HTU21D
loopsva 0:2dab43acb3a4 150 *
loopsva 1:d3ed713f8354 151 * @param --none--
loopsva 0:2dab43acb3a4 152 *
loopsva 1:d3ed713f8354 153 * @return success / failure of HTU21D i2c access. 1 = ok, 0 = error
loopsva 0:2dab43acb3a4 154 */
loopsva 0:2dab43acb3a4 155 int heaterOff();
loopsva 0:2dab43acb3a4 156 /**
loopsva 1:d3ed713f8354 157 * Get heater on/off status of the HTU21D
loopsva 0:2dab43acb3a4 158 *
loopsva 1:d3ed713f8354 159 * @param --none--
loopsva 0:2dab43acb3a4 160 *
loopsva 1:d3ed713f8354 161 * @return 0x04 = on, 0 = off
loopsva 0:2dab43acb3a4 162 */
loopsva 0:2dab43acb3a4 163 uint8_t getHeater();
loopsva 0:2dab43acb3a4 164 /**
loopsva 1:d3ed713f8354 165 * Get HTU21D Temperature
loopsva 0:2dab43acb3a4 166 *
loopsva 1:d3ed713f8354 167 * @param --none--
loopsva 0:2dab43acb3a4 168 *
loopsva 1:d3ed713f8354 169 * @return float of Temperature in degrees C. 255.0 if error
loopsva 0:2dab43acb3a4 170 */
loopsva 0:2dab43acb3a4 171 float getTemp();
loopsva 0:2dab43acb3a4 172 /**
loopsva 1:d3ed713f8354 173 * Get HTU21D Humidity
loopsva 0:2dab43acb3a4 174 *
loopsva 1:d3ed713f8354 175 * @param --none--
loopsva 0:2dab43acb3a4 176 *
loopsva 1:d3ed713f8354 177 * @return float of Humidity in percentage. 255.0 if error
loopsva 0:2dab43acb3a4 178 */
loopsva 0:2dab43acb3a4 179 float getHum();
loopsva 0:2dab43acb3a4 180 /**
loopsva 1:d3ed713f8354 181 * Calculate the Dew Point
loopsva 0:2dab43acb3a4 182 *
loopsva 1:d3ed713f8354 183 * @param --none-- NOTE: You MUST run getTemp() and getHum() first!!
loopsva 0:2dab43acb3a4 184 *
loopsva 1:d3ed713f8354 185 * @return float of Dew Point
loopsva 0:2dab43acb3a4 186 */
loopsva 0:2dab43acb3a4 187 float getDewPt();
loopsva 0:2dab43acb3a4 188 /**
loopsva 1:d3ed713f8354 189 * Calculate the Dew Point fast
loopsva 1:d3ed713f8354 190 * - 5x faster than getDewPt()
loopsva 1:d3ed713f8354 191 * - slightly less accurate than getDewPt()
loopsva 0:2dab43acb3a4 192 *
loopsva 1:d3ed713f8354 193 * @param --none-- NOTE: You MUST run getTemp() and getHum() first!!
loopsva 0:2dab43acb3a4 194 *
loopsva 1:d3ed713f8354 195 * @return float of Dew Point
loopsva 0:2dab43acb3a4 196 */
loopsva 0:2dab43acb3a4 197 float getDewPtFast();
loopsva 1:d3ed713f8354 198 /**
loopsva 1:d3ed713f8354 199 * Structure to access HTU21D's serial number
loopsva 1:d3ed713f8354 200 * - HTU21D_sna is the hi 16 bit word of the s/n, always is 0x4854
loopsva 1:d3ed713f8354 201 * - HTU21D_snb is the mid 32 bit word of the s/n, 0x00--------
loopsva 1:d3ed713f8354 202 * - HTU21D_snc is the low 16 bit word of the s/n, 0x32--
loopsva 1:d3ed713f8354 203 * - The complete 64 bit s/n value is: 0x48 54 00 -- -- -- 32 --
loopsva 1:d3ed713f8354 204 * - The numbers shown are fixed fields
loopsva 1:d3ed713f8354 205 * - The '-' numbers are variable
loopsva 1:d3ed713f8354 206 * - For reference, the CRC values for the s/n are included
loopsva 1:d3ed713f8354 207 */
loopsva 1:d3ed713f8354 208 struct HTU21snStruct {
loopsva 1:d3ed713f8354 209 uint16_t HTU21D_sna; /**< Highest order 16 bit word of SN
loopsva 1:d3ed713f8354 210 - Value always = 0x4854
loopsva 1:d3ed713f8354 211 */
loopsva 1:d3ed713f8354 212 uint32_t HTU21D_snb; /**< Middle order 32 bit word of SN
loopsva 1:d3ed713f8354 213 - Value = 0x00--------
loopsva 1:d3ed713f8354 214 - Highest byte always = 0x00
loopsva 1:d3ed713f8354 215 - Lower 3 bytes are variable
loopsva 1:d3ed713f8354 216 */
loopsva 1:d3ed713f8354 217 uint16_t HTU21D_snc; /**< Lowest order 16 bit word of SN
loopsva 1:d3ed713f8354 218 - Value = 0x32--
loopsva 1:d3ed713f8354 219 - Highest byte always = 0x32
loopsva 1:d3ed713f8354 220 - Lowest byte is variable
loopsva 1:d3ed713f8354 221 */
loopsva 1:d3ed713f8354 222 uint8_t HTU21D_crca; /**< Single byte checksum from HTU21D_sna
loopsva 1:d3ed713f8354 223 */
loopsva 1:d3ed713f8354 224 uint32_t HTU21D_crcb; /**< Four byte checksum from HTU21D_snb
loopsva 1:d3ed713f8354 225 */
loopsva 1:d3ed713f8354 226 uint8_t HTU21D_crcc; /**< Single byte checksum from HTU21D_snc
loopsva 1:d3ed713f8354 227 */
loopsva 1:d3ed713f8354 228 HTU21snStruct() {
loopsva 1:d3ed713f8354 229 HTU21D_sna = 0;
loopsva 1:d3ed713f8354 230 HTU21D_snb = 0;
loopsva 1:d3ed713f8354 231 HTU21D_snc = 0;
loopsva 1:d3ed713f8354 232 HTU21D_crca = 0;
loopsva 1:d3ed713f8354 233 HTU21D_crcb = 0;
loopsva 1:d3ed713f8354 234 HTU21D_crcc = 0;
loopsva 1:d3ed713f8354 235 }
loopsva 1:d3ed713f8354 236 } HTU21sn;
loopsva 0:2dab43acb3a4 237
loopsva 0:2dab43acb3a4 238 private:
loopsva 0:2dab43acb3a4 239 I2C _i2c;
loopsva 0:2dab43acb3a4 240 /**
loopsva 1:d3ed713f8354 241 * I2C access for getting raw Temperature and Humidity data
loopsva 0:2dab43acb3a4 242 *
loopsva 1:d3ed713f8354 243 * @param 8 bit HTU21D register to get data from. Must use non-blocking regs
loopsva 0:2dab43acb3a4 244 *
loopsva 1:d3ed713f8354 245 * @return 16 bit raw i2c data, ANDed to 14 bits 0xFFFC. 0000 if error
loopsva 0:2dab43acb3a4 246 */
loopsva 0:2dab43acb3a4 247 uint16_t getData(uint8_t reg);
loopsva 1:d3ed713f8354 248 /**
loopsva 1:d3ed713f8354 249 * Get the HTU21D's serial number.
loopsva 1:d3ed713f8354 250 * - Number returned is 0x4854 00-- ---- 32--
loopsva 1:d3ed713f8354 251 * - The numbers shown are fixed fields
loopsva 1:d3ed713f8354 252 * - The '-' numbers are variable
loopsva 1:d3ed713f8354 253 *
loopsva 1:d3ed713f8354 254 * @param --none--
loopsva 1:d3ed713f8354 255 *
loopsva 1:d3ed713f8354 256 * @return --none--
loopsva 1:d3ed713f8354 257 */
loopsva 3:5c0f8e91d319 258 #if not defined HTU21Di2cLOWLEVEL
loopsva 3:5c0f8e91d319 259 char htuBuffer[8];
loopsva 3:5c0f8e91d319 260 #endif
loopsva 1:d3ed713f8354 261 void getSNReg();
loopsva 0:2dab43acb3a4 262 double theTempIs;
loopsva 0:2dab43acb3a4 263 double theHumIs;
loopsva 0:2dab43acb3a4 264 };
loopsva 0:2dab43acb3a4 265
loopsva 0:2dab43acb3a4 266 #endif