Description:
DHT11 digital temperature and humidity sensor is a composite Sensor contains a calibrated digital signal output of the temperature and humidity. Application of a dedicated digital modules collection technology and the temperature and humidity sensing technology, to ensure that the product has high reliability and excellent long-term stability. The sensor includes a resistive sense of wet components and an NTC temperature measurement devices, and connected with a high-performance 8-bit microcontroller.
Features:
- Low cost
- Long-term stability
- Relative humidity and temperature measurement
- Excellent quality
- Fast response
- Strong anti-interference ability
- Long distance signal transmission
- Digital signal output
- Precise calibration.
Connections with Arduino:
Main Code:
// DHT11 Sensor Data Logging on Serial Monitor // www.circuits4you.com #include "DHT.h" #define DHTPIN 4 // a pin which is connected to the sensor //This program can be used to DHT11 and DHT22 sensors #define DHTTYPE DHT11 // DHT 11 //#define DHTTYPE DHT22 // DHT 22 // Connect pin 1 of the sensor to the pin as you defined at the beginning of the code (DHTPIN) // Connect pin 2 sensor to + 5V // Connect Pin 3 to GROUND // Connect the 10K resistor between pins 1 and 2 DHT dht(DHTPIN, DHTTYPE); void setup() { Serial.begin(9600); Serial.println("DHTxx testing"); dht.begin(); } void loop() { // For reading the values it takes about 250ms float h = dht.readHumidity(); float t = dht.readTemperature(); // If you have a wrong reading (NaN), check it again if everything is well connected. if (isnan(t) || isnan(h)) { Serial.println("The sensor can not be read"); } else { Serial.print("Humidity: "); Serial.print(h); Serial.print(" %\t"); Serial.print("Temperature: "); Serial.print(t); Serial.println(" *C"); } }
//-----------------------------------------------------------------------------------------------------------------------------
Required Files DHT.h Code:
#ifndef DHT_H #define DHT_H #if ARDUINO >= 100 #include "Arduino.h" #else #include "WProgram.h" #endif /* DHT library MIT license written by Adafruit Industries */ // how many timing transitions we need to keep track of. 2 * number bits + extra #define MAXTIMINGS 85 #define DHT11 11 #define DHT22 22 #define DHT21 21 #define AM2301 21 class DHT { private: uint8_t data[6]; uint8_t _pin, _type, _count; boolean read(void); unsigned long _lastreadtime; boolean firstreading; public: DHT(uint8_t pin, uint8_t type, uint8_t count=6); void begin(void); float readTemperature(bool S=false); float convertCtoF(float); float readHumidity(void); }; #endif
//-----------------------------------------------------------------------------------------------------------------------------
Required File DHT.cpp Code:
/* DHT library MIT license written by Adafruit Industries */ #include "DHT.h" DHT::DHT(uint8_t pin, uint8_t type, uint8_t count) { _pin = pin; _type = type; _count = count; firstreading = true; } void DHT::begin(void) { // set up the pins! pinMode(_pin, INPUT); digitalWrite(_pin, HIGH); _lastreadtime = 0; } //boolean S == Scale. True == Farenheit; False == Celcius float DHT::readTemperature(bool S) { float f; if (read()) { switch (_type) { case DHT11: f = data[2]; if(S) f = convertCtoF(f); return f; case DHT22: case DHT21: f = data[2] & 0x7F; f *= 256; f += data[3]; f /= 10; if (data[2] & 0x80) f *= -1; if(S) f = convertCtoF(f); return f; } } Serial.print("Read fail"); return NAN; } float DHT::convertCtoF(float c) { return c * 9 / 5 + 32; } float DHT::readHumidity(void) { float f; if (read()) { switch (_type) { case DHT11: f = data[0]; return f; case DHT22: case DHT21: f = data[0]; f *= 256; f += data[1]; f /= 10; return f; } } Serial.print("Read fail"); return NAN; } boolean DHT::read(void) { uint8_t laststate = HIGH; uint8_t counter = 0; uint8_t j = 0, i; unsigned long currenttime; // pull the pin high and wait 250 milliseconds digitalWrite(_pin, HIGH); delay(250); currenttime = millis(); if (currenttime < _lastreadtime) { // ie there was a rollover _lastreadtime = 0; } if (!firstreading && ((currenttime - _lastreadtime) < 2000)) { return true; // return last correct measurement //delay(2000 - (currenttime - _lastreadtime)); } firstreading = false; /* Serial.print("Currtime: "); Serial.print(currenttime); Serial.print(" Lasttime: "); Serial.print(_lastreadtime); */ _lastreadtime = millis(); data[0] = data[1] = data[2] = data[3] = data[4] = 0; // now pull it low for ~20 milliseconds pinMode(_pin, OUTPUT); digitalWrite(_pin, LOW); delay(20); cli(); digitalWrite(_pin, HIGH); delayMicroseconds(40); pinMode(_pin, INPUT); // read in timings for ( i=0; i< MAXTIMINGS; i++) { counter = 0; while (digitalRead(_pin) == laststate) { counter++; delayMicroseconds(1); if (counter == 255) { break; } } laststate = digitalRead(_pin); if (counter == 255) break; // ignore first 3 transitions if ((i >= 4) && (i%2 == 0)) { // shove each bit into the storage bytes data[j/8] <<= 1; if (counter > _count) data[j/8] |= 1; j++; } } sei(); /* Serial.println(j, DEC); Serial.print(data[0], HEX); Serial.print(", "); Serial.print(data[1], HEX); Serial.print(", "); Serial.print(data[2], HEX); Serial.print(", "); Serial.print(data[3], HEX); Serial.print(", "); Serial.print(data[4], HEX); Serial.print(" =? "); Serial.println(data[0] + data[1] + data[2] + data[3], HEX); */ // check we read 40 bits and that the checksum matches if ((j >= 40) && (data[4] == ((data[0] + data[1] + data[2] + data[3]) & 0xFF)) ) { return true; } return false; }
No comments:
Post a Comment