前面我们学了蜂鸣器发声、继电器控制高压设备,现在给 Arduino 加一个"耳朵"——红外遥控模块,让它能接收遥控器的指令,实现无线控制。
学完这篇,你会完成:
- 基础接收:读取遥控器按键的编码值
- 红外控制 LED:用遥控器控制 LED 的开关
- 综合项目:红外遥控继电器:用遥控器控制 220V 设备(如台灯)
一、红外遥控是什么?
红外遥控利用红外光(人眼不可见)传输控制信号。遥控器按下按键时,会发射一串编码的红外脉冲;Arduino 上的红外接收头接收到脉冲后,解码出对应的按键值。
核心组件
- 红外遥控器:发射端,每个按键对应一个唯一的编码
- 红外接收头:接收端(如 VS1838B),接收红外信号并输出解码后的电平信号
常见编码格式
| 格式 | 特点 |
|---|---|
| NEC | 最常见,32 位编码(地址 + 命令) |
| Sony | 12 位或 15 位编码 |
| RC5/RC6 | 飞利浦常用,曼彻斯特编码 |
我们使用IRremote 库,它支持多种编码格式,自动识别。
二、所需元件
- Arduino Uno
- 红外接收头(VS1838B 或类似)
- 红外遥控器(任意品牌,通常随接收头附赠)
- LED + 220Ω 电阻(实验二用)
- 继电器模块(综合项目用)
三、安装 IRremote 库
- 打开 Arduino IDE
- 菜单:工具 → 管理库
- 搜索"IRremote"
- 安装IRremote by shirriff(或最新版本)
安装完成后,在代码中
#include <IRremote.h>即可使用。
四、接线方式
红外接收头通常有 3 个引脚:
| 接收头引脚 | 接到 |
|---|---|
| VCC | Arduino 5V |
| GND | Arduino GND |
| OUT | Arduino D11 |
不同接收头引脚顺序可能不同,查看模块上的标注。VS1838B 通常是OUT-GND-VCC(从左到右)。
五、实验一:读取遥控器按键编码
先让 Arduino 读取遥控器每个按键的编码值,方便后续编程。
#include <IRremote.h> #define IR_PIN 11 IRrecv irrecv(IR_PIN); decode_results results; void setup() { Serial.begin(9600); irrecv.enableIRIn(); // 启动红外接收 Serial.println("IR Receiver Ready!"); } void loop() { if (irrecv.decode(&results)) { // 打印解码结果 Serial.print("编码类型: "); Serial.print(results.decode_type); Serial.print(" | 编码值: "); Serial.println(results.value, HEX); // 以十六进制显示 irrecv.resume(); // 接收下一个值 } }代码解读
IRrecv irrecv(IR_PIN):创建红外接收对象,指定接收引脚irrecv.enableIRIn():启动红外接收irrecv.decode(&results):尝试解码接收到的信号,成功返回 trueresults.value:解码后的按键编码值(十六进制)irrecv.resume():清空缓冲区,准备接收下一个信号
使用方法
- 上传代码,打开串口监视器(波特率 9600)
- 按下遥控器上的任意按键
- 串口会显示类似:
编码值: FF6897 - 记录每个按键的编码值,后续编程用
不同遥控器的编码值不同,务必记录自己遥控器的编码。
六、实验二:红外控制 LED
用遥控器的某个按键控制 LED 的开关。
#include <IRremote.h> #define IR_PIN 11 #define LED_PIN 13 // 替换为你遥控器的编码值(十六进制) #define KEY_POWER 0xFF6897 // 电源键 #define KEY_UP 0xFF18E7 // 上键 #define KEY_DOWN 0xFF4AB5 // 下键 IRrecv irrecv(IR_PIN); decode_results results; bool ledState = false; void setup() { pinMode(LED_PIN, OUTPUT); irrecv.enableIRIn(); Serial.begin(9600); Serial.println("IR LED Control Ready!"); } void loop() { if (irrecv.decode(&results)) { unsigned long key = results.value; Serial.print("按键编码: "); Serial.println(key, HEX); if (key == KEY_POWER) { // 电源键:切换 LED 状态 ledState = !ledState; digitalWrite(LED_PIN, ledState ? HIGH : LOW); Serial.println(ledState ? "LED ON" : "LED OFF"); } else if (key == KEY_UP) { // 上键:强制开启 digitalWrite(LED_PIN, HIGH); ledState = true; Serial.println("LED ON (UP)"); } else if (key == KEY_DOWN) { // 下键:强制关闭 digitalWrite(LED_PIN, LOW); ledState = false; Serial.println("LED OFF (DOWN)"); } irrecv.resume(); } }代码解读
#define KEY_POWER 0xFF6897:定义按键编码常量,替换为你自己的编码值ledState标志位:记录 LED 当前状态!ledState:逻辑非运算,实现状态翻转digitalWrite(LED_PIN, ledState ? HIGH : LOW):根据状态设置 LED
效果
- 按电源键 → LED 开/关切换
- 按上键 → LED 强制开启
- 按下键 → LED 强制关闭
七、综合项目:红外遥控继电器
用遥控器控制继电器,实现无线控制 220V 设备(如台灯、风扇)。
接线
| 元件 | 引脚 | 接到 |
|---|---|---|
| 红外接收头 | VCC | 5V |
| 红外接收头 | GND | GND |
| 红外接收头 | OUT | D11 |
| 继电器模块 | IN | D7 |
| 继电器模块 | VCC | 5V |
| 继电器模块 | GND | GND |
继电器输出端(COM/NO)接 220V 设备,注意高压安全!
代码
#include <IRremote.h> #define IR_PIN 11 #define RELAY 7 // 替换为你遥控器的编码值 #define KEY_POWER 0xFF6897 // 电源键 #define KEY_1 0xFF30CF // 数字键 1 #define KEY_2 0xFF18E7 // 数字键 2 IRrecv irrecv(IR_PIN); decode_results results; bool relayState = false; void setup() { pinMode(RELAY, OUTPUT); digitalWrite(RELAY, HIGH); // 初始关闭(低电平触发) irrecv.enableIRIn(); Serial.begin(9600); Serial.println("IR Relay Control Ready!"); } void loop() { if (irrecv.decode(&results)) { unsigned long key = results.value; Serial.print("按键编码: "); Serial.println(key, HEX); if (key == KEY_POWER) { // 电源键:切换继电器状态 relayState = !relayState; digitalWrite(RELAY, relayState ? LOW : HIGH); // 低电平触发 Serial.println(relayState ? "Relay ON" : "Relay OFF"); } else if (key == KEY_1) { // 数字键 1:强制开启 digitalWrite(RELAY, LOW); relayState = true; Serial.println("Relay ON (KEY_1)"); } else if (key == KEY_2) { // 数字键 2:强制关闭 digitalWrite(RELAY, HIGH); relayState = false; Serial.println("Relay OFF (KEY_2)"); } irrecv.resume(); } }代码解读
relayState标志位:记录继电器当前状态digitalWrite(RELAY, relayState ? LOW : HIGH):低电平触发,状态为 true 时输出 LOW 开启- 按键功能:
- 电源键:切换开/关
- 数字键 1:强制开启
- 数字键 2:强制关闭
效果
- 按电源键 → 继电器开/关切换(控制 220V 设备)
- 按数字键 1 → 强制开启
- 按数字键 2 → 强制关闭
八、进阶:红外遥控多路控制
如果需要控制多个设备(如灯 + 风扇),可以用不同按键控制不同继电器。
#include <IRremote.h> #define IR_PIN 11 #define RELAY1 7 #define RELAY2 8 #define KEY_1 0xFF30CF // 数字键 1 #define KEY_2 0xFF18E7 // 数字键 2 IRrecv irrecv(IR_PIN); decode_results results; void setup() { pinMode(RELAY1, OUTPUT); pinMode(RELAY2, OUTPUT); digitalWrite(RELAY1, HIGH); // 关闭 digitalWrite(RELAY2, HIGH); // 关闭 irrecv.enableIRIn(); Serial.begin(9600); } void loop() { if (irrecv.decode(&results)) { unsigned long key = results.value; if (key == KEY_1) { // 按键 1:切换继电器 1 digitalWrite(RELAY1, !digitalRead(RELAY1)); Serial.println("Relay 1 Toggled"); } else if (key == KEY_2) { // 按键 2:切换继电器 2 digitalWrite(RELAY2, !digitalRead(RELAY2)); Serial.println("Relay 2 Toggled"); } irrecv.resume(); } }九、常见问题
| 问题 | 解决方法 |
|---|---|
| 串口无输出 | 检查接线,确认红外接收头方向(对准遥控器) |
| 编码值全是 FFFFFFFF | 按键按住不放会重复发送,松开再按 |
| 编码值不稳定 | 远离强光(阳光、白炽灯),红外干扰大 |
| 库函数报错 | 确认安装的是 IRremote 库,而非其他同名库 |
十、本篇小结
回顾一下今天学到的核心知识:
- 红外遥控原理:遥控器发射编码脉冲,接收头解码出按键值
- IRremote 库:
IRrecv接收信号,decode()解码,results.value获取编码 - 读取编码:先读取遥控器每个按键的编码值,后续编程用
- 红外控制 LED:根据按键编码控制 LED 开关
- 红外控制继电器:实现无线控制 220V 设备
- 多路控制:不同按键控制不同继电器
红外遥控让 Arduino 项目摆脱了线缆束缚,可以制作遥控器控制的智能灯、无线开关、红外密码锁等有趣的项目。下一篇,我们学习超声波传感器——让 Arduino 测量距离!