3分钟掌握Arduino红外遥控:从零开始构建智能家居控制系统

发布时间:2026/6/14 22:25:01

3分钟掌握Arduino红外遥控:从零开始构建智能家居控制系统 3分钟掌握Arduino红外遥控从零开始构建智能家居控制系统【免费下载链接】Arduino-IRremoteInfrared remote library for Arduino: send and receive infrared signals with multiple protocols项目地址: https://gitcode.com/gh_mirrors/ar/Arduino-IRremote你是否想过用Arduino控制家里的电视、空调或智能设备Arduino-IRremote库正是你需要的解决方案。这个功能强大的红外遥控库让你能够发送和接收红外信号支持超过15种主流红外协议为你的物联网项目开启无限可能。为什么选择Arduino-IRremote在智能家居和物联网项目中红外遥控是最常见且成本最低的控制方式之一。Arduino-IRremote库提供了以下核心优势多协议支持兼容NEC、Sony、Samsung、LG、Panasonic等主流红外协议双向通信既能接收遥控器信号也能发送控制指令资源优化代码占用小适合资源有限的Arduino开发板易用性强简单的API设计新手也能快速上手硬件准备红外收发模块连接指南开始之前你需要准备以下硬件组件组件数量说明Arduino开发板1个Uno、Nano、Mega等主流型号红外接收模块1个如TSOP1736、VS1838B等红外发射二极管1-3个建议串联使用增强信号电阻1个100-220Ω限流保护面包板1块便于连接测试杜邦线若干连接各组件连接示意图上图展示了常见红外接收器的引脚配置。不同型号的红外接收器引脚定义略有差异TSOP1736/SFH506电源正极、S信号输出SFH505A电源正极、-电源负极、S信号输出PIC12043SS信号输出、电源正极连接Arduino的接线方式如下红外接收模块VCC → Arduino 5VGND → Arduino GNDOUT → Arduino数字引脚2红外发射电路Arduino数字引脚3 → 100Ω电阻 → 红外发射二极管正极红外发射二极管负极 → Arduino GND第一步快速安装与配置方法一通过Arduino IDE安装打开Arduino IDE依次选择工具→管理库搜索框输入IRremote找到IRremote by Armin Joachimsmeyer点击安装按钮方法二手动安装如果你需要最新版本或自定义配置可以通过Git克隆仓库cd ~/Arduino/libraries git clone https://gitcode.com/gh_mirrors/ar/Arduino-IRremote第二步编写第一个红外接收程序创建一个新的Arduino项目输入以下代码#include IRremote.hpp #define IR_RECEIVE_PIN 2 // 红外接收器连接的引脚 void setup() { Serial.begin(115200); Serial.println(红外接收器初始化...); // 启动红外接收器启用LED反馈 IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK); } void loop() { if (IrReceiver.decode()) { // 打印接收到的红外数据 Serial.println(收到红外信号); IrReceiver.printIRResultShort(Serial); // 打印发送该信号的代码 IrReceiver.printIRSendUsage(Serial); // 准备接收下一个信号 IrReceiver.resume(); } delay(100); }快速提示确保红外接收器的OUT引脚连接到Arduino的数字引脚2打开串口监视器波特率115200查看接收到的信号尝试用电视或空调遥控器对准接收器按下按钮第三步发送红外信号控制设备现在让我们实现发送功能控制你的设备#include IRremote.hpp #define IR_SEND_PIN 3 // 红外发射器连接的引脚 void setup() { Serial.begin(115200); Serial.println(红外发射器初始化...); // 启动红外发射器 IrSender.begin(IR_SEND_PIN); // 发送NEC协议的红外信号 // 地址0x00命令0x45音量 IrSender.sendNEC(0x00, 0x45, 0); Serial.println(已发送红外信号); } void loop() { // 每5秒发送一次信号 delay(5000); IrSender.sendNEC(0x00, 0x45, 0); Serial.println(再次发送红外信号...); }常见红外协议发送示例协议发送函数示例代码NECsendNEC()IrSender.sendNEC(0x00, 0x45, 2)SonysendSony()IrSender.sendSony(0x1, 0x15, 1)SamsungsendSamsung()IrSender.sendSamsung(0x707, 0x2, 0)LGsendLG()IrSender.sendLG(0x2, 0x3434, 3)第四步高级应用 - 构建红外遥控机器人上图展示了一个基于Arduino的红外遥控机器人小车。让我们创建一个简单的红外遥控小车控制系统#include IRremote.hpp #define IR_RECEIVE_PIN 2 #define MOTOR_A_PIN1 5 #define MOTOR_A_PIN2 6 #define MOTOR_B_PIN1 9 #define MOTOR_B_PIN2 10 // 定义遥控器按键对应的命令 #define CMD_FORWARD 0x18 #define CMD_BACKWARD 0x52 #define CMD_LEFT 0x08 #define CMD_RIGHT 0x5A #define CMD_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 CMD_FORWARD: moveForward(); break; case CMD_BACKWARD: moveBackward(); break; case CMD_LEFT: turnLeft(); break; case CMD_RIGHT: turnRight(); break; case CMD_STOP: stopMotors(); break; } IrReceiver.resume(); } } void moveForward() { digitalWrite(MOTOR_A_PIN1, HIGH); digitalWrite(MOTOR_A_PIN2, LOW); digitalWrite(MOTOR_B_PIN1, HIGH); digitalWrite(MOTOR_B_PIN2, LOW); Serial.println(前进); } void moveBackward() { digitalWrite(MOTOR_A_PIN1, LOW); digitalWrite(MOTOR_A_PIN2, HIGH); digitalWrite(MOTOR_B_PIN1, LOW); digitalWrite(MOTOR_B_PIN2, HIGH); Serial.println(后退); } void turnLeft() { digitalWrite(MOTOR_A_PIN1, LOW); digitalWrite(MOTOR_A_PIN2, HIGH); digitalWrite(MOTOR_B_PIN1, HIGH); digitalWrite(MOTOR_B_PIN2, LOW); Serial.println(左转); } void turnRight() { digitalWrite(MOTOR_A_PIN1, HIGH); digitalWrite(MOTOR_A_PIN2, LOW); digitalWrite(MOTOR_B_PIN1, LOW); digitalWrite(MOTOR_B_PIN2, HIGH); Serial.println(右转); } void stopMotors() { digitalWrite(MOTOR_A_PIN1, LOW); digitalWrite(MOTOR_A_PIN2, LOW); digitalWrite(MOTOR_B_PIN1, LOW); digitalWrite(MOTOR_B_PIN2, LOW); Serial.println(停止); }第五步红外信号分析与调试理解红外信号波形上图展示了红外信号的PWM脉冲宽度调制细节。理解这些参数对于调试红外通信至关重要周期27.70μs对应频率19.258kHz高电平宽度9.100μs低电平宽度18.60μs占空比32.85%使用调试工具Arduino-IRremote提供了强大的调试功能// 打印详细的接收信息 void printDetailedInfo() { if (IrReceiver.decode()) { Serial.println( 红外信号详情 ); // 打印协议信息 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.print(原始数据: 0x); Serial.println(IrReceiver.decodedIRData.decodedRawData, HEX); // 打印比特数 Serial.print(比特数: ); Serial.println(IrReceiver.decodedIRData.numberOfBits); // 打印发送示例 IrReceiver.printIRSendUsage(Serial); IrReceiver.resume(); } }实用技巧与常见问题解决技巧1增强红外信号强度为了获得更好的传输距离你可以串联多个红外发射二极管2-3个二极管串联可显著增强信号调整电阻值使用100Ω电阻可获得约20mA电流优化发射角度确保红外二极管正对目标设备技巧2处理未知协议遇到不支持的协议时使用以下方法// 启用通用解码器 #define DECODE_DISTANCE_WIDTH #include IRremote.hpp // 使用原始数据发送 uint16_t rawData[] {9000, 4500, 560, 560, 560, 1690, 560, 560, 560, 560}; IrSender.sendRaw(rawData, sizeof(rawData)/sizeof(rawData[0]), 38);常见问题排查表问题现象可能原因解决方案接收不到信号引脚连接错误检查VCC、GND、OUT连接信号不稳定环境光干扰远离日光灯、LED灯等光源发送距离短发射功率不足串联多个红外二极管协议无法识别协议未启用在代码开头添加#define DECODE_NEC等与Neopixel冲突中断被禁用使用if (IrReceiver.isIdle())检查技巧3节省内存的小型接收器对于资源受限的项目使用TinyIRReceiver#define USE_ONKYO_PROTOCOL #include TinyIRReceiver.hpp void setup() { initPCIInterruptForTinyIRReceiver(); } void loop() { if (TinyIRReceiverDecode()) { // 处理接收到的数据 } }TinyIRReceiver仅占用500字节代码空间且不需要定时器资源项目实战智能空调控制器让我们创建一个实用的智能空调控制器使用LG空调协议#include IRremote.hpp #define IR_SEND_PIN 3 #define TEMP_UP_PIN 7 #define TEMP_DOWN_PIN 8 #define POWER_PIN 9 void setup() { Serial.begin(115200); IrSender.begin(IR_SEND_PIN); pinMode(TEMP_UP_PIN, INPUT_PULLUP); pinMode(TEMP_DOWN_PIN, INPUT_PULLUP); pinMode(POWER_PIN, INPUT_PULLUP); Serial.println(智能空调控制器就绪); } void loop() { // 温度上调按钮 if (digitalRead(TEMP_UP_PIN) LOW) { sendLGTemperatureUp(); delay(500); // 防抖延时 } // 温度下调按钮 if (digitalRead(TEMP_DOWN_PIN) LOW) { sendLGTemperatureDown(); delay(500); } // 电源开关按钮 if (digitalRead(POWER_PIN) LOW) { sendLGPower(); delay(500); } } void sendLGTemperatureUp() { // LG协议地址0x8800温度命令0x02 IrSender.sendLG(0x8800, 0x02, 2); Serial.println(温度上调); } void sendLGTemperatureDown() { // LG协议地址0x8800温度-命令0x03 IrSender.sendLG(0x8800, 0x03, 2); Serial.println(温度下调); } void sendLGPower() { // LG协议地址0x8800电源命令0x40 IrSender.sendLG(0x8800, 0x40, 2); Serial.println(电源开关); }进阶功能红外信号学习与重放Arduino-IRremote库支持信号学习和重放功能#include IRremote.hpp #define IR_RECEIVE_PIN 2 #define IR_SEND_PIN 3 #define LEARN_BUTTON_PIN 4 #define PLAY_BUTTON_PIN 5 // 存储学习到的信号 uint32_t learnedRawData[100]; uint16_t learnedRawDataLength 0; void setup() { Serial.begin(115200); IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK); IrSender.begin(IR_SEND_PIN); pinMode(LEARN_BUTTON_PIN, INPUT_PULLUP); pinMode(PLAY_BUTTON_PIN, INPUT_PULLUP); Serial.println(红外学习器就绪); Serial.println(按下学习按钮开始录制信号); } void loop() { // 学习模式 if (digitalRead(LEARN_BUTTON_PIN) LOW) { learnIRSignal(); } // 播放模式 if (digitalRead(PLAY_BUTTON_PIN) LOW) { playIRSignal(); delay(500); } } void learnIRSignal() { Serial.println(正在学习...请按下遥控器按钮); learnedRawDataLength 0; bool signalReceived false; unsigned long startTime millis(); // 等待10秒接收信号 while (millis() - startTime 10000) { if (IrReceiver.decode()) { // 保存原始数据 learnedRawDataLength IrReceiver.irparams.rawlen; for (uint16_t i 0; i learnedRawDataLength; i) { learnedRawData[i] IrReceiver.irparams.rawbuf[i]; } Serial.print(已学习到信号长度); Serial.println(learnedRawDataLength); signalReceived true; IrReceiver.resume(); break; } } if (signalReceived) { Serial.println(学习完成); } else { Serial.println(学习超时未收到信号); } } void playIRSignal() { if (learnedRawDataLength 0) { Serial.println(播放学习到的信号...); IrSender.sendRaw(learnedRawData, learnedRawDataLength, 38); Serial.println(信号已发送); } else { Serial.println(请先学习一个信号); } }性能优化与最佳实践内存优化技巧选择性启用协议只启用需要的协议以减少内存占用// 只启用NEC和Sony协议 #define DECODE_NEC #define DECODE_SONY #include IRremote.hpp调整缓冲区大小根据协议长度调整RAW_BUFFER_LENGTH#define RAW_BUFFER_LENGTH 68 // 适用于32位协议使用Tiny版本对于简单应用使用TinyIRReceiver节省资源定时器冲突解决方案Arduino-IRremote使用定时器进行信号采样可能与其他库冲突开发板使用的定时器冲突的库Arduino Uno/NanoTimer2tone(), analogWrite(3,11)Arduino MegaTimer5Servo库ESP8266/ESP32软件定时器无硬件冲突解决方案// 在tone()使用后重新启动红外接收器 tone(8, 1000, 500); delay(500); IrReceiver.restartTimer();总结与下一步学习通过本指南你已经掌握了Arduino红外遥控的核心技能。让我们回顾一下关键要点硬件连接正确连接红外收发模块是成功的第一步基础收发使用SimpleReceiver和SimpleSender示例快速上手协议选择根据目标设备选择合适的红外协议信号分析利用调试工具理解红外信号特性项目实践从简单控制到复杂应用逐步深入下一步学习建议探索更多示例查看examples/目录中的28个示例项目研究协议细节深入了解不同红外协议的工作原理集成物联网将红外控制与WiFi/蓝牙结合实现远程控制创建用户界面添加LCD显示屏或手机App控制界面资源推荐官方示例查看examples/目录获取完整项目代码协议文档参考src/目录中的协议实现文件社区支持在项目Issues中查找常见问题解决方案现在拿起你的Arduino开发板和红外模块开始构建属于你自己的智能红外控制系统吧无论是控制家电、创建智能家居中枢还是开发创意物联网项目Arduino-IRremote都能为你提供强大的支持。记住实践是最好的老师。从简单的信号收发开始逐步挑战更复杂的项目。遇到问题时参考本文的常见问题排查表或查看项目中的详细示例代码。祝你开发顺利【免费下载链接】Arduino-IRremoteInfrared remote library for Arduino: send and receive infrared signals with multiple protocols项目地址: https://gitcode.com/gh_mirrors/ar/Arduino-IRremote创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻