add Dewpoint

Fork of AM2321 by Y Tomohara

Revision:
1:f42b99c425e8
Parent:
0:d1c0dbf5e5a6
Child:
2:dd902435d402
--- a/AM2321.cpp	Tue May 06 10:21:11 2014 +0000
+++ b/AM2321.cpp	Tue Aug 11 09:13:23 2015 +0000
@@ -15,53 +15,52 @@
 
 const int AM2321_I2C_ADDR = 0xB8;
 
-AM2321::AM2321(PinName sda, PinName scl)
-: _i2c(sda, scl)
-{
+AM2321::AM2321(PinName sda, PinName scl): _i2c(sda, scl)
+    {
     _result.temperature = 0.0f;
     _result.humidity    = 0.0f;        
-}
+    }
 
 float AM2321::getLogicalValue(uint16_t regVal) const
-{
+    {   
     if(regVal & 0x8000)
-    {
+        {
         regVal &= ~0x8000;
         return (float)regVal / -10.0;
-    }
+        }
     else
-    {
+        {
         return (float)regVal / 10.0;    
+        }
     }
-}
 
 uint16_t AM2321::calcCRC16(const uint8_t* src, int len) const
-{
+    {
     uint16_t crc = 0xFFFF;
 
     while(len--)
-    {
+        {
         crc ^= *(src++);
         
         for(uint8_t i = 0; i < 8; i++)
-        {
+            {
             if(crc & 0x01)
-            {
+                {
                 crc >>= 1;
                 crc ^= 0xA001;
-            }
+                }
             else
-            {
+                {
                 crc >>= 1;
+                }
             }
-        }
+        } 
+    return crc; 
     }
-    
-    return crc; 
-}
+
 
 bool AM2321::poll(void)
-{
+    {
     bool    success = false;
     uint8_t data[8];
     
@@ -79,7 +78,7 @@
     wait_us(1600);
 
     if(_i2c.read(AM2321_I2C_ADDR, (char*)data, 8) == 0)
-    {
+        {
         uint8_t  cmd     = data[0];
         uint8_t  dataLen = data[1];
         uint16_t humiVal = (data[2] * 256) + data[3];
@@ -88,29 +87,37 @@
         uint16_t chkCRC  = calcCRC16(&data[0], 6);
 
         if(dataLen == 4)
-        {
+            {
             if(recvCRC == chkCRC)
-            {
+                {
                 if(cmd == 0x03)
-                {
+                    {
                     _result.temperature = getLogicalValue(tempVal);
                     _result.humidity    = getLogicalValue(humiVal);
 
                     success = true;
+                    }
                 }
             }
-        }
+        } 
+    return success;
     }
-    
-    return success;
-}
 
 float AM2321::getTemperature(void) const
-{
+    {
     return _result.temperature;
-}
+    }
 
 float AM2321::getHumidity(void) const
-{
+    {
     return _result.humidity;
-}
+    }
+    
+float AM2321::getDewpoint(void) const
+  {
+  float H, Dp;
+
+  H = (log(_result.humidity) - 2) / 0.4343 + (17.62 * _result.temperature) / (243.12 + _result.temperature);
+  Dp = 243.12 * H / (17.62 - H);               //das ist der Taupunkt in Celsius
+  return Dp/10;
+  }