arduino捕获红外线信号


按照计划,今天应该用C语言加EGE图形库继续讲“if...else...”,但仅仅if和else没有循环(还没讲到),想实现一个吸引人的游戏,真的不容易。

那么,今天我们就来用if抓捕生活中的红外线数据吧

这篇内容同时作为C语言的硬件开发类文章,但因为C语言基础系列讲解进度的原因,本篇文章只实现简单的获取生活中的红外信号。


在生活中,红外信号无处不在,无论是电视机的遥控,还是空调的开关,以及车库门的控制等等都使用的红外信号。我们如果获得的红外信号,通过发射回放信号,就能实现同样的控制。比如我开启车库门的红外信号被你捕捉了,那么我关门走后,你通过重放信号,那么你估计就该被关起来接收教育了。

本篇内容需要硬件设备支持,如果您仅作为C语言基础部分学习,请着重关注if的使用就好,因为这里涉及了很多后续的知识,您可能无法理解。如果您有这些硬件,那么快快行动起来吧,这次的接线相当简单!




我们使用的是arduino来进行硬件控制,另外我们还需要一个红外接收头(VS1838B)和一个电阻。这里因为我身边电阻只有1K的比较接近需求,我就只好选用1K的了,如果各位有更合适的电阻,请选用更适合的。

接线:

adruino------通过USB连接---电脑USB接口

adruino 5v-------电阻----------红外接收头VCC(面向接收头右侧)

arduino GND--------------------红外接收头GND(正中最长引脚)

arduino 数字接口10-----------红外接收头VOUT(面向接收头左侧)




接线完成后,我们打开电脑中的arduino开发环境(学习C基础的没工具和环境请忽略)。




编写代码:

在开头编写

#include <IRremote.h>

IRrecv irrecv(10);

decode_results results;

在初始化中编写

Serial.begin(9600);

irrecv.enableIRIn();

在自动循环中编写

if(irrecv.decode(&results)){

Serial.println(results.value, HEX);

irrecv.resume();

}




在开始时:

我们先要引用红外接收的头文件

设置红外接收头的引脚为10

声明一个用来存储接收的红外编码的对象(结构体)。


在初始化时:

我们要初始化与我们电脑通信的USB串口,将串口波特率设置为默认的标准波特率9600即可。

初始化红外接收的解码器。


在arduino自动执行循环时:

如果(有收到红外(&编码数据))那么{

通过USB串口以16进制的形式返回红外线收到的值给电脑。

继续接收下一个红外编码数据。

}

这里的如果就是ifif的形式是“if(条件满足){执行内容}”。if是可以嵌套使用的,比如:

if(今天早上没吃饭){

if(今天早上食堂开门了){

去食堂吃饭;

}

}

当然C语言有了如果if那么,也就还有否则elseelse必须跟在if后使用,也可以不使用。使用方式如下

if(今天早上没吃饭){

if(今天早上食堂开门了){

去食堂吃饭;

}

else{

去外面吃饭;

}

}

else{

出去玩;

}

当然还有否则如果的形式

if(今天早上食堂开门了){

去食堂吃饭;

}

else if(学校大门开着){

去外面吃饭;

}

这里我们判断的是如果有收到红外编码信号,那么把信号发给电脑,然后继续接收编码(arduino会自动循环执行这个判断的内容,所以我们不需要编写循环)。




设置arduino板的类型为最常用的的Uno板,并设置使用的串口编号。




通过编译,上传程序到arduino中,然后我们在arduino的开发环境的工具中打开串口监视器,波特率默认9600。

接下来我们随意找一个遥控板,发出一个红外信号,接收结果如下:




我们可以通过不同遥控板的不同按键,发出不同的信号,它都会被我们的这个红外接收头接收到。请注意,如果您发出的信号经过多次反射才被接收到的话,可能照成信号与实际有所偏差信号过弱无法接收到


到这里我们已经能够获得那红外数据了,总结一下吧:

我们使用了一个arduino,一个红外接收头,一个电阻和几根导线,以及接线实验时可能用到的面包板和连接电脑的数据线,最后肯定还有一台电脑和电脑中的arduino开发环境(由于以后的一些设备兼容情况,这里使用的开发环境版本1.5.4,这在本次实验中版本不影响结果,但以后某些实现,版本过高的一些优化可能会影响整个实现效果)。

硬件连接完成后,我们进行C语言代码的编写

由于arduino将我们主函数main分解为了setup与loop所以这里没用到main主函数(main在一般的C语言开发中都是必不可少的程序的开始)。

我们引用了红外接收头文件,设置了红外接收的接线引脚(这是可以根据硬件接线进行更改的),声明了一个用来存储红外编码的对象。

在初始化时,初始化了红外解码器和与电脑的串口通信。

在arduino自动循环中,我们用if判断有收到红外编码的话,就把红外编码发给电脑,并继续接收下一个红外编码。