|
[md]## 一、DHT11数字温湿度传感器实验
在之前的实验中我们接触了LM35温度传感器,我们还用它做了许多有意思的实验,今天我们再来了解一种传感器,它就是DHT11数字温湿度传感器。
## 二、实验器材
+ UNO控制板:1块
+ DHT11数字温湿度传感器:1个
+ 面包板:1块
+ 面包板跳线:若干
## 三、连线示意图
图16-1
## 四、硬件连接图
图16-2
## 五、硬件知识要点
DHT11 数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相 连接。因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。每个DHT11 传感器都在极为精确的湿度校验室中进行校准。校准系数以程序的形式储存在OTP内存中,传感器内部在检测信号的处理过程中要调用这些校准系数。单线制串行接口,使系统集成变得简易快捷。超小的体积、极低的功耗,信号传输距离可达20米以上,使其成为各类应用甚至最为苛刻的应用场合的最佳选则。产品为4针单排引脚封装。连接方便,特殊封装形式可根据用户需求而提供。DHT11温湿度传感器常应用于暖通空调、汽车、消费品、湿度调节器、除湿器、医疗、自动控制等领域。
DHT11采用单总线方式与cpu进行数据传输,与DS18B20相似,对时序的要求比较高,不同之处在于写程序的时候数据的采集必须间隔1s以上,不然采集会失败。此篇将利用arduino驱动DHT11,检测环境温湿度情况。
+ 供电电压:3-5.5V
+ 供电电流:最大 2.5Ma
+ 温度范围:0-50℃ 误差±2℃
+ 湿度范围:20-90%RH 误差±5%RH
+ 响应时间: 1/e(63%) 6-30s
+ 测量分辨率: 8bit(温度)、8bit(湿度)
+ 采样周期间隔不得低于 1 秒钟
+ 模块尺寸:30x20mm
## 六、程序编写[/md]
- double Fahrenheit(double celsius)
- {
- return 1.8 * celsius + 32;
- } //摄氏温度度转化为华氏温度
-
- double Kelvin(double celsius)
- {
- return celsius + 273.15;
- } //摄氏温度转化为开氏温度
-
- // 露点(点在此温度时,空气饱和并产生露珠)
- // 参考: http://wahiduddin.net/calc/density_algorithms.htm
- double dewPoint(double celsius, double humidity)
- {
- double A0= 373.15/(273.15 + celsius);
- double SUM = -7.90298 * (A0-1);
- SUM += 5.02808 * log10(A0);
- SUM += -1.3816e-7 * (pow(10, (11.344*(1-1/A0)))-1) ;
- SUM += 8.1328e-3 * (pow(10,(-3.49149*(A0-1)))-1) ;
- SUM += log10(1013.246);
- double VP = pow(10, SUM-3) * humidity;
- double T = log(VP/0.61078); // temp var
- return (241.88 * T) / (17.558-T);
- }
-
- // 快速计算露点,速度是5倍dewPoint()
- // 参考: 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/100);
- double Td = (b * temp) / (a - temp);
- return Td;
- }
-
- #include <dht11.h>
-
- dht11 DHT11;
-
- #define DHT11PIN 4
-
- void setup()
- {
- Serial.begin(9600);
- 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, 4);
-
- Serial.print("Temperature (oC): ");
- Serial.println((float)DHT11.temperature, 4);
-
- Serial.print("Temperature (oF): ");
- Serial.println(Fahrenheit(DHT11.temperature), 4);
-
- Serial.print("Temperature (K): ");
- Serial.println(Kelvin(DHT11.temperature), 4);
-
- Serial.print("Dew Point (oC): ");
- Serial.println(dewPoint(DHT11.temperature, DHT11.humidity));
-
- Serial.print("Dew PointFast (oC): ");
- Serial.println(dewPointFast(DHT11.temperature, DHT11.humidity));
-
- delay(2000);
- }
复制代码
[md]
## 七、程序知识要点
Serial:
用于控制板和一台计算机或其他设备之间的通信。所有的控制板有至少一个串口(又称作为UART或USART)。它通过0(RX)和1(TX)数字引脚经过串口转换芯片连接计算机USB端口与计算机进行通信。因此,如果你使用这些功能的同时你不能使用引脚0和1作为输入或输出。[/md]
- switch (var) {
- case 1:
- //当var等于1时,执行一些语句
- break;
- case 2
- //当var等于2时,执行一些语句
- break;
- default:
- //如果没有任何匹配,执行default
- //default可有可不有
- }
复制代码
[md]
## 八、拓展阅读
在本章的拓展阅读中,我们来向大家介绍如何将DHT11采集到的数据在液晶显示器中显示,先把DHT11连接好,接到8脚。其他的数字脚请参考LCD接法。[/md]
- #include <dht11.h>
- #include<LiquidCrystal.h>
- dht11 DHT11;
- LiquidCrystal lcd(12,11,5,4,3,2);
- #define DHT11PIN 8
- byte armsDown[8] = {
- 0b00100,
- 0b01010,
- 0b00100,
- 0b00100,
- 0b01110,
- 0b10101,
- 0b00100,
- 0b01010
- };
- byte armsUp[8] = {
- 0b00100,
- 0b01010,
- 0b00100,
- 0b10101,
- 0b01110,
- 0b00100,
- 0b00100,
- 0b01010
- };
- void setup(){
- Serial.begin(9600);
- Serial.println("DHT11 TEST PROGRAM ");
- Serial.print("LIBRARY VERSION: ");
- Serial.println(DHT11LIB_VERSION);
- Serial.println();
- lcd.begin(16,2);
- lcd.print("lcd already ok");
- lcd.createChar(1, armsDown);
- // create a new character
- lcd.createChar(2, armsUp);
- delay(2000);
- lcd.clear();
- }
- void loop()
- {
- Serial.println("\n");
- //intchk=DHT11.read(DHT11PIN);
- int chk = DHT11.read(DHT11PIN);
- Serial.print("read sensor:");
- /*switch(chk){
- case DHTLIB_OK:
- Serial.println("ok");
- break;
- //case DHTLIB_ERROR_TIMEOUT:
- Serial.println("ERROR_TIMEOUT");
- break;
- //case DHTLIB_ERROR_CHECKSUM:
- Serial.println("CHECKSUM ERROR");
- break;
- default:
- Serial.println("ok ko");
- break;
- }*/
- Serial.print("\n");
- Serial.print("shidu(%):");
- Serial.print(DHT11.humidity);
- Serial.print("\n");
- Serial.print("wendu(0C):");
- Serial.println(DHT11.temperature);
- lcd.setCursor(0,0);
- lcd.print("shidu(%):");
- lcd.print(DHT11.humidity);
- lcd.setCursor(0,1);
- lcd.print("wendu(0C):");
- lcd.print(DHT11.temperature);
- delay(1000);
- lcd.setCursor(14, 1);
- // draw the little man, arms down:
- lcd.write(2);
- delay(300);
- lcd.setCursor(14, 1);
- // draw him arms up:
- lcd.write(1);
- delay(300);
- }
复制代码 |
|