Modified

Dependents:   DHT-11Mine

Fork of DHT by Wim De Roeve

Committer:
umairaftab
Date:
Tue Mar 18 23:48:19 2014 +0000
Revision:
1:21dc04090457
Parent:
0:9b5b3200688f
Working;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Wimpie 0:9b5b3200688f 1
Wimpie 0:9b5b3200688f 2 #include "DHT.h"
Wimpie 0:9b5b3200688f 3
Wimpie 0:9b5b3200688f 4 #define DHT_DATA_BIT_COUNT 41
Wimpie 0:9b5b3200688f 5
Wimpie 0:9b5b3200688f 6 DHT::DHT(PinName pin,int DHTtype) {
Wimpie 0:9b5b3200688f 7 _pin = pin;
Wimpie 0:9b5b3200688f 8 _DHTtype = DHTtype;
Wimpie 0:9b5b3200688f 9 _firsttime=true;
Wimpie 0:9b5b3200688f 10 }
Wimpie 0:9b5b3200688f 11
Wimpie 0:9b5b3200688f 12 DHT::~DHT() {
Wimpie 0:9b5b3200688f 13 }
Wimpie 0:9b5b3200688f 14
Wimpie 0:9b5b3200688f 15 int DHT::readData() {
Wimpie 0:9b5b3200688f 16 int i, j, retryCount,b;
Wimpie 0:9b5b3200688f 17 unsigned int bitTimes[DHT_DATA_BIT_COUNT];
Wimpie 0:9b5b3200688f 18
Wimpie 0:9b5b3200688f 19 eError err = ERROR_NONE;
Wimpie 0:9b5b3200688f 20 time_t currentTime = time(NULL);
Wimpie 0:9b5b3200688f 21
Wimpie 0:9b5b3200688f 22 DigitalInOut DHT_io(_pin);
Wimpie 0:9b5b3200688f 23
Wimpie 0:9b5b3200688f 24 for (i = 0; i < DHT_DATA_BIT_COUNT; i++) {
Wimpie 0:9b5b3200688f 25 bitTimes[i] = 0;
Wimpie 0:9b5b3200688f 26 }
Wimpie 0:9b5b3200688f 27
Wimpie 0:9b5b3200688f 28 if (!_firsttime) {
Wimpie 0:9b5b3200688f 29 if (int(currentTime - _lastReadTime) < 2) {
Wimpie 0:9b5b3200688f 30 err = ERROR_NO_PATIENCE;
Wimpie 0:9b5b3200688f 31 return err;
Wimpie 0:9b5b3200688f 32 }
Wimpie 0:9b5b3200688f 33 } else {
Wimpie 0:9b5b3200688f 34 _firsttime=false;
Wimpie 0:9b5b3200688f 35 _lastReadTime=currentTime;
Wimpie 0:9b5b3200688f 36 }
Wimpie 0:9b5b3200688f 37 retryCount = 0;
Wimpie 0:9b5b3200688f 38
Wimpie 0:9b5b3200688f 39 do {
Wimpie 0:9b5b3200688f 40 if (retryCount > 125) {
Wimpie 0:9b5b3200688f 41 err = BUS_BUSY;
Wimpie 0:9b5b3200688f 42 return err;
Wimpie 0:9b5b3200688f 43 }
Wimpie 0:9b5b3200688f 44 retryCount ++;
Wimpie 0:9b5b3200688f 45 wait_us(2);
Wimpie 0:9b5b3200688f 46 } while ((DHT_io==0));
Wimpie 0:9b5b3200688f 47
Wimpie 0:9b5b3200688f 48
Wimpie 0:9b5b3200688f 49 DHT_io.output();
Wimpie 0:9b5b3200688f 50 DHT_io = 0;
Wimpie 0:9b5b3200688f 51 wait_ms(18);
Wimpie 0:9b5b3200688f 52 DHT_io = 1;
Wimpie 0:9b5b3200688f 53 wait_us(40);
Wimpie 0:9b5b3200688f 54 DHT_io.input();
Wimpie 0:9b5b3200688f 55
Wimpie 0:9b5b3200688f 56 retryCount = 0;
Wimpie 0:9b5b3200688f 57 do {
Wimpie 0:9b5b3200688f 58 if (retryCount > 40) {
Wimpie 0:9b5b3200688f 59 err = ERROR_NOT_PRESENT;
Wimpie 0:9b5b3200688f 60 return err;
Wimpie 0:9b5b3200688f 61 }
Wimpie 0:9b5b3200688f 62 retryCount++;
Wimpie 0:9b5b3200688f 63 wait_us(1);
Wimpie 0:9b5b3200688f 64 } while ((DHT_io==1));
Wimpie 0:9b5b3200688f 65
Wimpie 0:9b5b3200688f 66 if (err != ERROR_NONE) {
Wimpie 0:9b5b3200688f 67 return err;
Wimpie 0:9b5b3200688f 68 }
Wimpie 0:9b5b3200688f 69
Wimpie 0:9b5b3200688f 70 wait_us(80);
Wimpie 0:9b5b3200688f 71
Wimpie 0:9b5b3200688f 72 for (i = 0; i < 5; i++) {
Wimpie 0:9b5b3200688f 73 for (j = 0; j < 8; j++) {
Wimpie 0:9b5b3200688f 74
Wimpie 0:9b5b3200688f 75 retryCount = 0;
Wimpie 0:9b5b3200688f 76 do {
Wimpie 0:9b5b3200688f 77 if (retryCount > 75) {
Wimpie 0:9b5b3200688f 78 err = ERROR_DATA_TIMEOUT;
Wimpie 0:9b5b3200688f 79 return err;
Wimpie 0:9b5b3200688f 80 }
Wimpie 0:9b5b3200688f 81 retryCount++;
Wimpie 0:9b5b3200688f 82 wait_us(1);
Wimpie 0:9b5b3200688f 83 } while (DHT_io == 0);
Wimpie 0:9b5b3200688f 84 wait_us(40);
Wimpie 0:9b5b3200688f 85 bitTimes[i*8+j]=DHT_io;
Wimpie 0:9b5b3200688f 86
Wimpie 0:9b5b3200688f 87 int count = 0;
Wimpie 0:9b5b3200688f 88 while (DHT_io == 1 && count < 100) {
Wimpie 0:9b5b3200688f 89 wait_us(1);
Wimpie 0:9b5b3200688f 90 count++;
Wimpie 0:9b5b3200688f 91 }
Wimpie 0:9b5b3200688f 92 }
Wimpie 0:9b5b3200688f 93 }
Wimpie 0:9b5b3200688f 94 DHT_io.output();
Wimpie 0:9b5b3200688f 95 DHT_io = 1;
Wimpie 0:9b5b3200688f 96 for (i = 0; i < 5; i++) {
Wimpie 0:9b5b3200688f 97 b=0;
Wimpie 0:9b5b3200688f 98 for (j=0; j<8; j++) {
Wimpie 0:9b5b3200688f 99 if (bitTimes[i*8+j+1] > 0) {
Wimpie 0:9b5b3200688f 100 b |= ( 1 << (7-j));
Wimpie 0:9b5b3200688f 101 }
Wimpie 0:9b5b3200688f 102 }
Wimpie 0:9b5b3200688f 103 DHT_data[i]=b;
Wimpie 0:9b5b3200688f 104 }
Wimpie 0:9b5b3200688f 105
Wimpie 0:9b5b3200688f 106 if (DHT_data[4] == ((DHT_data[0] + DHT_data[1] + DHT_data[2] + DHT_data[3]) & 0xFF)) {
Wimpie 0:9b5b3200688f 107 _lastReadTime = currentTime;
Wimpie 0:9b5b3200688f 108 _lastTemperature=CalcTemperature();
Wimpie 0:9b5b3200688f 109 _lastHumidity=CalcHumidity();
Wimpie 0:9b5b3200688f 110
Wimpie 0:9b5b3200688f 111 } else {
Wimpie 0:9b5b3200688f 112 err = ERROR_CHECKSUM;
Wimpie 0:9b5b3200688f 113 }
Wimpie 0:9b5b3200688f 114
Wimpie 0:9b5b3200688f 115 return err;
Wimpie 0:9b5b3200688f 116
Wimpie 0:9b5b3200688f 117 }
Wimpie 0:9b5b3200688f 118
Wimpie 0:9b5b3200688f 119 float DHT::CalcTemperature() {
Wimpie 0:9b5b3200688f 120 int v;
Wimpie 0:9b5b3200688f 121
Wimpie 0:9b5b3200688f 122 switch (_DHTtype) {
Wimpie 0:9b5b3200688f 123 case DHT11:
Wimpie 0:9b5b3200688f 124 v = DHT_data[2];
Wimpie 0:9b5b3200688f 125 return float(v);
Wimpie 0:9b5b3200688f 126 case DHT22:
Wimpie 0:9b5b3200688f 127 v = DHT_data[2] & 0x7F;
Wimpie 0:9b5b3200688f 128 v *= 256;
Wimpie 0:9b5b3200688f 129 v += DHT_data[3];
Wimpie 0:9b5b3200688f 130 v /= 10;
Wimpie 0:9b5b3200688f 131 if (DHT_data[2] & 0x80)
Wimpie 0:9b5b3200688f 132 v *= -1;
Wimpie 0:9b5b3200688f 133 return float(v);
Wimpie 0:9b5b3200688f 134 }
Wimpie 0:9b5b3200688f 135 return 0;
Wimpie 0:9b5b3200688f 136 }
Wimpie 0:9b5b3200688f 137
Wimpie 0:9b5b3200688f 138 float DHT::ReadHumidity() {
Wimpie 0:9b5b3200688f 139 return _lastHumidity;
Wimpie 0:9b5b3200688f 140 }
Wimpie 0:9b5b3200688f 141
Wimpie 0:9b5b3200688f 142 float DHT::ConvertCelciustoFarenheit(float celsius) {
Wimpie 0:9b5b3200688f 143 return celsius * 9 / 5 + 32;
Wimpie 0:9b5b3200688f 144 }
Wimpie 0:9b5b3200688f 145
Wimpie 0:9b5b3200688f 146 float DHT::ConvertCelciustoKelvin(float celsius) {
Wimpie 0:9b5b3200688f 147 return celsius + 273.15;
Wimpie 0:9b5b3200688f 148 }
Wimpie 0:9b5b3200688f 149
Wimpie 0:9b5b3200688f 150 // dewPoint function NOAA
Wimpie 0:9b5b3200688f 151 // reference: http://wahiduddin.net/calc/density_algorithms.htm
Wimpie 0:9b5b3200688f 152 float DHT::CalcdewPoint(float celsius, float humidity) {
Wimpie 0:9b5b3200688f 153 float A0= 373.15/(273.15 + celsius);
Wimpie 0:9b5b3200688f 154 float SUM = -7.90298 * (A0-1);
Wimpie 0:9b5b3200688f 155 SUM += 5.02808 * log10(A0);
Wimpie 0:9b5b3200688f 156 SUM += -1.3816e-7 * (pow(10, (11.344*(1-1/A0)))-1) ;
Wimpie 0:9b5b3200688f 157 SUM += 8.1328e-3 * (pow(10,(-3.49149*(A0-1)))-1) ;
Wimpie 0:9b5b3200688f 158 SUM += log10(1013.246);
Wimpie 0:9b5b3200688f 159 float VP = pow(10, SUM-3) * humidity;
Wimpie 0:9b5b3200688f 160 float T = log(VP/0.61078); // temp var
Wimpie 0:9b5b3200688f 161 return (241.88 * T) / (17.558-T);
Wimpie 0:9b5b3200688f 162 }
Wimpie 0:9b5b3200688f 163
Wimpie 0:9b5b3200688f 164 // delta max = 0.6544 wrt dewPoint()
Wimpie 0:9b5b3200688f 165 // 5x faster than dewPoint()
Wimpie 0:9b5b3200688f 166 // reference: http://en.wikipedia.org/wiki/Dew_point
Wimpie 0:9b5b3200688f 167 float DHT::CalcdewPointFast(float celsius, float humidity)
Wimpie 0:9b5b3200688f 168 {
Wimpie 0:9b5b3200688f 169 float a = 17.271;
Wimpie 0:9b5b3200688f 170 float b = 237.7;
Wimpie 0:9b5b3200688f 171 float temp = (a * celsius) / (b + celsius) + log(humidity/100);
Wimpie 0:9b5b3200688f 172 float Td = (b * temp) / (a - temp);
Wimpie 0:9b5b3200688f 173 return Td;
Wimpie 0:9b5b3200688f 174 }
Wimpie 0:9b5b3200688f 175
Wimpie 0:9b5b3200688f 176 float DHT::ReadTemperature(eScale Scale) {
Wimpie 0:9b5b3200688f 177 if (Scale == FARENHEIT)
Wimpie 0:9b5b3200688f 178 return ConvertCelciustoFarenheit(_lastTemperature);
Wimpie 0:9b5b3200688f 179 else if (Scale == KELVIN)
Wimpie 0:9b5b3200688f 180 return ConvertCelciustoKelvin(_lastTemperature);
Wimpie 0:9b5b3200688f 181 else
Wimpie 0:9b5b3200688f 182 return _lastTemperature;
Wimpie 0:9b5b3200688f 183 }
Wimpie 0:9b5b3200688f 184
Wimpie 0:9b5b3200688f 185 float DHT::CalcHumidity() {
Wimpie 0:9b5b3200688f 186 int v;
Wimpie 0:9b5b3200688f 187
Wimpie 0:9b5b3200688f 188 switch (_DHTtype) {
Wimpie 0:9b5b3200688f 189 case DHT11:
Wimpie 0:9b5b3200688f 190 v = DHT_data[0];
Wimpie 0:9b5b3200688f 191 return float(v);
Wimpie 0:9b5b3200688f 192 case DHT22:
Wimpie 0:9b5b3200688f 193 v = DHT_data[0];
Wimpie 0:9b5b3200688f 194 v *= 256;
Wimpie 0:9b5b3200688f 195 v += DHT_data[1];
Wimpie 0:9b5b3200688f 196 v /= 10;
Wimpie 0:9b5b3200688f 197 return float(v);
Wimpie 0:9b5b3200688f 198 }
Wimpie 0:9b5b3200688f 199 return 0;
Wimpie 0:9b5b3200688f 200 }
Wimpie 0:9b5b3200688f 201
Wimpie 0:9b5b3200688f 202