Direct conect sample

Dependents:   Nucleo_DHT11_Direct Projeto

Committer:
od_1969
Date:
Tue Dec 08 17:36:32 2015 +0000
Revision:
0:8ee3414dedde
1st commit

Who changed what in which revision?

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