Arduino-IRremote库中的红外信号收发示例解析
2025-07-08 05:35:18作者:侯霆垣
概述
本文将深入讲解Arduino-IRremote库中的SendAndReceive示例程序,该示例展示了如何同时实现红外信号的发送和接收功能。通过这个示例,我们可以学习到如何利用Arduino平台进行红外通信的基本原理和实现方法。
硬件准备
要运行此示例,您需要准备:
- Arduino开发板
- 红外发射二极管
- 红外接收模块(如VS1838B)
- 适当的电阻(通常330Ω用于发射,10kΩ用于接收)
代码解析
协议配置
示例中主要使用了NEC协议,这是最常见的红外遥控协议之一:
#define DECODE_NEC // 包含Apple和Onkyo设备
#define DECODE_DISTANCE_WIDTH // 当NEC协议接收不准确时的备用解码器
开发者可以根据需要启用或禁用其他协议,以节省程序存储空间:
//#define EXCLUDE_UNIVERSAL_PROTOCOLS // 可节省约1000字节
//#define EXCLUDE_EXOTIC_PROTOCOLS // 可节省约650字节
初始化设置
在setup()
函数中,程序完成了以下初始化工作:
- 串口通信初始化
- 红外接收器初始化
- 红外发送器初始化
- 打印调试信息
IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK);
IrSender.begin();
发送红外信号
send_ir_data()
函数负责发送NEC协议格式的红外信号:
IrSender.sendNEC(sAddress, sCommand, sRepeats);
其中:
sAddress
:设备地址(2字节)sCommand
:命令码(1字节)sRepeats
:重复发送次数
接收红外信号
receive_ir_data()
函数处理接收到的红外信号:
if (IrReceiver.decode()) {
// 解码并打印接收到的数据
IrReceiver.resume(); // 准备接收下一个信号
}
主循环
loop()
函数实现了完整的发送-接收流程:
- 打印当前循环的参数
- 发送红外信号
- 等待并接收信号
- 更新参数为下一次循环做准备
关键参数说明
RECORD_GAP_MICROS
:定义两个红外信号之间的最小间隔时间(默认为8000微秒)MARK_EXCESS_MICROS
:解码时对信号标记和空格的微调值DELAY_AFTER_SEND
:发送后的等待时间DELAY_AFTER_LOOP
:循环间的等待时间
实际应用建议
-
协议选择:根据您的设备选择合适的红外协议,NEC适用于大多数消费电子产品
-
信号调试:
- 启用
DEBUG
宏可获得详细的解码信息 - 使用示波器观察实际发送的信号波形
- 启用
-
性能优化:
- 对于资源受限的MCU,可以禁用不必要的协议
- 考虑使用硬件PWM(通过
SEND_PWM_BY_TIMER
定义)
-
常见问题:
- 接收不准确时,尝试调整
RECORD_GAP_MICROS
值 - 信号干扰大时,检查电路接地和滤波电容
- 接收不准确时,尝试调整
扩展应用
掌握了基本的红外收发后,您可以进一步开发:
- 万能红外遥控器
- 红外数据传输系统
- 家电自动化控制系统
- 红外避障机器人
通过这个示例,您已经掌握了Arduino平台红外通信的基本方法,可以在此基础上开发更复杂的红外应用系统。