文章目录
一、按键模块的使用
二、使用按键控制LED灯开关
三、红外遥控及红外接收头的使用
四、完成红外遥控灯
五、总结
硬件清单
一、按键模块的使用
如图所示为常见的按键模块,包含一个按键开关、一枚电阻及三根针脚,其电路原理图如下:
其原理也比较简单,1.在按键未按下时,信号端OUT与负极GND相接,此时获取信号为低电平;2.当按键按下,此时OUT与正极VCC导通,此时获取信号为高电平;另外与负极GND相连的电阻称之为下拉电阻,即在按键未按下时,保证电平信号为低电平。
按照上述原理,我们得知:将按键模块接入数字端口后,未按下时,得到低电平信号,即为0;当按键按下,得到高电平信号,即为1。
接下来按照下图进行连线,并检验是否符合上述结论:
将按键模块接入4号数字端口后,通过如下程序并使用串口监视器进行观察:
void setup()
{
pinMode(4,INPUT); //设置4号数字端口为输入模式
Serial.begin(9600); //初始化串口监视器,波特率默认9600
}
void loop()
{
Serial.println(digitalRead(4)); //通过串口打印在4号端口获取的信号
}
如图即为按键按下时串口监视器的输出内容(注:本章的串口监视器页面与前面有些区别,本章开始Arduino编译器使用了2.2的全新版本)
二、使用按键控制LED灯开关
按照如下图所示进行连线:
将两个按键模块分别连接到数字端4号及7号端口,并且将LED灯连接到数字端9号端口(可连接到任意端口,但要与下文的程序端口一一对应)
首先思考使用两个按键模块分别控制LED灯开关的逻辑是怎样的?即“如果4号按键按下,则开灯;如果7号按键按下,则关灯。”这里用到了“如果”这个词汇,因此先来学习符合这个逻辑的语句——if判断。
1. if判断语句
如图,if判断语句大致分为两类——“if-if句型”中的各个条件之间可以不相互影响,而“if-else句型”的两个条件是互补的。且可扩充至以下用法:
下面我们用实际的代码块来演示“if判断语句”的用法:
int i = 0; //定义一个整型变量i
if(i <= 1) //第一个判断,如果i小于或等于1
{
i++; //满足则i自身加1
}
if(i > 1) //第二个判断,如果i大于1
{
i--; //满足则i自身减1
}
int i = 0; //定义一个整型变量i
if(i <= 1) //第一个判断,如果i小于或等于1
{
i++; //满足则i自身加1
}
else //第二个判断,如果不满足第一个条件
{
i--; //自身减1
}
if判断语句自上而下执行,并且仅执行一次(如果在loop函数内,则受loop影响,所有程序循环执行)。
2.应用if判断实现两个按键控制灯开关
再次确保各模块连接正确,然后完成以下程序:
//此程序功能为使用两个按键模块控制灯亮灭
//两个按键分别接到数字端口D4与D7,LED灯接到D9
void setup()
{
pinMode(4,INPUT);
pinMode(7,INPUT); //设置4号及7号连接按键的端口为输入
pinMode(9,OUTPUT); //设置9号连接LED灯的端口为输出
digitalWrite(9,LOW); //初始9端口输出低电平,LED灯灭
}
void loop()
{
if(digitalRead(4) == 1) //如果检测到4号端口为高电平(即此按键按下)
{
digitalWrite(9,HIGH); //设置9号端口为高电平,点亮LED灯
}
if(digitalRead(7) == 1) //如果检测到7号端口为高电平(即此按键按下)
{
digitalWrite(9,LOW); //设置9号端口为低电平,熄灭LED灯
}
}
上传以上程序,并观察是否可以通过分别按下两个开关来控制LED灯的亮灭。
这里对上述程序中if判断内的“==”符号进行说明:形如“int i = 1”,其中的“=”的作用为赋值,即将“i”中的数值变为“1”;但“if”判断中的“digitalRead(4) == 1”,其中“==”表示判断,其作用为判断“4号”端口的数值是否为“1”。
3.进阶——使用单个按键控制LED灯开关
接下来我们拔掉一个按键模块,尝试使用单个按键来控制LED灯的亮灭:
仅保留4号数字端口的按键以及9号数字端口的LED灯,然后完成以下程序:
//此程序为使用单个按键模块控制灯亮灭
//按键接到数字端口D4,LED灯接到D9
void setup()
{
pinMode(4,INPUT); //设置4号连接按键的端口为输入
pinMode(9,OUTPUT); //设置9号连接LED灯的端口为输出
digitalWrite(9,LOW); //初始9端口输出低电平,LED灯灭
}
int i = 0; //创建一个整型变量并赋值为1
void loop()
{
if(digitalRead(4) == 1) //如果检测到4号端口为高电平(即此按键按下)
{
i++; //变量i自身加1
delay(300); //延时300毫秒,防止按下一次多次执行
}
if(i % 2 == 0) //如果i能够被2整除
{
digitalWrite(9,LOW); //设置9号端口为低电平,熄灭LED灯
}
else //不满足上述条件
{
digitalWrite(9,HIGH); //设置9号端口为高电平,点亮LED灯
}
}
我们首先通过下图来说明一下其原理:
这里需要补充说明符号“%”,使用此符号可以得到整除后的余数,即“余除”;另外使用“/”可以得到整除后的数值。
三、红外遥控及红外接收头的使用
1.Arduino开源库的使用
由于Arduino是一个完全开源的平台,不仅其硬件开源,使用Arduino的开发者也贡献了很多不同元器件的开源库,学习者可以登陆Arduino官网查看“www.arduino.cc”;借助开源库可以帮助我们轻松的使用一些较为复杂的元器件,下面我们说明一下开源库的导入及其所带示例程序。
如果使用的Arduino编译器版本为当前最新的2.2版本,可方便的在上图左侧的库管理菜单栏直接搜索并安装相应库文件;如果并非最新版,也可从“项目-导入库”直接进行导入,建议先将从官网下载的库文件压缩成zip文件,然后直接导入.zip文件。
2.红外遥控及红外接收头测试
如上图为本章使用的红外遥控及红外接收头,红外遥控为成品,可直接使用;另外红外接收头的针脚线序如上,自左向右分别为“OUT”、“GND”、“VCC”;接下来按照下图进行接线,其中红外接收头的“OUT”针脚接数字端“11”。
接下来我们需要导入“IRremote”库,可以直接在库管理搜索“IRremote”或者去arduino.cc官网下载,但要注意本章使用的为IRremote1.0的版本,注意下载好对应的版本;或者在我的网盘下载:“链接: https://pan.baidu.com/s/1m5xKz7RB36OF6H2LEMlmFQ?pwd=tff9 提取码: tff9”按照上述导入.zip库的方法进行导入。
接下来完成以下程序来使用红外接收功能:
//这是使用IRremote库接收红外信号
//并且把接收到的信号使用十六进制串口打印出来
#include <IRremote.h> //导入IRremote库
IRrecv ir(11);//声明一个对象,形参为接线针脚
decode_results results;//构造一个名为results的对象,存放解码的值
void setup()
{
Serial.begin(9600); //串口监视器初始化
ir.enableIRIn(); // 启动红外接收
}
void loop()
{
if (ir.decode(&results)) //如果ir解码成功了
{
Serial.println(results.value, HEX); //串口输出十六进制的解码值
delay(300); //延时300毫秒
ir.resume(); //继续接收下一个信号
}
}
现对上述程序作简要说明:但凡要用到库文件时,都需要使用“#include”来导入相应库文件;
“IRrecv ir(11)”的功能为:使用自定义的“ir”来调用IRrecv的所有功能,这里的“ir”是可自定义命名的,并且其括号内的数字为红外接收头OUT端所接的数字端口号;
“decode_results results”的作用为构造一个用于存放解码后数值的对象,并且第二个“results”也是可自定义命名的;
“ir.enableIRIN()”为启动红外接收功能,其中“ir”要与上述代码声明对象时的命名一致;
“ir.decode(&results)”作用为检测是否解码成功,如果解码成功则返回数值“1”,此时if判断可以执行;
“Serial.println(results.value, HEX)”作用为使用串口监视器输出“results”内的“value”,即数值,并且HEX为输出16进制数;(二进制、八进制、十进制、十六进制的转换)
“ir.resume()”作用为继续接收下一个信号。
将以上程序上传至Arduino板,并打开串口监视器,尝试按下红外遥控不同的按键,并观察输出的数值。
观察串口监视器的输出,红外遥控的每个按键都对应一个十六进制数,当然我们能发现其中有一个特殊的数值“FFFFFFFF”,这个数值是长按按键造成的,由于延时为300毫秒,所以按下时间过长会输出这个字符,所以可以尝试修改延时的时间。
四、完成红外遥控灯
按照上图进行接线,红外接收与11号数字端口连接,LED灯与9号数字端口连接,并且记录两个红外遥控按键的信号数值,用作控制LED灯的亮灭,并完成以下程序:
//这是使用IRremote库接收红外信号
//并且通过红外遥控的两个按键来控制LED灯的亮灭
#include <IRremote.h>
IRrecv ir(11); //声明一个对象,形参为接线针脚
decode_results results; //构造一个名为results的对象,存放解码的值
void setup()
{
Serial.begin(9600); //串口监视器初始化
ir.enableIRIn(); // 启动红外接收
pinMode(9,OUTPUT); //设置9号端口为输出
digitalWrite(9,0); //开始输出低电平,使得LED灯为灭
}
void loop()
{
if (ir.decode(&results)) //如果ir解码成功了
{
Serial.println(results.value, HEX); //串口输出十六进制的解码值
delay(200); //反应时间
ir.resume(); //继续接收下一个信号
}
if(results.value == 0xFF6897) //如果接收到某个按键的信号
{
digitalWrite(9,0);
}
if(results.value == 0xFFB04F) //如果接收到另一个按键的信号
{
digitalWrite(9,1);
}
}
将以上程序上传到Arduino板,并尝试使用刚刚记录的两个红外遥控的按键来操控一下LED的亮灭。
五、总结
本章同样涉及了多个硬件模块及若干语法的使用,其中对于原理较为简单的按键模块,可以直接读取其连接端口的高低电平来实现对LED灯的控制;但对于较为复杂的红外接收传感器,需要借助其他开发者贡献的库来进行操作,库的使用大大的减少了我们使用的代码量,比如完成某个功能,仅需要像“ir.resume()”类似的形式即可调用库文件中相应的功能,包括后续章节涉及到的复杂的元器件,都会借助其相应的库来进行使用;另外本章讲解的“if判断”语句也是判断语法相关语句中较为基础且重点的内容,需要读者认真研读,理清代码执行逻辑。