查看: 1162|回复: 1

[入门] 【红外遥控灯】基于Mind+ Ardunio入门教程14

[复制链接]
      这节我们会接触一个新的元件——红外接收管。所谓红外接收管,也就是接收红外光的电子器件。红外接收管,看着离我们很遥远的感觉!其实不然,它就在我们身边。比如我们电视机,空调这些家电,其实它们都需要用到红外接收管。我们都知道遥控器发射出来的都是红外光,电视机上势必要有红外接收管,才能接收到遥控器发过来的红外信号。

      我们这次就用红外接收管做个遥控灯,通过遥控器的红色电源键来控制LED的开关。

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



预热实验:

所需元件

1×  红外接收管                                      
1× Mini遥控器                     



硬件连接

       看着是不是很高兴,这应该是我们看到最容易的连线了,只需要连接三根线就可以了,注意一下正负就可以了(图中表明部分)。红外接收管Vout输出接到数字引脚3。

14-1红外接收管连线图



代码编程
       样例程序14-1
[C] 纯文本查看 复制代码
#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+中,库规定红外接收管只能连接23引脚。如遇问题可以在官方文档的常见问题中查找,或是论坛发帖询问。


       上面这段代码有一个知识点需要着重讲解
[C] 纯文本查看 复制代码
    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
[C] 纯文本查看 复制代码
#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相应状态         
                 }   
    }  
}  


代码学习

       程序一开始还是对红外接收管的一些常规定义,按原样搬过来就可以了。
[C] 纯文本查看 复制代码
#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中。
[C] 纯文本查看 复制代码
  if ((result!="0")) {  
       一旦接收到数据后,程序就要做两件事。第一件事,判断是否接收到了电源键的红外码。   
[C] 纯文本查看 复制代码
if(result == "FD00FF"){  
       第二件事,就是让LED改变状态。
[C] 纯文本查看 复制代码
ledState = !ledState;                                        //取反        
[align=left]digitalWrite(ledPin,ledState);                //改变LED相应状态  
      
       这里可能对“!”比较陌生,“!”是一个逻辑非的符号,“取反”的意思。我们知道“!=”代表的是不等于的意思,也就是相反。这里可以类推为,!ledState是ledState相反的一个状态。“!”只能用于只有两种状态的变量中,也就是boolean型变量。



课后作业

1. 通过这个遥控项目,再结合上一个项目的风扇,能不能再给遥控器增加一个功能,既可控灯,还可控风扇。
2. DIY一个你的遥控作品吧!比如简单的会动的小人,结合我们前面的舵机,通过遥控器上不同的按键,让舵机转动不同的角度,感觉随你的控制转动,发挥你的想象做出更多Arduino作品吧!

gada888  版主

发表于 2019-12-25 10:21:04

解析到位
回复

使用道具 举报

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

本版积分规则

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

硬件清单

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

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

mail