DHT22_Fail

Dependencies:   mbed

Committer:
binoit
Date:
Tue Sep 18 09:16:00 2018 +0000
Revision:
0:b8130f9ba1c3
Test_DHT22_fail

Who changed what in which revision?

UserRevisionLine numberNew contents of line
binoit 0:b8130f9ba1c3 1 /*
binoit 0:b8130f9ba1c3 2 * DHT Library for Digital-output Humidity and Temperature sensors
binoit 0:b8130f9ba1c3 3 *
binoit 0:b8130f9ba1c3 4 * Works with DHT11, DHT22
binoit 0:b8130f9ba1c3 5 * SEN11301P, Grove - Temperature&Humidity Sensor (Seeed Studio)
binoit 0:b8130f9ba1c3 6 * SEN51035P, Grove - Temperature&Humidity Sensor Pro (Seeed Studio)
binoit 0:b8130f9ba1c3 7 * AM2302 , temperature-humidity sensor
binoit 0:b8130f9ba1c3 8 * HM2303 , Digital-output humidity and temperature sensor
binoit 0:b8130f9ba1c3 9 *
binoit 0:b8130f9ba1c3 10 * Copyright (C) Wim De Roeve
binoit 0:b8130f9ba1c3 11 * based on DHT22 sensor library by HO WING KIT
binoit 0:b8130f9ba1c3 12 * Arduino DHT11 library
binoit 0:b8130f9ba1c3 13 *
binoit 0:b8130f9ba1c3 14 * Permission is hereby granted, free of charge, to any person obtaining a copy
binoit 0:b8130f9ba1c3 15 * of this software and associated documnetation files (the "Software"), to deal
binoit 0:b8130f9ba1c3 16 * in the Software without restriction, including without limitation the rights
binoit 0:b8130f9ba1c3 17 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
binoit 0:b8130f9ba1c3 18 * copies of the Software, and to permit persons to whom the Software is
binoit 0:b8130f9ba1c3 19 * furished to do so, subject to the following conditions:
binoit 0:b8130f9ba1c3 20 *
binoit 0:b8130f9ba1c3 21 * The above copyright notice and this permission notice shall be included in
binoit 0:b8130f9ba1c3 22 * all copies or substantial portions of the Software.
binoit 0:b8130f9ba1c3 23 *
binoit 0:b8130f9ba1c3 24 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
binoit 0:b8130f9ba1c3 25 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
binoit 0:b8130f9ba1c3 26 * FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
binoit 0:b8130f9ba1c3 27 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
binoit 0:b8130f9ba1c3 28 * LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
binoit 0:b8130f9ba1c3 29 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
binoit 0:b8130f9ba1c3 30 * THE SOFTWARE.
binoit 0:b8130f9ba1c3 31 */
binoit 0:b8130f9ba1c3 32
binoit 0:b8130f9ba1c3 33 #include "DHT.h"
binoit 0:b8130f9ba1c3 34
binoit 0:b8130f9ba1c3 35 #define DHT_DATA_BIT_COUNT 41
binoit 0:b8130f9ba1c3 36
binoit 0:b8130f9ba1c3 37 DHT::DHT(PinName pin,int DHTtype) {
binoit 0:b8130f9ba1c3 38 _pin = pin;
binoit 0:b8130f9ba1c3 39 _DHTtype = DHTtype;
binoit 0:b8130f9ba1c3 40 _firsttime=true;
binoit 0:b8130f9ba1c3 41 }
binoit 0:b8130f9ba1c3 42
binoit 0:b8130f9ba1c3 43 DHT::~DHT() {
binoit 0:b8130f9ba1c3 44 }
binoit 0:b8130f9ba1c3 45
binoit 0:b8130f9ba1c3 46 int DHT::readData() {
binoit 0:b8130f9ba1c3 47 int i, j, retryCount,b;
binoit 0:b8130f9ba1c3 48 unsigned int bitTimes[DHT_DATA_BIT_COUNT];
binoit 0:b8130f9ba1c3 49
binoit 0:b8130f9ba1c3 50 eError err = ERROR_NONE;
binoit 0:b8130f9ba1c3 51 time_t currentTime = time(NULL);
binoit 0:b8130f9ba1c3 52
binoit 0:b8130f9ba1c3 53 DigitalInOut DHT_io(_pin);
binoit 0:b8130f9ba1c3 54
binoit 0:b8130f9ba1c3 55 for (i = 0; i < DHT_DATA_BIT_COUNT; i++) {
binoit 0:b8130f9ba1c3 56 bitTimes[i] = 0;
binoit 0:b8130f9ba1c3 57 }
binoit 0:b8130f9ba1c3 58
binoit 0:b8130f9ba1c3 59 if (!_firsttime) {
binoit 0:b8130f9ba1c3 60 if (int(currentTime - _lastReadTime) < 2) {
binoit 0:b8130f9ba1c3 61 err = ERROR_NO_PATIENCE;
binoit 0:b8130f9ba1c3 62 return err;
binoit 0:b8130f9ba1c3 63 }
binoit 0:b8130f9ba1c3 64 } else {
binoit 0:b8130f9ba1c3 65 _firsttime=false;
binoit 0:b8130f9ba1c3 66 _lastReadTime=currentTime;
binoit 0:b8130f9ba1c3 67 }
binoit 0:b8130f9ba1c3 68 retryCount = 0;
binoit 0:b8130f9ba1c3 69
binoit 0:b8130f9ba1c3 70 do {
binoit 0:b8130f9ba1c3 71 if (retryCount > 125) {
binoit 0:b8130f9ba1c3 72 err = BUS_BUSY;
binoit 0:b8130f9ba1c3 73 return err;
binoit 0:b8130f9ba1c3 74 }
binoit 0:b8130f9ba1c3 75 retryCount ++;
binoit 0:b8130f9ba1c3 76 wait_us(2);
binoit 0:b8130f9ba1c3 77 } while ((DHT_io==0));
binoit 0:b8130f9ba1c3 78
binoit 0:b8130f9ba1c3 79
binoit 0:b8130f9ba1c3 80 DHT_io.output();
binoit 0:b8130f9ba1c3 81 DHT_io = 0;
binoit 0:b8130f9ba1c3 82 wait_ms(18);
binoit 0:b8130f9ba1c3 83 DHT_io = 1;
binoit 0:b8130f9ba1c3 84 wait_us(40);
binoit 0:b8130f9ba1c3 85 DHT_io.input();
binoit 0:b8130f9ba1c3 86
binoit 0:b8130f9ba1c3 87 retryCount = 0;
binoit 0:b8130f9ba1c3 88 do {
binoit 0:b8130f9ba1c3 89 if (retryCount > 40) {
binoit 0:b8130f9ba1c3 90 err = ERROR_NOT_PRESENT;
binoit 0:b8130f9ba1c3 91 return err;
binoit 0:b8130f9ba1c3 92 }
binoit 0:b8130f9ba1c3 93 retryCount++;
binoit 0:b8130f9ba1c3 94 wait_us(1);
binoit 0:b8130f9ba1c3 95 } while ((DHT_io==1));
binoit 0:b8130f9ba1c3 96
binoit 0:b8130f9ba1c3 97 if (err != ERROR_NONE) {
binoit 0:b8130f9ba1c3 98 return err;
binoit 0:b8130f9ba1c3 99 }
binoit 0:b8130f9ba1c3 100
binoit 0:b8130f9ba1c3 101 wait_us(80);
binoit 0:b8130f9ba1c3 102
binoit 0:b8130f9ba1c3 103 for (i = 0; i < 5; i++) {
binoit 0:b8130f9ba1c3 104 for (j = 0; j < 8; j++) {
binoit 0:b8130f9ba1c3 105
binoit 0:b8130f9ba1c3 106 retryCount = 0;
binoit 0:b8130f9ba1c3 107 do {
binoit 0:b8130f9ba1c3 108 if (retryCount > 75) {
binoit 0:b8130f9ba1c3 109 err = ERROR_DATA_TIMEOUT;
binoit 0:b8130f9ba1c3 110 return err;
binoit 0:b8130f9ba1c3 111 }
binoit 0:b8130f9ba1c3 112 retryCount++;
binoit 0:b8130f9ba1c3 113 wait_us(1);
binoit 0:b8130f9ba1c3 114 } while (DHT_io == 0);
binoit 0:b8130f9ba1c3 115 wait_us(40);
binoit 0:b8130f9ba1c3 116 bitTimes[i*8+j]=DHT_io;
binoit 0:b8130f9ba1c3 117
binoit 0:b8130f9ba1c3 118 int count = 0;
binoit 0:b8130f9ba1c3 119 while (DHT_io == 1 && count < 100) {
binoit 0:b8130f9ba1c3 120 wait_us(1);
binoit 0:b8130f9ba1c3 121 count++;
binoit 0:b8130f9ba1c3 122 }
binoit 0:b8130f9ba1c3 123 }
binoit 0:b8130f9ba1c3 124 }
binoit 0:b8130f9ba1c3 125 DHT_io.output();
binoit 0:b8130f9ba1c3 126 DHT_io = 1;
binoit 0:b8130f9ba1c3 127 for (i = 0; i < 5; i++) {
binoit 0:b8130f9ba1c3 128 b=0;
binoit 0:b8130f9ba1c3 129 for (j=0; j<8; j++) {
binoit 0:b8130f9ba1c3 130 if (bitTimes[i*8+j+1] > 0) {
binoit 0:b8130f9ba1c3 131 b |= ( 1 << (7-j));
binoit 0:b8130f9ba1c3 132 }
binoit 0:b8130f9ba1c3 133 }
binoit 0:b8130f9ba1c3 134 DHT_data[i]=b;
binoit 0:b8130f9ba1c3 135 }
binoit 0:b8130f9ba1c3 136
binoit 0:b8130f9ba1c3 137 if (DHT_data[4] == ((DHT_data[0] + DHT_data[1] + DHT_data[2] + DHT_data[3]) & 0xFF)) {
binoit 0:b8130f9ba1c3 138 _lastReadTime = currentTime;
binoit 0:b8130f9ba1c3 139 _lastTemperature=CalcTemperature();
binoit 0:b8130f9ba1c3 140 _lastHumidity=CalcHumidity();
binoit 0:b8130f9ba1c3 141
binoit 0:b8130f9ba1c3 142 } else {
binoit 0:b8130f9ba1c3 143 err = ERROR_CHECKSUM;
binoit 0:b8130f9ba1c3 144 }
binoit 0:b8130f9ba1c3 145
binoit 0:b8130f9ba1c3 146 return err;
binoit 0:b8130f9ba1c3 147
binoit 0:b8130f9ba1c3 148 }
binoit 0:b8130f9ba1c3 149
binoit 0:b8130f9ba1c3 150 float DHT::CalcTemperature() {
binoit 0:b8130f9ba1c3 151 int v;
binoit 0:b8130f9ba1c3 152
binoit 0:b8130f9ba1c3 153 switch (_DHTtype) {
binoit 0:b8130f9ba1c3 154 case DHT11:
binoit 0:b8130f9ba1c3 155 v = DHT_data[2];
binoit 0:b8130f9ba1c3 156 return float(v);
binoit 0:b8130f9ba1c3 157 case DHT22:
binoit 0:b8130f9ba1c3 158 v = DHT_data[2] & 0x7F;
binoit 0:b8130f9ba1c3 159 v *= 256;
binoit 0:b8130f9ba1c3 160 v += DHT_data[3];
binoit 0:b8130f9ba1c3 161 v /= 10;
binoit 0:b8130f9ba1c3 162 if (DHT_data[2] & 0x80)
binoit 0:b8130f9ba1c3 163 v *= -1;
binoit 0:b8130f9ba1c3 164 return float(v);
binoit 0:b8130f9ba1c3 165 }
binoit 0:b8130f9ba1c3 166 return 0;
binoit 0:b8130f9ba1c3 167 }
binoit 0:b8130f9ba1c3 168
binoit 0:b8130f9ba1c3 169 float DHT::ReadHumidity() {
binoit 0:b8130f9ba1c3 170 return _lastHumidity;
binoit 0:b8130f9ba1c3 171 }
binoit 0:b8130f9ba1c3 172
binoit 0:b8130f9ba1c3 173 float DHT::ConvertCelciustoFarenheit(float celsius) {
binoit 0:b8130f9ba1c3 174 return celsius * 9 / 5 + 32;
binoit 0:b8130f9ba1c3 175 }
binoit 0:b8130f9ba1c3 176
binoit 0:b8130f9ba1c3 177 float DHT::ConvertCelciustoKelvin(float celsius) {
binoit 0:b8130f9ba1c3 178 return celsius + 273.15;
binoit 0:b8130f9ba1c3 179 }
binoit 0:b8130f9ba1c3 180
binoit 0:b8130f9ba1c3 181 // dewPoint function NOAA
binoit 0:b8130f9ba1c3 182 // reference: http://wahiduddin.net/calc/density_algorithms.htm
binoit 0:b8130f9ba1c3 183 float DHT::CalcdewPoint(float celsius, float humidity) {
binoit 0:b8130f9ba1c3 184 float A0= 373.15/(273.15 + celsius);
binoit 0:b8130f9ba1c3 185 float SUM = -7.90298 * (A0-1);
binoit 0:b8130f9ba1c3 186 SUM += 5.02808 * log10(A0);
binoit 0:b8130f9ba1c3 187 SUM += -1.3816e-7 * (pow(10, (11.344*(1-1/A0)))-1) ;
binoit 0:b8130f9ba1c3 188 SUM += 8.1328e-3 * (pow(10,(-3.49149*(A0-1)))-1) ;
binoit 0:b8130f9ba1c3 189 SUM += log10(1013.246);
binoit 0:b8130f9ba1c3 190 float VP = pow(10, SUM-3) * humidity;
binoit 0:b8130f9ba1c3 191 float T = log(VP/0.61078); // temp var
binoit 0:b8130f9ba1c3 192 return (241.88 * T) / (17.558-T);
binoit 0:b8130f9ba1c3 193 }
binoit 0:b8130f9ba1c3 194
binoit 0:b8130f9ba1c3 195 // delta max = 0.6544 wrt dewPoint()
binoit 0:b8130f9ba1c3 196 // 5x faster than dewPoint()
binoit 0:b8130f9ba1c3 197 // reference: http://en.wikipedia.org/wiki/Dew_point
binoit 0:b8130f9ba1c3 198 float DHT::CalcdewPointFast(float celsius, float humidity)
binoit 0:b8130f9ba1c3 199 {
binoit 0:b8130f9ba1c3 200 float a = 17.271;
binoit 0:b8130f9ba1c3 201 float b = 237.7;
binoit 0:b8130f9ba1c3 202 float temp = (a * celsius) / (b + celsius) + log(humidity/100);
binoit 0:b8130f9ba1c3 203 float Td = (b * temp) / (a - temp);
binoit 0:b8130f9ba1c3 204 return Td;
binoit 0:b8130f9ba1c3 205 }
binoit 0:b8130f9ba1c3 206
binoit 0:b8130f9ba1c3 207 float DHT::ReadTemperature(eScale Scale) {
binoit 0:b8130f9ba1c3 208 if (Scale == FARENHEIT)
binoit 0:b8130f9ba1c3 209 return ConvertCelciustoFarenheit(_lastTemperature);
binoit 0:b8130f9ba1c3 210 else if (Scale == KELVIN)
binoit 0:b8130f9ba1c3 211 return ConvertCelciustoKelvin(_lastTemperature);
binoit 0:b8130f9ba1c3 212 else
binoit 0:b8130f9ba1c3 213 return _lastTemperature;
binoit 0:b8130f9ba1c3 214 }
binoit 0:b8130f9ba1c3 215
binoit 0:b8130f9ba1c3 216 float DHT::CalcHumidity() {
binoit 0:b8130f9ba1c3 217 int v;
binoit 0:b8130f9ba1c3 218
binoit 0:b8130f9ba1c3 219 switch (_DHTtype) {
binoit 0:b8130f9ba1c3 220 case DHT11:
binoit 0:b8130f9ba1c3 221 v = DHT_data[0];
binoit 0:b8130f9ba1c3 222 return float(v);
binoit 0:b8130f9ba1c3 223 case DHT22:
binoit 0:b8130f9ba1c3 224 v = DHT_data[0];
binoit 0:b8130f9ba1c3 225 v *= 256;
binoit 0:b8130f9ba1c3 226 v += DHT_data[1];
binoit 0:b8130f9ba1c3 227 v /= 10;
binoit 0:b8130f9ba1c3 228 return float(v);
binoit 0:b8130f9ba1c3 229 }
binoit 0:b8130f9ba1c3 230 return 0;
binoit 0:b8130f9ba1c3 231 }
binoit 0:b8130f9ba1c3 232
binoit 0:b8130f9ba1c3 233