Fork of DHT repo with checksum fixes.
Fork of DHT by
Diff: DHT.cpp
- Revision:
- 1:932d451474dc
- Parent:
- 0:9b5b3200688f
- Child:
- 2:e7b0a41eecac
--- a/DHT.cpp Mon Jul 09 19:47:43 2012 +0000 +++ b/DHT.cpp Sat Apr 19 18:05:38 2014 +0000 @@ -1,233 +1,134 @@ /* * DHT Library for Digital-output Humidity and Temperature sensors * - * Works with DHT11, DHT22 - * SEN11301P, Grove - Temperature&Humidity Sensor (Seeed Studio) - * SEN51035P, Grove - Temperature&Humidity Sensor Pro (Seeed Studio) - * AM2302 , temperature-humidity sensor - * HM2303 , Digital-output humidity and temperature sensor + * Works with DHT11, DHT22 Nucleo Board tested on F103RB * - * Copyright (C) Wim De Roeve + * Copyright (C) Wim De Roeve + * ported to work on Nucleo Board: + * Moises Marangoni + * Somlak Mangnimit * based on DHT22 sensor library by HO WING KIT * Arduino DHT11 library - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documnetation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. */ #include "DHT.h" +#include "mbed.h" #define DHT_DATA_BIT_COUNT 41 +//DigitalInOut data_pin(PA_10); + DHT::DHT(PinName pin,int DHTtype) { _pin = pin; _DHTtype = DHTtype; - _firsttime=true; + + } DHT::~DHT() { } int DHT::readData() { - int i, j, retryCount,b; - unsigned int bitTimes[DHT_DATA_BIT_COUNT]; + Timer tmr; + DigitalInOut data_pin(_pin); + // BUFFER TO RECEIVE + //uint8_t bits[5]; + uint8_t cnt = 7; + uint8_t idx = 0; + + tmr.stop(); + tmr.reset(); - eError err = ERROR_NONE; - time_t currentTime = time(NULL); - - DigitalInOut DHT_io(_pin); + // EMPTY BUFFER + for(int i=0; i< 5; i++) bits[i] = 0; - for (i = 0; i < DHT_DATA_BIT_COUNT; i++) { - bitTimes[i] = 0; - } + // REQUEST SAMPLE + data_pin.output(); + data_pin.write(0); + wait_ms(18); + data_pin.write(1); + wait_us(40); + data_pin.input(); - if (!_firsttime) { - if (int(currentTime - _lastReadTime) < 2) { - err = ERROR_NO_PATIENCE; - return err; - } - } else { - _firsttime=false; - _lastReadTime=currentTime; - } - retryCount = 0; + // ACKNOWLEDGE or TIMEOUT + unsigned int loopCnt = 10000; + + while(!data_pin.read())if(!loopCnt--)return DHTLIB_ERROR_TIMEOUT; - do { - if (retryCount > 125) { - err = BUS_BUSY; - return err; - } - retryCount ++; - wait_us(2); - } while ((DHT_io==0)); + loopCnt = 10000; + + while(data_pin.read())if(!loopCnt--)return DHTLIB_ERROR_TIMEOUT; + // READ OUTPUT - 40 BITS => 5 BYTES or TIMEOUT + for(int i=0; i<40; i++){ + + loopCnt = 10000; + + while(!data_pin.read())if(loopCnt-- == 0)return DHTLIB_ERROR_TIMEOUT; + + //unsigned long t = micros(); + tmr.start(); - DHT_io.output(); - DHT_io = 0; - wait_ms(18); - DHT_io = 1; - wait_us(40); - DHT_io.input(); + loopCnt = 10000; + + while(data_pin.read())if(!loopCnt--)return DHTLIB_ERROR_TIMEOUT; - retryCount = 0; - do { - if (retryCount > 40) { - err = ERROR_NOT_PRESENT; - return err; - } - retryCount++; - wait_us(1); - } while ((DHT_io==1)); - - if (err != ERROR_NONE) { - return err; + if(tmr.read_us() > 40) bits[idx] |= (1 << cnt); + + tmr.stop(); + tmr.reset(); + + if(cnt == 0){ // next byte? + + cnt = 7; // restart at MSB + idx++; // next byte! + + }else cnt--; + } - - wait_us(80); - - for (i = 0; i < 5; i++) { - for (j = 0; j < 8; j++) { + // WRITE TO RIGHT VARS + // as bits[1] and bits[3] are allways zero they are omitted in formulas. + //humidity = bits[0]; + //temperature = bits[2]; - retryCount = 0; - do { - if (retryCount > 75) { - err = ERROR_DATA_TIMEOUT; - return err; - } - retryCount++; - wait_us(1); - } while (DHT_io == 0); - wait_us(40); - bitTimes[i*8+j]=DHT_io; + uint8_t sum = bits[0] + bits[2]; - int count = 0; - while (DHT_io == 1 && count < 100) { - wait_us(1); - count++; - } - } - } - DHT_io.output(); - DHT_io = 1; - for (i = 0; i < 5; i++) { - b=0; - for (j=0; j<8; j++) { - if (bitTimes[i*8+j+1] > 0) { - b |= ( 1 << (7-j)); - } - } - DHT_data[i]=b; - } - - if (DHT_data[4] == ((DHT_data[0] + DHT_data[1] + DHT_data[2] + DHT_data[3]) & 0xFF)) { - _lastReadTime = currentTime; - _lastTemperature=CalcTemperature(); - _lastHumidity=CalcHumidity(); - - } else { - err = ERROR_CHECKSUM; - } - - return err; - + if(bits[4] != sum)return DHTLIB_ERROR_CHECKSUM; + + return DHTLIB_OK; } - -float DHT::CalcTemperature() { - int v; +float DHT::ReadTemperature() { + //int retornotemp; switch (_DHTtype) { case DHT11: - v = DHT_data[2]; - return float(v); + temperature = bits[2]; + return float(temperature); case DHT22: - v = DHT_data[2] & 0x7F; - v *= 256; - v += DHT_data[3]; - v /= 10; - if (DHT_data[2] & 0x80) - v *= -1; - return float(v); + temperature = bits[2] & 0x7F; + temperature *= 256; + temperature += bits[3]; + temperature /= 10; + if (bits[2] & 0x80) + {temperature *= -1;} + return float(temperature); } return 0; } -float DHT::ReadHumidity() { - return _lastHumidity; -} - -float DHT::ConvertCelciustoFarenheit(float celsius) { - return celsius * 9 / 5 + 32; -} - -float DHT::ConvertCelciustoKelvin(float celsius) { - return celsius + 273.15; -} - -// dewPoint function NOAA -// reference: http://wahiduddin.net/calc/density_algorithms.htm -float DHT::CalcdewPoint(float celsius, float humidity) { - float A0= 373.15/(273.15 + celsius); - float SUM = -7.90298 * (A0-1); - SUM += 5.02808 * log10(A0); - SUM += -1.3816e-7 * (pow(10, (11.344*(1-1/A0)))-1) ; - SUM += 8.1328e-3 * (pow(10,(-3.49149*(A0-1)))-1) ; - SUM += log10(1013.246); - float VP = pow(10, SUM-3) * humidity; - float T = log(VP/0.61078); // temp var - return (241.88 * T) / (17.558-T); -} - -// delta max = 0.6544 wrt dewPoint() -// 5x faster than dewPoint() -// reference: http://en.wikipedia.org/wiki/Dew_point -float DHT::CalcdewPointFast(float celsius, float humidity) -{ - float a = 17.271; - float b = 237.7; - float temp = (a * celsius) / (b + celsius) + log(humidity/100); - float Td = (b * temp) / (a - temp); - return Td; -} - -float DHT::ReadTemperature(eScale Scale) { - if (Scale == FARENHEIT) - return ConvertCelciustoFarenheit(_lastTemperature); - else if (Scale == KELVIN) - return ConvertCelciustoKelvin(_lastTemperature); - else - return _lastTemperature; -} - -float DHT::CalcHumidity() { - int v; +int DHT::ReadHumidity() { + //int v; switch (_DHTtype) { case DHT11: - v = DHT_data[0]; - return float(v); + humidity = bits[0]; + return float(humidity); case DHT22: - v = DHT_data[0]; - v *= 256; - v += DHT_data[1]; - v /= 10; - return float(v); + humidity = bits[0]; + humidity *= 256; + humidity += bits[1]; + humidity /= 10; + return float(humidity); } return 0; -} - - +} \ No newline at end of file