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