htu21d_for_weather_shield

Dependents:   SPARKFUN_WEATHER_SHIELD

Fork of htu21d by Kevin Braun

Committer:
loopsva
Date:
Wed May 14 00:31:30 2014 +0000
Revision:
0:2dab43acb3a4
Child:
1:d3ed713f8354
Convert to library

Who changed what in which revision?

UserRevisionLine numberNew contents of line
loopsva 0:2dab43acb3a4 1 /**
loopsva 0:2dab43acb3a4 2 HTU21D driver for mbed. Includes RTOS hooks if RTOS is detected during compile
loopsva 0:2dab43acb3a4 3 Author: Kevin Braun
loopsva 0:2dab43acb3a4 4 **/
loopsva 0:2dab43acb3a4 5 #include "htu21d.h"
loopsva 0:2dab43acb3a4 6
loopsva 0:2dab43acb3a4 7 #ifdef RTOS_H
loopsva 0:2dab43acb3a4 8 extern Mutex MutexI2cWait;
loopsva 0:2dab43acb3a4 9 #endif
loopsva 0:2dab43acb3a4 10
loopsva 0:2dab43acb3a4 11 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 0:2dab43acb3a4 12 //Contstructor
loopsva 0:2dab43acb3a4 13
loopsva 0:2dab43acb3a4 14 htu21d::htu21d(PinName sda, PinName scl) : _i2c(sda, scl) {
loopsva 0:2dab43acb3a4 15 // _i2c = new I2C(sda, scl);
loopsva 0:2dab43acb3a4 16 }
loopsva 0:2dab43acb3a4 17
loopsva 0:2dab43acb3a4 18 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 0:2dab43acb3a4 19 //De-contstructor
loopsva 0:2dab43acb3a4 20
loopsva 0:2dab43acb3a4 21 htu21d::~htu21d() {
loopsva 0:2dab43acb3a4 22 }
loopsva 0:2dab43acb3a4 23
loopsva 0:2dab43acb3a4 24 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 0:2dab43acb3a4 25 //Perform a soft reset on the HTU21D. REturn of 1 = ok, 0 = timeout.
loopsva 0:2dab43acb3a4 26
loopsva 0:2dab43acb3a4 27 int htu21d::softReset() {
loopsva 0:2dab43acb3a4 28
loopsva 0:2dab43acb3a4 29 #ifdef RTOS_H
loopsva 0:2dab43acb3a4 30 MutexI2cWait.lock();
loopsva 0:2dab43acb3a4 31 #endif
loopsva 0:2dab43acb3a4 32
loopsva 0:2dab43acb3a4 33 int htu21 = 0;
loopsva 0:2dab43acb3a4 34 _i2c.start();
loopsva 0:2dab43acb3a4 35 htu21 = _i2c.write(HTU21Di2cWRITE); //i2c, 1 = ack
loopsva 0:2dab43acb3a4 36 if(htu21 == 1) {
loopsva 0:2dab43acb3a4 37 _i2c.write(HTU21DRESET); //soft reset, must wait 15mS
loopsva 0:2dab43acb3a4 38 _i2c.stop();
loopsva 0:2dab43acb3a4 39 }
loopsva 0:2dab43acb3a4 40 wait_ms(16); //must wait a least 15mS for reset to finish
loopsva 0:2dab43acb3a4 41
loopsva 0:2dab43acb3a4 42 #ifdef RTOS_H
loopsva 0:2dab43acb3a4 43 MutexI2cWait.unlock();
loopsva 0:2dab43acb3a4 44 #endif
loopsva 0:2dab43acb3a4 45
loopsva 0:2dab43acb3a4 46 return(htu21);
loopsva 0:2dab43acb3a4 47 }
loopsva 0:2dab43acb3a4 48
loopsva 0:2dab43acb3a4 49 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 0:2dab43acb3a4 50 //Get the HTU21D user register. Returns 8 bit register.
loopsva 0:2dab43acb3a4 51
loopsva 0:2dab43acb3a4 52 uint8_t htu21d::getUserReg() {
loopsva 0:2dab43acb3a4 53
loopsva 0:2dab43acb3a4 54 #ifdef RTOS_H
loopsva 0:2dab43acb3a4 55 MutexI2cWait.lock();
loopsva 0:2dab43acb3a4 56 #endif
loopsva 0:2dab43acb3a4 57
loopsva 0:2dab43acb3a4 58 int htu21 = 0;
loopsva 0:2dab43acb3a4 59 uint8_t htu21data = 0;
loopsva 0:2dab43acb3a4 60 _i2c.start();
loopsva 0:2dab43acb3a4 61 htu21 = _i2c.write(HTU21Di2cWRITE); //i2c, 1 = ack
loopsva 0:2dab43acb3a4 62 if(htu21 == 1) {
loopsva 0:2dab43acb3a4 63 _i2c.write(HTU21DREADUSER);
loopsva 0:2dab43acb3a4 64 _i2c.start();
loopsva 0:2dab43acb3a4 65 htu21 = _i2c.write(HTU21Di2cREAD);
loopsva 0:2dab43acb3a4 66 htu21data = _i2c.read(0);
loopsva 0:2dab43acb3a4 67 _i2c.stop();
loopsva 0:2dab43acb3a4 68 }
loopsva 0:2dab43acb3a4 69
loopsva 0:2dab43acb3a4 70 #ifdef RTOS_H
loopsva 0:2dab43acb3a4 71 MutexI2cWait.unlock();
loopsva 0:2dab43acb3a4 72 #endif
loopsva 0:2dab43acb3a4 73
loopsva 0:2dab43acb3a4 74 return(htu21data);
loopsva 0:2dab43acb3a4 75 }
loopsva 0:2dab43acb3a4 76
loopsva 0:2dab43acb3a4 77 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 0:2dab43acb3a4 78 //Turn ON the heater the HTU21D user register.
loopsva 0:2dab43acb3a4 79
loopsva 0:2dab43acb3a4 80 int htu21d::heaterOn() {
loopsva 0:2dab43acb3a4 81 uint8_t htu21data = htu21d::getUserReg();
loopsva 0:2dab43acb3a4 82 htu21data |= HTU21DHEATER;
loopsva 0:2dab43acb3a4 83
loopsva 0:2dab43acb3a4 84 #ifdef RTOS_H
loopsva 0:2dab43acb3a4 85 MutexI2cWait.lock();
loopsva 0:2dab43acb3a4 86 #endif
loopsva 0:2dab43acb3a4 87
loopsva 0:2dab43acb3a4 88 int htu21 = 0;
loopsva 0:2dab43acb3a4 89 _i2c.start();
loopsva 0:2dab43acb3a4 90 htu21 = _i2c.write(HTU21Di2cWRITE); //i2c, 1 = ack
loopsva 0:2dab43acb3a4 91 if(htu21 == 1) {
loopsva 0:2dab43acb3a4 92 _i2c.write(HTU21DWRITEUSER);
loopsva 0:2dab43acb3a4 93 htu21 = _i2c.write(htu21data);
loopsva 0:2dab43acb3a4 94 _i2c.stop();
loopsva 0:2dab43acb3a4 95 }
loopsva 0:2dab43acb3a4 96
loopsva 0:2dab43acb3a4 97 #ifdef RTOS_H
loopsva 0:2dab43acb3a4 98 MutexI2cWait.unlock();
loopsva 0:2dab43acb3a4 99 #endif
loopsva 0:2dab43acb3a4 100
loopsva 0:2dab43acb3a4 101 return(htu21);
loopsva 0:2dab43acb3a4 102 }
loopsva 0:2dab43acb3a4 103
loopsva 0:2dab43acb3a4 104 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 0:2dab43acb3a4 105 //Turn OFF the heater the HTU21D user register.
loopsva 0:2dab43acb3a4 106
loopsva 0:2dab43acb3a4 107 int htu21d::heaterOff() {
loopsva 0:2dab43acb3a4 108 uint8_t htu21data = htu21d::getUserReg();
loopsva 0:2dab43acb3a4 109 htu21data &= ~HTU21DHEATER;
loopsva 0:2dab43acb3a4 110
loopsva 0:2dab43acb3a4 111 #ifdef RTOS_H
loopsva 0:2dab43acb3a4 112 MutexI2cWait.lock();
loopsva 0:2dab43acb3a4 113 #endif
loopsva 0:2dab43acb3a4 114
loopsva 0:2dab43acb3a4 115 int htu21 = 0;
loopsva 0:2dab43acb3a4 116 _i2c.start();
loopsva 0:2dab43acb3a4 117 htu21 = _i2c.write(HTU21Di2cWRITE); //i2c, 1 = ack
loopsva 0:2dab43acb3a4 118 if(htu21 == 1) {
loopsva 0:2dab43acb3a4 119 _i2c.write(HTU21DWRITEUSER);
loopsva 0:2dab43acb3a4 120 htu21 = _i2c.write(htu21data);
loopsva 0:2dab43acb3a4 121 _i2c.stop();
loopsva 0:2dab43acb3a4 122 }
loopsva 0:2dab43acb3a4 123
loopsva 0:2dab43acb3a4 124 #ifdef RTOS_H
loopsva 0:2dab43acb3a4 125 MutexI2cWait.unlock();
loopsva 0:2dab43acb3a4 126 #endif
loopsva 0:2dab43acb3a4 127
loopsva 0:2dab43acb3a4 128 return(htu21);
loopsva 0:2dab43acb3a4 129 }
loopsva 0:2dab43acb3a4 130
loopsva 0:2dab43acb3a4 131 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 0:2dab43acb3a4 132 //Get the status of the heater the HTU21D user register. 0 = off, 4 = on.
loopsva 0:2dab43acb3a4 133
loopsva 0:2dab43acb3a4 134 uint8_t htu21d::getHeater() {
loopsva 0:2dab43acb3a4 135 uint8_t htu21data = htu21d::getUserReg();
loopsva 0:2dab43acb3a4 136 htu21data &= HTU21DHEATER;
loopsva 0:2dab43acb3a4 137 return(htu21data);
loopsva 0:2dab43acb3a4 138 }
loopsva 0:2dab43acb3a4 139
loopsva 0:2dab43acb3a4 140 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 0:2dab43acb3a4 141 //generic routine to get temp or humidity from HTU21D.
loopsva 0:2dab43acb3a4 142 //Returns 14 bits of data (anded 0xFFFC) or 0000 if i2c timeout occurs.
loopsva 0:2dab43acb3a4 143 //After a read temp or humidity command, HTU21D responds with NACKs until data is ready.
loopsva 0:2dab43acb3a4 144 //NOTE: Use non-hold commands
loopsva 0:2dab43acb3a4 145
loopsva 0:2dab43acb3a4 146 uint16_t htu21d::getData(uint8_t reg) {
loopsva 0:2dab43acb3a4 147 int htu21 = 0; //ACK flag
loopsva 0:2dab43acb3a4 148 int htu21cnt = 0; //number of NACKs before ACK or timeout
loopsva 0:2dab43acb3a4 149 uint16_t htu21data = 0; //returned data
loopsva 0:2dab43acb3a4 150
loopsva 0:2dab43acb3a4 151 #ifdef RTOS_H
loopsva 0:2dab43acb3a4 152 MutexI2cWait.lock();
loopsva 0:2dab43acb3a4 153 #endif
loopsva 0:2dab43acb3a4 154
loopsva 0:2dab43acb3a4 155 _i2c.start();
loopsva 0:2dab43acb3a4 156 htu21 = _i2c.write(HTU21Di2cWRITE);
loopsva 0:2dab43acb3a4 157 _i2c.write(reg); //read temp, no hold
loopsva 0:2dab43acb3a4 158 if(htu21 == 0) return 0; //HTU21T not responding
loopsva 0:2dab43acb3a4 159 do {
loopsva 0:2dab43acb3a4 160 htu21cnt++;
loopsva 0:2dab43acb3a4 161 _i2c.start();
loopsva 0:2dab43acb3a4 162 htu21 = _i2c.write(HTU21Di2cREAD);
loopsva 0:2dab43acb3a4 163 if(htu21 == 1) {
loopsva 0:2dab43acb3a4 164 htu21data = _i2c.read(1) << 8;
loopsva 0:2dab43acb3a4 165 htu21data |= _i2c.read(0) & 0xFC;
loopsva 0:2dab43acb3a4 166 _i2c.stop();
loopsva 0:2dab43acb3a4 167 }
loopsva 0:2dab43acb3a4 168 wait_us(50);
loopsva 0:2dab43acb3a4 169 } while((htu21cnt < 1000) && (htu21 == 0)); //htu21cnt takes 510 to get temp, 160 for humidity
loopsva 0:2dab43acb3a4 170
loopsva 0:2dab43acb3a4 171 #ifdef RTOS_H
loopsva 0:2dab43acb3a4 172 MutexI2cWait.unlock();
loopsva 0:2dab43acb3a4 173 #endif
loopsva 0:2dab43acb3a4 174
loopsva 0:2dab43acb3a4 175 if(htu21 == 0) return 0; //HTU21D ACK response timed out
loopsva 0:2dab43acb3a4 176 return(htu21data); //return 14 bit value
loopsva 0:2dab43acb3a4 177 }
loopsva 0:2dab43acb3a4 178
loopsva 0:2dab43acb3a4 179 double theTempIs = 0.0;
loopsva 0:2dab43acb3a4 180 double theHumIs = 0.0;
loopsva 0:2dab43acb3a4 181 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 0:2dab43acb3a4 182 //get temperature from HTU21D in degrees C. Returns with 255.0 if HTU21D had timed out.
loopsva 0:2dab43acb3a4 183
loopsva 0:2dab43acb3a4 184 float htu21d::getTemp() {
loopsva 0:2dab43acb3a4 185 uint16_t getData = htu21d::getData(HTU21DtempNOHOLD);
loopsva 0:2dab43acb3a4 186 if (getData == 0) return(255.0); //return with error
loopsva 0:2dab43acb3a4 187 double tempData = (double)getData / 65536.0;
loopsva 0:2dab43acb3a4 188 theTempIs = -46.85 + (175.72 * tempData);
loopsva 0:2dab43acb3a4 189 return(theTempIs);
loopsva 0:2dab43acb3a4 190 }
loopsva 0:2dab43acb3a4 191
loopsva 0:2dab43acb3a4 192 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 0:2dab43acb3a4 193 //get humidity from HTU21D in percentage. Returns with 255.0 if HTU21D had timed out.
loopsva 0:2dab43acb3a4 194
loopsva 0:2dab43acb3a4 195 float htu21d::getHum() {
loopsva 0:2dab43acb3a4 196 uint16_t getData = htu21d::getData(HTU21DhumNOHOLD);
loopsva 0:2dab43acb3a4 197 if (getData == 0) return(255.0); //return with error
loopsva 0:2dab43acb3a4 198 double tempData = (double)getData / 65536.0;
loopsva 0:2dab43acb3a4 199 theHumIs = -6.0 + (125.0 * tempData);
loopsva 0:2dab43acb3a4 200 return(theHumIs);
loopsva 0:2dab43acb3a4 201 }
loopsva 0:2dab43acb3a4 202
loopsva 0:2dab43acb3a4 203 //--------------------------------------------------------------------------------------------------------------------------------------//
loopsva 0:2dab43acb3a4 204 //Calculate the Dew Point from getTemp and getHum. User must first execute both getTemp and getHum for an accurate result.
loopsva 0:2dab43acb3a4 205 //Calculations come from DHT library
loopsva 0:2dab43acb3a4 206 /* Copyright (C) Wim De Roeve
loopsva 0:2dab43acb3a4 207 * based on DHT22 sensor library by HO WING KIT
loopsva 0:2dab43acb3a4 208 * Arduino DHT11 library
loopsva 0:2dab43acb3a4 209 */
loopsva 0:2dab43acb3a4 210
loopsva 0:2dab43acb3a4 211 float htu21d::getDewPt() {
loopsva 0:2dab43acb3a4 212 // dewPoint function NOAA
loopsva 0:2dab43acb3a4 213 // reference: http://wahiduddin.net/calc/density_algorithms.htm
loopsva 0:2dab43acb3a4 214 double A0= 373.15/(273.15 + (double)theTempIs);
loopsva 0:2dab43acb3a4 215 double SUM = -7.90298 * (A0-1);
loopsva 0:2dab43acb3a4 216 SUM += 5.02808 * log10(A0);
loopsva 0:2dab43acb3a4 217 SUM += -1.3816e-7 * (pow(10, (11.344*(1-1/A0)))-1) ;
loopsva 0:2dab43acb3a4 218 SUM += 8.1328e-3 * (pow(10,(-3.49149*(A0-1)))-1) ;
loopsva 0:2dab43acb3a4 219 SUM += log10(1013.246);
loopsva 0:2dab43acb3a4 220 double VP = pow(10, SUM-3) * theHumIs;
loopsva 0:2dab43acb3a4 221 double T = log(VP/0.61078); // temp var
loopsva 0:2dab43acb3a4 222 return (241.88 * T) / (17.558-T);
loopsva 0:2dab43acb3a4 223 }
loopsva 0:2dab43acb3a4 224
loopsva 0:2dab43acb3a4 225 float htu21d::getDewPtFast() {
loopsva 0:2dab43acb3a4 226 // delta max = 0.6544 wrt dewPoint()
loopsva 0:2dab43acb3a4 227 // 5x faster than dewPoint()
loopsva 0:2dab43acb3a4 228 // reference: http://en.wikipedia.org/wiki/Dew_point
loopsva 0:2dab43acb3a4 229 double h21DtzA = 17.271;
loopsva 0:2dab43acb3a4 230 double h21DtzB = 237.7;
loopsva 0:2dab43acb3a4 231 double h21DtzC = (h21DtzA * theTempIs) / (h21DtzB + theTempIs) + log(theHumIs/100);
loopsva 0:2dab43acb3a4 232 double h21DtzD = (h21DtzB * h21DtzC) / (h21DtzA - h21DtzC);
loopsva 0:2dab43acb3a4 233 return (h21DtzD);
loopsva 0:2dab43acb3a4 234 }