友情提示:380元/半年,儿童学编程,就上码丁实验室。
我是潘,曾经是个工程师。这是 “Arduino 公开课” 系列的入门教程。上一课我们介绍 LM35温度传感器,学会了利用参考电压提高测量精度,这节课我们将使用 DHT系列模块和它的库函数来测量温度和湿度。有任何疑问请在评论区提出,我会逐一回答。
Arduino 之所以风靡,不仅仅是因为它的电路简单、程序易懂,而且它作为一个平台,有大量现成模块,简单调用对应的库,就可以使用,极大简化了开发流程和难度。下面我们将介绍怎么使用 DHT11 模块和它的库。
之前用过的 LM35 也是一个模块,将温度转化为模拟量(电压)输出,其实,不用 Arduino 也能通过模拟电路的方式来使用。而 DHT11(AM2301)则是一个数字模块,将温度、湿度传感器和 一个8bit 的 ADC 集成在一起,以数字的方式输出到 Arduino 。
DHT11 规格如下:
测量范围:20~90&RH、0~50°C
测量精度:温度±2%,湿度±5%
分辨率:温度1°C,湿度1%
另外,DHT11 的升级版本 DHT22(AM2302),外观一样,但可以带来更大的测量范围(温度-40°C ~ 80°C,湿度0~99%)和更高的精度(温度±0.5°C,湿度±2%),但价格相差达3倍以上。
由于 DHT 系列模块已经有非常成熟的库,所以使用很简单。只需接上电源,DataPin 接数字端口(远距离传输接上拉电阻至5V端口) ,非模块直接使用的话则悬空NC:
然后下载 DHT 的库文件:打开 IDE 界面,在顶部菜单选择“项目”,选择“管理库”,等待索引加载完成后搜索DHT,选择 Arduino Uno 目前支持的 1.2.3 版(1.3.0 版会导致编译出错),安装即可:
程序如下,注意阅读注释:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
/*
作者:Ardui.Co
效果:DHT11 温湿度测量
版本:1.0
更新时间:2017年1月13日
*/
#include “DHT.h” //加载DHT11的库
#define DHTTYPE DHT11 // 定义传感器类似 DHT11
#define DHTPIN 2 //宏定义DHT数据接口,编译时DHTPIN会替换成2
DHT dht(DHTPIN,DHTTYPE);//声明 dht 函数
voidsetup(){
Serial.begin(9600);
dht.begin();//启动传感器
}
voidloop(){
delay(2000); //采样延时,每次抓取数据时间间隔 1~2秒钟
floath=dht.readHumidity();//读取湿度
floatt=dht.readTemperature();//读取摄氏度
floatf=dht.readTemperature(true);//读取华氏度
if(isnan(h)||isnan(t)||isnan(f)){
Serial.println(“Failed to read from DHT sensor!”);
return;
}//检查抓取是否成功
floathic=dht.computeHeatIndex(t,h,false);//用摄氏度计算酷热指数,摄氏度设参数为false
floathif=dht.computeHeatIndex(f,h);//用华氏度计算酷热指数
Serial.print(“Humidity: “);
Serial.print(h);
Serial.print(” %\t”);
Serial.print(“Temperature: “);
Serial.print(t);
Serial.print(” *C “);
Serial.print(f);
Serial.print(” *F\t”);
Serial.print(“Heat index: “);
Serial.print(hic);
Serial.print(” *C “);
Serial.print(hif);
Serial.println(” *F”);
}
|
要注意 DHT 采样速度为每秒1次,为保证采样成功,采样延时设置1秒以上。打开串口监视器,采集结果如下:
DHT 系列模块与 LM35 相比的另一优势是数据传输距离可达20m以上,而不会影响精度。由于 LM35 使用电压模量,尤其在 10mV 的量级上,导线存在内阻和分压效应会极大影响数据的精确性。