友情提示:380元/半年,儿童学编程,就上码丁实验室。
我是潘,曾经是个工程师。这是 “Arduino 公开课” 系列的入门教程。上一课介绍了I2C 协议和基本的通信方式,现在我们看看 I2C 在显示技术中,会带来多少便利。有任何疑问请在评论区提出,我会逐一回答。
人机交互常常除了电脑、手机(之前介绍了蓝牙串口)外,就是设备上的小屏幕了。现在最常见的是 1602 LCD模块,价格非常便宜,兼容性极好:
但如果没有I2C协议,连接这个模块时,让人想起女生一年4季不洗头的样子:
(来源:网络)
看到一堆引线是否让你心烦意乱?而且占用了 Arduino 不少端口。如果用 I2C 就没有这样的烦恼,只需要4根线即可。
但是 1602 本身不具备 I2C 接口,需要 PCE8547 模块来转接,这芯片原本的功能是通过 I2C 扩充 8个 I/O端口。模块接线方式也很简单,直接安装到 1602 上:
此时,将SDA、SCL、VCC、GND 连接到 Arduino 上,就能实现通信。是不是非常清爽?另外,电位器的作用是调节字体对比度。
Arduino-LiquidCrystal-I2C-library-master库 ,导入到 IDE 里面后,写入第一个程序:
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
|
/*
作者:Ardui.Co
效果:1602 显示串口输入的数据
版本:1.0
更新时间:2017年3月29日
*/
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0×27,16,2);//声明I2C地址和点阵的规格为16字符和2行
voidsetup()
{
lcd.begin();//初始化LCD
Serial.begin(9600);
lcd.backlight();//点亮背光板
lcd.print(“Hello, Ardui.Co!”);//老规矩
delay(2000);
lcd.clear();//清屏,准备显示新信息
lcd.setCursor(0,0);//光标移动到第1行的第1个字符开始显示
lcd.print(“Use Serial Mon”);
lcd.setCursor(0,1);//光标移动到第2行的第1个字符
lcd.print(“Type to display”);
}
voidloop()
{
if(Serial.available()){
delay(100);//全部接受串口数据需要延时一点延时
lcd.clear();//清屏,尝试注释掉会怎样?
lcd.setCursor(0,0);
while(Serial.available()>0){//如果串口有数据
lcd.write(Serial.read());//读取并打印串口数据
}
}
}
|
现在结合第9课的 DHT11 传感器,将湿度、温度显示在 1602 上:
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
|
/*
作者:Ardui.Co
效果:1602 显示当前湿度和温度
版本:1.0
更新时间:2017年3月29日
*/
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include “DHT.h” //加载DHT11的库
#define DHTTYPE DHT11 // 定义传感器类似 DHT11
#define DHTPIN 2 //宏定义DHT数据接口,编译时DHTPIN会替换成2
DHT dht(DHTPIN,DHTTYPE);//声明 dht 函数
LiquidCrystal_I2C lcd(0×27,16,2);//声明I2C地址和点阵的规格为16字符和2行
voidsetup()
{
lcd.begin();//初始化LCD
dht.begin();//初始化DHT传感器
lcd.backlight();//点亮背光板
lcd.setCursor(0,0);
}
voidloop()
{
delay(2000); //采样延时,每次抓取数据时间间隔 1~2秒钟
floath=dht.readHumidity();//读取湿度
floatt=dht.readTemperature();//读取摄氏度
if(isnan(h)||isnan(t)){
lcd.print(“Failed to read !”);
delay(1000);
lcd.clear();//清屏
return;
}//检查抓取是否成功
lcd.setCursor(0,0);
lcd.print(“Humidity:”);
lcd.print(h);
lcd.setCursor(0,1);
lcd.print(“Temp:”);
lcd.print(t);
}
|