按照计划,今天应该用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进制的形式返回红外线收到的值给电脑。
继续接收下一个红外编码数据。
}
这里的如果就是if,if的形式是“ if(条件满足){执行内容}”。if是可以嵌套使用的,比如:
if(今天早上没吃饭){
if(今天早上食堂开门了){
去食堂吃饭;
}
}
当然C语言有了如果if那么,也就还有否则else, else必须跟在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判断有收到红外编码的话,就把红外编码发给电脑,并继续接收下一个红外编码。