友情提示:380元/半年,儿童学编程,就上码丁实验室。
本教程由DFRobot提供。
该教程为中级套件教程。购买地址:
https://item.taobao.com/item.htm?spm=a1z10.5-c.w4002-12108364412.9.uh4s3j&id=44531434864
想不想做个实时温湿度检测器,走到哪儿,测到哪儿!只需要一个 DHT11 温湿度传感 器就能做到,再外加个1602 的显示屏,实时查看数据。等你之后玩 Arduino够溜的时候, 还可以往控制器上加网络模板,这样数据不仅能实时显示,还能放到网上,或者通过微博发 布出去,是不是很心动了呢?那就先做个最简单的,本地实时显示数据~
所需材料
- 1× DHT11 温湿度传感器
- 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(0×20,16,2);
//设置 LCD 的地址为 0×20,可以设置 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){
case DHTLIB_OK:
Serial.print(“OK,t”);
break;
case DHTLIB_ERROR_CHECKSUM:
Serial.print(“Checksum error,t”);
break;
case DHTLIB_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(0×20,16,2);
0×20:I2C 地址
由 屏 后 面 的 A0~A1 决 定 , 具 体 不 同 的 地 址 可 以 查 看 链 接 : http://wiki.dfrobot.com.cn/index.php/(SKU:DFR0063)IIC_LCD1602_display_mo dule_%E5%85%BC%E5%AE%B9Gadgeteer
16:每行 16 个字符
2: 共2 行
代码中 LiquidCrystal_I2C 涉及函数说明
switch…case 语句
“switch”可以理解为是“开关”,多选择开关。与 if 语句相似之处在于 switch…case 也用于判断,又与 if 不同点在于它能判断多种情况。
switch(var){
case 1:
//当 var=1,做点什么事
break; //跳出 switch 语句
case 2:
//当 var=2,做点什么事
break;
default:
//如果没有一种情况是匹配的,运行 default
//default 可有可无,视情况而定
}
注意几点:
1. case 后面是冒号,不是分号。
2. 关键字 break 用于退出 switch 语句,通常每条 case 语句都以break 结尾。如果没有 break语句,switch语句将会一直执行接下来的语句(一直向下)直到遇见一个break, 或者switch 语句结尾。
注:如果对 switch…case 语句用 法 还 有 不 懂 的 , 可 以 查 看 下 Arduino IDE 中的 examples/05.Control/switchCase 相关资料。