htu21d_for_weather_shield
Dependents: SPARKFUN_WEATHER_SHIELD
Fork of htu21d by
Diff: htu21d.h
- Revision:
- 1:d3ed713f8354
- Parent:
- 0:2dab43acb3a4
- Child:
- 3:5c0f8e91d319
diff -r 2dab43acb3a4 -r d3ed713f8354 htu21d.h --- a/htu21d.h Wed May 14 00:31:30 2014 +0000 +++ b/htu21d.h Thu May 15 19:12:11 2014 +0000 @@ -1,5 +1,8 @@ /** - */ +HTU21D / HPP828E031 driver for mbed. +- Includes RTOS hooks if RTOS is detected during compile. +Author: Kevin Braun + **/ #ifndef HTU21D_H #define HTU21D_H @@ -16,116 +19,239 @@ #define HTU21DhumNOHOLD 0xF5 #define HTU21DRESET 0xFE +#define HTU21SNAC1 0xFC +#define HTU21SNAC2 0xC9 +#define HTU21SNB1 0xFA +#define HTU21SNB2 0x0F + #define HTU21DHEATER 0x04 -/** - * Honeywell HTU21D digital humidity and temperature sensor. - */ + /** + * measurement specialties / Honeywell HTU21D digital humidity and temperature sensor. + * - Web site: http://www.meas-spec.com + * - Part Number: HPP828E031 + * - HTU21D = +-3% rh error at 55% + * - HTU20D = +-5% rh error at 55% + * - Main code generated from datasheet dated October 2013 + * - Serial number code generated from App Note "HTU2X Serial Number Reading", dated Februrary 2014 + * - No checksum checking is performed in this code + * + * @code + * //Tested on FRDM-K64F + * + * #include "mbed.h" + * #include "htu21d.h" + * + * #define SDA PTE25 + * #define SCL PTE24 + * + * Serial pc(USBTX, USBRX); //local terminal + * htu21d htu(SDA, SCL); //Temp Hum || sda, scl + * + * float H21Temp = 0.0; //Temperture from HTU21D + * float H21Hum = 0.0; //Humidity from HTU21D + * float H21Dew = 0.0; //Dew Point from HTU21D + * + * //Note: If RTOS is used, Mutex for I2C must be initialized + * #ifdef RTOS_H + * Mutex MutexI2cWait; + * #endif + * + * int main() { + * pc.baud(230400); //local terminal baud + * pc.printf("\r\n\r\nK64F_HTU21D basic operation\r\n"); + * + * //initialize the HTU21D + * int htu21 = htu.softReset(); + * if(htu21 == 0) { + * pc.printf(" - HTU21D broken...\r\n"); + * } else { + * uint8_t HTU21DuserReg = htu.getUserReg(); + * pc.printf("HTU21D UserReg: 0x%02x SN: 0x%04x %08x %04x\r\n", + * HTU21DuserReg, htu.HTU21sn.HTU21D_sna, htu.HTU21sn.HTU21D_snb, htu.HTU21sn.HTU21D_snc); + * } + * + * while(true) { + * //get humidity, temperature and dew point from HTU21D + * if(htu21 == 1) { //if HTU21D didn't initialize, don't access HTU21D anymore + * H21Hum = htu.getHum(); + * if((double)H21Hum == 255.0) pc.printf("\r\n*** HTU21D Hum error!!\r\n"); + * H21Temp = htu.getTemp(); + * if((double)H21Temp == 255.0) pc.printf("\r\n*** HTU21D Temp error!!\r\n"); + * H21Dew = htu.getDewPtFast(); + * } + * pc.printf("Temp: %7.2f C %7.2f F Hum: %4.1f %% DewPt: %7.2f C\r\n", H21Temp, H21Hum, H21Dew); + * wait(1.0); + * } + * } + * @endcode + **/ class htu21d { public: /** - * Constructor. + * Constructor + * - Fixed at I2C address 0x80 + * - I2C speed set to 400000 * - * @param sda and scl, mbed I2C interface pins. + * @param PinName sda and scl, mbed I2C interface pins */ htu21d(PinName sda, PinName scl); /** - * De-constructor. + * Constructor + * - Fixed at I2C address 0x80 + * - I2C speed set by user * - * @param --none--. + * @param PinName sda and scl, mbed I2C interface pins + * @param int I2C frequency + */ + htu21d(PinName sda, PinName scl, int i2cFrequency); + /** + * Destructor + * + * @param --none-- */ ~htu21d(); /** - * Get HTU21D Temperature. + * Reset the HTU21D chip + * - Waits 15mS before exiting, allowing the chip reset to finish + * - Executes getSNReg() which loads up HTU21D serial number structure * - * @param --none--. + * @param --none-- NOTE: run softReset() once at initialization time * - * @return success / failure of HTU21D i2c access. 1 = ok, 0 = error. + * @return success / failure of HTU21D i2c access. 1 = ok, 0 = error */ int softReset(); /** - * Get HTU21D user register. + * Get HTU21D user register * - * @param --none--. + * @param --none-- * - * @return success / failure of HTU21D i2c access. 1 = ok, 0 = error. + * @return 8 bit user register value */ uint8_t getUserReg(); /** - * Turn ON the heater in the HTU21D. + * Turn ON the heater on the HTU21D * - * @param --none--. + * @param --none-- * - * @return success / failure of HTU21D i2c access. 1 = ok, 0 = error. + * @return success / failure of HTU21D i2c access. 1 = ok, 0 = error */ int heaterOn(); /** - * Turn OFF the heater in the HTU21D. + * Turn OFF the heater on the HTU21D * - * @param --none--. + * @param --none-- * - * @return --none--. + * @return success / failure of HTU21D i2c access. 1 = ok, 0 = error */ int heaterOff(); /** - * Get heater on/off status in the HTU21D. + * Get heater on/off status of the HTU21D * - * @param --none--. + * @param --none-- * - * @return 4 = on, 0 = 0ff. + * @return 0x04 = on, 0 = off */ uint8_t getHeater(); /** - * Do a reset on the HTU21D. + * Get HTU21D Temperature * - * @param --none--. + * @param --none-- * - * @return float of Temperature in degrees C. 255.0 if error. + * @return float of Temperature in degrees C. 255.0 if error */ float getTemp(); /** - * Get HTU21D Humidity. + * Get HTU21D Humidity * - * @param --none--. + * @param --none-- * - * @return float of Humidity in percentage. 255.0 if error. + * @return float of Humidity in percentage. 255.0 if error */ float getHum(); /** - * Claculate the Dew Point. + * Calculate the Dew Point * - * @param MUST run getTemp and getHum first!! + * @param --none-- NOTE: You MUST run getTemp() and getHum() first!! * - * @return float of Dew Point. + * @return float of Dew Point */ float getDewPt(); /** - * Claculate the Dew Point. 5x faster than getDewPt(). + * Calculate the Dew Point fast + * - 5x faster than getDewPt() + * - slightly less accurate than getDewPt() * - * @param MUST run getTemp and getHum first!! + * @param --none-- NOTE: You MUST run getTemp() and getHum() first!! * - * @return float of Dew Point. + * @return float of Dew Point */ float getDewPtFast(); - - + /** + * Structure to access HTU21D's serial number + * - HTU21D_sna is the hi 16 bit word of the s/n, always is 0x4854 + * - HTU21D_snb is the mid 32 bit word of the s/n, 0x00-------- + * - HTU21D_snc is the low 16 bit word of the s/n, 0x32-- + * - The complete 64 bit s/n value is: 0x48 54 00 -- -- -- 32 -- + * - The numbers shown are fixed fields + * - The '-' numbers are variable + * - For reference, the CRC values for the s/n are included + */ + struct HTU21snStruct { + uint16_t HTU21D_sna; /**< Highest order 16 bit word of SN + - Value always = 0x4854 + */ + uint32_t HTU21D_snb; /**< Middle order 32 bit word of SN + - Value = 0x00-------- + - Highest byte always = 0x00 + - Lower 3 bytes are variable + */ + uint16_t HTU21D_snc; /**< Lowest order 16 bit word of SN + - Value = 0x32-- + - Highest byte always = 0x32 + - Lowest byte is variable + */ + uint8_t HTU21D_crca; /**< Single byte checksum from HTU21D_sna + */ + uint32_t HTU21D_crcb; /**< Four byte checksum from HTU21D_snb + */ + uint8_t HTU21D_crcc; /**< Single byte checksum from HTU21D_snc + */ + HTU21snStruct() { + HTU21D_sna = 0; + HTU21D_snb = 0; + HTU21D_snc = 0; + HTU21D_crca = 0; + HTU21D_crcb = 0; + HTU21D_crcc = 0; + } + } HTU21sn; private: I2C _i2c; /** - * I2C access for getting raw Temperature and Humidity data. + * I2C access for getting raw Temperature and Humidity data * - * @param 8 bit HTU21D register to get data from. Must use non-blocking regs. + * @param 8 bit HTU21D register to get data from. Must use non-blocking regs * - * @return 16 bit raw i2c data, ANDed to 14 bits 0xFFFC. 0000 if error. + * @return 16 bit raw i2c data, ANDed to 14 bits 0xFFFC. 0000 if error */ uint16_t getData(uint8_t reg); + /** + * Get the HTU21D's serial number. + * - Number returned is 0x4854 00-- ---- 32-- + * - The numbers shown are fixed fields + * - The '-' numbers are variable + * + * @param --none-- + * + * @return --none-- + */ + void getSNReg(); double theTempIs; double theHumIs; - float getTrash(); - }; #endif