news 2026/6/14 22:25:00

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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(信号输出)
  • PIC12043S:S(信号输出)、+(电源正极)

连接Arduino的接线方式如下:

  1. 红外接收模块

    • VCC → Arduino 5V
    • GND → Arduino GND
    • OUT → Arduino数字引脚2
  2. 红外发射电路

    • Arduino数字引脚3 → 100Ω电阻 → 红外发射二极管正极
    • 红外发射二极管负极 → Arduino GND

第一步:快速安装与配置

方法一:通过Arduino IDE安装

打开Arduino IDE,依次选择:

  1. 工具管理库
  2. 搜索框输入"IRremote"
  3. 找到"IRremote by Armin Joachimsmeyer"
  4. 点击"安装"按钮

方法二:手动安装

如果你需要最新版本或自定义配置,可以通过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:增强红外信号强度

为了获得更好的传输距离,你可以:

  1. 串联多个红外发射二极管:2-3个二极管串联可显著增强信号
  2. 调整电阻值:使用100Ω电阻可获得约20mA电流
  3. 优化发射角度:确保红外二极管正对目标设备

技巧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("请先学习一个信号"); } }

性能优化与最佳实践

内存优化技巧

  1. 选择性启用协议:只启用需要的协议以减少内存占用
// 只启用NEC和Sony协议 #define DECODE_NEC #define DECODE_SONY #include <IRremote.hpp>
  1. 调整缓冲区大小:根据协议长度调整RAW_BUFFER_LENGTH
#define RAW_BUFFER_LENGTH 68 // 适用于32位协议
  1. 使用Tiny版本:对于简单应用,使用TinyIRReceiver节省资源

定时器冲突解决方案

Arduino-IRremote使用定时器进行信号采样,可能与其他库冲突:

开发板使用的定时器冲突的库
Arduino Uno/NanoTimer2tone(), analogWrite(3,11)
Arduino MegaTimer5Servo库
ESP8266/ESP32软件定时器无硬件冲突

解决方案:

// 在tone()使用后重新启动红外接收器 tone(8, 1000, 500); delay(500); IrReceiver.restartTimer();

总结与下一步学习

通过本指南,你已经掌握了Arduino红外遥控的核心技能。让我们回顾一下关键要点:

  1. 硬件连接:正确连接红外收发模块是成功的第一步
  2. 基础收发:使用SimpleReceiver和SimpleSender示例快速上手
  3. 协议选择:根据目标设备选择合适的红外协议
  4. 信号分析:利用调试工具理解红外信号特性
  5. 项目实践:从简单控制到复杂应用逐步深入

下一步学习建议

  1. 探索更多示例:查看examples/目录中的28个示例项目
  2. 研究协议细节:深入了解不同红外协议的工作原理
  3. 集成物联网:将红外控制与WiFi/蓝牙结合,实现远程控制
  4. 创建用户界面:添加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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/14 21:59:55

深入解析PowerPC e300核心寄存器:从架构原理到嵌入式实战

1. 项目概述&#xff1a;从手册到实战&#xff0c;拆解e300核心的寄存器世界如果你正在开发基于Freescale&#xff08;现NXP&#xff09;MPC8309这类通信处理器的嵌入式系统&#xff0c;或者对PowerPC架构的底层细节充满好奇&#xff0c;那么你肯定绕不开它的核心——e300。手册…

作者头像 李华
网站建设 2026/6/14 21:58:56

3个技巧让Windows电脑风扇更智能:FanControl完全配置指南

3个技巧让Windows电脑风扇更智能&#xff1a;FanControl完全配置指南 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending…

作者头像 李华
网站建设 2026/6/14 21:48:06

YOLO26涨点改进| TCSVT 2026|独家创新、特征融合改进篇| 引入CLAE跨层关联增强模块,通过跨层相关性建模和注意力增强机制,助力目标检测,遥感目标检测、多模态融合目标检测有效涨点

一、本文介绍 🔥本文给大家介绍使用 CLAE跨层关联增强模块 改进YOLO26网络模型,主要作用是在Neck或多尺度特征融合阶段建立不同层级特征之间的关联,强化浅层边缘、纹理、位置信息与深层语义、全局上下文信息的协同表达,从而缓解YOLO特征金字塔中常见的语义错位和尺度信息…

作者头像 李华
网站建设 2026/6/14 21:45:03

Backtrader完整指南:如何用Python构建量化交易策略

Backtrader完整指南&#xff1a;如何用Python构建量化交易策略 【免费下载链接】backtrader Python Backtesting library for trading strategies 项目地址: https://gitcode.com/gh_mirrors/ba/backtrader 你是否曾经有过一个绝佳的交易想法&#xff0c;却不知道如何在…

作者头像 李华
网站建设 2026/6/14 21:43:23

foobox-cn:让你的foobar2000从专业播放器升级为视觉艺术品

foobox-cn&#xff1a;让你的foobar2000从专业播放器升级为视觉艺术品 【免费下载链接】foobox-cn DUI 配置 for foobar2000 项目地址: https://gitcode.com/GitHub_Trending/fo/foobox-cn 你是否曾想过&#xff0c;一款专业的音乐播放器能否同时拥有极致的美学体验&…

作者头像 李华