a library that provides a connection to a SHT21 temperature and humidity sensor Author: Graeme Coapes - Newcastle University, graeme.coapes@ncl.ac.uk Date: 29/11/12
Dependents: test_ncleee WeatherStation Temp_hum PROJ ... more
SHT21_ncleee.cpp@3:03bbabb7b0b0, 2012-12-06 (annotated)
- Committer:
- graeme88
- Date:
- Thu Dec 06 10:33:10 2012 +0000
- Revision:
- 3:03bbabb7b0b0
- Parent:
- 2:1411bb5e8c0a
tested on device, temperature and humidity read functions now return floats with real world values
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
graeme88 | 2:1411bb5e8c0a | 1 | /* Copyright (c) 2012 Graeme Coapes, Newcastle University, MIT License |
graeme88 | 1:73fc5aef174e | 2 | * |
graeme88 | 1:73fc5aef174e | 3 | * Permission is hereby granted, free of charge, to any person obtaining a copy of this software |
graeme88 | 1:73fc5aef174e | 4 | * and associated documentation files (the "Software"), to deal in the Software without restriction, |
graeme88 | 1:73fc5aef174e | 5 | * including without limitation the rights to use, copy, modify, merge, publish, distribute, |
graeme88 | 1:73fc5aef174e | 6 | * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is |
graeme88 | 1:73fc5aef174e | 7 | * furnished to do so, subject to the following conditions: |
graeme88 | 1:73fc5aef174e | 8 | * |
graeme88 | 1:73fc5aef174e | 9 | * The above copyright notice and this permission notice shall be included in all copies or |
graeme88 | 1:73fc5aef174e | 10 | * substantial portions of the Software. |
graeme88 | 1:73fc5aef174e | 11 | * |
graeme88 | 1:73fc5aef174e | 12 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING |
graeme88 | 1:73fc5aef174e | 13 | * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND |
graeme88 | 1:73fc5aef174e | 14 | * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, |
graeme88 | 1:73fc5aef174e | 15 | * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
graeme88 | 1:73fc5aef174e | 16 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
graeme88 | 1:73fc5aef174e | 17 | */ |
graeme88 | 1:73fc5aef174e | 18 | |
graeme88 | 2:1411bb5e8c0a | 19 | |
graeme88 | 0:91e3e396bc6e | 20 | #include "mbed.h" |
graeme88 | 0:91e3e396bc6e | 21 | #include "SHT21_ncleee.h" |
graeme88 | 0:91e3e396bc6e | 22 | |
graeme88 | 0:91e3e396bc6e | 23 | |
graeme88 | 0:91e3e396bc6e | 24 | // Class constructor |
graeme88 | 0:91e3e396bc6e | 25 | |
graeme88 | 3:03bbabb7b0b0 | 26 | //SHT21::SHT21(I2C *i2c, Serial *pc) : |
graeme88 | 3:03bbabb7b0b0 | 27 | //_i2c(i2c), _pc(pc) |
graeme88 | 3:03bbabb7b0b0 | 28 | //{ |
graeme88 | 3:03bbabb7b0b0 | 29 | //} |
graeme88 | 3:03bbabb7b0b0 | 30 | |
graeme88 | 0:91e3e396bc6e | 31 | SHT21::SHT21(I2C *i2c) : |
graeme88 | 0:91e3e396bc6e | 32 | _i2c(i2c) |
graeme88 | 0:91e3e396bc6e | 33 | { |
graeme88 | 0:91e3e396bc6e | 34 | } |
graeme88 | 0:91e3e396bc6e | 35 | |
graeme88 | 0:91e3e396bc6e | 36 | int SHT21::triggerTemp() |
graeme88 | 0:91e3e396bc6e | 37 | { |
graeme88 | 0:91e3e396bc6e | 38 | return wr(SHT_TRIG_TEMP); |
graeme88 | 0:91e3e396bc6e | 39 | } |
graeme88 | 0:91e3e396bc6e | 40 | |
graeme88 | 0:91e3e396bc6e | 41 | int SHT21::requestTemp() |
graeme88 | 0:91e3e396bc6e | 42 | { |
graeme88 | 0:91e3e396bc6e | 43 | int res; |
graeme88 | 0:91e3e396bc6e | 44 | |
graeme88 | 3:03bbabb7b0b0 | 45 | int rx_bytes = 3; |
graeme88 | 3:03bbabb7b0b0 | 46 | |
graeme88 | 3:03bbabb7b0b0 | 47 | char rx[rx_bytes]; |
graeme88 | 0:91e3e396bc6e | 48 | |
graeme88 | 3:03bbabb7b0b0 | 49 | res = _i2c->read(SHT_I2C_ADDR,rx,rx_bytes); |
graeme88 | 3:03bbabb7b0b0 | 50 | |
graeme88 | 3:03bbabb7b0b0 | 51 | // _pc->printf("%x %x %x \n", rx[0], rx[1], rx[2]); |
graeme88 | 0:91e3e396bc6e | 52 | |
graeme88 | 0:91e3e396bc6e | 53 | //should use checksum here |
graeme88 | 0:91e3e396bc6e | 54 | |
graeme88 | 0:91e3e396bc6e | 55 | //shift the MSByte to the left of the 16-bit temperature value |
graeme88 | 0:91e3e396bc6e | 56 | //don't shift the LSByte |
graeme88 | 0:91e3e396bc6e | 57 | //Clear bit 1 and bit 0 of the result - these are status bits sent from the sensor |
graeme88 | 3:03bbabb7b0b0 | 58 | //temperature = ((rx[0] << 8) || (rx[1] << 0)) ; //&& (0x00FC); |
graeme88 | 3:03bbabb7b0b0 | 59 | unsigned short msb = (rx[0] << 8); |
graeme88 | 3:03bbabb7b0b0 | 60 | unsigned short lsb = (rx[1] << 0); |
graeme88 | 3:03bbabb7b0b0 | 61 | |
graeme88 | 3:03bbabb7b0b0 | 62 | temperature = msb + lsb; |
graeme88 | 3:03bbabb7b0b0 | 63 | |
graeme88 | 3:03bbabb7b0b0 | 64 | //_pc->printf("msb: 0x%x, lsb: 0x%x, r: 0x%x, temp: 0x%x \n",msb, lsb,r, temperature); |
graeme88 | 0:91e3e396bc6e | 65 | |
graeme88 | 0:91e3e396bc6e | 66 | return res; |
graeme88 | 0:91e3e396bc6e | 67 | } |
graeme88 | 0:91e3e396bc6e | 68 | |
graeme88 | 3:03bbabb7b0b0 | 69 | float SHT21::readTemp() |
graeme88 | 0:91e3e396bc6e | 70 | { |
graeme88 | 0:91e3e396bc6e | 71 | //First of all trigger the temperature reading |
graeme88 | 0:91e3e396bc6e | 72 | //process on the sensor |
graeme88 | 3:03bbabb7b0b0 | 73 | int trig = triggerTemp(); |
graeme88 | 3:03bbabb7b0b0 | 74 | |
graeme88 | 3:03bbabb7b0b0 | 75 | if(trig != SHT_SUCCESS) |
graeme88 | 0:91e3e396bc6e | 76 | { |
graeme88 | 0:91e3e396bc6e | 77 | //if this has failed, exit function with specific error condition |
graeme88 | 0:91e3e396bc6e | 78 | return SHT_TRIG_FAIL; |
graeme88 | 0:91e3e396bc6e | 79 | } |
graeme88 | 0:91e3e396bc6e | 80 | |
graeme88 | 0:91e3e396bc6e | 81 | //else pause whilst sensor is measuring |
graeme88 | 0:91e3e396bc6e | 82 | //maximum measuring time is: 85ms |
graeme88 | 0:91e3e396bc6e | 83 | wait_ms(100); |
graeme88 | 0:91e3e396bc6e | 84 | |
graeme88 | 0:91e3e396bc6e | 85 | //Now request the temperature |
graeme88 | 0:91e3e396bc6e | 86 | if(requestTemp() != SHT_SUCCESS) |
graeme88 | 0:91e3e396bc6e | 87 | { |
graeme88 | 0:91e3e396bc6e | 88 | //if this has failed, exit function with specific error condition |
graeme88 | 0:91e3e396bc6e | 89 | return SHT_READ_FAIL; |
graeme88 | 3:03bbabb7b0b0 | 90 | } |
graeme88 | 0:91e3e396bc6e | 91 | |
graeme88 | 0:91e3e396bc6e | 92 | //the received temperature value should now |
graeme88 | 0:91e3e396bc6e | 93 | //be stored in the temperature field |
graeme88 | 3:03bbabb7b0b0 | 94 | |
graeme88 | 3:03bbabb7b0b0 | 95 | float realtemp; |
graeme88 | 3:03bbabb7b0b0 | 96 | |
graeme88 | 3:03bbabb7b0b0 | 97 | realtemp = -46.85 + 175.72 * ( ((float) temperature) / 65536 ); |
graeme88 | 3:03bbabb7b0b0 | 98 | |
graeme88 | 3:03bbabb7b0b0 | 99 | return realtemp; |
graeme88 | 0:91e3e396bc6e | 100 | } |
graeme88 | 0:91e3e396bc6e | 101 | |
graeme88 | 0:91e3e396bc6e | 102 | int SHT21::triggerRH() |
graeme88 | 0:91e3e396bc6e | 103 | { |
graeme88 | 0:91e3e396bc6e | 104 | return wr(SHT_TRIG_RH); |
graeme88 | 0:91e3e396bc6e | 105 | } |
graeme88 | 0:91e3e396bc6e | 106 | |
graeme88 | 0:91e3e396bc6e | 107 | int SHT21::requestRH() |
graeme88 | 0:91e3e396bc6e | 108 | { |
graeme88 | 0:91e3e396bc6e | 109 | int res; |
graeme88 | 0:91e3e396bc6e | 110 | |
graeme88 | 0:91e3e396bc6e | 111 | char rx[3]; |
graeme88 | 0:91e3e396bc6e | 112 | |
graeme88 | 0:91e3e396bc6e | 113 | res = _i2c->read(SHT_I2C_ADDR,rx,3); |
graeme88 | 0:91e3e396bc6e | 114 | |
graeme88 | 0:91e3e396bc6e | 115 | //should use checksum here |
graeme88 | 0:91e3e396bc6e | 116 | |
graeme88 | 0:91e3e396bc6e | 117 | //shift the MSByte to the left of the 16-bit temperature value |
graeme88 | 0:91e3e396bc6e | 118 | //don't shift the LSByte |
graeme88 | 0:91e3e396bc6e | 119 | //Clear bit 1 and bit 0 of the result - these are status bits sent from the sensor |
graeme88 | 3:03bbabb7b0b0 | 120 | //humidity = ((rx[0] << 8) || (rx[1] << 0)) && (0xFC); |
graeme88 | 3:03bbabb7b0b0 | 121 | humidity = (rx[0]<<8) + rx[1]; |
graeme88 | 3:03bbabb7b0b0 | 122 | |
graeme88 | 0:91e3e396bc6e | 123 | |
graeme88 | 0:91e3e396bc6e | 124 | return res; |
graeme88 | 0:91e3e396bc6e | 125 | } |
graeme88 | 0:91e3e396bc6e | 126 | |
graeme88 | 3:03bbabb7b0b0 | 127 | float SHT21::readHumidity() |
graeme88 | 0:91e3e396bc6e | 128 | { |
graeme88 | 0:91e3e396bc6e | 129 | //First of all trigger the temperature reading |
graeme88 | 0:91e3e396bc6e | 130 | //process on the sensor |
graeme88 | 0:91e3e396bc6e | 131 | if(triggerRH() != SHT_SUCCESS) |
graeme88 | 0:91e3e396bc6e | 132 | { |
graeme88 | 0:91e3e396bc6e | 133 | //if this has failed, exit function with specific error condition |
graeme88 | 0:91e3e396bc6e | 134 | return SHT_TRIG_FAIL; |
graeme88 | 0:91e3e396bc6e | 135 | } |
graeme88 | 0:91e3e396bc6e | 136 | |
graeme88 | 0:91e3e396bc6e | 137 | //else pause whilst sensor is measuring |
graeme88 | 0:91e3e396bc6e | 138 | //maximum measuring time is: 85ms |
graeme88 | 0:91e3e396bc6e | 139 | wait_ms(100); |
graeme88 | 0:91e3e396bc6e | 140 | |
graeme88 | 0:91e3e396bc6e | 141 | //Now request the temperature |
graeme88 | 0:91e3e396bc6e | 142 | if(requestRH() != SHT_SUCCESS) |
graeme88 | 0:91e3e396bc6e | 143 | { |
graeme88 | 0:91e3e396bc6e | 144 | //if this has failed, exit function with specific error condition |
graeme88 | 0:91e3e396bc6e | 145 | return SHT_READ_FAIL; |
graeme88 | 0:91e3e396bc6e | 146 | } |
graeme88 | 0:91e3e396bc6e | 147 | |
graeme88 | 3:03bbabb7b0b0 | 148 | float realhum; |
graeme88 | 3:03bbabb7b0b0 | 149 | realhum = -6 + 125 * ( ((float) humidity) / 65536 ); |
graeme88 | 3:03bbabb7b0b0 | 150 | return realhum; |
graeme88 | 3:03bbabb7b0b0 | 151 | |
graeme88 | 0:91e3e396bc6e | 152 | //the received temperature value should now |
graeme88 | 0:91e3e396bc6e | 153 | //be stored in the temperature field |
graeme88 | 3:03bbabb7b0b0 | 154 | // return humidity; |
graeme88 | 3:03bbabb7b0b0 | 155 | |
graeme88 | 3:03bbabb7b0b0 | 156 | |
graeme88 | 0:91e3e396bc6e | 157 | } |
graeme88 | 0:91e3e396bc6e | 158 | |
graeme88 | 0:91e3e396bc6e | 159 | int SHT21::reset() |
graeme88 | 0:91e3e396bc6e | 160 | { |
graeme88 | 0:91e3e396bc6e | 161 | return wr(SHT_SOFT_RESET); |
graeme88 | 0:91e3e396bc6e | 162 | } |
graeme88 | 0:91e3e396bc6e | 163 | |
graeme88 | 0:91e3e396bc6e | 164 | |
graeme88 | 0:91e3e396bc6e | 165 | int SHT21::setPrecision(char precision) |
graeme88 | 0:91e3e396bc6e | 166 | { |
graeme88 | 0:91e3e396bc6e | 167 | int res; |
graeme88 | 0:91e3e396bc6e | 168 | |
graeme88 | 0:91e3e396bc6e | 169 | char command[2]; |
graeme88 | 0:91e3e396bc6e | 170 | command[0] = SHT_WRITE_REG; |
graeme88 | 0:91e3e396bc6e | 171 | command[1] = precision; |
graeme88 | 0:91e3e396bc6e | 172 | |
graeme88 | 0:91e3e396bc6e | 173 | res = _i2c->write(SHT_I2C_ADDR,command,2); |
graeme88 | 0:91e3e396bc6e | 174 | |
graeme88 | 0:91e3e396bc6e | 175 | return res; |
graeme88 | 0:91e3e396bc6e | 176 | } |
graeme88 | 0:91e3e396bc6e | 177 | |
graeme88 | 0:91e3e396bc6e | 178 | int SHT21::wr(int cmd) |
graeme88 | 0:91e3e396bc6e | 179 | { |
graeme88 | 3:03bbabb7b0b0 | 180 | |
graeme88 | 0:91e3e396bc6e | 181 | int res; |
graeme88 | 0:91e3e396bc6e | 182 | |
graeme88 | 0:91e3e396bc6e | 183 | char command[1]; |
graeme88 | 0:91e3e396bc6e | 184 | command[0] = cmd; |
graeme88 | 0:91e3e396bc6e | 185 | |
graeme88 | 3:03bbabb7b0b0 | 186 | |
graeme88 | 3:03bbabb7b0b0 | 187 | res = _i2c->write(SHT_I2C_ADDR,command,1); |
graeme88 | 0:91e3e396bc6e | 188 | |
graeme88 | 0:91e3e396bc6e | 189 | return res; |
graeme88 | 0:91e3e396bc6e | 190 | } |
graeme88 | 0:91e3e396bc6e | 191 | |
graeme88 | 0:91e3e396bc6e | 192 | |
graeme88 | 0:91e3e396bc6e | 193 | |
graeme88 | 0:91e3e396bc6e | 194 | |
graeme88 | 0:91e3e396bc6e | 195 | |
graeme88 | 0:91e3e396bc6e | 196 |