2016-1-27 17:45:40 [显示全部楼层]
26365浏览
查看: 26365|回复: 10

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

[复制链接]

项目十二 遥控灯

本系列教程为DF创客社区版权所有,配套硬件套件:新版Arduino中级套件

我们知道家里的那些遥控器,不管是电视还是空调都是通过红外来控制的。我们这次也通过红外来做个遥控灯。本章中,设定遥控器的“红色电源键”来控制LED的开关,当然看完这一节后,你也可以用其他的按钮来代替。

在开始遥控灯之前,我们先来个预热实验,通过串口来了解下如何使用红外接收管和遥控器。

预热实验:

所需材料

1×  数字红外接收模块
1×  Mini遥控器
Arduino教程中级 项目十二 遥控灯图1

硬件连接

数字红外接收模块 → 数字口10
Arduino教程中级 项目十二 遥控灯图2

输入代码

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

把库文件夹整个解压到Arduino IDE的libraries文件夹

Arduino教程中级 项目十二 遥控灯图3Arduino教程中级 项目十二 遥控灯图4
直接运行Example中的IRrecvDemo代码即可

样例代码12-1:

//这段代码来自IRremote库中examples中的 IRrecvDemo
//项目十二 – 红外接收管
#include <IRremote.h>        //调用IRremote.h库
int RECV_PIN = 10;           //定义RECV_PIN变量为10
IRrecv 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的串口监视器(Seri-al Monitor),设置波特率baud为9600,与代码中
Serial.begin(9600)相匹配。

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

如果按住常按一个键不放就是出现“FFFFFFFF”。
Arduino教程中级 项目十二 遥控灯图7

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

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

预热完之后,我们言归正传,开始制作遥控灯。

所需材料

1×  数字食人鱼红色LED发光模块
1×  数字红外接收模块
1×  Mini遥控器
Arduino教程中级 项目十二 遥控灯图6

硬件连接

其实就是在原有的基础上,加了个LED,LED使用的是数字引脚10。红外接收管仍然接的是数字引脚3。
Arduino教程中级 项目十二 遥控灯图5

输入代码

这里不建议一步一步输入代码,可以在原有的代码上进行修改,观察下相对前一段代码增加了哪些内容。

样例代码12-2:

#include<IRremote.h>
int RECV_PIN = 10;              
int ledPin = 3;                 // LED – digital 3
boolean 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变HIGH
if(results.value == 0xFD00FF){
         ledState = !ledState;             //取反      
         digitalWrite(ledPin,ledState);    //改变LED相应状态        
     }   
    irrecv.resume();
  }
}

代码回顾

程序一开始还是对红外接收管的一些常规定义,按原样搬过来就可以了。

#include <IRremote.h>     //调用IRremote.h库
int RECV_PIN = 10;        //定义RECV_PIN变量为10
IRrecv irrecv(RECV_PIN); //设置RECV_PIN(也就是11引脚)为红外接收端
decode_results results;   //定义results变量为红外结果存放位置

intledPin = 3;              // LED – digital3
boolean ledState = LOW;      //ledstate用来存储LED的状态

在这里,我们多定义了一个变量ledState,通过名字应该就可以看出来含义了,用来存储LED的状态的,由于LED状态就两种(1或者0),所以我们使用bool-ean变量类型。

setup()函数中,对使用串口,启动红外解码,数字引脚模式进行设置。
到了主函数loop(),一开始还是先判断是否接收到红外码,并把接收到的数据存储在变量results中。

if(irrecv.decode(&results))

一旦接收到数据后,程序就要做两件事。第一件事,判
断是否接收到了电源键的红外码。

if(results.value == 0xFD00FF)

第二件事,就是让LED改变状态。

ledState = !ledState;             //取反      
digitalWrite(ledPin,ledState);    //改变LED相应状态   

这里可能对“!”比较陌生,“!”是一个逻辑非的符号,“取反”的意思。我们知道“!=”代表的是不等于的意思,也就是相反。这里可以类推为,!ledState是ledState相反的一个状态。“!”只能用于只有两种状态的变量中,也就是boolean型变量。

最后,继续等待下一组信号。
irrecv.resume();

Lesson12_2.ino

1.17 KB, 下载次数: 5012

孙毅  初级技匠

发表于 2016-1-27 23:05:30

这个难道是 DF套件的配套教材啊?!吼吼
回复

使用道具 举报

boluo_77  学徒

发表于 2017-1-6 10:22:01

:victory:
回复

使用道具 举报

boluo_77  学徒

发表于 2017-1-6 10:33:01

求教:   Lesson12_1   在哪儿载?   
只找到这个   Lesson12_2.ino  
回复

使用道具 举报

jiashe2011  见习技师

发表于 2017-2-22 00:59:46

学习12!!!!
回复

使用道具 举报

zhouyu77642017  学徒

发表于 2018-8-9 09:31:33

学习学习
回复

使用道具 举报

小飞侠_  见习技师

发表于 2019-7-9 08:32:56


学习学习
回复

使用道具 举报

vivitong  学徒

发表于 2019-11-27 16:57:17

请问IRremote库在哪里有下载?
回复

使用道具 举报

LPOVER  学徒

发表于 2022-2-9 10:53:07

回复

使用道具 举报

迟迟具体  见习技师

发表于 2023-3-28 09:53:20

boluo_77 发表于 2017-1-6 10:33
求教:   Lesson12_1   在哪儿载?   
只找到这个   Lesson12_2.ino

同问.翻遍了帖子,都没有找到这个文件。
回复

使用道具 举报

迟迟具体  见习技师

发表于 2023-3-28 10:44:31

样例代码12-2:IRrecvirrecv应为IRrecv irrecv;decode_resultsresults应为decode_results results。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail