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

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?

UserRevisionLine numberNew 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