Arduino红外遥控终极指南:Arduino-IRremote库完整使用教程

张开发
2026/6/14 19:04:02 15 分钟阅读

分享文章

Arduino红外遥控终极指南:Arduino-IRremote库完整使用教程
Arduino红外遥控终极指南Arduino-IRremote库完整使用教程【免费下载链接】Arduino-IRremoteInfrared remote library for Arduino: send and receive infrared signals with multiple protocols项目地址: https://gitcode.com/gh_mirrors/ar/Arduino-IRremoteArduino-IRremote是一个功能强大的红外信号收发库支持30种红外协议让您的Arduino项目轻松实现红外遥控功能。无论是控制家电、制作智能家居还是开发机器人项目这个库都能为您提供完整的红外通信解决方案。 为什么选择Arduino-IRremote在众多红外库中Arduino-IRremote以其高效性能、丰富功能和易用性脱颖而出支持30种红外协议包括NEC、Sony、RC5、RC6、LG、Samsung等主流协议双向通信同时支持发送和接收红外信号代码优化最小版本仅需500字节适合资源受限的Arduino跨平台兼容支持Arduino Uno、Nano、Mega、ESP8266、ESP32等主流开发板 快速入门5分钟搭建红外接收器硬件准备您需要以下硬件组件Arduino开发板如Arduino Uno红外接收模块如TSOP1738、VS1838等面包板和连接线红外遥控器任意品牌基础接收示例创建一个最简单的红外接收程序#include IRremote.hpp #define IR_RECEIVE_PIN 11 // 红外接收器连接到数字引脚11 void setup() { Serial.begin(115200); IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK); Serial.println(红外接收器已启动); } void loop() { if (IrReceiver.decode()) { Serial.print(协议: ); Serial.println(IrReceiver.decodedIRData.protocol); Serial.print(地址: 0x); Serial.println(IrReceiver.decodedIRData.address, HEX); Serial.print(命令: 0x); Serial.println(IrReceiver.decodedIRData.command, HEX); Serial.println(---); IrReceiver.resume(); } }安装库的三种方法方法1Arduino库管理器安装打开Arduino IDE点击工具→管理库搜索IRremote选择最新版本并安装方法2手动安装推荐cd ~/Arduino/libraries git clone https://gitcode.com/gh_mirrors/ar/Arduino-IRremote方法3下载ZIP文件访问项目仓库下载最新版本在Arduino IDE中选择项目→加载库→添加.ZIP库 核心功能详解1. 红外信号接收Arduino-IRremote支持多种解码方式从简单到复杂解码模式特点适用场景协议解码识别具体协议输出地址和命令已知协议的遥控器原始数据解码记录脉冲时间序列未知协议的设备哈希解码生成唯一哈希值快速识别不同按键2. 红外信号发送发送红外信号同样简单#include IRremote.hpp void setup() { IrSender.begin(3); // 红外LED连接到引脚3 delay(100); // 发送NEC协议信号地址0xF1命令0x76 IrSender.sendNEC(0xF1, 0x76, 2); // 重复2次 } void loop() { // 循环发送 delay(5000); IrSender.sendNEC(0xF1, 0x76, 2); }3. 支持的主要红外协议Arduino-IRremote支持丰富的红外协议常见消费电子协议NEC / Onkyo / AppleSony (12/15/20位)Samsung / LGRC5 / RC6 / RCMMPanasonic / Kaseikyo特殊设备协议BoseWaveBang OlufsenMagiQuestLego Power Functions空调协议LG等️ 实战项目制作红外遥控机器人项目概述通过红外遥控器控制机器人小车实现前进、后退、左转、右转等基本功能。核心代码实现#include IRremote.hpp #define IR_RECEIVE_PIN 11 #define MOTOR_A_PIN1 5 #define MOTOR_A_PIN2 6 #define MOTOR_B_PIN1 9 #define MOTOR_B_PIN2 10 // 定义遥控器按键对应的命令值 #define IR_UP 0x18 #define IR_DOWN 0x52 #define IR_LEFT 0x08 #define IR_RIGHT 0x5A #define IR_STOP 0x1C void setup() { Serial.begin(115200); IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK); // 初始化电机引脚 pinMode(MOTOR_A_PIN1, OUTPUT); pinMode(MOTOR_A_PIN2, OUTPUT); pinMode(MOTOR_B_PIN1, OUTPUT); pinMode(MOTOR_B_PIN2, OUTPUT); stopMotors(); } void loop() { if (IrReceiver.decode()) { uint16_t command IrReceiver.decodedIRData.command; switch(command) { case IR_UP: forward(); break; case IR_DOWN: backward(); break; case IR_LEFT: turnLeft(); break; case IR_RIGHT: turnRight(); break; case IR_STOP: stopMotors(); break; } IrReceiver.resume(); } } // 电机控制函数 void forward() { digitalWrite(MOTOR_A_PIN1, HIGH); digitalWrite(MOTOR_A_PIN2, LOW); digitalWrite(MOTOR_B_PIN1, HIGH); digitalWrite(MOTOR_B_PIN2, LOW); } void backward() { digitalWrite(MOTOR_A_PIN1, LOW); digitalWrite(MOTOR_A_PIN2, HIGH); digitalWrite(MOTOR_B_PIN1, LOW); digitalWrite(MOTOR_B_PIN2, HIGH); } void turnLeft() { digitalWrite(MOTOR_A_PIN1, LOW); digitalWrite(MOTOR_A_PIN2, HIGH); digitalWrite(MOTOR_B_PIN1, HIGH); digitalWrite(MOTOR_B_PIN2, LOW); } void turnRight() { digitalWrite(MOTOR_A_PIN1, HIGH); digitalWrite(MOTOR_A_PIN2, LOW); digitalWrite(MOTOR_B_PIN1, LOW); digitalWrite(MOTOR_B_PIN2, HIGH); } void stopMotors() { digitalWrite(MOTOR_A_PIN1, LOW); digitalWrite(MOTOR_A_PIN2, LOW); digitalWrite(MOTOR_B_PIN1, LOW); digitalWrite(MOTOR_B_PIN2, LOW); } 高级配置与优化技巧1. 协议选择优化为了节省程序空间可以只启用需要的协议// 在包含IRremote.hpp之前定义 #define DECODE_NEC // 仅启用NEC协议解码 #define DECODE_SONY // 仅启用Sony协议解码 // #define DECODE_DENON // 注释掉不需要的协议 #include IRremote.hpp2. 缓冲区大小调整根据协议长度调整缓冲区大小#define RAW_BUFFER_LENGTH 100 // 默认值适用于大多数协议 // #define RAW_BUFFER_LENGTH 200 // 长协议如空调协议3. 多接收器支持从版本4.6开始支持多个红外接收器#define SUPPORT_MULTIPLE_RECEIVER_INSTANCES #include IRremote.hpp IRrecv IrReceiver1(2); // 第一个接收器在引脚2 IRrecv IrReceiver2(3); // 第二个接收器在引脚3 void setup() { IrReceiver1.begin(2, DISABLE_LED_FEEDBACK); IrReceiver2.begin(3, DISABLE_LED_FEEDBACK); } 红外信号分析技巧使用示波器分析信号红外信号分析是调试红外通信的关键。上图展示了软件生成的PWM红外信号波形可以看到载波频率38kHz脉冲宽度9.1μs占空比32.85%周期27.7μs常见红外协议特征协议载波频率数据格式典型应用NEC38kHz32位地址命令反码大多数消费电子Sony40kHz12/15/20位索尼设备RC536kHz14位地址命令翻转位飞利浦设备Samsung38kHz32位三星电视、空调 实际应用案例案例1智能家居控制使用Arduino-IRremote控制家电设备// 控制LG空调 #include IRremote.hpp #include ac_LG.h Aircondition_LG myAC; void setup() { myAC.begin(3); // 红外LED连接到引脚3 // 设置空调参数 myAC.setPower(true); myAC.setMode(AC_MODE_COOL); myAC.setTemperature(25); myAC.setFanSpeed(AC_FAN_AUTO); // 发送命令 myAC.sendCommand(); }案例2红外学习遥控器制作可以学习其他遥控器的万能遥控器#include IRremote.hpp #define IR_RECEIVE_PIN 11 #define IR_SEND_PIN 3 #define LEARN_BUTTON_PIN 4 struct LearnedCode { decode_type_t protocol; uint32_t address; uint32_t command; }; LearnedCode learnedCodes[10]; uint8_t learnedCount 0; void setup() { pinMode(LEARN_BUTTON_PIN, INPUT_PULLUP); IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK); IrSender.begin(IR_SEND_PIN); } void loop() { // 学习模式 if (digitalRead(LEARN_BUTTON_PIN) LOW) { if (IrReceiver.decode()) { if (learnedCount 10) { learnedCodes[learnedCount].protocol IrReceiver.decodedIRData.protocol; learnedCodes[learnedCount].address IrReceiver.decodedIRData.address; learnedCodes[learnedCount].command IrReceiver.decodedIRData.command; learnedCount; Serial.println(代码已学习); } IrReceiver.resume(); } } // 发送学习到的代码 // ... 根据其他输入发送相应代码 }⚠️ 常见问题与解决方案问题1接收不到信号可能原因及解决方案引脚连接错误检查红外接收器VCC、GND、OUT引脚是否正确连接协议不匹配确认遥控器使用的协议已在代码中启用距离过远红外信号有效距离通常为5-10米角度问题红外接收器有约45°的接收角度问题2信号干扰解决方法使用滤波电容在VCC和GND之间添加10-100μF电容避免强光直射红外接收器对日光和荧光灯敏感使用屏蔽线减少电磁干扰问题3代码空间不足优化建议仅启用需要的协议解码使用TinyIRReceiver仅需500字节禁用LED反馈功能调整缓冲区大小 调试技巧与工具1. 串口调试输出启用详细调试信息void setup() { Serial.begin(115200); Serial.println(红外调试模式); // 打印接收到的所有信息 if (IrReceiver.decode()) { IrReceiver.printIRResultShort(Serial); IrReceiver.printIRResultRawFormatted(Serial, true); IrReceiver.printIRSendUsage(Serial); } }2. 使用逻辑分析仪对于复杂的红外协议分析逻辑分析仪是强大工具采样率至少1MHz通道数1通道即可分析软件PulseView、Saleae Logic3. 红外信号可视化工具推荐使用以下工具IrScrutinizer专业的红外信号分析软件AnalysIR在线红外信号分析IRremoteESP8266解码器ESP8266专用工具 性能优化建议1. 内存优化对于资源受限的Arduino如ATtiny85// 使用最小配置 #define DECODE_NEC // 仅支持NEC协议 #define RAW_BUFFER_LENGTH 50 // 减少缓冲区 #define NO_LED_FEEDBACK_CODE // 禁用LED反馈 #include TinyIRReceiver.hpp // 使用轻量级版本2. 响应速度优化使用中断驱动接收TinyIRReceiver减少串口输出优化数据处理逻辑3. 电源管理红外LED使用合适的限流电阻考虑使用晶体管驱动大功率红外LED在空闲时进入低功耗模式 进阶功能探索1. 红外信号录制与回放Arduino-IRremote支持原始信号录制// 录制原始红外信号 if (IrReceiver.decode()) { // 获取原始数据 uint16_t* rawData IrReceiver.irparams.rawbuf; uint16_t rawLength IrReceiver.decodedIRData.rawlen; // 存储或发送原始数据 storeRawData(rawData, rawLength); }2. 自定义红外协议对于非标准设备可以创建自定义协议// 发送自定义脉冲距离编码 void sendCustomProtocol() { uint32_t data 0x12345678; IrSender.sendPulseDistance(38, // 载波频率kHz 9000, // 头脉冲时间μs 4500, // 头间隔时间μs 560, // 逻辑1脉冲时间 1690, // 逻辑1间隔时间 560, // 逻辑0脉冲时间 560, // 逻辑0间隔时间 data, // 数据指针 32, // 数据位数 false, // LSB优先 0, // 重复次数 0); // 额外标志 }3. 红外中继器制作红外信号中继器扩展控制范围// 简单的红外中继器 void loop() { if (IrReceiver.decode()) { // 立即转发接收到的信号 IrSender.sendRaw(IrReceiver.irparams.rawbuf, IrReceiver.decodedIRData.rawlen, 38); // 38kHz载波 IrReceiver.resume(); } } 学习资源与社区官方资源项目仓库包含完整源代码和示例API文档详细的函数说明和使用示例示例代码30个实用示例覆盖各种应用场景社区支持GitHub Issues报告问题和功能请求Arduino论坛与其他开发者交流经验Stack Overflow技术问题解答进阶学习红外协议原理深入了解不同协议的编码方式信号处理算法学习红外信号的数字处理技术硬件设计设计高性能红外收发电路 结语Arduino-IRremote库为Arduino开发者提供了强大而灵活的红外通信解决方案。无论您是初学者还是经验丰富的开发者都能通过这个库快速实现红外遥控功能。关键要点回顾简单易用几行代码即可实现红外收发功能丰富支持30种协议满足各种需求⚡性能优异最小版本仅500字节适合资源受限项目持续更新活跃的社区维护和更新现在就开始您的红外项目吧从简单的遥控开关到复杂的智能家居系统Arduino-IRremote都能为您提供强大的支持。提示在实际项目中建议先从SimpleReceiver和SimpleSender示例开始逐步深入探索更高级的功能。遇到问题时可以参考项目中的30多个示例代码它们涵盖了大多数常见应用场景。【免费下载链接】Arduino-IRremoteInfrared remote library for Arduino: send and receive infrared signals with multiple protocols项目地址: https://gitcode.com/gh_mirrors/ar/Arduino-IRremote创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

更多文章