Version one of final code

Dependencies:   ARCH_GPRS_V2_HW Blinker GPRSInterface HTTPClient_GPRS SDFileSystem USBDevice mbed

Committer:
mbotkinl
Date:
Thu Apr 16 19:46:40 2015 +0000
Revision:
0:a2a4d0d432b3
Code from Micah and Z

Who changed what in which revision?

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