realease DHT lib working with Nucleo Board Thanks Somlak Mangnimit

Fork of DHT by Wim De Roeve

Committer:
moisesmarangoni
Date:
Sat Apr 19 18:05:38 2014 +0000
Revision:
1:932d451474dc
Parent:
0:9b5b3200688f
First realease DHT working with Nucleo Board. Thanks (Somlak Mangnimit)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Wimpie 0:9b5b3200688f 1 /*
Wimpie 0:9b5b3200688f 2 * DHT Library for Digital-output Humidity and Temperature sensors
Wimpie 0:9b5b3200688f 3 *
moisesmarangoni 1:932d451474dc 4 * Works with DHT11, DHT22 Nucleo Board tested on F103RB
Wimpie 0:9b5b3200688f 5 *
moisesmarangoni 1:932d451474dc 6 * Copyright (C) Wim De Roeve
moisesmarangoni 1:932d451474dc 7 * ported to work on Nucleo Board:
moisesmarangoni 1:932d451474dc 8 * Moises Marangoni
moisesmarangoni 1:932d451474dc 9 * Somlak Mangnimit
Wimpie 0:9b5b3200688f 10 * based on DHT22 sensor library by HO WING KIT
Wimpie 0:9b5b3200688f 11 * Arduino DHT11 library
Wimpie 0:9b5b3200688f 12 */
Wimpie 0:9b5b3200688f 13
Wimpie 0:9b5b3200688f 14 #include "DHT.h"
moisesmarangoni 1:932d451474dc 15 #include "mbed.h"
Wimpie 0:9b5b3200688f 16
Wimpie 0:9b5b3200688f 17 #define DHT_DATA_BIT_COUNT 41
Wimpie 0:9b5b3200688f 18
moisesmarangoni 1:932d451474dc 19 //DigitalInOut data_pin(PA_10);
moisesmarangoni 1:932d451474dc 20
Wimpie 0:9b5b3200688f 21 DHT::DHT(PinName pin,int DHTtype) {
Wimpie 0:9b5b3200688f 22 _pin = pin;
Wimpie 0:9b5b3200688f 23 _DHTtype = DHTtype;
moisesmarangoni 1:932d451474dc 24
moisesmarangoni 1:932d451474dc 25
Wimpie 0:9b5b3200688f 26 }
Wimpie 0:9b5b3200688f 27
Wimpie 0:9b5b3200688f 28 DHT::~DHT() {
Wimpie 0:9b5b3200688f 29 }
Wimpie 0:9b5b3200688f 30
Wimpie 0:9b5b3200688f 31 int DHT::readData() {
moisesmarangoni 1:932d451474dc 32 Timer tmr;
moisesmarangoni 1:932d451474dc 33 DigitalInOut data_pin(_pin);
moisesmarangoni 1:932d451474dc 34 // BUFFER TO RECEIVE
moisesmarangoni 1:932d451474dc 35 //uint8_t bits[5];
moisesmarangoni 1:932d451474dc 36 uint8_t cnt = 7;
moisesmarangoni 1:932d451474dc 37 uint8_t idx = 0;
moisesmarangoni 1:932d451474dc 38
moisesmarangoni 1:932d451474dc 39 tmr.stop();
moisesmarangoni 1:932d451474dc 40 tmr.reset();
Wimpie 0:9b5b3200688f 41
moisesmarangoni 1:932d451474dc 42 // EMPTY BUFFER
moisesmarangoni 1:932d451474dc 43 for(int i=0; i< 5; i++) bits[i] = 0;
Wimpie 0:9b5b3200688f 44
moisesmarangoni 1:932d451474dc 45 // REQUEST SAMPLE
moisesmarangoni 1:932d451474dc 46 data_pin.output();
moisesmarangoni 1:932d451474dc 47 data_pin.write(0);
moisesmarangoni 1:932d451474dc 48 wait_ms(18);
moisesmarangoni 1:932d451474dc 49 data_pin.write(1);
moisesmarangoni 1:932d451474dc 50 wait_us(40);
moisesmarangoni 1:932d451474dc 51 data_pin.input();
Wimpie 0:9b5b3200688f 52
moisesmarangoni 1:932d451474dc 53 // ACKNOWLEDGE or TIMEOUT
moisesmarangoni 1:932d451474dc 54 unsigned int loopCnt = 10000;
moisesmarangoni 1:932d451474dc 55
moisesmarangoni 1:932d451474dc 56 while(!data_pin.read())if(!loopCnt--)return DHTLIB_ERROR_TIMEOUT;
Wimpie 0:9b5b3200688f 57
moisesmarangoni 1:932d451474dc 58 loopCnt = 10000;
moisesmarangoni 1:932d451474dc 59
moisesmarangoni 1:932d451474dc 60 while(data_pin.read())if(!loopCnt--)return DHTLIB_ERROR_TIMEOUT;
Wimpie 0:9b5b3200688f 61
moisesmarangoni 1:932d451474dc 62 // READ OUTPUT - 40 BITS => 5 BYTES or TIMEOUT
moisesmarangoni 1:932d451474dc 63 for(int i=0; i<40; i++){
moisesmarangoni 1:932d451474dc 64
moisesmarangoni 1:932d451474dc 65 loopCnt = 10000;
moisesmarangoni 1:932d451474dc 66
moisesmarangoni 1:932d451474dc 67 while(!data_pin.read())if(loopCnt-- == 0)return DHTLIB_ERROR_TIMEOUT;
moisesmarangoni 1:932d451474dc 68
moisesmarangoni 1:932d451474dc 69 //unsigned long t = micros();
moisesmarangoni 1:932d451474dc 70 tmr.start();
Wimpie 0:9b5b3200688f 71
moisesmarangoni 1:932d451474dc 72 loopCnt = 10000;
moisesmarangoni 1:932d451474dc 73
moisesmarangoni 1:932d451474dc 74 while(data_pin.read())if(!loopCnt--)return DHTLIB_ERROR_TIMEOUT;
Wimpie 0:9b5b3200688f 75
moisesmarangoni 1:932d451474dc 76 if(tmr.read_us() > 40) bits[idx] |= (1 << cnt);
moisesmarangoni 1:932d451474dc 77
moisesmarangoni 1:932d451474dc 78 tmr.stop();
moisesmarangoni 1:932d451474dc 79 tmr.reset();
moisesmarangoni 1:932d451474dc 80
moisesmarangoni 1:932d451474dc 81 if(cnt == 0){ // next byte?
moisesmarangoni 1:932d451474dc 82
moisesmarangoni 1:932d451474dc 83 cnt = 7; // restart at MSB
moisesmarangoni 1:932d451474dc 84 idx++; // next byte!
moisesmarangoni 1:932d451474dc 85
moisesmarangoni 1:932d451474dc 86 }else cnt--;
moisesmarangoni 1:932d451474dc 87
Wimpie 0:9b5b3200688f 88 }
moisesmarangoni 1:932d451474dc 89 // WRITE TO RIGHT VARS
moisesmarangoni 1:932d451474dc 90 // as bits[1] and bits[3] are allways zero they are omitted in formulas.
moisesmarangoni 1:932d451474dc 91 //humidity = bits[0];
moisesmarangoni 1:932d451474dc 92 //temperature = bits[2];
Wimpie 0:9b5b3200688f 93
moisesmarangoni 1:932d451474dc 94 uint8_t sum = bits[0] + bits[2];
Wimpie 0:9b5b3200688f 95
moisesmarangoni 1:932d451474dc 96 if(bits[4] != sum)return DHTLIB_ERROR_CHECKSUM;
moisesmarangoni 1:932d451474dc 97
moisesmarangoni 1:932d451474dc 98 return DHTLIB_OK;
Wimpie 0:9b5b3200688f 99 }
moisesmarangoni 1:932d451474dc 100 float DHT::ReadTemperature() {
moisesmarangoni 1:932d451474dc 101 //int retornotemp;
Wimpie 0:9b5b3200688f 102
Wimpie 0:9b5b3200688f 103 switch (_DHTtype) {
Wimpie 0:9b5b3200688f 104 case DHT11:
moisesmarangoni 1:932d451474dc 105 temperature = bits[2];
moisesmarangoni 1:932d451474dc 106 return float(temperature);
Wimpie 0:9b5b3200688f 107 case DHT22:
moisesmarangoni 1:932d451474dc 108 temperature = bits[2] & 0x7F;
moisesmarangoni 1:932d451474dc 109 temperature *= 256;
moisesmarangoni 1:932d451474dc 110 temperature += bits[3];
moisesmarangoni 1:932d451474dc 111 temperature /= 10;
moisesmarangoni 1:932d451474dc 112 if (bits[2] & 0x80)
moisesmarangoni 1:932d451474dc 113 {temperature *= -1;}
moisesmarangoni 1:932d451474dc 114 return float(temperature);
Wimpie 0:9b5b3200688f 115 }
Wimpie 0:9b5b3200688f 116 return 0;
Wimpie 0:9b5b3200688f 117 }
Wimpie 0:9b5b3200688f 118
moisesmarangoni 1:932d451474dc 119 int DHT::ReadHumidity() {
moisesmarangoni 1:932d451474dc 120 //int v;
Wimpie 0:9b5b3200688f 121
Wimpie 0:9b5b3200688f 122 switch (_DHTtype) {
Wimpie 0:9b5b3200688f 123 case DHT11:
moisesmarangoni 1:932d451474dc 124 humidity = bits[0];
moisesmarangoni 1:932d451474dc 125 return float(humidity);
Wimpie 0:9b5b3200688f 126 case DHT22:
moisesmarangoni 1:932d451474dc 127 humidity = bits[0];
moisesmarangoni 1:932d451474dc 128 humidity *= 256;
moisesmarangoni 1:932d451474dc 129 humidity += bits[1];
moisesmarangoni 1:932d451474dc 130 humidity /= 10;
moisesmarangoni 1:932d451474dc 131 return float(humidity);
Wimpie 0:9b5b3200688f 132 }
Wimpie 0:9b5b3200688f 133 return 0;
moisesmarangoni 1:932d451474dc 134 }