Simple library for the DHT11 temperature and humidity sensor. Forked from an existing Mbed DHT11 project.

Dependents:   UoY-DHT11-test

Simple DHT11 temperature and humidity library.

Example usage

#include "mbed.h"
#include "DHT11.h"

DHT11 dht(D8); // Change pin name here if required

main()
{
    printf("T:%d, H:%d\r\n", dht.readTemperature(), dht.readHumidity());
}

The sensor may be read as often as desired, but temperature and humidity values are cached and will only be updated if they are more than 2 seconds old. This is the underlying sensor update rate.

Please note that this project has been modified only enough to make it work for its intended purpose. Various parts of this project still need work, and the source code should not be seen as an example of best practice.

Revision:
9:056d1e9b428c
Parent:
8:160047ca45bf
Child:
10:f0d789f49df7
--- a/DHT11.cpp	Wed Sep 10 18:00:31 2014 +0000
+++ b/DHT11.cpp	Thu Sep 11 13:45:00 2014 +0000
@@ -11,72 +11,77 @@
     io_irq.rise(this, &DHT11::pos_edge);
     io_irq.fall(this, &DHT11::neg_edge);
     io_irq.disable_irq();
-    init();    
+    t.start();
     first_time = true;
 }
 
 // Destructor
 DHT11::~DHT11(void) {}
 
+// Constants
+const int DHT11::t_tol_start = 2;
+const int DHT11::t_tol_pulse = 10;
+
 // Reading the data bits from the DHT11
-int DHT11::readData()
+int DHT11::readData(void)
 {
+    // Checking the measurement frequency
+    if (t.read_ms() < 2000 && first_time == false) {
+        t.reset();
+        return READ_TOO_OFTEN;
+    }
+    
     // Initialize
     init();
 
-    // Checking the measurement frequency
-    if (t.read_ms() < 2000 & first_time == false) {
-        t.reset();
-        return TOO_FAST_READ;
-    }
-
     // Checking the data bus
     if (io == 0) {
-        io.input();
+        t.reset();
         return BUS_BUSY;
     }
 
-    // Sending start signal, low signal for 20 ms
-    io.output();
+    // Sending start signal, low signal for around 10 ms
     t.reset();
-    t.start();
     do {
         io = 0;
-    } while (t.read_ms() < 20);
+    } while (t.read_ms() < 20 + t_tol_start);
     io = 1;
-    io.input();
 
     // Waiting for the start of the response signal
     t.reset();
-    t.start();
     do {
         if (t.read_us() > 100) {
-            io.input();
+            t.reset();
             return NOT_PRESENT;
         }
     } while (io == 1);
 
     // Wainting for the start of the ready signal
     t.reset();
-    t.start();
     do {
         if (t.read_us() > 100) {
-            io.input();
+            t.reset();
             return NOT_READY;
         }
     } while (io == 0);
 
     // Wainting for the end of the ready signal
     t.reset();
-    t.start();
-    do {} while (io == 1);
+    do {
+        if (t.read_us() > 100) {
+            t.reset();
+            return WATCHDOG_ERR;
+        }
+    } while (io == 1);
 
     // Starting the pulse width sensing
+    // by the use of interruptions
     io_irq.enable_irq();
 
     do {
         wait_us(100);
         if (wdt > 50) {
+            t.reset();
             return WATCHDOG_ERR;
         }
         wdt++;
@@ -87,7 +92,9 @@
              + ((data & 0x00ff000000) >> 24)
              + ((data & 0x0000ff0000) >> 16)
              + ((data & 0x000000ff00) >> 8);
+
     if (chksum != (data & 0x00000000ff)) {
+        t.reset();
         return CHKSUM_ERR;
     } else {
         t.reset();
@@ -97,23 +104,15 @@
 }
 
 // Extracting humidity data from the received data
-int DHT11::readHumidity()
+int DHT11::readHumidity(void)
 {
-    if (err == OK) {
-        return (data & 0xff00000000) >> 32;
-    } else {
-        return 0xffffffff;
-    }
+    return (data & 0xff00000000) >> 32;
 }
 
 // Extracting temperature data from the received data
-int DHT11::readTemperature()
+int DHT11::readTemperature(void)
 {
-    if (err == OK) {
-        return (data & 0x0000ff0000) >> 16;
-    } else {
-        return 0xffffffff;
-    }
+    return (data & 0x0000ff0000) >> 16;
 }
 
 // Initialization of variables
@@ -124,8 +123,8 @@
     chksum = 0;
     cnt = 0;
     wdt = 0;
-    err = OK;
     eod = false;
+    t.reset();
 }
 
 void DHT11::pos_edge(void)
@@ -148,8 +147,8 @@
     // Reading the positive pulse width
     t_pulse_us = t.read_us();
 
-    // Detecting 0 if the pulse width ranges from 20 us to 30 us
-    if (20 <= t_pulse_us && t_pulse_us <= 30) {
+    // Detecting 0 if the pulse width ranges around 25 us
+    if (25 - t_tol_pulse <= t_pulse_us && t_pulse_us <= 30 + t_tol_pulse) {
         // Shifting the data buffer and not adding 1 (because this bit is zero)
         data = data << 1;
 
@@ -157,8 +156,8 @@
         cnt++;
     }
 
-    // Detecting 1 if the pulse width ranges from 60 us to 80 us
-    else if (60 <= t_pulse_us && t_pulse_us <= 80) {
+    // Detecting 1 if the pulse width ranges from 70 us
+    else if (70 - t_tol_pulse <= t_pulse_us && t_pulse_us <= 70 + t_tol_pulse) {
         // Shifting the data buffer and adding 1 (because this bit is one)
         data = data << 1;
         data++;