Arduino-DHT
Digital Humidity and Temperature (DHT) Sensor library for Arduino
DHT.h
Go to the documentation of this file.
1 
19 #ifndef DHT_H
20 #define DHT_H
21 
22 #include "GPIO.h"
23 
42 template<BOARD::pin_t DATA_PIN, uint8_t DEVICE>
43 class DHT {
44 public:
48  DHT() :
49  m_humidity(0),
50  m_temperature(0)
51  {
52  m_data.open_drain();
53  }
54 
59  float humidity()
60  {
61  return (m_humidity);
62  }
63 
68  float temperature()
69  {
70  return (m_temperature);
71  }
72 
78  int read(float& humidity, float& temperature)
79  {
80  // Issue start signal and wait for device to respond
81  m_data.output();
82  delay(START_SIGNAL);
83  m_data.input();
84  int retry = 16;
85  do {
86  delayMicroseconds(PULLUP);
87  } while (m_data && --retry);
88  if (retry == 0 || m_data.pulse() < THRESHOLD) return (-2);
89 
90  // Read data from the device. Each bit is pulse width coded;
91  // low for 50 us, and high 26-28 us for zero(0), and 70 us for one(1).
92  uint8_t chsum = 0;
93  uint8_t d[5];
94  for (int i = 0; i < 5; i++) {
95  uint8_t v = 0;
96  for (int j = 0; j < 8; j++) {
97  uint8_t width = m_data.pulse();
98  v = (v << 1) | (width > THRESHOLD);
99  }
100  d[i] = v;
101  if (i < 4) chsum += v;
102  }
103 
104  // Validate check sum
105  if (chsum != d[4]) return (-1);
106 
107  // Check type of device and convert data
108  if (DEVICE == 11) {
109  humidity = d[0];
110  temperature = d[2];
111  }
112  else {
113  humidity = ((d[0] << 8) | d[1]) / 10.0;
114  temperature = (((d[2] & 0x7f) << 8) | d[3]) / 10.0;
115  if (d[2] & 0x80) temperature *= -1;
116  }
117 
118  // Check for value changes
119  int res = (humidity != m_humidity) + (temperature != m_temperature);
120  if (res > 0) {
123  }
124 
125  // Return number of changed values: 0, 1 och 2
126  return (res);
127  }
128 
129 protected:
131  static const uint16_t START_SIGNAL = 18;
132 
134  static const uint16_t PULLUP = 4;
135 
137  static const int THRESHOLD = 60;
138 
140  GPIO<DATA_PIN> m_data;
141 
143  float m_humidity;
144 
147 };
148 
153 template<BOARD::pin_t DATA_PIN> class DHT11 : public DHT<DATA_PIN, 11> {};
154 
159 template<BOARD::pin_t DATA_PIN> class DHT21 : public DHT<DATA_PIN, 21> {};
160 
165 template<BOARD::pin_t DATA_PIN> class DHT22 : public DHT<DATA_PIN, 22> {};
166 #endif
static const uint16_t PULLUP
Definition: DHT.h:134
static const int THRESHOLD
Definition: DHT.h:137
float temperature()
Definition: DHT.h:68
Definition: DHT.h:159
static const uint16_t START_SIGNAL
Definition: DHT.h:131
int read(float &humidity, float &temperature)
Definition: DHT.h:78
float m_temperature
Definition: DHT.h:146
float m_humidity
Definition: DHT.h:143
Definition: DHT.h:153
GPIO< DATA_PIN > m_data
Definition: DHT.h:140
float humidity()
Definition: DHT.h:59
Definition: DHT.h:43
DHT()
Definition: DHT.h:48
Definition: DHT.h:165