目录
1、传感器介绍
2、接线
3、DHT.h库
1、传感器介绍
DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器,是简单环境监测项目的理想选择。
温度分辨率为1ºC,相对湿度为1%。温度范围在0ºC到50ºC之间,湿度的测量范围取决于温度。
2、接线
下面是开发板原理图,DHT11接在外设接口上,传感器数据可以通过GPIO5获取。
读取DHT11,采用的DHT sensor library库
接线注意:根据资料显示传感器可以接在ESP8266的引脚GPIO3、4、5、12、13或14、15,等引脚,这里是ESP8266的,不是D3,D4,这个和厂家有关系,不同模组不一样。
重点注意的是:传感器接GPIO15引脚时,上传程序时必须断开DHT。否则无法上传程序。同时GPIO16和AO引脚也无法正常
3、DHT.h库
该库有两个示例文件,
库文件解释
该示例程序 两秒获取刷新一次数据,推荐用下面这个,已测试ok
#include "DHT.h"
#define DHTPIN 2 // 连接到DHT传感器的数字引脚
//#define DHTTYPE DHT11 // DHT 11
#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321
//#define DHTTYPE DHT21 // DHT 21 (AM2301)
DHT dht(DHTPIN, DHTTYPE);
void setup() {Serial.begin(9600);Serial.println(F("DHTxx test!"));dht.begin();
}void loop() {delay(2000);// 读取温度或湿度大约需要250毫秒!float h = dht.readHumidity();// 读取温度为摄氏度(默认值)float t = dht.readTemperature();// 将温度读取为华氏度(isFahrenheight=true)float f = dht.readTemperature(true);// 检查是否有任何读取失败,并提前退出(重试)。if (isnan(h) || isnan(t) || isnan(f)) {Serial.println(F("从DHT传感器读取失败!"));return;}// 以华氏度为单位计算热指数(默认值)//float hif = dht.computeHeatIndex(f, h);// 以摄氏度为单位计算热指数(isFahreheit=false)// float hic = dht.computeHeatIndex(t, h, false);Serial.print(F("Humidity: "));Serial.print(h);Serial.print(F("% Temperature: "));Serial.print(t);Serial.printLN(F("°C "));// Serial.print(f);// Serial.print(F("°F Heat index: "));// Serial.print(hic);// Serial.print(F("°C "));// Serial.print(hif);
// Serial.println(F("°F"));
}
注意:
1、F() 宏包裹起来,可以节省微控制器的内存空间。例如,F("Humidity: ") 会将 "Humidity: " 字符串会存储在程序的 Flash 存储器中,而不是 RAM.
2、上面将计算热指数的注释掉了,如果需要计算热指数,删除注释,Serial.printLN(F("°C ")这里采用换行,需要取消换行使用Serial.print
下面这个可以根据传感器详细信息设置传感器读数之间的延迟.
#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <DHT_U.h>#define DHTPIN 2 //连接到DHT传感器的数字引脚
// 定义正在使用的传感器类型:
//#define DHTTYPE DHT11 // DHT 11
#define DHTTYPE DHT22 // DHT 22 (AM2302)
//#define DHTTYPE DHT21 // DHT 21 (AM2301)DHT_Unified dht(DHTPIN, DHTTYPE);uint32_t delayMS;void setup() {Serial.begin(9600);// 串口波特率.dht.begin();Serial.println(F("DHTxx Unified Sensor Example"));// 打印温度传感器详细信息.sensor_t sensor;dht.temperature().getSensor(&sensor);Serial.println(F("------------------------------------"));Serial.println(F("Temperature Sensor"));Serial.print (F("Sensor Type: ")); Serial.println(sensor.name);Serial.print (F("Driver Ver: ")); Serial.println(sensor.version);Serial.print (F("Unique ID: ")); Serial.println(sensor.sensor_id);Serial.print (F("Max Value: ")); Serial.print(sensor.max_value); Serial.println(F("°C"));Serial.print (F("Min Value: ")); Serial.print(sensor.min_value); Serial.println(F("°C"));Serial.print (F("Resolution: ")); Serial.print(sensor.resolution); Serial.println(F("°C"));Serial.println(F("------------------------------------"));// 打印湿度传感器详细信息dht.humidity().getSensor(&sensor);Serial.println(F("Humidity Sensor"));Serial.print (F("Sensor Type: ")); Serial.println(sensor.name);Serial.print (F("Driver Ver: ")); Serial.println(sensor.version);Serial.print (F("Unique ID: ")); Serial.println(sensor.sensor_id);Serial.print (F("Max Value: ")); Serial.print(sensor.max_value); Serial.println(F("%"));Serial.print (F("Min Value: ")); Serial.print(sensor.min_value); Serial.println(F("%"));Serial.print (F("Resolution: ")); Serial.print(sensor.resolution); Serial.println(F("%"));Serial.println(F("------------------------------------"));// 根据传感器详细信息设置传感器读数之间的延迟.delayMS = sensor.min_delay / 1000;。
}void loop() {// Delay between measurements.delay(delayMS);// 获取温度事件并打印其值。sensors_event_t event;dht.temperature().getEvent(&event);if (isnan(event.temperature)) {Serial.println(F("Error reading temperature!"));}else {Serial.print(F("Temperature: "));Serial.print(event.temperature);Serial.println(F("°C"));}// 获取湿度事件并打印其值.dht.humidity().getEvent(&event);if (isnan(event.relative_humidity)) {Serial.println(F("Error reading humidity!"));}else {Serial.print(F("Humidity: "));Serial.print(event.relative_humidity);Serial.println(F("%"));}
}
4、测试
测试采用官方示例的第一种方法获取的,数据获取正常,两秒数据刷新一次。