Y SI / lib_SHT25

Dependents:   lib_SHT25_example

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)