Arduino项目式编程教学第三章——红外遥控灯

文章目录
一、按键模块的使用
二、使用按键控制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判断”语句也是判断语法相关语句中较为基础且重点的内容,需要读者认真研读,理清代码执行逻辑。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

洪博hopes

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值