FRDM-K64F, Avnet M14A2A, Grove Shield, to create smart home system. In use with AT&Ts M2x & Flow.

Dependencies:   mbed FXOS8700CQ MODSERIAL

Committer:
jwhammel
Date:
Mon Apr 29 04:24:38 2019 +0000
Revision:
85:0cf65ceb4492
Parent:
84:fc8c9b39723a
We have added an alarm trigger that gets sent to AT&T Flow.

Who changed what in which revision?

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