Quick sample to return float temp in C.

Dependents:   mbed-IBooth-ETH

Fork of htu21d by Kevin Braun

Committer:
loopsva
Date:
Thu May 22 18:48:46 2014 +0000
Revision:
2:8fbe84ed61e6
Parent:
1:d3ed713f8354
Child:
3:396c0b63392e
Updated Temperature and Humidity i2c read functions to free up the RTOS and i2c bus while waiting for the Hum / Temp command in the HTU21D to complete.

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 //Perform a soft reset on the HTU21D. REturn of 1 = ok, 0 = timeout.
loopsva 0:2dab43acb3a4 35
loopsva 0:2dab43acb3a4 36 int htu21d::softReset() {
loopsva 0:2dab43acb3a4 37
loopsva 0:2dab43acb3a4 38 #ifdef RTOS_H
loopsva 0:2dab43acb3a4 39 MutexI2cWait.lock();
loopsva 0:2dab43acb3a4 40 #endif
loopsva 0:2dab43acb3a4 41
loopsva 0:2dab43acb3a4 42 int htu21 = 0;
loopsva 0:2dab43acb3a4 43 _i2c.start();
loopsva 0:2dab43acb3a4 44 htu21 = _i2c.write(HTU21Di2cWRITE); //i2c, 1 = ack
loopsva 0:2dab43acb3a4 45 if(htu21 == 1) {
loopsva 0:2dab43acb3a4 46 _i2c.write(HTU21DRESET); //soft reset, must wait 15mS
loopsva 0:2dab43acb3a4 47 _i2c.stop();
loopsva 1:d3ed713f8354 48 wait_ms(16); //must wait a least 15mS for reset to finish
loopsva 1:d3ed713f8354 49 htu21d::getSNReg(); //go load up the s/n registers
loopsva 0:2dab43acb3a4 50 }
loopsva 1:d3ed713f8354 51
loopsva 0:2dab43acb3a4 52 #ifdef RTOS_H
loopsva 0:2dab43acb3a4 53 MutexI2cWait.unlock();
loopsva 0:2dab43acb3a4 54 #endif
loopsva 0:2dab43acb3a4 55
loopsva 0:2dab43acb3a4 56 return(htu21);
loopsva 0:2dab43acb3a4 57 }
loopsva 0:2dab43acb3a4 58
loopsva 0:2dab43acb3a4 59 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 0:2dab43acb3a4 60 //Get the HTU21D user register. Returns 8 bit register.
loopsva 0:2dab43acb3a4 61
loopsva 0:2dab43acb3a4 62 uint8_t htu21d::getUserReg() {
loopsva 0:2dab43acb3a4 63
loopsva 0:2dab43acb3a4 64 #ifdef RTOS_H
loopsva 0:2dab43acb3a4 65 MutexI2cWait.lock();
loopsva 0:2dab43acb3a4 66 #endif
loopsva 0:2dab43acb3a4 67
loopsva 0:2dab43acb3a4 68 int htu21 = 0;
loopsva 0:2dab43acb3a4 69 uint8_t htu21data = 0;
loopsva 0:2dab43acb3a4 70 _i2c.start();
loopsva 0:2dab43acb3a4 71 htu21 = _i2c.write(HTU21Di2cWRITE); //i2c, 1 = ack
loopsva 0:2dab43acb3a4 72 if(htu21 == 1) {
loopsva 0:2dab43acb3a4 73 _i2c.write(HTU21DREADUSER);
loopsva 0:2dab43acb3a4 74 _i2c.start();
loopsva 0:2dab43acb3a4 75 htu21 = _i2c.write(HTU21Di2cREAD);
loopsva 0:2dab43acb3a4 76 htu21data = _i2c.read(0);
loopsva 0:2dab43acb3a4 77 _i2c.stop();
loopsva 0:2dab43acb3a4 78 }
loopsva 0:2dab43acb3a4 79
loopsva 0:2dab43acb3a4 80 #ifdef RTOS_H
loopsva 0:2dab43acb3a4 81 MutexI2cWait.unlock();
loopsva 0:2dab43acb3a4 82 #endif
loopsva 0:2dab43acb3a4 83
loopsva 0:2dab43acb3a4 84 return(htu21data);
loopsva 0:2dab43acb3a4 85 }
loopsva 0:2dab43acb3a4 86
loopsva 0:2dab43acb3a4 87 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 0:2dab43acb3a4 88 //Turn ON the heater the HTU21D user register.
loopsva 0:2dab43acb3a4 89
loopsva 0:2dab43acb3a4 90 int htu21d::heaterOn() {
loopsva 0:2dab43acb3a4 91 uint8_t htu21data = htu21d::getUserReg();
loopsva 0:2dab43acb3a4 92 htu21data |= HTU21DHEATER;
loopsva 0:2dab43acb3a4 93
loopsva 0:2dab43acb3a4 94 #ifdef RTOS_H
loopsva 0:2dab43acb3a4 95 MutexI2cWait.lock();
loopsva 0:2dab43acb3a4 96 #endif
loopsva 0:2dab43acb3a4 97
loopsva 0:2dab43acb3a4 98 int htu21 = 0;
loopsva 0:2dab43acb3a4 99 _i2c.start();
loopsva 0:2dab43acb3a4 100 htu21 = _i2c.write(HTU21Di2cWRITE); //i2c, 1 = ack
loopsva 0:2dab43acb3a4 101 if(htu21 == 1) {
loopsva 0:2dab43acb3a4 102 _i2c.write(HTU21DWRITEUSER);
loopsva 0:2dab43acb3a4 103 htu21 = _i2c.write(htu21data);
loopsva 0:2dab43acb3a4 104 _i2c.stop();
loopsva 0:2dab43acb3a4 105 }
loopsva 0:2dab43acb3a4 106
loopsva 0:2dab43acb3a4 107 #ifdef RTOS_H
loopsva 0:2dab43acb3a4 108 MutexI2cWait.unlock();
loopsva 0:2dab43acb3a4 109 #endif
loopsva 0:2dab43acb3a4 110
loopsva 0:2dab43acb3a4 111 return(htu21);
loopsva 0:2dab43acb3a4 112 }
loopsva 0:2dab43acb3a4 113
loopsva 0:2dab43acb3a4 114 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 0:2dab43acb3a4 115 //Turn OFF the heater the HTU21D user register.
loopsva 0:2dab43acb3a4 116
loopsva 0:2dab43acb3a4 117 int htu21d::heaterOff() {
loopsva 0:2dab43acb3a4 118 uint8_t htu21data = htu21d::getUserReg();
loopsva 0:2dab43acb3a4 119 htu21data &= ~HTU21DHEATER;
loopsva 0:2dab43acb3a4 120
loopsva 0:2dab43acb3a4 121 #ifdef RTOS_H
loopsva 0:2dab43acb3a4 122 MutexI2cWait.lock();
loopsva 0:2dab43acb3a4 123 #endif
loopsva 0:2dab43acb3a4 124
loopsva 0:2dab43acb3a4 125 int htu21 = 0;
loopsva 0:2dab43acb3a4 126 _i2c.start();
loopsva 0:2dab43acb3a4 127 htu21 = _i2c.write(HTU21Di2cWRITE); //i2c, 1 = ack
loopsva 0:2dab43acb3a4 128 if(htu21 == 1) {
loopsva 0:2dab43acb3a4 129 _i2c.write(HTU21DWRITEUSER);
loopsva 0:2dab43acb3a4 130 htu21 = _i2c.write(htu21data);
loopsva 0:2dab43acb3a4 131 _i2c.stop();
loopsva 0:2dab43acb3a4 132 }
loopsva 0:2dab43acb3a4 133
loopsva 0:2dab43acb3a4 134 #ifdef RTOS_H
loopsva 0:2dab43acb3a4 135 MutexI2cWait.unlock();
loopsva 0:2dab43acb3a4 136 #endif
loopsva 0:2dab43acb3a4 137
loopsva 0:2dab43acb3a4 138 return(htu21);
loopsva 0:2dab43acb3a4 139 }
loopsva 0:2dab43acb3a4 140
loopsva 0:2dab43acb3a4 141 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 0:2dab43acb3a4 142 //Get the status of the heater the HTU21D user register. 0 = off, 4 = on.
loopsva 0:2dab43acb3a4 143
loopsva 0:2dab43acb3a4 144 uint8_t htu21d::getHeater() {
loopsva 0:2dab43acb3a4 145 uint8_t htu21data = htu21d::getUserReg();
loopsva 0:2dab43acb3a4 146 htu21data &= HTU21DHEATER;
loopsva 0:2dab43acb3a4 147 return(htu21data);
loopsva 0:2dab43acb3a4 148 }
loopsva 0:2dab43acb3a4 149
loopsva 0:2dab43acb3a4 150 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 0:2dab43acb3a4 151 //generic routine to get temp or humidity from HTU21D.
loopsva 0:2dab43acb3a4 152 //Returns 14 bits of data (anded 0xFFFC) or 0000 if i2c timeout occurs.
loopsva 0:2dab43acb3a4 153 //After a read temp or humidity command, HTU21D responds with NACKs until data is ready.
loopsva 0:2dab43acb3a4 154 //NOTE: Use non-hold commands
loopsva 0:2dab43acb3a4 155
loopsva 0:2dab43acb3a4 156 uint16_t htu21d::getData(uint8_t reg) {
loopsva 0:2dab43acb3a4 157 int htu21 = 0; //ACK flag
loopsva 0:2dab43acb3a4 158 int htu21cnt = 0; //number of NACKs before ACK or timeout
loopsva 0:2dab43acb3a4 159 uint16_t htu21data = 0; //returned data
loopsva 0:2dab43acb3a4 160
loopsva 0:2dab43acb3a4 161 #ifdef RTOS_H
loopsva 0:2dab43acb3a4 162 MutexI2cWait.lock();
loopsva 0:2dab43acb3a4 163 #endif
loopsva 0:2dab43acb3a4 164 _i2c.start();
loopsva 0:2dab43acb3a4 165 htu21 = _i2c.write(HTU21Di2cWRITE);
loopsva 0:2dab43acb3a4 166 _i2c.write(reg); //read temp, no hold
loopsva 2:8fbe84ed61e6 167 _i2c.stop();
loopsva 2:8fbe84ed61e6 168 #ifdef RTOS_H
loopsva 2:8fbe84ed61e6 169 MutexI2cWait.unlock();
loopsva 2:8fbe84ed61e6 170 #endif
loopsva 2:8fbe84ed61e6 171
loopsva 0:2dab43acb3a4 172 if(htu21 == 0) return 0; //HTU21T not responding
loopsva 0:2dab43acb3a4 173 do {
loopsva 0:2dab43acb3a4 174 htu21cnt++;
loopsva 2:8fbe84ed61e6 175 #ifdef RTOS_H
loopsva 2:8fbe84ed61e6 176 MutexI2cWait.lock();
loopsva 2:8fbe84ed61e6 177 #endif
loopsva 0:2dab43acb3a4 178 _i2c.start();
loopsva 0:2dab43acb3a4 179 htu21 = _i2c.write(HTU21Di2cREAD);
loopsva 0:2dab43acb3a4 180 if(htu21 == 1) {
loopsva 0:2dab43acb3a4 181 htu21data = _i2c.read(1) << 8;
loopsva 0:2dab43acb3a4 182 htu21data |= _i2c.read(0) & 0xFC;
loopsva 0:2dab43acb3a4 183 _i2c.stop();
loopsva 0:2dab43acb3a4 184 }
loopsva 0:2dab43acb3a4 185 #ifdef RTOS_H
loopsva 2:8fbe84ed61e6 186 MutexI2cWait.unlock(); //free up the I2C bus
loopsva 2:8fbe84ed61e6 187 Thread::wait(1); //allow other RTOS functions to sneak in
loopsva 2:8fbe84ed61e6 188 #else
loopsva 2:8fbe84ed61e6 189 wait_us(1000);
loopsva 0:2dab43acb3a4 190 #endif
loopsva 2:8fbe84ed61e6 191 } while((htu21cnt < 100) && (htu21 == 0)); //htu21cnt takes 55 to get temp, 16 for humidity (at 1mS loops)
loopsva 2:8fbe84ed61e6 192
loopsva 0:2dab43acb3a4 193 if(htu21 == 0) return 0; //HTU21D ACK response timed out
loopsva 0:2dab43acb3a4 194 return(htu21data); //return 14 bit value
loopsva 0:2dab43acb3a4 195 }
loopsva 0:2dab43acb3a4 196
loopsva 0:2dab43acb3a4 197 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 0:2dab43acb3a4 198 //get temperature from HTU21D in degrees C. Returns with 255.0 if HTU21D had timed out.
loopsva 0:2dab43acb3a4 199
loopsva 0:2dab43acb3a4 200 float htu21d::getTemp() {
loopsva 0:2dab43acb3a4 201 uint16_t getData = htu21d::getData(HTU21DtempNOHOLD);
loopsva 0:2dab43acb3a4 202 if (getData == 0) return(255.0); //return with error
loopsva 0:2dab43acb3a4 203 double tempData = (double)getData / 65536.0;
loopsva 0:2dab43acb3a4 204 theTempIs = -46.85 + (175.72 * tempData);
loopsva 0:2dab43acb3a4 205 return(theTempIs);
loopsva 0:2dab43acb3a4 206 }
loopsva 0:2dab43acb3a4 207
loopsva 0:2dab43acb3a4 208 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 0:2dab43acb3a4 209 //get humidity from HTU21D in percentage. Returns with 255.0 if HTU21D had timed out.
loopsva 0:2dab43acb3a4 210
loopsva 0:2dab43acb3a4 211 float htu21d::getHum() {
loopsva 0:2dab43acb3a4 212 uint16_t getData = htu21d::getData(HTU21DhumNOHOLD);
loopsva 0:2dab43acb3a4 213 if (getData == 0) return(255.0); //return with error
loopsva 0:2dab43acb3a4 214 double tempData = (double)getData / 65536.0;
loopsva 0:2dab43acb3a4 215 theHumIs = -6.0 + (125.0 * tempData);
loopsva 0:2dab43acb3a4 216 return(theHumIs);
loopsva 0:2dab43acb3a4 217 }
loopsva 0:2dab43acb3a4 218
loopsva 0:2dab43acb3a4 219 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 0:2dab43acb3a4 220 //Calculate the Dew Point from getTemp and getHum. User must first execute both getTemp and getHum for an accurate result.
loopsva 0:2dab43acb3a4 221 //Calculations come from DHT library
loopsva 0:2dab43acb3a4 222 /* Copyright (C) Wim De Roeve
loopsva 0:2dab43acb3a4 223 * based on DHT22 sensor library by HO WING KIT
loopsva 0:2dab43acb3a4 224 * Arduino DHT11 library
loopsva 0:2dab43acb3a4 225 */
loopsva 0:2dab43acb3a4 226
loopsva 0:2dab43acb3a4 227 float htu21d::getDewPt() {
loopsva 0:2dab43acb3a4 228 // dewPoint function NOAA
loopsva 0:2dab43acb3a4 229 // reference: http://wahiduddin.net/calc/density_algorithms.htm
loopsva 0:2dab43acb3a4 230 double A0= 373.15/(273.15 + (double)theTempIs);
loopsva 0:2dab43acb3a4 231 double SUM = -7.90298 * (A0-1);
loopsva 0:2dab43acb3a4 232 SUM += 5.02808 * log10(A0);
loopsva 0:2dab43acb3a4 233 SUM += -1.3816e-7 * (pow(10, (11.344*(1-1/A0)))-1) ;
loopsva 0:2dab43acb3a4 234 SUM += 8.1328e-3 * (pow(10,(-3.49149*(A0-1)))-1) ;
loopsva 0:2dab43acb3a4 235 SUM += log10(1013.246);
loopsva 0:2dab43acb3a4 236 double VP = pow(10, SUM-3) * theHumIs;
loopsva 0:2dab43acb3a4 237 double T = log(VP/0.61078); // temp var
loopsva 0:2dab43acb3a4 238 return (241.88 * T) / (17.558-T);
loopsva 0:2dab43acb3a4 239 }
loopsva 0:2dab43acb3a4 240
loopsva 0:2dab43acb3a4 241 float htu21d::getDewPtFast() {
loopsva 0:2dab43acb3a4 242 // delta max = 0.6544 wrt dewPoint()
loopsva 0:2dab43acb3a4 243 // 5x faster than dewPoint()
loopsva 0:2dab43acb3a4 244 // reference: http://en.wikipedia.org/wiki/Dew_point
loopsva 0:2dab43acb3a4 245 double h21DtzA = 17.271;
loopsva 0:2dab43acb3a4 246 double h21DtzB = 237.7;
loopsva 0:2dab43acb3a4 247 double h21DtzC = (h21DtzA * theTempIs) / (h21DtzB + theTempIs) + log(theHumIs/100);
loopsva 0:2dab43acb3a4 248 double h21DtzD = (h21DtzB * h21DtzC) / (h21DtzA - h21DtzC);
loopsva 0:2dab43acb3a4 249 return (h21DtzD);
loopsva 0:2dab43acb3a4 250 }
loopsva 1:d3ed713f8354 251
loopsva 1:d3ed713f8354 252 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 1:d3ed713f8354 253 //Get the HTU21D serial number registers. Returns 64 bit register.
loopsva 1:d3ed713f8354 254 //should return 0x4854 00xx xxxx 32xx
loopsva 1:d3ed713f8354 255
loopsva 1:d3ed713f8354 256 void htu21d::getSNReg() {
loopsva 1:d3ed713f8354 257
loopsva 1:d3ed713f8354 258 #ifdef RTOS_H
loopsva 1:d3ed713f8354 259 MutexI2cWait.lock();
loopsva 1:d3ed713f8354 260 #endif
loopsva 1:d3ed713f8354 261
loopsva 1:d3ed713f8354 262 //get 16 bit SNC register, 8 bit SNC-CRC, 16 bit SNA register, 8 bit SNA-CRC
loopsva 1:d3ed713f8354 263 int htu21 = 0;
loopsva 1:d3ed713f8354 264 _i2c.start();
loopsva 1:d3ed713f8354 265 htu21 = _i2c.write(HTU21Di2cWRITE); //i2c, 1 = ack
loopsva 1:d3ed713f8354 266 if(htu21 == 1) {
loopsva 1:d3ed713f8354 267 _i2c.write(HTU21SNAC1);
loopsva 1:d3ed713f8354 268 _i2c.write(HTU21SNAC2);
loopsva 1:d3ed713f8354 269 _i2c.start();
loopsva 1:d3ed713f8354 270 htu21 = _i2c.write(HTU21Di2cREAD);
loopsva 1:d3ed713f8354 271 HTU21sn.HTU21D_snc = _i2c.read(1) << 8;
loopsva 1:d3ed713f8354 272 HTU21sn.HTU21D_snc |= _i2c.read(1);
loopsva 1:d3ed713f8354 273 HTU21sn.HTU21D_crcc = _i2c.read(1);
loopsva 1:d3ed713f8354 274 HTU21sn.HTU21D_sna = _i2c.read(1) << 8;
loopsva 1:d3ed713f8354 275 HTU21sn.HTU21D_sna |= _i2c.read(1);
loopsva 1:d3ed713f8354 276 HTU21sn.HTU21D_crca = _i2c.read(0);
loopsva 1:d3ed713f8354 277 _i2c.stop();
loopsva 1:d3ed713f8354 278 }
loopsva 1:d3ed713f8354 279
loopsva 1:d3ed713f8354 280 //get 32 bit SNB register, 32 bit SNB-CRC - regs are intermixed
loopsva 1:d3ed713f8354 281 htu21 = 0;
loopsva 1:d3ed713f8354 282 _i2c.start();
loopsva 1:d3ed713f8354 283 htu21 = _i2c.write(HTU21Di2cWRITE); //i2c, 1 = ack
loopsva 1:d3ed713f8354 284 if(htu21 == 1) {
loopsva 1:d3ed713f8354 285 _i2c.write(HTU21SNB1);
loopsva 1:d3ed713f8354 286 _i2c.write(HTU21SNB2);
loopsva 1:d3ed713f8354 287 _i2c.start();
loopsva 1:d3ed713f8354 288 htu21 = _i2c.write(HTU21Di2cREAD);
loopsva 1:d3ed713f8354 289 HTU21sn.HTU21D_snb = _i2c.read(1) << 24;
loopsva 1:d3ed713f8354 290 HTU21sn.HTU21D_crcb = _i2c.read(1) << 24;
loopsva 1:d3ed713f8354 291 HTU21sn.HTU21D_snb |= _i2c.read(1) << 16;
loopsva 1:d3ed713f8354 292 HTU21sn.HTU21D_crcb |= _i2c.read(1) << 16;
loopsva 1:d3ed713f8354 293 HTU21sn.HTU21D_snb |= _i2c.read(1) << 8;
loopsva 1:d3ed713f8354 294 HTU21sn.HTU21D_crcb |= _i2c.read(1) << 8;
loopsva 1:d3ed713f8354 295 HTU21sn.HTU21D_snb |= _i2c.read(1);
loopsva 1:d3ed713f8354 296 HTU21sn.HTU21D_crcb |= _i2c.read(0);
loopsva 1:d3ed713f8354 297 _i2c.stop();
loopsva 1:d3ed713f8354 298 }
loopsva 1:d3ed713f8354 299
loopsva 1:d3ed713f8354 300 #ifdef RTOS_H
loopsva 1:d3ed713f8354 301 MutexI2cWait.unlock();
loopsva 1:d3ed713f8354 302 #endif
loopsva 1:d3ed713f8354 303
loopsva 1:d3ed713f8354 304 }
loopsva 1:d3ed713f8354 305