红外解码编码模块
红外解码编码模块采用MCU+红外发射头+红外接收头,引出MCU的串口连接其他需要红外控制的设备,可作为红外无线数据通信、数据传输等功能。具备NEC格式红外编码发射功能,可控制99%的NEC红外格式设备,如大部分电视机、机顶盒、DVD、电风扇等电器设备。
只需要利用到单片机的串口通信知识,通过串口发送指定的指令进行控制模块发射;通过串口接收方式进行红外解码操作,获取遥控编码信息。也可以使用2个模块实现无线操控。
模块来源
规格参数
工作电压:5V
供电电流:>100mA
发射距离:6-10米(根据环境光线不同和收发情况有偏差)
接收距离:6-10米(和发射设备的功率有关)
控制方式:串口
管脚数量:4 Pin(2.54mm间距排针)
使用说明
发射和接收过程中指示灯会闪烁,否则常亮。
解码:解码时不需要发送任何指令,只需要拿起遥控对准模块的接收头按下,这时模块的串口就输出该红外编码。通过串口调试助手查看到解码的结果,结果输出为“用户码1+用户码2+命令码”三位。在做编码发送时也只需要发送这三位即可。
查看解码的结果方法
这里没有接错请不要怀疑。
将模块的TXD接到开发板的TXD->1,模块的RXD接到开发板上的RXD->0上。
将串口调试助手连接电脑,按照如下配置打开串口调试软件。使用红外遥控器或者空调遥控器对着模块发送红外信号,就会看到红外发射接收模块解析遥控器信号后,返回的解码数据。图中显示的是美的空调遥控器的打开空调信号的解码数据:E0 FD FD。
通信方式
这个红外发射接收模块,通过特定的串口协议,实现的红外信号的接收和发送。需要注意的是本模块收发的串口指令格式都为 16 进制格式,即A1为0XA1。
帧头为通信地址,A1为默认地址,而默认地址是可以通过指令修改的,所以还有一个通用地址为0XFA,当忘记了自己设置的地址,可以通过通用地址0XFA进行修改。
操作位用于表示当前指令用于实现什么功能,其定义的说明见下表。
操作位 | F1 | F2 | F3 |
---|---|---|---|
说明 | 发送红外信号状态 | 修改通信地址状态 | 修改串口波特率状态 |
发送反馈
每一个指令发送完毕之后,都有对应的反馈信息。
反馈数据 | 说明 |
---|---|
F1 | 发送成功 |
F2 | 串口地址修改成功 |
F3 | 波特率设置成功 |
无返回 | 指令接收错误或操作不成功 |
示例:
发送红外信号数据 FA F1 E0 FD FD 后,返回 F1 说明发送成功; 返回其他说明发送失败;
发送修改通信地址 FA F2 A5 00 00 后,返回 F2 说明修改成功; 返回其他说明修改失败;
发送修改波特率 FA F3 02 00 00 后,返回 F3 说明修改成功; 返回其他说明修改失败;
实现代码说明:
定义一个长度为5的unsigned char的数组:unsigned char send_data[]={0};将指令填充至数组里。
unsigned char send_data[]={0};
send_data[] = 0XF1; //帧头
send_data[] = 0XF1; //操作位
send_data[] = 0XE0; //地址1
send_data[] = 0XFD; //地址2
send_data[] = 0XFD; //键值
2
3
4
5
6
将这个数组通过串口发送给模块。但是需要注意,因为是有反馈信息的,为了确定返回的数据是否正确,需要先清除之前接收的数据,不管之前有没有接收过数据都要清除。
infrared_receive_clear();//先清除接收的数据
infrared_send_hex(send_data, 5);//发送数据
2
发送数据完毕后,等待串口接收到反馈的数据,并且设置好如果长时间接收不到,要结束接收,防止一直等待接收导致卡死。
time_out = 1000;//等待接收时间1000Ms
//等待回应数据
//infrared_recv_flag != 1说明串口没有接收到数据
while( infrared_recv_flag != 1 && time_out > 0 )
{
time_out--;
delay_1ms(1);
}
if( time_out > 0 )//没有超时
{
infrared_recv_flag = 0;//清除标志位
//如果接收到发送成功的回应数据
if( infrared_recv_buff[] == 0XF1 ) return 1;
else return 2;//接收的数据不对
}
return 0;//接收超时
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
硬件连接
这里没有接错请不要怀疑。
红外模块的5V 接到 开发板的 5V。
红外模块的TXD 接到 开发板的RX->0。
红外模块的RXD 接到 开发板的TX->1。
红外模块的GND 接到 开发板的GND。
注意:在上传代码时可能需要从RX和TX引脚断开HC-05的连接,以避免上传过程中的干扰。
使用方法
/******************************************************************************
* 测试硬件:ColorEasyDuino开发板
* 版 本 号: V1.0
* 修改作者: www.lckfb.com
* 修改日期: 2024年04月11日
* 功能介绍:
*****************************************************************************
* 开发板软硬件资料与相关项目软硬件资料官网全部开源
* 开发板官网:www.lckfb.com
* 技术支持常驻论坛,任何技术问题欢迎随时交流学习
* 立创论坛:club.szlcsc.com
* 关注bilibili账号:【立创开发板】,掌握我们的最新动态!
* 不靠卖板赚钱,以培养中国工程师为己任
******************************************************************************/
unsigned char device_addr = 0XA1;//默认器件地址
unsigned char Infrared_emission = 0XF1;//红外发射状态
unsigned char modified_addr = 0XF2;//修改设备地址
unsigned char modified_baud = 0XF3;//修改波特率
/******************************************************************
* 函 数 名 称:Infrared_emission_cmd
* 函 数 说 明:控制模块发射红外命令
* 函 数 形 参:Infrared_buff要发射的红外信号 len红外信号长度
* 函 数 返 回:0: 超时未接收到发射成功数据
* 1: 发射成功
* 2: 接收的数据不是发射成功数据
* 100:发射的数据不是3位
* 备 注:无
******************************************************************/
char Infrared_emission_cmd(unsigned char* Infrared_buff, char len)
{
unsigned char send_data[] = {0};//必须赋初值
unsigned int time_out = 1000; //超时时间,单位MS
String receivedData = "";
// //如果要发送的数据长度不对
if( (len < 3) || (len > 3) )
return 100;
send_data[] = device_addr; //设备地址
send_data[] = Infrared_emission; //操作位
send_data[] = Infrared_buff[]; //数据位1
send_data[] = Infrared_buff[]; //数据位2
send_data[] = Infrared_buff[]; //数据位3
//发送数据
for( int i = 0; i < 5; i++ )Serial.write(send_data[]);
//等待模块的回应数据
while (Serial.available() <= 0 && time_out > 0 )
{
time_out--;
delay(1);
}
if( time_out > 0 )//没有超时
{
while (Serial.available() > 0)
{
unsigned char incomingByte = Serial.read();
receivedData += incomingByte;
delay(2); // 确保数据完全到达
}
//如果接收到通信地址修改成功的回应数据
if( receivedData[] == 0XF1 ) return 1;
else return 2;
}
return 0;
}
void setup() {
Serial.begin(9600);
}
void loop() {
//假设这个是你要发送的红外数据
unsigned char buff[] = {0XE0, 0XFD, 0XFD};
Infrared_emission_cmd(buff,3);
delay(1000);
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84