Arduino教程中级 项目十二 遥控灯

项目十二 遥控灯
本系列教程为DF创客社区版权所有,配套硬件套件:新版Arduino中级套件上一课:项目十一 夜光宝盒
我们知道家里的那些遥控器,不管是电视还是空调都是通过红外来控制的.我们这次也通过红外来做个遥控灯。本章中,设定遥控器的“红色电源键”来控制LED的开关,当然看完这一节后,你也可以用其他的按钮来代替。在开始遥控灯之前,我们先来个预热实验,通过串口来了解下如何使用红外接收管和遥控器。
预热实验:
所需材料
l1×数字红外接收模块

image001.jpg (16.12 KB, 下载次数: 1)

下载附件

保存到相册

2016-1-27 17:01 上传

l1×Mini遥控器

image003.jpg (20.53 KB, 下载次数: 1)

下载附件

保存到相册

2016-1-27 17:01 上传

硬件连接
数字红外接收模块 → 数字口10

image005.jpg (85.91 KB, 下载次数: 1)

下载附件

保存到相册

2016-1-27 17:01 上传

输入代码
这段代码,你可以不用自己手动输入,我们提供现成的IRremote库,在我们的教程代码文件夹中的Lesson12_1中,把整个库的压缩包解压到Arduino IDE安装位置Arduino 1.0.5/ libraries文件夹中,。如下图所示。

image007.jpg (83.48 KB, 下载次数: 1)

下载附件

保存到相册

2016-1-27 17:01 上传

image009.jpg (63.89 KB, 下载次数: 1)

下载附件

保存到相册

2016-1-27 17:01 上传

直接运行Example中的IRrecvDemo代码即可。 样例代码12-1://这段代码来自IRremote库中examples中的 IRrecvDemo//项目十二 – 红外接收管#include <IRremote.h> //调用IRremote.h库int RECV_PIN = 10; //定义RECV_PIN变量为10IRrecv irrecv(RECV_PIN); //设置RECV_PIN(也就是10引脚)为红外接收端decode_results results; //定义results变量为红外结果存放位置void setup(){ Serial.begin(9600); //串口波特率设为9600 irrecv.enableIRIn(); //启动红外解码} void loop() {//是否接收到解码数据,把接收到的数据存储在变量results中if (irrecv.decode(&results)){ //接收到的数据以16进制的方式在串口输出 Serial.println(results.value, HEX); irrecv.resume();// 继续等待接收下一组信号 }} 下载完成后,打开Arduino IDE的串口监视器(Serial Monitor),设置波特率baud为9600,与代码中Serial.begin(9600)相匹配。

image011.jpg (12.55 KB, 下载次数: 1)

下载附件

保存到相册

2016-1-27 17:01 上传

设置完后,用Mini遥控器的按钮对着红外接收管的方向,任意按个按钮,我们都能在串口监视器上看到相对应的代码。如下图所示,按数字“0”,接收到对应16进制的代码是FD30CF。每个按钮都有一个特定的16进制的代码。

image013.jpg (8.5 KB, 下载次数: 1)

下载附件

保存到相册

2016-1-27 17:01 上传

如果按住常按一个键不放就是出现“FFFFFFFF”。

image015.jpg (11.33 KB, 下载次数: 1)

下载附件

保存到相册

2016-1-27 17:01 上传

在串口中,正确接收的话,应该收到以FD-开头的六位数。如果遥控器没有对准红外接收管的话,可能会接收到错误的代码。如我们下图所示:

image017.jpg (24.89 KB, 下载次数: 1)

下载附件

保存到相册

2016-1-27 17:01 上传

上面这段代码我们没有像以前一样一步一步做详细说明,原因就是由于红外解码较为复杂,所幸的是,高手把这些难的工作已经做好了,提供给我们这个IRremote库,我们只需要会用就可以了,先不需要弄明白函数内部如何工作的。要用的时候,把代码原样搬过来就好了。先用起来再说~ 预热完之后,我们言归正传,开始制作遥控灯。

所需材料
l1×数字食人鱼红色LED发光模块

image019.jpg (18.85 KB, 下载次数: 1)

下载附件

保存到相册

2016-1-27 17:01 上传

l1×数字红外接收模块

image021.jpg (10.37 KB, 下载次数: 1)

下载附件

保存到相册

2016-1-27 17:01 上传

l1×Mini遥控器

image022.jpg (11.58 KB, 下载次数: 1)

下载附件

保存到相册

2016-1-27 17:01 上传

硬件连接
其实就是在原有的基础上,加了个LED,LED使用的是数字引脚10。红外接收管仍然接的是数字引脚3。

image023.jpg (93.66 KB, 下载次数: 1)

下载附件

保存到相册

2016-1-27 17:01 上传

输入代码
这里不建议一步一步输入代码,可以在原有的代码上进行修改,观察下相对前一段代码增加了哪些内容。 样例代码12-2:#include<IRremote.h>int RECV_PIN = 10; int ledPin = 3; // LED – digital 3boolean ledState =LOW; // ledstate用来存储LED的状态IRrecvirrecv(RECV_PIN);decode_resultsresults; void setup(){Serial.begin(9600);irrecv.enableIRIn(); pinMode(ledPin,OUTPUT); // 设置LED为输出状态} void loop() {if (irrecv.decode(&results)) { Serial.println(results.value, HEX); //一旦接收到电源键的代码, LED翻转状态,HIGH变LOW,或者LOW变HIGHif(results.value == 0xFD00FF){ ledState = !ledState; //取反 digitalWrite(ledPin,ledState); //改变LED相应状态 } irrecv.resume(); }}
代码回顾
程序一开始还是对红外接收管的一些常规定义,按原样搬过来就可以了。 #include <IRremote.h> //调用IRremote.h库int RECV_PIN = 10; //定义RECV_PIN变量为10IRrecv irrecv(RECV_PIN); //设置RECV_PIN(也就是11引脚)为红外接收端decode_results results; //定义results变量为红外结果存放位置 intledPin = 3; // LED – digital3boolean ledState = LOW; //ledstate用来存储LED的状态 在这里,我们多定义了一个变量ledState,通过名字应该就可以看出来含义了,用来存储LED的状态的,由于LED状态就两种(1或者0),所以我们使用boolean变量类型。 setup()函数中,对使用串口,启动红外解码,数字引脚模式进行设置。 到了主函数loop(),一开始还是先判断是否接收到红外码,并把接收到的数据存储在变量results中。 if(irrecv.decode(&results)) 一旦接收到数据后,程序就要做两件事。第一件事,判断是否接收到了电源键的红外码。 if(results.value == 0xFD00FF) 第二件事,就是让LED改变状态。 ledState = !ledState; //取反 digitalWrite(ledPin,ledState); //改变LED相应状态 这里可能对“!”比较陌生,“!”是一个逻辑非的符号,“取反”的意思。我们知道“!=”代表的是不等于的意思,也就是相反。这里可以类推为,!ledState是ledState相反的一个状态。“!”只能用于只有两种状态的变量中,也就是boolean型变量。 最后,继续等待下一组信号。 irrecv.resume();
※ 在之后的Arduino学习之旅中,不管你遇到奇奇怪怪的问题,都希望你与我们交流,欢迎登陆我们的DFRobot创客社区!www.dfrobot.com.cn下一课:项目十三 数字骰子

标签: Arduino教程