SHT V4 5V UART

Dependencies:   mbed

Fork of SHT_v1 by Stephen McGarry

Revision:
1:0dbbb4802508
Parent:
0:df1c8f2961a1
--- a/SHT.cpp	Sun Jan 24 22:00:35 2010 +0000
+++ b/SHT.cpp	Tue Feb 23 08:10:54 2016 +0000
@@ -6,6 +6,7 @@
 #include "SHT.h"
 
 #include "mbed.h"
+#define MICROSECONDE 10//1
 
 SHT::SHT(PinName p_sclk, PinName p_data, SHT_acc p_accuracy) : sclk(p_sclk), data(p_data), accuracy(p_accuracy) {
     sclk=0;
@@ -13,7 +14,7 @@
     data.mode(PullUp);    // with the pull up internally active
     data.input();        // with line released to go high
     temperature = humidity = dewpoint=0.0f;
-   printf("constructor\n");
+  
 }
 
 char SHT::write_byte(byte value)
@@ -26,16 +27,17 @@
     for (i=0x80;i>0;i/=2) {           //shift bit for masking
         if (i & value) data.input();  //masking value with i , write to SENSI-BUS
         else data.output();
-        wait_us(1);                   //ensure sclk is low for min time
+        wait_us(MICROSECONDE);                   //ensure sclk is low for min time
+        
         sclk=1;                       //clk for SENSI-BUS
-        wait_us(1);                   //pulsewith approx. 2 us
+        wait_us(MICROSECONDE);                   //pulsewith approx. 2 us
         sclk=0;
     }
     data.input();                     //release DATA-line
-    wait_us(1);                       //ensure sclk is low for min time
+    wait_us(MICROSECONDE);                       //ensure sclk is low for min time
     sclk=1;                           //clk #9 for ack
     error=data;                       //check ack (DATA will be pulled down by SHT11)
-    wait_us(1);
+    wait_us(MICROSECONDE);
     sclk=0;
     return error;                     //error=1 in case of no acknowledge
 }
@@ -47,16 +49,16 @@
     byte i,val=0;
     data.input();                     //release DATA-line
     for (i=0x80;i>0;i/=2) {           //shift bit for masking
-        wait_us(1);
+        wait_us(MICROSECONDE);
         sclk=1;                       //clk for SENSI-BUS
         if (data) val=(val | i);      //read bit
-        wait_us(1);
+        wait_us(MICROSECONDE);
         sclk=0;
     }
-    wait_us(1);
+    wait_us(MICROSECONDE);
     if (send_ack) data.output();      // if ack needed then drive data low
     sclk=1;                           //clk #9 for ack
-    wait_us(1);
+    wait_us(MICROSECONDE);
     sclk=0;
     data.input();                     //release DATA-line
     return val;
@@ -72,19 +74,19 @@
 {
     data.input();
     sclk=0;                   //Initial state
-    wait_us(1);
+    wait_us(MICROSECONDE);
     sclk=1;
-    wait_us(1);
+    wait_us(MICROSECONDE);
     data.output();            // data low
-    wait_us(1);
+    wait_us(MICROSECONDE);
     sclk=0;
-    wait_us(1);
+    wait_us(MICROSECONDE);
     sclk=1;
-    wait_us(1);
+    wait_us(MICROSECONDE);
     data.input();            // allow data to high
-    wait_us(1);
+    wait_us(MICROSECONDE);
     sclk=0;
-    wait_us(1);
+    wait_us(MICROSECONDE);
 }
 
 void SHT::connection_reset(void)
@@ -99,12 +101,13 @@
     data.input();            // allow data high
     sclk=0;                  // and clk low
     for (i=0;i<9;i++) {      // 9 SCK cycles
-        wait_us(1);
+        wait_us(MICROSECONDE);
         sclk=1;
-        wait_us(1);
+        wait_us(MICROSECONDE);
         sclk=0;
     }
 }
+
 char SHT::soft_reset(void)
 //----------------------------------------------------------------------------------
 // resets the sensor by a softreset
@@ -168,21 +171,23 @@
 
 void SHT::calculate()
 //----------------------------------------------------------------------------------------
-// calculates temperature [°C] and humidity [%RH]
+// calculates temperature [�C] and humidity [%RH]
 // input :  hum  [Ticks] (12 bit)
 //          temp [Ticks] (14 bit)
 // output:  humidity [%RH]
-//          temperature [°C]
+//          temperature [�C]
 {
-    const float C1=-4.0;              // for 12 Bit
-    const float C2=+0.0405;           // for 12 Bit
-    const float C3=-0.0000028;        // for 12 Bit
-    //const float T1=+0.01;             // for 14 Bit @ 5V
-    //const float T2=+0.00008;           // for 14 Bit @ 5V
-
+    //Optimized V4 humidity conversion coefficients
+    const float C1=-2.0468;              // for 12 Bit
+    const float C2=0.0367;           // for 12 Bit
+    const float C3=-1.5955E-6;        // for 12 Bit
+    const float T1=0.01;             // for 12 
+    const float T2=0.00008;           // for 12 Bit 
+    const float D1= -40.1;             //for °C 5V
+    const float D2= 0.01 ;            //for °C for 14
     float rh;                         // rh:      Humidity [Ticks] 12 Bit
     float t;                          // t:       Temperature [Ticks] 14 Bit
-    //float rh_lin;                     // rh_lin:  Humidity linear
+    float rh_lin;                     // rh_lin:  Humidity linear
     if (accuracy==SHT_low) {
         rh=hum*16;                    // rescale to high accuracy values - 8 to 12 bits
         t=temp*4;                     // and 12 to 14 bits
@@ -191,9 +196,9 @@
         t=temp;
     }
 
-    temperature=t*0.01 - 40;                  //calc. temperature from ticks to [°C]
-    humidity=C3*rh*rh + C2*rh + C1;     //calc. humidity from ticks to [%RH]
-    // =(temperature-25)*(T1+T2*rh)+rh_lin;   //calc. temperature compensated humidity [%RH] (ignore as never >0.25%)
+    temperature=D1 + D2*t ;                  //calc. temperature from ticks to [�C]
+     rh_lin=C3*rh*rh + C2*rh + C1;     //calc. humidity from ticks to [%RH]
+     humidity =(temperature-25)*(T1+T2*rh)+rh_lin;   //calc. temperature compensated humidity [%RH] (ignore as never >0.25%)
     if (humidity>100)humidity=100;      //cut if the value is outside of
     if (humidity<0.1)humidity=0.1;      //the physical possible range
 }
@@ -210,9 +215,10 @@
     return dewpoint;
 }
 
-void SHT::update(SHT_acc acc) {   // update stored values from sensor
+int SHT::update(SHT_acc acc) {   // update stored values from sensor
     int error=0;
-    connection_reset();
+    soft_reset();
+    //connection_reset();
     if (acc!=accuracy) {
         accuracy=acc;
         error+=write_status((acc==SHT_low)?0x01:0x00);    //set the status reg to high or low accuarcy
@@ -220,5 +226,5 @@
     error+=measure(temp,com_measure_temp);
     error+=measure(hum,com_measure_humid);
     if (!error) calculate();
-
+return error;
 }