项目九 实时温湿度检测器
本系列教程为DF创客社区版权所有,配套硬件套件:新版Arduino中级套件
想不想做个实时温湿度检测器,走到哪儿,测到哪儿!只需要一个DHT11温湿度传感器就能做到,再外加个1602的显示屏,实时查看数据。等你之后玩Arduino够溜的时候,还可以往控制器上加网络模板,这样数据不仅能实时显示,还能放到网上,或者通过微博发布出去,是不是很心动了呢?那就先做个最简单的,本地实时显示数据~
所需材料
l 1× DHT11温湿度传感器
l 1× I2C LCD1602液晶模块

硬件连接
DHT11温湿度传感器
数字引脚4 LCD GND
GND LCD VCC
5V LCD SDA
SDA LCD SCL
SCL A0,A1,A2全部插上跳冒

输入代码
下载代码之前,把库“dht11”和“LiquidCrystal_I2C”放入Arduino IDE的libraries中,不知道如何加载库的小伙伴可以先看下项目十二 遥控器一节,有详细说明过程。
样例代码9-1:
//项目九 - 实时温湿度检测器
#include <dht11.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x20,16,2); //设置LCD的地址为0x20,可以设置2行,每行16个字符
dht11 DHT;
#define DHT11_PIN 4
void setup(){
lcd.init(); // LCD初始化设置
lcd.backlight(); // 打开LCD背光
Serial.begin(9600); // 设置串口波特率9600
//串口输出”Type, status, Humidity(%), Temperature(C)”
Serial.println("Type,\tstatus,\tHumidity(%),\tTemperature(C)");
lcd.print("Humidity(%): "); //LCD屏显示” Humidity(%):”
lcd.setCursor(0, 1); //光标移到第2行,第一个字符
lcd.print("Temp(C): "); //LCD屏显示”Temp(C):”
}
void loop(){
int chk; //chk用于存储DHT11传感器的数据
Serial.print("DHT11, \t");
//读取DHT11传感器的数据
chk = DHT.read(DHT11_PIN);
switch(chk){
caseDHTLIB_OK:
Serial.print("OK,\t");
break;
caseDHTLIB_ERROR_CHECKSUM:
Serial.print("Checksum error,\t");
break;
caseDHTLIB_ERROR_TIMEOUT:
Serial.print("Time out error,\t");
break;
default:
Serial.print("Unknown error,\t");
break;
}
//串口显示温湿度值
Serial.print(DHT.humidity,1);
Serial.print(",\t");
Serial.println(DHT.temperature,1);
//LCD显示温湿度值
lcd.setCursor(12, 0);
lcd.print(DHT.humidity,1);
lcd.setCursor(8, 1);
lcd.print(DHT.temperature,1);
delay(1000);
}
下载完代码后,不仅可以从LCD屏上显示当前的温湿度,还可以从串口中看到值。


代码回顾
首先,把用到的库声明一下:
#include <dht11.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
dht11.h和LiquidCrystal_I2C的库,我们事先已经加载过库了,那么Wire.h的库为什么不需要加载呢?因为我们下载的Arduino IDE本身自带这个库。不信的话,你可以同样找到libraries文件夹,Wire.h库会在里面。
有了现有的库,所以只需要在程序的一开始声明一下这个LCD:
LiquidCrystal_I2C lcd(0x20,16,2);
0x20:I2C地址
由屏后面的A0~A1决定,具体不同的地址可以查看链接:https://wiki.dfrobot.com.cn/_SKU_DFR0063_IIC_LCD1602_display_module_%E5%85%BC%E5%AE%B9Gadgeteer
16:每行16个字符
2: 共2行
代码中LiquidCrystal_I2C涉及函数说明
| lcd.init() |
LCD初始化 |
| lcd.backlight() |
打开LCD背光灯 |
| lcd.print() |
LCD显示 |
| lcd.setCursor() |
设置LCD光标停留位置 |
注:更多用法可见LiquidCrystal_I2C/examples中样例代码。
switch…case语句
“switch”可以理解为是“开关”,多选择开关。与if语句相似之处在于switch…case也用于判断,又与if不同点在于它能判断多种情况。
switch(var){
case 1:
//当var=1,做点什么事
break; //跳出switch语句
case 2:
//当var=2,做点什么事
break;
default:
//如果没有一种情况是匹配的,运行default
//default可有可无,视情况而定
}
注意几点:
- case后面是冒号,不是分号。
- 关键字break用于退出switch语句,通常每条case语句都以break结尾。如果没有break语句,switch语句将会一直执行接下来的语句(一直向下)直到遇见一个break,或者switch语句结尾。
注:如果对switch⋯case语句用法还有不懂的,可以查看下Arduino IDE中的examples/05.Control/switchCase相关资料。
DF创客社区版权所有,欢迎转载。
转载请务必标注来源: DF创客社区+作者姓名+原文网址。
LK 2021-09-19 11:49:08
我照搬库文件和代码,结果却是 “Humidity”只显示了个‘H’、"Temperature"只显示了个‘T’,数据也只显示 ...
自从1.6.6版本的IDE出来后,不断有反应LCD 1602 IIC液晶显示不正常,打印一字符串,却只显示第一个字符!最初解决办法换低版本IDE,就可以解决该问题!
现在问题找出来了,只需要更改库中的 LiquidCrystal_I2C.cpp 文件中的一个语句就可以了,更改如下:
inline size_t LiquidCrystal_I2C::write(uint8_t value) {
send(value, Rs);
return 0; 改为 return 1;
}
构建选项已变更,全部重新构建
使用库 Wire 在文件夹: E:\arduino\朗译电子arduino套件资料\原版arduino驱动安装方法及软件\arduino-1.7.8\arduino-1.7.8\hardware\arduino\avr\libraries\Wire
E:\arduino\朗译电子arduino套件资料\原版arduino驱动安装方法及软件\arduino-1.7.8\arduino-1.7.8/hardware/tools/avr/bin/avr-g++ -c -g -Os -w -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -MMD -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10708 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR -IE:\arduino\朗译电子arduino套件资料\原版arduino驱动安装方法及软件\arduino-1.7.8\arduino-1.7.8\hardware\arduino\avr\cores\arduino -IE:\arduino\朗译电子arduino套件资料\原版arduino驱动安装方法及软件\arduino-1.7.8\arduino-1.7.8\hardware\arduino\avr\variants\standard -IE:\arduino\朗译电子arduino套件资料\原版arduino驱动安装方法及软件\arduino-1.7.8\arduino-1.7.8\hardware\arduino\avr\libraries\Wire C:\Users\ADMINI~1\AppData\Local\Temp\build2568614031449157192.tmp\Lesson9_1.cpp -o C:\Users\ADMINI~1\AppData\Local\Temp\build2568614031449157192.tmp\Lesson9_1.cpp.o
Lesson9_1.ino:4:22: fatal error: dht11.h: No such file or directory
compilation terminated.
编译有误。
https://wiki.dfrobot.com.cn/index.php/(SKU:DFR0063)IIC_LCD1602_display_module_%E5%85%BC%E5%AE%B9Gadgeteer
https://wiki.dfrobot.com.cn/index.php/(SKU:DFR0063)IIC_LCD1602_display_module_%E5%85%BC%E5%AE%B9Gadgeteer
exit status 1
为开发板 Arduino/Genuino Uno 编译时出错。 这个 请教一下
现在问题找出来了,只需要更改 LiquidCrystal_I2C.cpp 文件中的一个语句就可以了,更改如下:
inline size_t LiquidCrystal_I2C::write(uint8_t value) {
send(value, Rs);
return 0; 改为 return 1;
}