An eddied version of http://mbed.org/users/crazystick/code/DHT22/ for LPC11U24. All printf statements are removed and features requiring the real time clock are removed.

Dependents:   RHT03_HelloWorld IOT_sensor_nfc CanSat_Alex cansat_alex_v1 ... more

Revision:
1:2bd5cffd60d0
Parent:
0:24f59e3759a1
Child:
4:e9fe691122c1
--- a/RHT03.cpp	Tue Aug 28 14:27:50 2012 +0000
+++ b/RHT03.cpp	Tue Aug 28 14:36:18 2012 +0000
@@ -1,220 +1,220 @@
-/*
-    DHT22.cpp - DHT22 sensor library
-    Developed by HO WING KIT
-    Modifications by Paul Adams
-
-    This library is free software; you can redistribute it and / or
-    modify it under the terms of the GNU Leser General Public
-    License as published by the Free Software Foundation; either
-    version 2.1 of the License, or (at your option) any later version.
-
-    This library is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRENTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PATRICULAR PURPOSE.  See the GNU
-    Lesser General Public License for more details.
-
-    You should have received a copy of the GNU Lesser General Public
-    License along with this library; if not, write to the Free Software
-    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-
-
-    Humidity and Temperature Sensor DHT22 info found at
-    http://www.sparkfun.com/products/10167
-    same as RHT03 http://www.humiditycn.com    
-
-    Version 0.1: 8-Jan-2011 by Ho Wing Kit
-    Version 0.2: 29-Mar-2012 by Paul Adams
-    
-    Additional Credit: All the commenters on http://www.sparkfun.com/products/10167
-    
-*/
-
-#include "RHT03.h"
-
-
-// This should be 40, but the sensor is adding an extra bit at the start
-#define DHT22_DATA_BIT_COUNT 41
-
-DHT22::DHT22(PinName Data) {
-
-    _data = Data;                // Set Data Pin
-    _lastReadTime = time(NULL);
-    _lastHumidity = 0;
-    _lastTemperature = DHT22_ERROR_VALUE;
-}
-
-DHT22::~DHT22() {
-}
-
-DHT22_ERROR DHT22::readData() {
-    int i, j, retryCount;
-    int currentTemperature=0;
-    int currentHumidity=0;
-    unsigned int checkSum = 0, csPart1, csPart2, csPart3, csPart4;
-    unsigned int bitTimes[DHT22_DATA_BIT_COUNT];
-    DHT22_ERROR err = DHT_ERROR_NONE;
-    time_t currentTime = time(NULL);
-
-    DigitalInOut  DATA(_data);
-       
-    for (i = 0; i < DHT22_DATA_BIT_COUNT; i++) {
-        bitTimes[i] = 0;
-    }
-    
-   // if (int(currentTime - _lastReadTime) < 2) {        
-   //     printf("DHT22 Error Access Time < 2s");
-   //     err = DHT_ERROR_TOO_QUICK;
-   // }   
-    retryCount = 0;
-    // Pin needs to start HIGH, wait unit it is HIGH with a timeout
-    do {
-        if (retryCount > 125) {
-            //pc1.printf("DHT22 Bus busy!");
-            err = DHT_BUS_HUNG;
-            return err;
-        }
-        retryCount ++;
-        wait_us(2);
-    } while (DATA==0);   // exit on DHT22 return 'High' Signal within 250us
-    
-    // Send the activate pulse
-    // Step 1: MCU send out start signal to DHT22 and DHT22 send
-    //         response signal to MCU.
-    // If always signal high-voltage-level, it means DHT22 is not 
-    // working properly, please check the electrical connection status.
-    //
-    DATA.output(); // set pin to output data
-    DATA = 0;      // MCU send out start signal to DHT22
-    wait_ms(18);   // 18 ms wait (spec: at least 1ms)
-    DATA = 1;      // MCU pull up 
-    wait_us(40);
-    DATA.input();  // set pin to receive data
-    // Find the start of the ACK Pulse
-    retryCount = 0;
-    do {
-        if (retryCount > 40)  { // (Spec is 20-40 us high)
-            //pc1.printf("DHT22 not responding!");
-            err = DHT_ERROR_NOT_PRESENT;
-            return err;
-        }
-        retryCount++;
-        wait_us(1);
-    } while (DATA==1);   // Exit on DHT22 pull low within 40us
-    if (err != DHT_ERROR_NONE) {
-        // initialisation failed
-        return err;    
-    }
-    wait_us(80); // DHT pull up ready to transmit data
-    
-    /*
-    if (DATA == 0) {
-        printf("DHT22 not ready!");
-        err = DHT_ERROR_ACK_TOO_LONG;
-        return err;
-    }
-    */
-    
-    // Reading the 5 byte data stream
-    // Step 2: DHT22 send data to MCU
-    //         Start bit -> low volage within 50us (actually could be anything from 35-75us)
-    //         0         -> high volage within 26-28us (actually could be 10-40us)
-    //         1         -> high volage within 70us (actually could be 60-85us)
-    //         See http://www.sparkfun.com/products/10167#comment-4f118d6e757b7f536e000000
-    
-    
-    for (i = 0; i < 5; i++) {
-        for (j = 0; j < 8; j++) {
-            // Instead of relying on the data sheet, just wait while the RHT03 pin is low
-            retryCount = 0;
-            do {
-                if (retryCount > 75)  {
-                    //pc1.printf("DHT22 timeout waiting for data!");
-                    err = DHT_ERROR_DATA_TIMEOUT;
-                }
-                retryCount++;
-                wait_us(1);
-            } while (DATA == 0);
-            // We now wait for 40us
-            wait_us(40);
-            if (DATA == 1) {  
-                // If pin is still high, bit value is a 1
-                bitTimes[i*8+j] = 1;
-            } else {  
-                // The bit value is a 0
-                bitTimes[i*8+j] = 0;
-            }
-            int count = 0;
-            while (DATA == 1 && count < 100) {  
-                wait_us(1); // Delay for 1 microsecond  
-                count++;  
-            }
-        }
-    }
-    // Re-init DHT22 pin  
-    DATA.output();  
-    DATA = 1;
-
-    // Now bitTimes have the actual bits
-    // that were needed to find the end of each data bit
-    // Note: the bits are offset by one from the data sheet, not sure why
-    currentHumidity    = 0;
-    currentTemperature = 0;
-    checkSum           = 0;
-    // First 16 bits is Humidity
-    for (i=0; i<16; i++) {
-        //printf("bit %d: %d  ", i, bitTimes[i+1]);
-        if (bitTimes[i+1] > 0) {
-            currentHumidity |= ( 1 << (15-i));
-        }
-    }
-    
-    // Second 16 bits is Temperature 
-    for (i=0; i<16; i ++) {
-        //printf("bit %d: %d  ", i+16, bitTimes[i+17]);
-        if (bitTimes[i+17] > 0) {
-            currentTemperature |= (1 <<(15-i));
-        }
-    }
-
-    // Last 8 bit is Checksum
-    for (i=0; i<8; i++) {
-        //printf("bit %d: %d  ", i+32, bitTimes[i+33]);
-        if (bitTimes[i+33] > 0) {
-            checkSum |= (1 << (7-i));
-        }
-    }
-   
-    _lastHumidity = (float(currentHumidity) / 10.0);
-    
-    // if first bit of currentTemperature is 1, it is negative value.
-    if ((currentTemperature & 0x8000)==0x8000) {        
-        _lastTemperature = (float(currentTemperature & 0x7FFF) / 10.0) * -1.0;
-    } else {
-        _lastTemperature = float(currentTemperature) / 10.0;
-    }
-
-    // Calculate Check Sum
-    csPart1 = currentHumidity >> 8;
-    csPart2 = currentHumidity & 0xFF;
-    csPart3 = currentTemperature >> 8;
-    csPart4 = currentTemperature & 0xFF;
-    if (checkSum == ((csPart1 + csPart2 + csPart3 + csPart4) & 0xFF)) {
-        _lastReadTime = currentTime;
-        //pc1.printf("OK-->Temperature:%f, Humidity:%f\r\n", _lastTemperature, _lastHumidity);
-        err = DHT_ERROR_NONE;
-    } else {
-        //pc1.printf("DHT22 Checksum error!\n");
-        //pc1.printf("Calculate check sum is %d\n",(csPart1 + csPart2 + csPart3 + csPart4) & 0xFF);
-        //pc1.printf("Reading check sum is %d",checkSum);
-        err = DHT_ERROR_CHECKSUM;
-    }
-    return err;
-}
-
-float DHT22::getTemperatureC() {
-    return _lastTemperature;
-}
-
-float DHT22::getHumidity() {
-    return _lastHumidity;
+/*
+    RHT22.cpp - RHT22 sensor library
+    Developed by HO WING KIT
+    Modifications by Paul Adams
+
+    This library is free software; you can redistribute it and / or
+    modify it under the terms of the GNU Leser General Public
+    License as published by the Free Software Foundation; either
+    version 2.1 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRENTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PATRICULAR PURPOSE.  See the GNU
+    Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public
+    License along with this library; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+
+    Humidity and Temperature Sensor RHT22 info found at
+    http://www.sparkfun.com/products/10167
+    same as RHT03 http://www.humiditycn.com    
+
+    Version 0.1: 8-Jan-2011 by Ho Wing Kit
+    Version 0.2: 29-Mar-2012 by Paul Adams
+    
+    Additional Credit: All the commenters on http://www.sparkfun.com/products/10167
+    
+*/
+
+#include "RHT03.h"
+
+
+// This should be 40, but the sensor is adding an extra bit at the start
+#define RHT03_DATA_BIT_COUNT 41
+
+RHT03::RHT03(PinName Data) {
+
+    _data = Data;                // Set Data Pin
+    _lastReadTime = time(NULL);
+    _lastHumidity = 0;
+    _lastTemperature = RHT03_ERROR_VALUE;
+}
+
+RHT03::~RHT03() {
+}
+
+RHT03_ERROR RHT03::readData() {
+    int i, j, retryCount;
+    int currentTemperature=0;
+    int currentHumidity=0;
+    unsigned int checkSum = 0, csPart1, csPart2, csPart3, csPart4;
+    unsigned int bitTimes[RHT03_DATA_BIT_COUNT];
+    RHT03_ERROR err = RHT_ERROR_NONE;
+    time_t currentTime = time(NULL);
+
+    DigitalInOut  DATA(_data);
+       
+    for (i = 0; i < RHT03_DATA_BIT_COUNT; i++) {
+        bitTimes[i] = 0;
+    }
+    
+   // if (int(currentTime - _lastReadTime) < 2) {        
+   //     printf("RHT22 Error Access Time < 2s");
+   //     err = RHT_ERROR_TOO_QUICK;
+   // }   
+    retryCount = 0;
+    // Pin needs to start HIGH, wait unit it is HIGH with a timeout
+    do {
+        if (retryCount > 125) {
+            //pc1.printf("RHT22 Bus busy!");
+            err = RHT_BUS_HUNG;
+            return err;
+        }
+        retryCount ++;
+        wait_us(2);
+    } while (DATA==0);   // exit on RHT22 return 'High' Signal within 250us
+    
+    // Send the activate pulse
+    // Step 1: MCU send out start signal to RHT22 and RHT22 send
+    //         response signal to MCU.
+    // If always signal high-voltage-level, it means RHT22 is not 
+    // working properly, please check the electrical connection status.
+    //
+    DATA.output(); // set pin to output data
+    DATA = 0;      // MCU send out start signal to RHT22
+    wait_ms(18);   // 18 ms wait (spec: at least 1ms)
+    DATA = 1;      // MCU pull up 
+    wait_us(40);
+    DATA.input();  // set pin to receive data
+    // Find the start of the ACK Pulse
+    retryCount = 0;
+    do {
+        if (retryCount > 40)  { // (Spec is 20-40 us high)
+            //pc1.printf("RHT22 not responding!");
+            err = RHT_ERROR_NOT_PRESENT;
+            return err;
+        }
+        retryCount++;
+        wait_us(1);
+    } while (DATA==1);   // Exit on RHT22 pull low within 40us
+    if (err != RHT_ERROR_NONE) {
+        // initialisation failed
+        return err;    
+    }
+    wait_us(80); // RHT pull up ready to transmit data
+    
+    /*
+    if (DATA == 0) {
+        printf("RHT22 not ready!");
+        err = RHT_ERROR_ACK_TOO_LONG;
+        return err;
+    }
+    */
+    
+    // Reading the 5 byte data stream
+    // Step 2: RHT22 send data to MCU
+    //         Start bit -> low volage within 50us (actually could be anything from 35-75us)
+    //         0         -> high volage within 26-28us (actually could be 10-40us)
+    //         1         -> high volage within 70us (actually could be 60-85us)
+    //         See http://www.sparkfun.com/products/10167#comment-4f118d6e757b7f536e000000
+    
+    
+    for (i = 0; i < 5; i++) {
+        for (j = 0; j < 8; j++) {
+            // Instead of relying on the data sheet, just wait while the RHT03 pin is low
+            retryCount = 0;
+            do {
+                if (retryCount > 75)  {
+                    //pc1.printf("RHT22 timeout waiting for data!");
+                    err = RHT_ERROR_DATA_TIMEOUT;
+                }
+                retryCount++;
+                wait_us(1);
+            } while (DATA == 0);
+            // We now wait for 40us
+            wait_us(40);
+            if (DATA == 1) {  
+                // If pin is still high, bit value is a 1
+                bitTimes[i*8+j] = 1;
+            } else {  
+                // The bit value is a 0
+                bitTimes[i*8+j] = 0;
+            }
+            int count = 0;
+            while (DATA == 1 && count < 100) {  
+                wait_us(1); // Delay for 1 microsecond  
+                count++;  
+            }
+        }
+    }
+    // Re-init RHT22 pin  
+    DATA.output();  
+    DATA = 1;
+
+    // Now bitTimes have the actual bits
+    // that were needed to find the end of each data bit
+    // Note: the bits are offset by one from the data sheet, not sure why
+    currentHumidity    = 0;
+    currentTemperature = 0;
+    checkSum           = 0;
+    // First 16 bits is Humidity
+    for (i=0; i<16; i++) {
+        //printf("bit %d: %d  ", i, bitTimes[i+1]);
+        if (bitTimes[i+1] > 0) {
+            currentHumidity |= ( 1 << (15-i));
+        }
+    }
+    
+    // Second 16 bits is Temperature 
+    for (i=0; i<16; i ++) {
+        //printf("bit %d: %d  ", i+16, bitTimes[i+17]);
+        if (bitTimes[i+17] > 0) {
+            currentTemperature |= (1 <<(15-i));
+        }
+    }
+
+    // Last 8 bit is Checksum
+    for (i=0; i<8; i++) {
+        //printf("bit %d: %d  ", i+32, bitTimes[i+33]);
+        if (bitTimes[i+33] > 0) {
+            checkSum |= (1 << (7-i));
+        }
+    }
+   
+    _lastHumidity = (float(currentHumidity) / 10.0);
+    
+    // if first bit of currentTemperature is 1, it is negative value.
+    if ((currentTemperature & 0x8000)==0x8000) {        
+        _lastTemperature = (float(currentTemperature & 0x7FFF) / 10.0) * -1.0;
+    } else {
+        _lastTemperature = float(currentTemperature) / 10.0;
+    }
+
+    // Calculate Check Sum
+    csPart1 = currentHumidity >> 8;
+    csPart2 = currentHumidity & 0xFF;
+    csPart3 = currentTemperature >> 8;
+    csPart4 = currentTemperature & 0xFF;
+    if (checkSum == ((csPart1 + csPart2 + csPart3 + csPart4) & 0xFF)) {
+        _lastReadTime = currentTime;
+        //pc1.printf("OK-->Temperature:%f, Humidity:%f\r\n", _lastTemperature, _lastHumidity);
+        err = RHT_ERROR_NONE;
+    } else {
+        //pc1.printf("RHT22 Checksum error!\n");
+        //pc1.printf("Calculate check sum is %d\n",(csPart1 + csPart2 + csPart3 + csPart4) & 0xFF);
+        //pc1.printf("Reading check sum is %d",checkSum);
+        err = RHT_ERROR_CHECKSUM;
+    }
+    return err;
+}
+
+float RHT03::getTemperatureC() {
+    return _lastTemperature;
+}
+
+float RHT03::getHumidity() {
+    return _lastHumidity;
 }
\ No newline at end of file