Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Diff: DHT11.cpp
- 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++;