test

Dependents:   gather_sensor_data

Committer:
readysteadygo2006
Date:
Thu Sep 08 14:05:43 2016 +0000
Revision:
0:1570961902a8
test

Who changed what in which revision?

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