Quick sample to return float temp in C.
Fork of htu21d by
htu21d.cpp@3:396c0b63392e, 2015-04-16 (annotated)
- Committer:
- andcor02
- Date:
- Thu Apr 16 13:07:52 2015 +0000
- Revision:
- 3:396c0b63392e
- Parent:
- 2:8fbe84ed61e6
Fit for purpose
Who changed what in which revision?
User | Revision | Line number | New 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 | 0:2dab43acb3a4 | 4 | Author: Kevin Braun |
loopsva | 0:2dab43acb3a4 | 5 | **/ |
loopsva | 1:d3ed713f8354 | 6 | |
loopsva | 0:2dab43acb3a4 | 7 | #include "htu21d.h" |
loopsva | 0:2dab43acb3a4 | 8 | |
loopsva | 0:2dab43acb3a4 | 9 | #ifdef RTOS_H |
loopsva | 0:2dab43acb3a4 | 10 | extern Mutex MutexI2cWait; |
loopsva | 0:2dab43acb3a4 | 11 | #endif |
loopsva | 0:2dab43acb3a4 | 12 | |
loopsva | 2:8fbe84ed61e6 | 13 | double theTempIs = 0.0; |
loopsva | 2:8fbe84ed61e6 | 14 | double theHumIs = 0.0; |
loopsva | 2:8fbe84ed61e6 | 15 | |
loopsva | 0:2dab43acb3a4 | 16 | //--------------------------------------------------------------------------------------------------------------------------------------// |
loopsva | 0:2dab43acb3a4 | 17 | //Contstructor |
loopsva | 0:2dab43acb3a4 | 18 | |
loopsva | 0:2dab43acb3a4 | 19 | htu21d::htu21d(PinName sda, PinName scl) : _i2c(sda, scl) { |
loopsva | 1:d3ed713f8354 | 20 | _i2c.frequency(400000); |
loopsva | 1:d3ed713f8354 | 21 | } |
loopsva | 1:d3ed713f8354 | 22 | |
loopsva | 1:d3ed713f8354 | 23 | htu21d::htu21d(PinName sda, PinName scl, int i2cFrequency) : _i2c(sda, scl) { |
loopsva | 1:d3ed713f8354 | 24 | _i2c.frequency(i2cFrequency); |
loopsva | 0:2dab43acb3a4 | 25 | } |
loopsva | 0:2dab43acb3a4 | 26 | |
loopsva | 0:2dab43acb3a4 | 27 | //--------------------------------------------------------------------------------------------------------------------------------------// |
loopsva | 1:d3ed713f8354 | 28 | //Destructor |
loopsva | 0:2dab43acb3a4 | 29 | |
loopsva | 0:2dab43acb3a4 | 30 | htu21d::~htu21d() { |
loopsva | 0:2dab43acb3a4 | 31 | } |
loopsva | 0:2dab43acb3a4 | 32 | |
loopsva | 0:2dab43acb3a4 | 33 | //--------------------------------------------------------------------------------------------------------------------------------------// |
loopsva | 0:2dab43acb3a4 | 34 | //generic routine to get temp or humidity from HTU21D. |
loopsva | 0:2dab43acb3a4 | 35 | //Returns 14 bits of data (anded 0xFFFC) or 0000 if i2c timeout occurs. |
loopsva | 0:2dab43acb3a4 | 36 | //After a read temp or humidity command, HTU21D responds with NACKs until data is ready. |
loopsva | 0:2dab43acb3a4 | 37 | //NOTE: Use non-hold commands |
loopsva | 0:2dab43acb3a4 | 38 | |
loopsva | 0:2dab43acb3a4 | 39 | uint16_t htu21d::getData(uint8_t reg) { |
loopsva | 0:2dab43acb3a4 | 40 | int htu21 = 0; //ACK flag |
loopsva | 0:2dab43acb3a4 | 41 | int htu21cnt = 0; //number of NACKs before ACK or timeout |
loopsva | 0:2dab43acb3a4 | 42 | uint16_t htu21data = 0; //returned data |
loopsva | 0:2dab43acb3a4 | 43 | |
loopsva | 0:2dab43acb3a4 | 44 | #ifdef RTOS_H |
loopsva | 0:2dab43acb3a4 | 45 | MutexI2cWait.lock(); |
loopsva | 0:2dab43acb3a4 | 46 | #endif |
loopsva | 0:2dab43acb3a4 | 47 | _i2c.start(); |
loopsva | 0:2dab43acb3a4 | 48 | htu21 = _i2c.write(HTU21Di2cWRITE); |
loopsva | 0:2dab43acb3a4 | 49 | _i2c.write(reg); //read temp, no hold |
loopsva | 2:8fbe84ed61e6 | 50 | _i2c.stop(); |
loopsva | 2:8fbe84ed61e6 | 51 | #ifdef RTOS_H |
loopsva | 2:8fbe84ed61e6 | 52 | MutexI2cWait.unlock(); |
loopsva | 2:8fbe84ed61e6 | 53 | #endif |
loopsva | 2:8fbe84ed61e6 | 54 | |
loopsva | 0:2dab43acb3a4 | 55 | if(htu21 == 0) return 0; //HTU21T not responding |
loopsva | 0:2dab43acb3a4 | 56 | do { |
loopsva | 0:2dab43acb3a4 | 57 | htu21cnt++; |
loopsva | 2:8fbe84ed61e6 | 58 | #ifdef RTOS_H |
loopsva | 2:8fbe84ed61e6 | 59 | MutexI2cWait.lock(); |
loopsva | 2:8fbe84ed61e6 | 60 | #endif |
loopsva | 0:2dab43acb3a4 | 61 | _i2c.start(); |
loopsva | 0:2dab43acb3a4 | 62 | htu21 = _i2c.write(HTU21Di2cREAD); |
loopsva | 0:2dab43acb3a4 | 63 | if(htu21 == 1) { |
loopsva | 0:2dab43acb3a4 | 64 | htu21data = _i2c.read(1) << 8; |
loopsva | 0:2dab43acb3a4 | 65 | htu21data |= _i2c.read(0) & 0xFC; |
loopsva | 0:2dab43acb3a4 | 66 | _i2c.stop(); |
loopsva | 0:2dab43acb3a4 | 67 | } |
loopsva | 0:2dab43acb3a4 | 68 | #ifdef RTOS_H |
loopsva | 2:8fbe84ed61e6 | 69 | MutexI2cWait.unlock(); //free up the I2C bus |
loopsva | 2:8fbe84ed61e6 | 70 | Thread::wait(1); //allow other RTOS functions to sneak in |
loopsva | 2:8fbe84ed61e6 | 71 | #else |
loopsva | 2:8fbe84ed61e6 | 72 | wait_us(1000); |
loopsva | 0:2dab43acb3a4 | 73 | #endif |
loopsva | 2:8fbe84ed61e6 | 74 | } while((htu21cnt < 100) && (htu21 == 0)); //htu21cnt takes 55 to get temp, 16 for humidity (at 1mS loops) |
loopsva | 2:8fbe84ed61e6 | 75 | |
loopsva | 0:2dab43acb3a4 | 76 | if(htu21 == 0) return 0; //HTU21D ACK response timed out |
loopsva | 0:2dab43acb3a4 | 77 | return(htu21data); //return 14 bit value |
loopsva | 0:2dab43acb3a4 | 78 | } |
loopsva | 0:2dab43acb3a4 | 79 | |
loopsva | 0:2dab43acb3a4 | 80 | //--------------------------------------------------------------------------------------------------------------------------------------// |
loopsva | 0:2dab43acb3a4 | 81 | //get temperature from HTU21D in degrees C. Returns with 255.0 if HTU21D had timed out. |
loopsva | 0:2dab43acb3a4 | 82 | |
loopsva | 0:2dab43acb3a4 | 83 | float htu21d::getTemp() { |
loopsva | 0:2dab43acb3a4 | 84 | uint16_t getData = htu21d::getData(HTU21DtempNOHOLD); |
loopsva | 0:2dab43acb3a4 | 85 | if (getData == 0) return(255.0); //return with error |
loopsva | 0:2dab43acb3a4 | 86 | double tempData = (double)getData / 65536.0; |
loopsva | 0:2dab43acb3a4 | 87 | theTempIs = -46.85 + (175.72 * tempData); |
loopsva | 0:2dab43acb3a4 | 88 | return(theTempIs); |
loopsva | 0:2dab43acb3a4 | 89 | } |
loopsva | 0:2dab43acb3a4 | 90 | |
loopsva | 0:2dab43acb3a4 | 91 | //--------------------------------------------------------------------------------------------------------------------------------------// |
loopsva | 0:2dab43acb3a4 | 92 | //get humidity from HTU21D in percentage. Returns with 255.0 if HTU21D had timed out. |
loopsva | 0:2dab43acb3a4 | 93 | |
loopsva | 0:2dab43acb3a4 | 94 | float htu21d::getHum() { |
loopsva | 0:2dab43acb3a4 | 95 | uint16_t getData = htu21d::getData(HTU21DhumNOHOLD); |
loopsva | 0:2dab43acb3a4 | 96 | if (getData == 0) return(255.0); //return with error |
loopsva | 0:2dab43acb3a4 | 97 | double tempData = (double)getData / 65536.0; |
loopsva | 0:2dab43acb3a4 | 98 | theHumIs = -6.0 + (125.0 * tempData); |
loopsva | 0:2dab43acb3a4 | 99 | return(theHumIs); |
loopsva | 0:2dab43acb3a4 | 100 | } |
loopsva | 0:2dab43acb3a4 | 101 | |
loopsva | 1:d3ed713f8354 | 102 | |
loopsva | 1:d3ed713f8354 | 103 |