点击上方“蘑菇云创造”可以关注我们哦
这节我们会接触一个新的元件——红外接收管。所谓红外接收管,也就是接收红外光的电子器件。红外接收管,看着离我们很遥远的感觉!其实不然,它就在我们身边。比如我们电视机,空调这些家电,其实它们都需要用到红外接收管。我们都知道遥控器发射出来的都是红外光,电视机上势必要有红外接收管,才能接收到遥控器发过来的红外信号。
我们这次就用红外接收管做个遥控灯,通过遥控器的红色电源键来控制LED的开关。
在开始遥控灯之前,我们先来个预热实验,通过串口来了解下如何使用红外接收管和遥控器。
预热实验:
所需元件
■ 1× 红外接收管
■ 1× Mini遥控器
硬件连接
看着是不是很高兴,这应该是我们看到最容易的连线了,只需要连接三根线就可以了,注意一下正负就可以了(图中表明部分)。红外接收管Vout输出接到数字引脚3。
图 14-1红外接收管连线图
代码编程
样例程序14-1
#include <DFRobot_IRremote.h> //载入红外库
String result; // 创建变量
IRremote_Receive remoteReceive_3; // 创建对象
// 主程序开始
void setup() {
Serial.begin(9600); // 设置串口波特率
remoteReceive_3.begin(3); //启动红外解码
}
void loop() {
result = (remoteReceive_3.getIrCommand()); //将红外读取值存入变量中
if ((result!="0")) { //判断接受值是否不为零
Serial.println(result); //串口输出有效读取值
}
}
下载完成后,在串口区,设置波特率为9600,与代码中Serial.begin(9600)相匹配,并打开串口。这些操作在项目七中已有教学,若还不熟悉,可以复习下之前的章节。
*我们还可以将代码区和串口区的对话框拉宽,隐藏在按钮中的波特率就会显现出来。
设置完后,用Mini遥控器的按钮对着红外接收管的方向,任意按个按钮,我们都能在串口监视器上看到相对应的代码。如下图所示,按数字“0”,接收到对应16进制的代码是FD30CF。每个按钮都有一个特定的16进制的代码。
像图中的出现“203EC837”和“FCC837”都是因为传输时被干扰或因为遥控器没有对准接收管的原因而产生的错误信号。
*此外在Mind+中,库规定红外接收管只能连接2、3引脚。如遇问题可以在官方文档的常见问题中查找,或是论坛发帖询问。
上面这段代码有一个知识点需要着重讲解
result = (remoteReceive_3.getIrCommand()); //将红外读取值存入变量中
Mind+中remoteReceive_3.getIrCommand()这一指令在读取一次红外接收管后,会将数据以字符串的类型储存在寄存器中,且在被使用过后,寄存器中就会清除这一指令储存的数据,所以我们无法多次使用这数据,故而需要建立一个新的字符串变量来存放和反复使用它。
由于红外解码较为复杂,其中具体如何实现就暂时不做讲解。所幸的是,高手把这些难的工作已经做好了,提供给我们这个DFRobot_IRremote库,我们只需要会用就可以了,先不需要弄明白函数内部如何工作的。要用的时候,把代码原样搬过来就好了。照猫画虎,先用起来再说~
预热完之后,我们言归正传,开始制作遥控灯。
所需元件
■ 1× 5mm LED灯
■ 1× 220欧电阻
■ 1× 红外接收管
■ 1× Mini遥控器
硬件连接
其实就是在原有的基础上,加了个LED和电阻,LED使用的是数字引脚10。红外接收管仍然接的是数字引脚3。
图 14-2红外接收管连线图
代码编程
样例程序14-2
#include <DFRobot_IRremote.h>
String result; // 创建寄存变量
IRremote_Receive remoteReceive_3; // 创建对象
int RECV_PIN = 3;
int ledPin = 10; // LED – digital 10
boolean ledState = LOW; // ledstate用来存储LED的状态
// 主程序开始
void setup() {
Serial.begin(9600);
remoteReceive_3.begin(RECV_PIN);
pinMode(ledPin,OUTPUT); // 设置LED为输出状态
}
void loop() {
result = (remoteReceive_3.getIrCommand());
if ((result!="0")) {
Serial.println(result);
//一旦接收到电源键的代码, LED翻转状态,HIGH变LOW,或者LOW变HIGH
if(result == "FD00FF"){
ledState = !ledState; //取反
digitalWrite(ledPin,ledState); //改变LED相应状态
}
}
}
代码学习
程序一开始还是对红外接收管的一些常规定义,按原样搬过来就可以了。
#include <DFRobot_IRremote.h>
String result; // 创建寄存变量
IRremote_Receive remoteReceive_3; // 创建对象
int RECV_PIN = 3;
int ledPin = 10; // LED – digital 10
boolean ledState = LOW; // ledstate用来存储LED的状态
在这里,我们多定义了一个变量ledState,通过名字应该就可以看出来含义了,用来存储LED的状态的,由于LED状态就两种(1或者0),所以我们使用boolean变量类型,(可回看项目三中,表3-1列举出的数据类型)。
setup()函数中,对使用串口,启动红外解码,数字引脚模式进行设置。
到了主函数loop(),一开始还是先判断是否接收到红外码,并把接收到的数据存储在变量result中。
if ((result!="0")) {
一旦接收到数据后,程序就要做两件事。第一件事,判断是否接收到了电源键的红外码。
if(result == "FD00FF"){
第二件事,就是让LED改变状态。
ledState = !ledState; //取反
digitalWrite(ledPin,ledState); //改变LED相应状态
这里可能对“!”比较陌生,“!”是一个逻辑非的符号,“取反”的意思。我们知道“!=”代表的是不等于的意思,也就是相反。这里可以类推为,!ledState是ledState相反的一个状态。“!”只能用于只有两种状态的变量中,也就是boolean型变量。
课后作业
1. 通过这个遥控项目,再结合上一个项目的风扇,能不能再给遥控器增加一个功能,既可控灯,还可控风扇。
2. DIY一个你的遥控作品吧!比如简单的会动的小人,结合我们前面的舵机,通过遥控器上不同的按键,让舵机转动不同的角度,感觉随你的控制转动,发挥你的想象做出更多Arduino作品吧!
——————— 正文完 ———————
教育的目的是为了培养学生协作能力、沟通能力、批判思维以及创造力,其中最核心的是创造力,蘑菇云创客教育作为国内为数不多的一站式创客教育服务供应商旨在培养孩子的创造力。
为让学生们在课堂上学习到的知识更好地连接现实世界,蘑菇云将指导学校规划、建立、运营自己的创客空间。并根据学生年龄段的不同,在设计与布局上进行了区分
小学创客空间注重趣味性,
强调互动场景;
初中创客空间注重实用性,
强调学习场景;
高中创客空间注重技术性,
强调应用场景;
在内容上, 蘑菇云和国内一线创客名师联手,编纂了一系列适合国内创客教育的教材。并拥有一套完整的创客教育课程体系,包括课程内容及教具,课程培训,技术答疑。同样根据学生年龄段的不同,在课程分类与设计上也会有所区别。
小学通过游戏化和体验化的方式来开展,要以“玩中学”为主。
初中引导学生在实际动手过程中进行探究式学习,促进“做中学”。
高中基于问题和设计的学习,需要教师为学生创设相关的真实情境,使高中生在“思中学”。
推荐阅读:
【炫彩 RGB LED】基于Mind+Arduino入门教程05
【S.O.S求救信号】基于Mind+ Ardunio入门教程02
【初识Arduino & Mind+】基于mind+ Arduino入门教程00
我知道你在看呦

