DHT11 数字温湿度传感器
来自Jack's Lab
(版本间的差异)
(以“== 概述 == <br><br> == 参考 == * http://playground.arduino.cc/Main/DHT11Lib * http://playground.arduino.cc/Main/DHTLib <br><br> <br><br> <br><br> <br><br> <b...”为内容创建页面) |
(→示例) |
||
(未显示1个用户的5个中间版本) | |||
第1行: | 第1行: | ||
== 概述 == | == 概述 == | ||
+ | |||
+ | DHT11 Datasheet: http://www.micro4you.com/files/sensor/DHT11.pdf | ||
+ | |||
+ | <br><br> | ||
+ | |||
+ | == 库 == | ||
+ | |||
+ | <source lang=cpp> | ||
+ | // | ||
+ | // FILE: dht11.cpp | ||
+ | // VERSION: 0.4.1 | ||
+ | // PURPOSE: DHT11 Temperature & Humidity Sensor library for Arduino | ||
+ | // LICENSE: GPL v3 (http://www.gnu.org/licenses/gpl.html) | ||
+ | // | ||
+ | // DATASHEET: http://www.micro4you.com/files/sensor/DHT11.pdf | ||
+ | // | ||
+ | // HISTORY: | ||
+ | // George Hadjikyriacou - Original version (??) | ||
+ | // Mod by SimKard - Version 0.2 (24/11/2010) | ||
+ | // Mod by Rob Tillaart - Version 0.3 (28/03/2011) | ||
+ | // + added comments | ||
+ | // + removed all non DHT11 specific code | ||
+ | // + added references | ||
+ | // Mod by Rob Tillaart - Version 0.4 (17/03/2012) | ||
+ | // + added 1.0 support | ||
+ | // Mod by Rob Tillaart - Version 0.4.1 (19/05/2012) | ||
+ | // + added error codes | ||
+ | // | ||
+ | |||
+ | #include "dht11.h" | ||
+ | |||
+ | // Return values: | ||
+ | // DHTLIB_OK | ||
+ | // DHTLIB_ERROR_CHECKSUM | ||
+ | // DHTLIB_ERROR_TIMEOUT | ||
+ | int dht11::read(int pin) | ||
+ | { | ||
+ | // BUFFER TO RECEIVE | ||
+ | uint8_t bits[5]; | ||
+ | uint8_t cnt = 7; | ||
+ | uint8_t idx = 0; | ||
+ | |||
+ | // EMPTY BUFFER | ||
+ | for (int i=0; i< 5; i++) bits[i] = 0; | ||
+ | |||
+ | // REQUEST SAMPLE | ||
+ | pinMode(pin, OUTPUT); | ||
+ | digitalWrite(pin, LOW); | ||
+ | delay(18); | ||
+ | digitalWrite(pin, HIGH); | ||
+ | delayMicroseconds(40); | ||
+ | pinMode(pin, INPUT); | ||
+ | |||
+ | // ACKNOWLEDGE or TIMEOUT | ||
+ | unsigned int loopCnt = 10000; | ||
+ | while(digitalRead(pin) == LOW) | ||
+ | if (loopCnt-- == 0) return DHTLIB_ERROR_TIMEOUT; | ||
+ | |||
+ | loopCnt = 10000; | ||
+ | while(digitalRead(pin) == HIGH) | ||
+ | if (loopCnt-- == 0) return DHTLIB_ERROR_TIMEOUT; | ||
+ | |||
+ | // READ OUTPUT - 40 BITS => 5 BYTES or TIMEOUT | ||
+ | for (int i=0; i<40; i++) | ||
+ | { | ||
+ | loopCnt = 10000; | ||
+ | while(digitalRead(pin) == LOW) | ||
+ | if (loopCnt-- == 0) return DHTLIB_ERROR_TIMEOUT; | ||
+ | |||
+ | unsigned long t = micros(); | ||
+ | |||
+ | loopCnt = 10000; | ||
+ | while(digitalRead(pin) == HIGH) | ||
+ | if (loopCnt-- == 0) return DHTLIB_ERROR_TIMEOUT; | ||
+ | |||
+ | if ((micros() - t) > 40) bits[idx] |= (1 << cnt); | ||
+ | if (cnt == 0) // next byte? | ||
+ | { | ||
+ | cnt = 7; // restart at MSB | ||
+ | idx++; // next byte! | ||
+ | } | ||
+ | else cnt--; | ||
+ | } | ||
+ | |||
+ | // WRITE TO RIGHT VARS | ||
+ | // as bits[1] and bits[3] are allways zero they are omitted in formulas. | ||
+ | humidity = bits[0]; | ||
+ | temperature = bits[2]; | ||
+ | |||
+ | uint8_t sum = bits[0] + bits[2]; | ||
+ | |||
+ | if (bits[4] != sum) return DHTLIB_ERROR_CHECKSUM; | ||
+ | return DHTLIB_OK; | ||
+ | } | ||
+ | |||
+ | |||
+ | // | ||
+ | // FILE: dht11.h | ||
+ | // VERSION: 0.4.1 | ||
+ | // PURPOSE: DHT11 Temperature & Humidity Sensor library for Arduino | ||
+ | // LICENSE: GPL v3 (http://www.gnu.org/licenses/gpl.html) | ||
+ | // | ||
+ | // DATASHEET: http://www.micro4you.com/files/sensor/DHT11.pdf | ||
+ | // | ||
+ | // URL: http://playground.arduino.cc/Main/DHT11Lib | ||
+ | // | ||
+ | // HISTORY: | ||
+ | // George Hadjikyriacou - Original version | ||
+ | // see dht.cpp file | ||
+ | // | ||
+ | |||
+ | #ifndef dht11_h | ||
+ | #define dht11_h | ||
+ | |||
+ | #if defined(ARDUINO) && (ARDUINO >= 100) | ||
+ | #include <Arduino.h> | ||
+ | #else | ||
+ | #include <WProgram.h> | ||
+ | #endif | ||
+ | |||
+ | #define DHT11LIB_VERSION "0.4.1" | ||
+ | |||
+ | #define DHTLIB_OK 0 | ||
+ | #define DHTLIB_ERROR_CHECKSUM -1 | ||
+ | #define DHTLIB_ERROR_TIMEOUT -2 | ||
+ | |||
+ | class dht11 | ||
+ | { | ||
+ | public: | ||
+ | int read(int pin); | ||
+ | int humidity; | ||
+ | int temperature; | ||
+ | }; | ||
+ | #endif | ||
+ | </source> | ||
+ | |||
+ | <br><br> | ||
+ | |||
+ | == 示例 == | ||
+ | |||
+ | <source lang=cpp> | ||
+ | // | ||
+ | // FILE: dht11_test1.pde | ||
+ | // PURPOSE: DHT11 library test sketch for Arduino | ||
+ | // | ||
+ | |||
+ | //Celsius to Fahrenheit conversion | ||
+ | double Fahrenheit(double celsius) | ||
+ | { | ||
+ | return 1.8 * celsius + 32; | ||
+ | } | ||
+ | |||
+ | // fast integer version with rounding | ||
+ | //int Celcius2Fahrenheit(int celcius) | ||
+ | //{ | ||
+ | // return (celsius * 18 + 5)/10 + 32; | ||
+ | //} | ||
+ | |||
+ | |||
+ | //Celsius to Kelvin conversion | ||
+ | double Kelvin(double celsius) | ||
+ | { | ||
+ | return celsius + 273.15; | ||
+ | } | ||
+ | |||
+ | // dewPoint function NOAA | ||
+ | // reference (1) : http://wahiduddin.net/calc/density_algorithms.htm | ||
+ | // reference (2) : http://www.colorado.edu/geography/weather_station/Geog_site/about.htm | ||
+ | // | ||
+ | double dewPoint(double celsius, double humidity) | ||
+ | { | ||
+ | // (1) Saturation Vapor Pressure = ESGG(T) | ||
+ | double RATIO = 373.15 / (273.15 + celsius); | ||
+ | double RHS = -7.90298 * (RATIO - 1); | ||
+ | RHS += 5.02808 * log10(RATIO); | ||
+ | RHS += -1.3816e-7 * (pow(10, (11.344 * (1 - 1/RATIO ))) - 1) ; | ||
+ | RHS += 8.1328e-3 * (pow(10, (-3.49149 * (RATIO - 1))) - 1) ; | ||
+ | RHS += log10(1013.246); | ||
+ | |||
+ | // factor -3 is to adjust units - Vapor Pressure SVP * humidity | ||
+ | double VP = pow(10, RHS - 3) * humidity; | ||
+ | |||
+ | // (2) DEWPOINT = F(Vapor Pressure) | ||
+ | double T = log(VP/0.61078); // temp var | ||
+ | return (241.88 * T) / (17.558 - T); | ||
+ | } | ||
+ | |||
+ | // delta max = 0.6544 wrt dewPoint() | ||
+ | // 6.9 x faster than dewPoint() | ||
+ | // reference: http://en.wikipedia.org/wiki/Dew_point | ||
+ | double dewPointFast(double celsius, double humidity) | ||
+ | { | ||
+ | double a = 17.271; | ||
+ | double b = 237.7; | ||
+ | double temp = (a * celsius) / (b + celsius) + log(humidity*0.01); | ||
+ | double Td = (b * temp) / (a - temp); | ||
+ | return Td; | ||
+ | } | ||
+ | |||
+ | |||
+ | #include <dht11.h> | ||
+ | |||
+ | dht11 DHT11; | ||
+ | |||
+ | #define DHT11PIN 2 | ||
+ | |||
+ | void setup() | ||
+ | { | ||
+ | Serial.begin(115200); | ||
+ | Serial.println("DHT11 TEST PROGRAM "); | ||
+ | Serial.print("LIBRARY VERSION: "); | ||
+ | Serial.println(DHT11LIB_VERSION); | ||
+ | Serial.println(); | ||
+ | } | ||
+ | |||
+ | void loop() | ||
+ | { | ||
+ | Serial.println("\n"); | ||
+ | |||
+ | int chk = DHT11.read(DHT11PIN); | ||
+ | |||
+ | Serial.print("Read sensor: "); | ||
+ | switch (chk) | ||
+ | { | ||
+ | case DHTLIB_OK: | ||
+ | Serial.println("OK"); | ||
+ | break; | ||
+ | case DHTLIB_ERROR_CHECKSUM: | ||
+ | Serial.println("Checksum error"); | ||
+ | break; | ||
+ | case DHTLIB_ERROR_TIMEOUT: | ||
+ | Serial.println("Time out error"); | ||
+ | break; | ||
+ | default: | ||
+ | Serial.println("Unknown error"); | ||
+ | break; | ||
+ | } | ||
+ | |||
+ | Serial.print("Humidity (%): "); | ||
+ | Serial.println((float)DHT11.humidity, 2); | ||
+ | |||
+ | Serial.print("Temperature (°C): "); | ||
+ | Serial.println((float)DHT11.temperature, 2); | ||
+ | |||
+ | Serial.print("Temperature (°F): "); | ||
+ | Serial.println(Fahrenheit(DHT11.temperature), 2); | ||
+ | |||
+ | Serial.print("Temperature (°K): "); | ||
+ | Serial.println(Kelvin(DHT11.temperature), 2); | ||
+ | |||
+ | Serial.print("Dew Point (°C): "); | ||
+ | Serial.println(dewPoint(DHT11.temperature, DHT11.humidity)); | ||
+ | |||
+ | Serial.print("Dew PointFast (°C): "); | ||
+ | Serial.println(dewPointFast(DHT11.temperature, DHT11.humidity)); | ||
+ | |||
+ | delay(2000); | ||
+ | } | ||
+ | </source> | ||
+ | |||
+ | <br><br> | ||
+ | |||
+ | == 优化版 == | ||
+ | |||
+ | https://github.com/adalton/arduino/tree/master/projects/Dht11_Library | ||
<br><br> | <br><br> | ||
第6行: | 第271行: | ||
* http://playground.arduino.cc/Main/DHT11Lib | * http://playground.arduino.cc/Main/DHT11Lib | ||
+ | * http://www.micro4you.com/files/sensor/DHT11.pdf | ||
* http://playground.arduino.cc/Main/DHTLib | * http://playground.arduino.cc/Main/DHTLib | ||
2015年7月17日 (五) 17:21的最后版本
目录 |
[编辑] 1 概述
DHT11 Datasheet: http://www.micro4you.com/files/sensor/DHT11.pdf
[编辑] 2 库
// // FILE: dht11.cpp // VERSION: 0.4.1 // PURPOSE: DHT11 Temperature & Humidity Sensor library for Arduino // LICENSE: GPL v3 (http://www.gnu.org/licenses/gpl.html) // // DATASHEET: http://www.micro4you.com/files/sensor/DHT11.pdf // // HISTORY: // George Hadjikyriacou - Original version (??) // Mod by SimKard - Version 0.2 (24/11/2010) // Mod by Rob Tillaart - Version 0.3 (28/03/2011) // + added comments // + removed all non DHT11 specific code // + added references // Mod by Rob Tillaart - Version 0.4 (17/03/2012) // + added 1.0 support // Mod by Rob Tillaart - Version 0.4.1 (19/05/2012) // + added error codes // #include "dht11.h" // Return values: // DHTLIB_OK // DHTLIB_ERROR_CHECKSUM // DHTLIB_ERROR_TIMEOUT int dht11::read(int pin) { // BUFFER TO RECEIVE uint8_t bits[5]; uint8_t cnt = 7; uint8_t idx = 0; // EMPTY BUFFER for (int i=0; i< 5; i++) bits[i] = 0; // REQUEST SAMPLE pinMode(pin, OUTPUT); digitalWrite(pin, LOW); delay(18); digitalWrite(pin, HIGH); delayMicroseconds(40); pinMode(pin, INPUT); // ACKNOWLEDGE or TIMEOUT unsigned int loopCnt = 10000; while(digitalRead(pin) == LOW) if (loopCnt-- == 0) return DHTLIB_ERROR_TIMEOUT; loopCnt = 10000; while(digitalRead(pin) == HIGH) if (loopCnt-- == 0) return DHTLIB_ERROR_TIMEOUT; // READ OUTPUT - 40 BITS => 5 BYTES or TIMEOUT for (int i=0; i<40; i++) { loopCnt = 10000; while(digitalRead(pin) == LOW) if (loopCnt-- == 0) return DHTLIB_ERROR_TIMEOUT; unsigned long t = micros(); loopCnt = 10000; while(digitalRead(pin) == HIGH) if (loopCnt-- == 0) return DHTLIB_ERROR_TIMEOUT; if ((micros() - t) > 40) bits[idx] |= (1 << cnt); if (cnt == 0) // next byte? { cnt = 7; // restart at MSB idx++; // next byte! } else cnt--; } // WRITE TO RIGHT VARS // as bits[1] and bits[3] are allways zero they are omitted in formulas. humidity = bits[0]; temperature = bits[2]; uint8_t sum = bits[0] + bits[2]; if (bits[4] != sum) return DHTLIB_ERROR_CHECKSUM; return DHTLIB_OK; } // // FILE: dht11.h // VERSION: 0.4.1 // PURPOSE: DHT11 Temperature & Humidity Sensor library for Arduino // LICENSE: GPL v3 (http://www.gnu.org/licenses/gpl.html) // // DATASHEET: http://www.micro4you.com/files/sensor/DHT11.pdf // // URL: http://playground.arduino.cc/Main/DHT11Lib // // HISTORY: // George Hadjikyriacou - Original version // see dht.cpp file // #ifndef dht11_h #define dht11_h #if defined(ARDUINO) && (ARDUINO >= 100) #include <Arduino.h> #else #include <WProgram.h> #endif #define DHT11LIB_VERSION "0.4.1" #define DHTLIB_OK 0 #define DHTLIB_ERROR_CHECKSUM -1 #define DHTLIB_ERROR_TIMEOUT -2 class dht11 { public: int read(int pin); int humidity; int temperature; }; #endif
[编辑] 3 示例
// // FILE: dht11_test1.pde // PURPOSE: DHT11 library test sketch for Arduino // //Celsius to Fahrenheit conversion double Fahrenheit(double celsius) { return 1.8 * celsius + 32; } // fast integer version with rounding //int Celcius2Fahrenheit(int celcius) //{ // return (celsius * 18 + 5)/10 + 32; //} //Celsius to Kelvin conversion double Kelvin(double celsius) { return celsius + 273.15; } // dewPoint function NOAA // reference (1) : http://wahiduddin.net/calc/density_algorithms.htm // reference (2) : http://www.colorado.edu/geography/weather_station/Geog_site/about.htm // double dewPoint(double celsius, double humidity) { // (1) Saturation Vapor Pressure = ESGG(T) double RATIO = 373.15 / (273.15 + celsius); double RHS = -7.90298 * (RATIO - 1); RHS += 5.02808 * log10(RATIO); RHS += -1.3816e-7 * (pow(10, (11.344 * (1 - 1/RATIO ))) - 1) ; RHS += 8.1328e-3 * (pow(10, (-3.49149 * (RATIO - 1))) - 1) ; RHS += log10(1013.246); // factor -3 is to adjust units - Vapor Pressure SVP * humidity double VP = pow(10, RHS - 3) * humidity; // (2) DEWPOINT = F(Vapor Pressure) double T = log(VP/0.61078); // temp var return (241.88 * T) / (17.558 - T); } // delta max = 0.6544 wrt dewPoint() // 6.9 x faster than dewPoint() // reference: http://en.wikipedia.org/wiki/Dew_point double dewPointFast(double celsius, double humidity) { double a = 17.271; double b = 237.7; double temp = (a * celsius) / (b + celsius) + log(humidity*0.01); double Td = (b * temp) / (a - temp); return Td; } #include <dht11.h> dht11 DHT11; #define DHT11PIN 2 void setup() { Serial.begin(115200); Serial.println("DHT11 TEST PROGRAM "); Serial.print("LIBRARY VERSION: "); Serial.println(DHT11LIB_VERSION); Serial.println(); } void loop() { Serial.println("\n"); int chk = DHT11.read(DHT11PIN); Serial.print("Read sensor: "); switch (chk) { case DHTLIB_OK: Serial.println("OK"); break; case DHTLIB_ERROR_CHECKSUM: Serial.println("Checksum error"); break; case DHTLIB_ERROR_TIMEOUT: Serial.println("Time out error"); break; default: Serial.println("Unknown error"); break; } Serial.print("Humidity (%): "); Serial.println((float)DHT11.humidity, 2); Serial.print("Temperature (°C): "); Serial.println((float)DHT11.temperature, 2); Serial.print("Temperature (°F): "); Serial.println(Fahrenheit(DHT11.temperature), 2); Serial.print("Temperature (°K): "); Serial.println(Kelvin(DHT11.temperature), 2); Serial.print("Dew Point (°C): "); Serial.println(dewPoint(DHT11.temperature, DHT11.humidity)); Serial.print("Dew PointFast (°C): "); Serial.println(dewPointFast(DHT11.temperature, DHT11.humidity)); delay(2000); }
[编辑] 4 优化版
https://github.com/adalton/arduino/tree/master/projects/Dht11_Library
[编辑] 5 参考
- http://playground.arduino.cc/Main/DHT11Lib
- http://www.micro4you.com/files/sensor/DHT11.pdf
- http://playground.arduino.cc/Main/DHTLib