Y SI / lib_SHT25

Dependents:   lib_SHT25_example

Committer:
YSI
Date:
Mon Jun 18 12:10:49 2018 +0000
Revision:
2:34e14b4cd981
Parent:
1:ebd95757fba4
Child:
3:81324c19d870
Add NaN return on I2C error

Who changed what in which revision?

UserRevisionLine numberNew contents of line
YSI 0:71da3fbfe141 1 /** SHT25 class
YSI 0:71da3fbfe141 2 *
YSI 0:71da3fbfe141 3 * @purpose library for SHT25 humidity and temperature sensor
YSI 0:71da3fbfe141 4 *
YSI 0:71da3fbfe141 5 * Use to get temperature and humidity
YSI 0:71da3fbfe141 6 *
YSI 0:71da3fbfe141 7 * https://www.sensirion.com/products/humidity-sensor/
YSI 0:71da3fbfe141 8 *
YSI 0:71da3fbfe141 9 * Example:
YSI 0:71da3fbfe141 10 * @code
YSI 0:71da3fbfe141 11 * #include "mbed.h"
YSI 0:71da3fbfe141 12 * #include "lib_SHT25.h"
YSI 0:71da3fbfe141 13 *
YSI 0:71da3fbfe141 14 * Serial pc(USBTX, USBRX);
YSI 0:71da3fbfe141 15 * SHT25 sensor(p28, p27);
YSI 0:71da3fbfe141 16 *
YSI 0:71da3fbfe141 17 * int main()
YSI 0:71da3fbfe141 18 * {
YSI 0:71da3fbfe141 19 * float temperature, humidity;
YSI 0:71da3fbfe141 20 * while(1)
YSI 0:71da3fbfe141 21 * {
YSI 0:71da3fbfe141 22 * sensor.getData(&temperature, &humidity);
YSI 0:71da3fbfe141 23 * pc.printf("\rtemperature = %6.2f%cC -|- humidity = %6.2f%%RH", temperature, 248, humidity);
YSI 0:71da3fbfe141 24 * wait(0.5);
YSI 0:71da3fbfe141 25 * }
YSI 0:71da3fbfe141 26 * }
YSI 0:71da3fbfe141 27 * @endcode
YSI 1:ebd95757fba4 28 * @file lib_SHT25.cpp
YSI 0:71da3fbfe141 29 * @date Jun 2018
YSI 0:71da3fbfe141 30 * @author Yannic Simon
YSI 0:71da3fbfe141 31 */
YSI 0:71da3fbfe141 32 #include "lib_SHT25.h"
YSI 0:71da3fbfe141 33
YSI 0:71da3fbfe141 34 SHT25::SHT25(PinName sda, PinName scl) : _i2c(sda, scl)
YSI 0:71da3fbfe141 35 {
YSI 2:34e14b4cd981 36 wait_ms(SHT_WAIT_SET);
YSI 0:71da3fbfe141 37 softReset();
YSI 0:71da3fbfe141 38 setPrecision(SHT_PREC_1214);
YSI 0:71da3fbfe141 39 _selfHeat = true;
YSI 0:71da3fbfe141 40 }
YSI 0:71da3fbfe141 41
YSI 0:71da3fbfe141 42 float SHT25::getTemperature(void)
YSI 0:71da3fbfe141 43 {
YSI 0:71da3fbfe141 44 if(_selfHeat)
YSI 0:71da3fbfe141 45 {
YSI 0:71da3fbfe141 46 _selfHeat = false;
YSI 0:71da3fbfe141 47 _t.attach(callback(this, &SHT25::keepSelf), SHT_SELF_HEATING);
YSI 2:34e14b4cd981 48 return _temperature = readTemperature();
YSI 0:71da3fbfe141 49 }
YSI 0:71da3fbfe141 50 return _temperature;
YSI 0:71da3fbfe141 51 }
YSI 0:71da3fbfe141 52
YSI 0:71da3fbfe141 53 float SHT25::readTemperature(void)
YSI 0:71da3fbfe141 54 {
YSI 0:71da3fbfe141 55 char command[1] = {SHT_TRIG_TEMP}, rx[3] = {0xFF, 0xFF, 0xFF};
YSI 0:71da3fbfe141 56
YSI 2:34e14b4cd981 57 if(!_i2c.write(SHT_I2C_ADDR, command, 1, false))
YSI 2:34e14b4cd981 58 {
YSI 2:34e14b4cd981 59 wait_ms(SHT_WAIT_TEMP);
YSI 2:34e14b4cd981 60 if(!_i2c.read(SHT_I2C_ADDR, rx, 3, false))
YSI 2:34e14b4cd981 61 return -46.85 + 175.72 * ((((rx[0] << 8) | rx[1]) & 0xFFFC) / 65536.0);
YSI 2:34e14b4cd981 62 }
YSI 2:34e14b4cd981 63 return NAN;
YSI 0:71da3fbfe141 64 }
YSI 0:71da3fbfe141 65
YSI 0:71da3fbfe141 66 float SHT25::getHumidity(void)
YSI 0:71da3fbfe141 67 {
YSI 0:71da3fbfe141 68 if(_selfHeat)
YSI 0:71da3fbfe141 69 {
YSI 0:71da3fbfe141 70 _selfHeat = false;
YSI 0:71da3fbfe141 71 _t.attach(callback(this, &SHT25::keepSelf), SHT_SELF_HEATING);
YSI 2:34e14b4cd981 72 return _humidity = readHumidity();
YSI 0:71da3fbfe141 73 }
YSI 0:71da3fbfe141 74 return _humidity;
YSI 0:71da3fbfe141 75 }
YSI 0:71da3fbfe141 76
YSI 0:71da3fbfe141 77 float SHT25::readHumidity(void)
YSI 0:71da3fbfe141 78 {
YSI 0:71da3fbfe141 79 char command[1] = {SHT_TRIG_RH}, rx[3] = {0xFF, 0xFF, 0xFF};
YSI 0:71da3fbfe141 80
YSI 2:34e14b4cd981 81 if(!_i2c.write(SHT_I2C_ADDR, command, 1, false))
YSI 2:34e14b4cd981 82 {
YSI 2:34e14b4cd981 83 wait_ms(SHT_WAIT_RH);
YSI 2:34e14b4cd981 84 if(!_i2c.read(SHT_I2C_ADDR, rx, 3, false))
YSI 2:34e14b4cd981 85 return -6.0 + 125.0 * ((((rx[0] << 8) | rx[1]) & 0xFFFC) / 65536.0);
YSI 2:34e14b4cd981 86 }
YSI 2:34e14b4cd981 87 return NAN;
YSI 0:71da3fbfe141 88 }
YSI 0:71da3fbfe141 89
YSI 0:71da3fbfe141 90 void SHT25::getData(float *tempC, float *relHumidity)
YSI 0:71da3fbfe141 91 {
YSI 0:71da3fbfe141 92 if(_selfHeat)
YSI 0:71da3fbfe141 93 {
YSI 0:71da3fbfe141 94 _selfHeat = false;
YSI 0:71da3fbfe141 95 _t.attach(callback(this, &SHT25::keepSelf), SHT_SELF_HEATING);
YSI 0:71da3fbfe141 96 readData(tempC, relHumidity);
YSI 0:71da3fbfe141 97 }
YSI 2:34e14b4cd981 98 else
YSI 2:34e14b4cd981 99 {
YSI 2:34e14b4cd981 100 *tempC = _temperature;
YSI 2:34e14b4cd981 101 *relHumidity = _humidity;
YSI 2:34e14b4cd981 102 }
YSI 0:71da3fbfe141 103 }
YSI 0:71da3fbfe141 104
YSI 0:71da3fbfe141 105 void SHT25::readData(float *tempC, float *relHumidity)
YSI 0:71da3fbfe141 106 {
YSI 2:34e14b4cd981 107 *tempC = _temperature = readTemperature();
YSI 2:34e14b4cd981 108 *relHumidity = _humidity = readHumidity();
YSI 0:71da3fbfe141 109 }
YSI 0:71da3fbfe141 110
YSI 2:34e14b4cd981 111 bool SHT25::setPrecision(char precision)
YSI 0:71da3fbfe141 112 {
YSI 0:71da3fbfe141 113 char command[2] = {SHT_WRITE_REG, precision};
YSI 0:71da3fbfe141 114
YSI 2:34e14b4cd981 115 if(!_i2c.write(SHT_I2C_ADDR, command, 2, false))
YSI 2:34e14b4cd981 116 {
YSI 2:34e14b4cd981 117 wait_ms(SHT_WAIT_SET);
YSI 2:34e14b4cd981 118 return true;
YSI 2:34e14b4cd981 119 }
YSI 2:34e14b4cd981 120 return false;
YSI 0:71da3fbfe141 121 }
YSI 0:71da3fbfe141 122
YSI 0:71da3fbfe141 123 bool SHT25::softReset()
YSI 0:71da3fbfe141 124 {
YSI 0:71da3fbfe141 125 char command[1] = {SHT_SOFT_RESET};
YSI 0:71da3fbfe141 126
YSI 2:34e14b4cd981 127 if (!_i2c.write(SHT_I2C_ADDR, command, 1, false))
YSI 0:71da3fbfe141 128 {
YSI 2:34e14b4cd981 129 wait_ms(SHT_WAIT_SET);
YSI 2:34e14b4cd981 130 return true;
YSI 0:71da3fbfe141 131 }
YSI 2:34e14b4cd981 132 return false;
YSI 0:71da3fbfe141 133 }
YSI 0:71da3fbfe141 134
YSI 0:71da3fbfe141 135 void SHT25::keepSelf(void)
YSI 0:71da3fbfe141 136 {
YSI 0:71da3fbfe141 137 _selfHeat = true;
YSI 0:71da3fbfe141 138 }