Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Diff: lib_SHT25.cpp
- Revision:
- 7:b55223269e6b
- Parent:
- 5:8e34f365eb45
- Child:
- 8:bb3dbc86a180
--- a/lib_SHT25.cpp Wed Sep 08 06:48:12 2021 +0000
+++ b/lib_SHT25.cpp Thu Sep 16 11:17:17 2021 +0000
@@ -34,77 +34,22 @@
*/
#include "lib_SHT25.h"
-SHT25::SHT25(PinName sda, PinName scl) : _i2c(sda, scl)
-{
- SHT_WAIT_MS(SHT_WAIT_MS_SET);
- softReset();
- setPrecision(SHT_PREC_RH12T14);
- _temperature = _humidity = NAN;
- _selfHeatTemperature = _selfHeatHumidity = true;
-}
-
-float SHT25::getTemperature(void)
-{
- if(_selfHeatTemperature)
- {
- _selfHeatTemperature = false;
- _t.attach(callback(this, &SHT25::keepSafeTemperature), SHT_SELF_HEATING);
- return _temperature = readTemperature();
- }
- return _temperature;
-}
-
-float SHT25::readTemperature(void)
+SHT25::SHT25(PinName sda, PinName scl, enum_sht_prec prec, int frequency) : _i2c(sda, scl)
{
- char command[1] = {SHT_TRIG_TEMP}, rx[3] = {0xFF, 0xFF, 0xFF};
-
- if(!_i2c.write(SHT_I2C_ADDR, command, 1, false))
- {
- SHT_WAIT_MS(SHT_WAIT_MS_TEMP);
- if(!_i2c.read(SHT_I2C_ADDR, rx, 3, false))
- return -46.85 + 175.72 * ((((rx[0] << 8) | rx[1]) & 0xFFFC) / 65536.0);
- }
- return NAN;
-}
-
-float SHT25::getHumidity(void)
-{
- if(_selfHeatHumidity)
- {
- _selfHeatHumidity = false;
- _h.attach(callback(this, &SHT25::keepSafeHumidity), SHT_SELF_HEATING);
- return _humidity = readHumidity();
- }
- return _humidity;
-}
-
-float SHT25::readHumidity(void)
-{
- char command[1] = {SHT_TRIG_RH}, rx[3] = {0xFF, 0xFF, 0xFF};
-
- if(!_i2c.write(SHT_I2C_ADDR, command, 1, false))
- {
- SHT_WAIT_MS(SHT_WAIT_MS_RH);
- if(!_i2c.read(SHT_I2C_ADDR, rx, 3, false))
- return -6.0 + 125.0 * ((((rx[0] << 8) | rx[1]) & 0xFFFC) / 65536.0);
- }
- return NAN;
+ _i2c.frequency(frequency);
+ setPrecision(prec);
+ _temperature = _humidity = NAN;
+ _selfHeatTemperature = _selfHeatHumidity = false;
+ _t.attach(callback(this, &SHT25::keepSafeTemperature), SHT_SELF_HEATING);
+ _h.attach(callback(this, &SHT25::keepSafeHumidity), SHT_SELF_HEATING);
}
void SHT25::getData(float *tempC, float *relHumidity)
{
+ *tempC = _temperature;
+ *relHumidity = _humidity;
if(_selfHeatTemperature && _selfHeatHumidity)
- {
- _selfHeatTemperature = _selfHeatHumidity = false;
- _t.attach(callback(this, &SHT25::keepSafeTemperature), SHT_SELF_HEATING);
- _h.attach(callback(this, &SHT25::keepSafeHumidity), SHT_SELF_HEATING);
readData(tempC, relHumidity);
- }
- else
- {
- *tempC = _temperature;
- *relHumidity = _humidity;
- }
}
void SHT25::readData(float *tempC, float *relHumidity)
@@ -113,34 +58,61 @@
*relHumidity = _humidity = readHumidity();
}
+float SHT25::getTemperature(void)
+{
+ if(_selfHeatTemperature)
+ _temperature = readTemperature();
+ return _temperature;
+}
+
+float SHT25::readTemperature(void)
+{
+ char cmd[1] = {SHT_TRIG_TEMP_NHOLD}, rx[3] = {0xFF, 0xFF, 0xFF};
+ if(!_i2c.write(SHT_I2C_ADDR_WRITE, cmd, 1, false))
+ {
+ for(int i = 0; _i2c.read(SHT_I2C_ADDR_READ, rx, 3, false) && (i < 1889); i++); //1889*45ms(time to read at 400KHz) = 85ms(time max to measure T on 14bit)
+ _selfHeatTemperature = false;
+ _t.attach(callback(this, &SHT25::keepSafeTemperature), SHT_SELF_HEATING);
+ return -46.85f + 175.72f * ((((rx[0] << 8) | rx[1]) & 0xFFFC) / 65536.0f);
+ }
+ return NAN;
+}
+
+float SHT25::getHumidity(void)
+{
+ if(_selfHeatHumidity)
+ _humidity = readHumidity();
+ return _humidity;
+}
+
+float SHT25::readHumidity(void)
+{
+ char cmd[1] = {SHT_TRIG_RH_NHOLD}, rx[3] = {0xFF, 0xFF, 0xFF};
+ if(!_i2c.write(SHT_I2C_ADDR_WRITE, cmd, 1, false))
+ {
+ for(int i = 0; _i2c.read(SHT_I2C_ADDR_READ, rx, 3, false) && (i < 667); i++); //667*45ms(time to read at 400KHz) = 30ms(time max to measure RH on 12bit)
+ _selfHeatHumidity = false;
+ _h.attach(callback(this, &SHT25::keepSafeHumidity), SHT_SELF_HEATING);
+ return -6.0f + 125.0f * ((((rx[0] << 8) | rx[1]) & 0xFFFC) / 65536.0f);
+ }
+ return NAN;
+}
+
bool SHT25::setPrecision(const enum_sht_prec precision)
{
- char command[2] = {SHT_WRITE_REG, precision};
-
- if(!_i2c.write(SHT_I2C_ADDR, command, 2, false))
- {
- SHT_WAIT_MS(SHT_WAIT_MS_SET);
- return true;
- }
- return false;
+ char cmd[2] = {SHT_WRITE_REG_USER, precision};
+ return !_i2c.write(SHT_I2C_ADDR_WRITE, cmd, 2, false);
}
bool SHT25::softReset()
{
- char command[1] = {SHT_SOFT_RESET};
-
- if (!_i2c.write(SHT_I2C_ADDR, command, 1, false))
- {
- SHT_WAIT_MS(SHT_WAIT_MS_SET);
- return true;
- }
- return false;
+ char cmd[1] = {SHT_SOFT_RESET};
+ return !_i2c.write(SHT_I2C_ADDR_WRITE, cmd, 1, false);
}
void SHT25::waitSafeHeat(void)
{
- while(!_selfHeatTemperature || !_selfHeatHumidity)
- SHT_WAIT_MS(SHT_WAIT_MS_SET);
+ while(!_selfHeatTemperature || !_selfHeatHumidity) __NOP();
}
void SHT25::keepSafeTemperature(void)