A library for the use of DHT11, a temperature and humidity sensor
Dependents: DHT11_Hello_World IBMIoTClientEthernetExample_W5200 AutoPlants PB_Emma_Ethernet ... more
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++;