A library for the use of AM2303 (a.k.a. DHT22), a temperature and humidity sensor.
Dependents: AM2303_Hello_World
Fork of DHT11 by
Diff: DHT11.cpp
- Revision:
- 12:1ad0612823e9
- Parent:
- 11:e91c151d1798
--- a/DHT11.cpp Thu Sep 25 14:13:10 2014 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,192 +0,0 @@ -/* Copyright (c) 2014 Shigenori Inoue, MIT License - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of this software - * and associated documentation files (the "Software"), to deal in the Software without restriction, - * including without limitation the rights to use, copy, modify, merge, publish, distribute, - * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all copies or - * substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING - * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, - * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#include "DHT11.h" - -// Constructor -DHT11::DHT11(PinName pin) : io(pin, PIN_INPUT, OpenDrain, 1), io_irq(pin) -{ - io_irq.rise(this, &DHT11::pos_edge); - io_irq.fall(this, &DHT11::neg_edge); - io_irq.disable_irq(); - 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(void) -{ - // Checking the measurement frequency - if (t.read_ms() < 2000 && first_time == false) { - t.reset(); - return READ_TOO_OFTEN; - } - - // Initialize - init(); - - // Checking the data bus - if (io == 0) { - t.reset(); - return BUS_BUSY; - } - - // Sending start signal, low signal for around 10 ms - t.reset(); - io.output(); - io = 0; - do { - } while (t.read_ms() < 20 + t_tol_start); - io.input(); - io = 1; - - - // Waiting for the start of the response signal - t.reset(); - do { - if (t.read_us() > 100) { - t.reset(); - return NOT_PRESENT; - } - } while (io == 1); - - // Wainting for the start of the ready signal - t.reset(); - do { - if (t.read_us() > 100) { - t.reset(); - return NOT_READY; - } - } while (io == 0); - - // Wainting for the end of the ready signal - t.reset(); - 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++; - } while (eod == false); - - // Calculating the check sum - chksum = ((data & 0xff00000000) >> 32) - + ((data & 0x00ff000000) >> 24) - + ((data & 0x0000ff0000) >> 16) - + ((data & 0x000000ff00) >> 8); - - if (chksum != (data & 0x00000000ff)) { - t.reset(); - return CHKSUM_ERR; - } else { - t.reset(); - first_time = false; - return OK; - } -} - -// Extracting humidity data from the received data -int DHT11::readHumidity(void) -{ - return (data & 0xff00000000) >> 32; -} - -// Extracting temperature data from the received data -int DHT11::readTemperature(void) -{ - return (data & 0x0000ff0000) >> 16; -} - -// Initialization of variables -void DHT11::init(void) -{ - t_pulse_us = 0; - data = 0; - chksum = 0; - cnt = 0; - wdt = 0; - eod = false; - t.reset(); -} - -void DHT11::pos_edge(void) -{ - // Disabling the interruptions - io_irq.disable_irq(); - - // Initializing the Timer - t.reset(); - - // Enabling the interruptions - io_irq.enable_irq(); -} - -void DHT11::neg_edge(void) -{ - // Disabling the interruptions - io_irq.disable_irq(); - - // Reading the positive pulse width - t_pulse_us = t.read_us(); - - // 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; - - // Counting up the bits - cnt++; - } - - // 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++; - - // Counting up the bits - cnt++; - } - - // Detecting the end of Data - if (cnt < 40) { - // Enabling the interruptions - io_irq.enable_irq(); - } else { - eod = true; - } -} \ No newline at end of file