首页
/ Arduino-IRremote库中的红外信号收发示例解析

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()函数中,程序完成了以下初始化工作:

  1. 串口通信初始化
  2. 红外接收器初始化
  3. 红外发送器初始化
  4. 打印调试信息
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()函数实现了完整的发送-接收流程:

  1. 打印当前循环的参数
  2. 发送红外信号
  3. 等待并接收信号
  4. 更新参数为下一次循环做准备

关键参数说明

  • RECORD_GAP_MICROS:定义两个红外信号之间的最小间隔时间(默认为8000微秒)
  • MARK_EXCESS_MICROS:解码时对信号标记和空格的微调值
  • DELAY_AFTER_SEND:发送后的等待时间
  • DELAY_AFTER_LOOP:循环间的等待时间

实际应用建议

  1. 协议选择:根据您的设备选择合适的红外协议,NEC适用于大多数消费电子产品

  2. 信号调试

    • 启用DEBUG宏可获得详细的解码信息
    • 使用示波器观察实际发送的信号波形
  3. 性能优化

    • 对于资源受限的MCU,可以禁用不必要的协议
    • 考虑使用硬件PWM(通过SEND_PWM_BY_TIMER定义)
  4. 常见问题

    • 接收不准确时,尝试调整RECORD_GAP_MICROS
    • 信号干扰大时,检查电路接地和滤波电容

扩展应用

掌握了基本的红外收发后,您可以进一步开发:

  • 万能红外遥控器
  • 红外数据传输系统
  • 家电自动化控制系统
  • 红外避障机器人

通过这个示例,您已经掌握了Arduino平台红外通信的基本方法,可以在此基础上开发更复杂的红外应用系统。