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:
2:8fbe84ed61e6
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 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