Y SI / lib_SHT25

Dependents:   lib_SHT25_example

Committer:
YSI
Date:
Wed Jun 30 09:05:04 2021 +0000
Revision:
5:8e34f365eb45
Parent:
4:21a50575cb79
Child:
7:b55223269e6b
bug fixe with LPC1768 mac adresse

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 "lib_SHT25.h"
YSI 0:71da3fbfe141 12 *
YSI 0:71da3fbfe141 13 * Serial pc(USBTX, USBRX);
YSI 3:81324c19d870 14 * SHT25 sensor(I2C_SDA, I2C_SCL);
YSI 0:71da3fbfe141 15 *
YSI 0:71da3fbfe141 16 * int main()
YSI 0:71da3fbfe141 17 * {
YSI 0:71da3fbfe141 18 * float temperature, humidity;
YSI 0:71da3fbfe141 19 * while(1)
YSI 0:71da3fbfe141 20 * {
YSI 3:81324c19d870 21 * temperature = sensor.getTemperature();
YSI 3:81324c19d870 22 * humidity = sensor.getTemperature();
YSI 3:81324c19d870 23 * pc.printf("\r\ntemperature = %6.2f%cC -|- humidity = %6.2f%%RH", temperature, 248, humidity);
YSI 3:81324c19d870 24 * sensor.waitSafeHeat();
YSI 0:71da3fbfe141 25 * sensor.getData(&temperature, &humidity);
YSI 3:81324c19d870 26 * pc.printf("\ntemperature = %6.2f%cC -|- humidity = %6.2f%%RH", temperature, 248, humidity);
YSI 3:81324c19d870 27 * sensor.waitSafeHeat();
YSI 0:71da3fbfe141 28 * }
YSI 0:71da3fbfe141 29 * }
YSI 0:71da3fbfe141 30 * @endcode
YSI 1:ebd95757fba4 31 * @file lib_SHT25.cpp
YSI 0:71da3fbfe141 32 * @date Jun 2018
YSI 0:71da3fbfe141 33 * @author Yannic Simon
YSI 0:71da3fbfe141 34 */
YSI 0:71da3fbfe141 35 #include "lib_SHT25.h"
YSI 0:71da3fbfe141 36
YSI 0:71da3fbfe141 37 SHT25::SHT25(PinName sda, PinName scl) : _i2c(sda, scl)
YSI 0:71da3fbfe141 38 {
YSI 5:8e34f365eb45 39 SHT_WAIT_MS(SHT_WAIT_MS_SET);
YSI 0:71da3fbfe141 40 softReset();
YSI 5:8e34f365eb45 41 setPrecision(SHT_PREC_RH12T14);
YSI 3:81324c19d870 42 _temperature = _humidity = NAN;
YSI 3:81324c19d870 43 _selfHeatTemperature = _selfHeatHumidity = true;
YSI 0:71da3fbfe141 44 }
YSI 0:71da3fbfe141 45
YSI 0:71da3fbfe141 46 float SHT25::getTemperature(void)
YSI 0:71da3fbfe141 47 {
YSI 3:81324c19d870 48 if(_selfHeatTemperature)
YSI 0:71da3fbfe141 49 {
YSI 3:81324c19d870 50 _selfHeatTemperature = false;
YSI 3:81324c19d870 51 _t.attach(callback(this, &SHT25::keepSafeTemperature), SHT_SELF_HEATING);
YSI 2:34e14b4cd981 52 return _temperature = readTemperature();
YSI 0:71da3fbfe141 53 }
YSI 0:71da3fbfe141 54 return _temperature;
YSI 0:71da3fbfe141 55 }
YSI 0:71da3fbfe141 56
YSI 0:71da3fbfe141 57 float SHT25::readTemperature(void)
YSI 0:71da3fbfe141 58 {
YSI 0:71da3fbfe141 59 char command[1] = {SHT_TRIG_TEMP}, rx[3] = {0xFF, 0xFF, 0xFF};
YSI 0:71da3fbfe141 60
YSI 2:34e14b4cd981 61 if(!_i2c.write(SHT_I2C_ADDR, command, 1, false))
YSI 2:34e14b4cd981 62 {
YSI 5:8e34f365eb45 63 SHT_WAIT_MS(SHT_WAIT_MS_TEMP);
YSI 2:34e14b4cd981 64 if(!_i2c.read(SHT_I2C_ADDR, rx, 3, false))
YSI 2:34e14b4cd981 65 return -46.85 + 175.72 * ((((rx[0] << 8) | rx[1]) & 0xFFFC) / 65536.0);
YSI 2:34e14b4cd981 66 }
YSI 2:34e14b4cd981 67 return NAN;
YSI 0:71da3fbfe141 68 }
YSI 0:71da3fbfe141 69
YSI 0:71da3fbfe141 70 float SHT25::getHumidity(void)
YSI 0:71da3fbfe141 71 {
YSI 3:81324c19d870 72 if(_selfHeatHumidity)
YSI 0:71da3fbfe141 73 {
YSI 3:81324c19d870 74 _selfHeatHumidity = false;
YSI 3:81324c19d870 75 _h.attach(callback(this, &SHT25::keepSafeHumidity), SHT_SELF_HEATING);
YSI 2:34e14b4cd981 76 return _humidity = readHumidity();
YSI 0:71da3fbfe141 77 }
YSI 0:71da3fbfe141 78 return _humidity;
YSI 0:71da3fbfe141 79 }
YSI 0:71da3fbfe141 80
YSI 0:71da3fbfe141 81 float SHT25::readHumidity(void)
YSI 0:71da3fbfe141 82 {
YSI 0:71da3fbfe141 83 char command[1] = {SHT_TRIG_RH}, rx[3] = {0xFF, 0xFF, 0xFF};
YSI 0:71da3fbfe141 84
YSI 2:34e14b4cd981 85 if(!_i2c.write(SHT_I2C_ADDR, command, 1, false))
YSI 2:34e14b4cd981 86 {
YSI 5:8e34f365eb45 87 SHT_WAIT_MS(SHT_WAIT_MS_RH);
YSI 2:34e14b4cd981 88 if(!_i2c.read(SHT_I2C_ADDR, rx, 3, false))
YSI 2:34e14b4cd981 89 return -6.0 + 125.0 * ((((rx[0] << 8) | rx[1]) & 0xFFFC) / 65536.0);
YSI 2:34e14b4cd981 90 }
YSI 2:34e14b4cd981 91 return NAN;
YSI 0:71da3fbfe141 92 }
YSI 0:71da3fbfe141 93
YSI 0:71da3fbfe141 94 void SHT25::getData(float *tempC, float *relHumidity)
YSI 0:71da3fbfe141 95 {
YSI 3:81324c19d870 96 if(_selfHeatTemperature && _selfHeatHumidity)
YSI 0:71da3fbfe141 97 {
YSI 3:81324c19d870 98 _selfHeatTemperature = _selfHeatHumidity = false;
YSI 3:81324c19d870 99 _t.attach(callback(this, &SHT25::keepSafeTemperature), SHT_SELF_HEATING);
YSI 3:81324c19d870 100 _h.attach(callback(this, &SHT25::keepSafeHumidity), SHT_SELF_HEATING);
YSI 0:71da3fbfe141 101 readData(tempC, relHumidity);
YSI 0:71da3fbfe141 102 }
YSI 2:34e14b4cd981 103 else
YSI 2:34e14b4cd981 104 {
YSI 2:34e14b4cd981 105 *tempC = _temperature;
YSI 2:34e14b4cd981 106 *relHumidity = _humidity;
YSI 2:34e14b4cd981 107 }
YSI 0:71da3fbfe141 108 }
YSI 0:71da3fbfe141 109
YSI 0:71da3fbfe141 110 void SHT25::readData(float *tempC, float *relHumidity)
YSI 0:71da3fbfe141 111 {
YSI 2:34e14b4cd981 112 *tempC = _temperature = readTemperature();
YSI 2:34e14b4cd981 113 *relHumidity = _humidity = readHumidity();
YSI 0:71da3fbfe141 114 }
YSI 0:71da3fbfe141 115
YSI 5:8e34f365eb45 116 bool SHT25::setPrecision(const enum_sht_prec precision)
YSI 0:71da3fbfe141 117 {
YSI 0:71da3fbfe141 118 char command[2] = {SHT_WRITE_REG, precision};
YSI 0:71da3fbfe141 119
YSI 2:34e14b4cd981 120 if(!_i2c.write(SHT_I2C_ADDR, command, 2, false))
YSI 2:34e14b4cd981 121 {
YSI 5:8e34f365eb45 122 SHT_WAIT_MS(SHT_WAIT_MS_SET);
YSI 2:34e14b4cd981 123 return true;
YSI 2:34e14b4cd981 124 }
YSI 2:34e14b4cd981 125 return false;
YSI 0:71da3fbfe141 126 }
YSI 0:71da3fbfe141 127
YSI 0:71da3fbfe141 128 bool SHT25::softReset()
YSI 0:71da3fbfe141 129 {
YSI 0:71da3fbfe141 130 char command[1] = {SHT_SOFT_RESET};
YSI 0:71da3fbfe141 131
YSI 2:34e14b4cd981 132 if (!_i2c.write(SHT_I2C_ADDR, command, 1, false))
YSI 0:71da3fbfe141 133 {
YSI 5:8e34f365eb45 134 SHT_WAIT_MS(SHT_WAIT_MS_SET);
YSI 2:34e14b4cd981 135 return true;
YSI 0:71da3fbfe141 136 }
YSI 2:34e14b4cd981 137 return false;
YSI 0:71da3fbfe141 138 }
YSI 0:71da3fbfe141 139
YSI 3:81324c19d870 140 void SHT25::waitSafeHeat(void)
YSI 3:81324c19d870 141 {
YSI 3:81324c19d870 142 while(!_selfHeatTemperature || !_selfHeatHumidity)
YSI 5:8e34f365eb45 143 SHT_WAIT_MS(SHT_WAIT_MS_SET);
YSI 3:81324c19d870 144 }
YSI 3:81324c19d870 145
YSI 3:81324c19d870 146 void SHT25::keepSafeTemperature(void)
YSI 0:71da3fbfe141 147 {
YSI 3:81324c19d870 148 _selfHeatTemperature = true;
YSI 3:81324c19d870 149 }
YSI 3:81324c19d870 150
YSI 3:81324c19d870 151 void SHT25::keepSafeHumidity(void)
YSI 3:81324c19d870 152 {
YSI 3:81324c19d870 153 _selfHeatHumidity = true;
YSI 0:71da3fbfe141 154 }