draft2

Dependencies:   ARCH_GPRS_V2_HW Blinker GPRSInterface HTTPClient_GPRS RTC_WorkingLibrary SDFileSystem USBDevice mbed

Committer:
mbotkinl
Date:
Tue May 05 19:07:02 2015 +0000
Revision:
0:77d82c39b97c
second draft of code

Who changed what in which revision?

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