A library for the use of DHT11, a temperature and humidity sensor

Fork of DHT11 by Shigenori Inoue

Committer:
pwrbhaskar
Date:
Thu Oct 15 01:11:24 2015 +0000
Revision:
12:a5d0f8c8d1e0
h

Who changed what in which revision?

UserRevisionLine numberNew contents of line
pwrbhaskar 12:a5d0f8c8d1e0 1 /* Copyright (c) 2014 Shigenori Inoue, MIT License
pwrbhaskar 12:a5d0f8c8d1e0 2 *
pwrbhaskar 12:a5d0f8c8d1e0 3 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
pwrbhaskar 12:a5d0f8c8d1e0 4 * and associated documentation files (the "Software"), to deal in the Software without restriction,
pwrbhaskar 12:a5d0f8c8d1e0 5 * including without limitation the rights to use, copy, modify, merge, publish, distribute,
pwrbhaskar 12:a5d0f8c8d1e0 6 * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
pwrbhaskar 12:a5d0f8c8d1e0 7 * furnished to do so, subject to the following conditions:
pwrbhaskar 12:a5d0f8c8d1e0 8 *
pwrbhaskar 12:a5d0f8c8d1e0 9 * The above copyright notice and this permission notice shall be included in all copies or
pwrbhaskar 12:a5d0f8c8d1e0 10 * substantial portions of the Software.
pwrbhaskar 12:a5d0f8c8d1e0 11 *
pwrbhaskar 12:a5d0f8c8d1e0 12 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
pwrbhaskar 12:a5d0f8c8d1e0 13 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
pwrbhaskar 12:a5d0f8c8d1e0 14 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
pwrbhaskar 12:a5d0f8c8d1e0 15 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
pwrbhaskar 12:a5d0f8c8d1e0 16 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
pwrbhaskar 12:a5d0f8c8d1e0 17 */
pwrbhaskar 12:a5d0f8c8d1e0 18
pwrbhaskar 12:a5d0f8c8d1e0 19 #include "DHT11.h"
pwrbhaskar 12:a5d0f8c8d1e0 20
pwrbhaskar 12:a5d0f8c8d1e0 21 // Constructor
pwrbhaskar 12:a5d0f8c8d1e0 22 DHT11::DHT11(PinName pin) : io(pin, PIN_INPUT, OpenDrain, 1), io_irq(pin)
pwrbhaskar 12:a5d0f8c8d1e0 23 {
pwrbhaskar 12:a5d0f8c8d1e0 24 io_irq.rise(this, &DHT11::pos_edge);
pwrbhaskar 12:a5d0f8c8d1e0 25 io_irq.fall(this, &DHT11::neg_edge);
pwrbhaskar 12:a5d0f8c8d1e0 26 io_irq.disable_irq();
pwrbhaskar 12:a5d0f8c8d1e0 27 t.start();
pwrbhaskar 12:a5d0f8c8d1e0 28 first_time = true;
pwrbhaskar 12:a5d0f8c8d1e0 29 }
pwrbhaskar 12:a5d0f8c8d1e0 30
pwrbhaskar 12:a5d0f8c8d1e0 31 // Destructor
pwrbhaskar 12:a5d0f8c8d1e0 32 DHT11::~DHT11(void) {}
pwrbhaskar 12:a5d0f8c8d1e0 33
pwrbhaskar 12:a5d0f8c8d1e0 34 // Constants
pwrbhaskar 12:a5d0f8c8d1e0 35 const int DHT11::t_tol_start = 2;
pwrbhaskar 12:a5d0f8c8d1e0 36 const int DHT11::t_tol_pulse = 10;
pwrbhaskar 12:a5d0f8c8d1e0 37
pwrbhaskar 12:a5d0f8c8d1e0 38 // Reading the data bits from the DHT11
pwrbhaskar 12:a5d0f8c8d1e0 39 int DHT11::readData(void)
pwrbhaskar 12:a5d0f8c8d1e0 40 {
pwrbhaskar 12:a5d0f8c8d1e0 41 // Checking the measurement frequency
pwrbhaskar 12:a5d0f8c8d1e0 42 if (t.read_ms() < 2000 && first_time == false) {
pwrbhaskar 12:a5d0f8c8d1e0 43 t.reset();
pwrbhaskar 12:a5d0f8c8d1e0 44 return READ_TOO_OFTEN;
pwrbhaskar 12:a5d0f8c8d1e0 45 }
pwrbhaskar 12:a5d0f8c8d1e0 46
pwrbhaskar 12:a5d0f8c8d1e0 47 // Initialize
pwrbhaskar 12:a5d0f8c8d1e0 48 init();
pwrbhaskar 12:a5d0f8c8d1e0 49
pwrbhaskar 12:a5d0f8c8d1e0 50 // Checking the data bus
pwrbhaskar 12:a5d0f8c8d1e0 51 if (io == 0) {
pwrbhaskar 12:a5d0f8c8d1e0 52 t.reset();
pwrbhaskar 12:a5d0f8c8d1e0 53 return BUS_BUSY;
pwrbhaskar 12:a5d0f8c8d1e0 54 }
pwrbhaskar 12:a5d0f8c8d1e0 55
pwrbhaskar 12:a5d0f8c8d1e0 56 // Sending start signal, low signal for around 10 ms
pwrbhaskar 12:a5d0f8c8d1e0 57 t.reset();
pwrbhaskar 12:a5d0f8c8d1e0 58 io.output();
pwrbhaskar 12:a5d0f8c8d1e0 59 io = 0;
pwrbhaskar 12:a5d0f8c8d1e0 60 do {
pwrbhaskar 12:a5d0f8c8d1e0 61 } while (t.read_ms() < 20 + t_tol_start);
pwrbhaskar 12:a5d0f8c8d1e0 62 io.input();
pwrbhaskar 12:a5d0f8c8d1e0 63 io = 1;
pwrbhaskar 12:a5d0f8c8d1e0 64
pwrbhaskar 12:a5d0f8c8d1e0 65
pwrbhaskar 12:a5d0f8c8d1e0 66 // Waiting for the start of the response signal
pwrbhaskar 12:a5d0f8c8d1e0 67 t.reset();
pwrbhaskar 12:a5d0f8c8d1e0 68 do {
pwrbhaskar 12:a5d0f8c8d1e0 69 if (t.read_us() > 100) {
pwrbhaskar 12:a5d0f8c8d1e0 70 t.reset();
pwrbhaskar 12:a5d0f8c8d1e0 71 return NOT_PRESENT;
pwrbhaskar 12:a5d0f8c8d1e0 72 }
pwrbhaskar 12:a5d0f8c8d1e0 73 } while (io == 1);
pwrbhaskar 12:a5d0f8c8d1e0 74
pwrbhaskar 12:a5d0f8c8d1e0 75 // Wainting for the start of the ready signal
pwrbhaskar 12:a5d0f8c8d1e0 76 t.reset();
pwrbhaskar 12:a5d0f8c8d1e0 77 do {
pwrbhaskar 12:a5d0f8c8d1e0 78 if (t.read_us() > 100) {
pwrbhaskar 12:a5d0f8c8d1e0 79 t.reset();
pwrbhaskar 12:a5d0f8c8d1e0 80 return NOT_READY;
pwrbhaskar 12:a5d0f8c8d1e0 81 }
pwrbhaskar 12:a5d0f8c8d1e0 82 } while (io == 0);
pwrbhaskar 12:a5d0f8c8d1e0 83
pwrbhaskar 12:a5d0f8c8d1e0 84 // Wainting for the end of the ready signal
pwrbhaskar 12:a5d0f8c8d1e0 85 t.reset();
pwrbhaskar 12:a5d0f8c8d1e0 86 do {
pwrbhaskar 12:a5d0f8c8d1e0 87 if (t.read_us() > 100) {
pwrbhaskar 12:a5d0f8c8d1e0 88 t.reset();
pwrbhaskar 12:a5d0f8c8d1e0 89 return WATCHDOG_ERR;
pwrbhaskar 12:a5d0f8c8d1e0 90 }
pwrbhaskar 12:a5d0f8c8d1e0 91 } while (io == 1);
pwrbhaskar 12:a5d0f8c8d1e0 92
pwrbhaskar 12:a5d0f8c8d1e0 93 // Starting the pulse width sensing
pwrbhaskar 12:a5d0f8c8d1e0 94 // by the use of interruptions
pwrbhaskar 12:a5d0f8c8d1e0 95 io_irq.enable_irq();
pwrbhaskar 12:a5d0f8c8d1e0 96
pwrbhaskar 12:a5d0f8c8d1e0 97 do {
pwrbhaskar 12:a5d0f8c8d1e0 98 wait_us(100);
pwrbhaskar 12:a5d0f8c8d1e0 99 if (wdt > 50) {
pwrbhaskar 12:a5d0f8c8d1e0 100 t.reset();
pwrbhaskar 12:a5d0f8c8d1e0 101 return WATCHDOG_ERR;
pwrbhaskar 12:a5d0f8c8d1e0 102 }
pwrbhaskar 12:a5d0f8c8d1e0 103 wdt++;
pwrbhaskar 12:a5d0f8c8d1e0 104 } while (eod == false);
pwrbhaskar 12:a5d0f8c8d1e0 105
pwrbhaskar 12:a5d0f8c8d1e0 106 // Calculating the check sum
pwrbhaskar 12:a5d0f8c8d1e0 107 chksum = ((data & 0xff00000000) >> 32)
pwrbhaskar 12:a5d0f8c8d1e0 108 + ((data & 0x00ff000000) >> 24)
pwrbhaskar 12:a5d0f8c8d1e0 109 + ((data & 0x0000ff0000) >> 16)
pwrbhaskar 12:a5d0f8c8d1e0 110 + ((data & 0x000000ff00) >> 8);
pwrbhaskar 12:a5d0f8c8d1e0 111
pwrbhaskar 12:a5d0f8c8d1e0 112 if (chksum != (data & 0x00000000ff)) {
pwrbhaskar 12:a5d0f8c8d1e0 113 t.reset();
pwrbhaskar 12:a5d0f8c8d1e0 114 return CHKSUM_ERR;
pwrbhaskar 12:a5d0f8c8d1e0 115 } else {
pwrbhaskar 12:a5d0f8c8d1e0 116 t.reset();
pwrbhaskar 12:a5d0f8c8d1e0 117 first_time = false;
pwrbhaskar 12:a5d0f8c8d1e0 118 return OK;
pwrbhaskar 12:a5d0f8c8d1e0 119 }
pwrbhaskar 12:a5d0f8c8d1e0 120 }
pwrbhaskar 12:a5d0f8c8d1e0 121
pwrbhaskar 12:a5d0f8c8d1e0 122 // Extracting humidity data from the received data
pwrbhaskar 12:a5d0f8c8d1e0 123 int DHT11::readHumidity(void)
pwrbhaskar 12:a5d0f8c8d1e0 124 {
pwrbhaskar 12:a5d0f8c8d1e0 125 return (data & 0xff00000000) >> 32;
pwrbhaskar 12:a5d0f8c8d1e0 126 }
pwrbhaskar 12:a5d0f8c8d1e0 127
pwrbhaskar 12:a5d0f8c8d1e0 128 // Extracting temperature data from the received data
pwrbhaskar 12:a5d0f8c8d1e0 129 int DHT11::readTemperature(void)
pwrbhaskar 12:a5d0f8c8d1e0 130 {
pwrbhaskar 12:a5d0f8c8d1e0 131 return (data & 0x0000ff0000) >> 16;
pwrbhaskar 12:a5d0f8c8d1e0 132 }
pwrbhaskar 12:a5d0f8c8d1e0 133
pwrbhaskar 12:a5d0f8c8d1e0 134 // Initialization of variables
pwrbhaskar 12:a5d0f8c8d1e0 135 void DHT11::init(void)
pwrbhaskar 12:a5d0f8c8d1e0 136 {
pwrbhaskar 12:a5d0f8c8d1e0 137 t_pulse_us = 0;
pwrbhaskar 12:a5d0f8c8d1e0 138 data = 0;
pwrbhaskar 12:a5d0f8c8d1e0 139 chksum = 0;
pwrbhaskar 12:a5d0f8c8d1e0 140 cnt = 0;
pwrbhaskar 12:a5d0f8c8d1e0 141 wdt = 0;
pwrbhaskar 12:a5d0f8c8d1e0 142 eod = false;
pwrbhaskar 12:a5d0f8c8d1e0 143 t.reset();
pwrbhaskar 12:a5d0f8c8d1e0 144 }
pwrbhaskar 12:a5d0f8c8d1e0 145
pwrbhaskar 12:a5d0f8c8d1e0 146 void DHT11::pos_edge(void)
pwrbhaskar 12:a5d0f8c8d1e0 147 {
pwrbhaskar 12:a5d0f8c8d1e0 148 // Disabling the interruptions
pwrbhaskar 12:a5d0f8c8d1e0 149 io_irq.disable_irq();
pwrbhaskar 12:a5d0f8c8d1e0 150
pwrbhaskar 12:a5d0f8c8d1e0 151 // Initializing the Timer
pwrbhaskar 12:a5d0f8c8d1e0 152 t.reset();
pwrbhaskar 12:a5d0f8c8d1e0 153
pwrbhaskar 12:a5d0f8c8d1e0 154 // Enabling the interruptions
pwrbhaskar 12:a5d0f8c8d1e0 155 io_irq.enable_irq();
pwrbhaskar 12:a5d0f8c8d1e0 156 }
pwrbhaskar 12:a5d0f8c8d1e0 157
pwrbhaskar 12:a5d0f8c8d1e0 158 void DHT11::neg_edge(void)
pwrbhaskar 12:a5d0f8c8d1e0 159 {
pwrbhaskar 12:a5d0f8c8d1e0 160 // Disabling the interruptions
pwrbhaskar 12:a5d0f8c8d1e0 161 io_irq.disable_irq();
pwrbhaskar 12:a5d0f8c8d1e0 162
pwrbhaskar 12:a5d0f8c8d1e0 163 // Reading the positive pulse width
pwrbhaskar 12:a5d0f8c8d1e0 164 t_pulse_us = t.read_us();
pwrbhaskar 12:a5d0f8c8d1e0 165
pwrbhaskar 12:a5d0f8c8d1e0 166 // Detecting 0 if the pulse width ranges around 25 us
pwrbhaskar 12:a5d0f8c8d1e0 167 if (25 - t_tol_pulse <= t_pulse_us && t_pulse_us <= 30 + t_tol_pulse) {
pwrbhaskar 12:a5d0f8c8d1e0 168 // Shifting the data buffer and not adding 1 (because this bit is zero)
pwrbhaskar 12:a5d0f8c8d1e0 169 data = data << 1;
pwrbhaskar 12:a5d0f8c8d1e0 170
pwrbhaskar 12:a5d0f8c8d1e0 171 // Counting up the bits
pwrbhaskar 12:a5d0f8c8d1e0 172 cnt++;
pwrbhaskar 12:a5d0f8c8d1e0 173 }
pwrbhaskar 12:a5d0f8c8d1e0 174
pwrbhaskar 12:a5d0f8c8d1e0 175 // Detecting 1 if the pulse width ranges from 70 us
pwrbhaskar 12:a5d0f8c8d1e0 176 else if (70 - t_tol_pulse <= t_pulse_us && t_pulse_us <= 70 + t_tol_pulse) {
pwrbhaskar 12:a5d0f8c8d1e0 177 // Shifting the data buffer and adding 1 (because this bit is one)
pwrbhaskar 12:a5d0f8c8d1e0 178 data = data << 1;
pwrbhaskar 12:a5d0f8c8d1e0 179 data++;
pwrbhaskar 12:a5d0f8c8d1e0 180
pwrbhaskar 12:a5d0f8c8d1e0 181 // Counting up the bits
pwrbhaskar 12:a5d0f8c8d1e0 182 cnt++;
pwrbhaskar 12:a5d0f8c8d1e0 183 }
pwrbhaskar 12:a5d0f8c8d1e0 184
pwrbhaskar 12:a5d0f8c8d1e0 185 // Detecting the end of Data
pwrbhaskar 12:a5d0f8c8d1e0 186 if (cnt < 40) {
pwrbhaskar 12:a5d0f8c8d1e0 187 // Enabling the interruptions
pwrbhaskar 12:a5d0f8c8d1e0 188 io_irq.enable_irq();
pwrbhaskar 12:a5d0f8c8d1e0 189 } else {
pwrbhaskar 12:a5d0f8c8d1e0 190 eod = true;
pwrbhaskar 12:a5d0f8c8d1e0 191 }
pwrbhaskar 12:a5d0f8c8d1e0 192 }