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 Nov 29 10:36:10 2012 +0000
Revision:
0:91e3e396bc6e
Child:
1:73fc5aef174e
initial release

Who changed what in which revision?

UserRevisionLine numberNew contents of line
graeme88 0:91e3e396bc6e 1 /**
graeme88 0:91e3e396bc6e 2 * SHT21 - Temperature and Humidity Sensor by Sensiron
graeme88 0:91e3e396bc6e 3 *
graeme88 0:91e3e396bc6e 4 * This is a driver to connect to the sensor using an mbed device through an I2C interface
graeme88 0:91e3e396bc6e 5 *
graeme88 0:91e3e396bc6e 6 * Author: Graeme Coapes - Newcastle University
graeme88 0:91e3e396bc6e 7 * Email: graeme.coapes@ncl.ac.uk
graeme88 0:91e3e396bc6e 8 *
graeme88 0:91e3e396bc6e 9 * Date: 28/11/2012
graeme88 0:91e3e396bc6e 10 *
graeme88 0:91e3e396bc6e 11 */
graeme88 0:91e3e396bc6e 12 #include "mbed.h"
graeme88 0:91e3e396bc6e 13 #include "SHT21_ncleee.h"
graeme88 0:91e3e396bc6e 14
graeme88 0:91e3e396bc6e 15
graeme88 0:91e3e396bc6e 16 // Class constructor
graeme88 0:91e3e396bc6e 17
graeme88 0:91e3e396bc6e 18 SHT21::SHT21(I2C *i2c) :
graeme88 0:91e3e396bc6e 19 _i2c(i2c)
graeme88 0:91e3e396bc6e 20 {
graeme88 0:91e3e396bc6e 21 }
graeme88 0:91e3e396bc6e 22
graeme88 0:91e3e396bc6e 23 int SHT21::triggerTemp()
graeme88 0:91e3e396bc6e 24 {
graeme88 0:91e3e396bc6e 25 return wr(SHT_TRIG_TEMP);
graeme88 0:91e3e396bc6e 26 }
graeme88 0:91e3e396bc6e 27
graeme88 0:91e3e396bc6e 28 int SHT21::requestTemp()
graeme88 0:91e3e396bc6e 29 {
graeme88 0:91e3e396bc6e 30 int res;
graeme88 0:91e3e396bc6e 31
graeme88 0:91e3e396bc6e 32 char rx[3];
graeme88 0:91e3e396bc6e 33
graeme88 0:91e3e396bc6e 34 res = _i2c->read(SHT_I2C_ADDR,rx,3);
graeme88 0:91e3e396bc6e 35
graeme88 0:91e3e396bc6e 36 //should use checksum here
graeme88 0:91e3e396bc6e 37
graeme88 0:91e3e396bc6e 38 //shift the MSByte to the left of the 16-bit temperature value
graeme88 0:91e3e396bc6e 39 //don't shift the LSByte
graeme88 0:91e3e396bc6e 40 //Clear bit 1 and bit 0 of the result - these are status bits sent from the sensor
graeme88 0:91e3e396bc6e 41 temperature = ((rx[0] << 8) || (rx[1] << 0)) && (0xFC);
graeme88 0:91e3e396bc6e 42
graeme88 0:91e3e396bc6e 43 return res;
graeme88 0:91e3e396bc6e 44 }
graeme88 0:91e3e396bc6e 45
graeme88 0:91e3e396bc6e 46 int SHT21::readTemp()
graeme88 0:91e3e396bc6e 47 {
graeme88 0:91e3e396bc6e 48 //First of all trigger the temperature reading
graeme88 0:91e3e396bc6e 49 //process on the sensor
graeme88 0:91e3e396bc6e 50 if(triggerTemp() != SHT_SUCCESS)
graeme88 0:91e3e396bc6e 51 {
graeme88 0:91e3e396bc6e 52 //if this has failed, exit function with specific error condition
graeme88 0:91e3e396bc6e 53 return SHT_TRIG_FAIL;
graeme88 0:91e3e396bc6e 54 }
graeme88 0:91e3e396bc6e 55
graeme88 0:91e3e396bc6e 56 //else pause whilst sensor is measuring
graeme88 0:91e3e396bc6e 57 //maximum measuring time is: 85ms
graeme88 0:91e3e396bc6e 58 wait_ms(100);
graeme88 0:91e3e396bc6e 59
graeme88 0:91e3e396bc6e 60 //Now request the temperature
graeme88 0:91e3e396bc6e 61 if(requestTemp() != SHT_SUCCESS)
graeme88 0:91e3e396bc6e 62 {
graeme88 0:91e3e396bc6e 63 //if this has failed, exit function with specific error condition
graeme88 0:91e3e396bc6e 64 return SHT_READ_FAIL;
graeme88 0:91e3e396bc6e 65 }
graeme88 0:91e3e396bc6e 66
graeme88 0:91e3e396bc6e 67 //the received temperature value should now
graeme88 0:91e3e396bc6e 68 //be stored in the temperature field
graeme88 0:91e3e396bc6e 69 return temperature;
graeme88 0:91e3e396bc6e 70 }
graeme88 0:91e3e396bc6e 71
graeme88 0:91e3e396bc6e 72 int SHT21::triggerRH()
graeme88 0:91e3e396bc6e 73 {
graeme88 0:91e3e396bc6e 74 return wr(SHT_TRIG_RH);
graeme88 0:91e3e396bc6e 75 }
graeme88 0:91e3e396bc6e 76
graeme88 0:91e3e396bc6e 77 int SHT21::requestRH()
graeme88 0:91e3e396bc6e 78 {
graeme88 0:91e3e396bc6e 79 int res;
graeme88 0:91e3e396bc6e 80
graeme88 0:91e3e396bc6e 81 char rx[3];
graeme88 0:91e3e396bc6e 82
graeme88 0:91e3e396bc6e 83 res = _i2c->read(SHT_I2C_ADDR,rx,3);
graeme88 0:91e3e396bc6e 84
graeme88 0:91e3e396bc6e 85 //should use checksum here
graeme88 0:91e3e396bc6e 86
graeme88 0:91e3e396bc6e 87 //shift the MSByte to the left of the 16-bit temperature value
graeme88 0:91e3e396bc6e 88 //don't shift the LSByte
graeme88 0:91e3e396bc6e 89 //Clear bit 1 and bit 0 of the result - these are status bits sent from the sensor
graeme88 0:91e3e396bc6e 90 humidity = ((rx[0] << 8) || (rx[1] << 0)) && (0xFC);
graeme88 0:91e3e396bc6e 91
graeme88 0:91e3e396bc6e 92 return res;
graeme88 0:91e3e396bc6e 93 }
graeme88 0:91e3e396bc6e 94
graeme88 0:91e3e396bc6e 95 int SHT21::readHumidity()
graeme88 0:91e3e396bc6e 96 {
graeme88 0:91e3e396bc6e 97 //First of all trigger the temperature reading
graeme88 0:91e3e396bc6e 98 //process on the sensor
graeme88 0:91e3e396bc6e 99 if(triggerRH() != SHT_SUCCESS)
graeme88 0:91e3e396bc6e 100 {
graeme88 0:91e3e396bc6e 101 //if this has failed, exit function with specific error condition
graeme88 0:91e3e396bc6e 102 return SHT_TRIG_FAIL;
graeme88 0:91e3e396bc6e 103 }
graeme88 0:91e3e396bc6e 104
graeme88 0:91e3e396bc6e 105 //else pause whilst sensor is measuring
graeme88 0:91e3e396bc6e 106 //maximum measuring time is: 85ms
graeme88 0:91e3e396bc6e 107 wait_ms(100);
graeme88 0:91e3e396bc6e 108
graeme88 0:91e3e396bc6e 109 //Now request the temperature
graeme88 0:91e3e396bc6e 110 if(requestRH() != SHT_SUCCESS)
graeme88 0:91e3e396bc6e 111 {
graeme88 0:91e3e396bc6e 112 //if this has failed, exit function with specific error condition
graeme88 0:91e3e396bc6e 113 return SHT_READ_FAIL;
graeme88 0:91e3e396bc6e 114 }
graeme88 0:91e3e396bc6e 115
graeme88 0:91e3e396bc6e 116 //the received temperature value should now
graeme88 0:91e3e396bc6e 117 //be stored in the temperature field
graeme88 0:91e3e396bc6e 118 return humidity;
graeme88 0:91e3e396bc6e 119 }
graeme88 0:91e3e396bc6e 120
graeme88 0:91e3e396bc6e 121 int SHT21::reset()
graeme88 0:91e3e396bc6e 122 {
graeme88 0:91e3e396bc6e 123 return wr(SHT_SOFT_RESET);
graeme88 0:91e3e396bc6e 124 }
graeme88 0:91e3e396bc6e 125
graeme88 0:91e3e396bc6e 126
graeme88 0:91e3e396bc6e 127 int SHT21::setPrecision(char precision)
graeme88 0:91e3e396bc6e 128 {
graeme88 0:91e3e396bc6e 129 int res;
graeme88 0:91e3e396bc6e 130
graeme88 0:91e3e396bc6e 131 char command[2];
graeme88 0:91e3e396bc6e 132 command[0] = SHT_WRITE_REG;
graeme88 0:91e3e396bc6e 133 command[1] = precision;
graeme88 0:91e3e396bc6e 134
graeme88 0:91e3e396bc6e 135 res = _i2c->write(SHT_I2C_ADDR,command,2);
graeme88 0:91e3e396bc6e 136
graeme88 0:91e3e396bc6e 137 return res;
graeme88 0:91e3e396bc6e 138 }
graeme88 0:91e3e396bc6e 139
graeme88 0:91e3e396bc6e 140 int SHT21::wr(int cmd)
graeme88 0:91e3e396bc6e 141 {
graeme88 0:91e3e396bc6e 142 int res;
graeme88 0:91e3e396bc6e 143
graeme88 0:91e3e396bc6e 144 char command[1];
graeme88 0:91e3e396bc6e 145 command[0] = cmd;
graeme88 0:91e3e396bc6e 146
graeme88 0:91e3e396bc6e 147 res = _i2c->write(SHT_I2C_ADDR,command,1);
graeme88 0:91e3e396bc6e 148
graeme88 0:91e3e396bc6e 149 return res;
graeme88 0:91e3e396bc6e 150 }
graeme88 0:91e3e396bc6e 151
graeme88 0:91e3e396bc6e 152
graeme88 0:91e3e396bc6e 153
graeme88 0:91e3e396bc6e 154
graeme88 0:91e3e396bc6e 155
graeme88 0:91e3e396bc6e 156