我们将讨论如何使用Arduino和IRremote库来实现通过红外遥控器控制继电器的开关。通过这个项目,你将学会如何接收和解码红外信号,并根据接收到的信号控制继电器(这里的继电器可以换成其他传感器)的状态。
项目简介
我们将使用Arduino开发板、一个红外接收模块和一个红外遥控器来实现这个项目。当按下遥控器上的特定按钮时,继电器将会打开或关闭。我们将使用最新版本的IRremote库来接收和解码红外信号。
硬件准备
- Arduino开发板(例如Arduino Uno)
- 红外接收模块
- 红外遥控器
- 继电器
- 杜邦线
电路连接
- 将红外接收模块的信号引脚连接到Arduino的数字引脚11。
- 将红外接收模块的VCC和GND分别连接到Arduino的5V和GND。
继电器连接如图所示,信号输入引脚接arduino的7号引脚
软件准备
确保你已经在Arduino IDE中安装了最新版本的IRremote库。你可以通过以下步骤来安装:
- 打开Arduino IDE。
- 进入“工具”菜单,选择“库管理器”。
- 在弹出的窗口中搜索“IRremote”,找到“IRremote并安装。
这是解码遥控器发出的红外信号的代码
#include <IRremote.hpp> // 引入新的IRremote库
const int RECV_PIN = 11; // 定义红外接收器引脚
const int LED_PIN = 13; // 定义LED引脚
bool ledState = LOW; // 初始化LED状态为低
void setup() {
pinMode(LED_PIN, OUTPUT); // 设置LED引脚为输出模式
Serial.begin(9600); // 初始化串口通讯,波特率为9600
IrReceiver.begin(RECV_PIN, ENABLE_LED_FEEDBACK); // 启动红外解码,并启用LED反馈
}
void loop() {
if (IrReceiver.decode()) { // 判断是否接收到红外码
Serial.print("bits: ");
Serial.println(IrReceiver.decodedIRData.rawDataPtr->rawlen); // 打印红外线码元位数
Serial.print("IRCode: ");
Serial.println(IrReceiver.decodedIRData.decodedRawData, HEX); // 串口监视器查看红外解码结果(十六进制)
ledState = !ledState; // 切换LED状态
digitalWrite(LED_PIN, ledState); // 设置LED引脚电平
IrReceiver.resume(); // 在解码一个红外线信号之后,持续接收下一组信号
}
}
下面是通过遥控器控制继电器的代码
#include <IRremote.hpp> // 引入新的IRremote库
const int RECV_PIN = 11; // 定义红外接收器引脚
const int LED = 7; // 定义LED引脚
void setup() {
Serial.begin(9600); // 初始化串口通讯,波特率为9600
IrReceiver.begin(RECV_PIN, ENABLE_LED_FEEDBACK); // 启动红外解码,并启用LED反馈
pinMode(LED, OUTPUT); // 设置LED引脚为输出模式
}
void loop() {
if (IrReceiver.decode()) { // 判断是否接收到红外码
unsigned long value = IrReceiver.decodedIRData.decodedRawData; // 获取解码后的红外码
switch (value) {
case 0xBA45FF00:
Serial.println("OPEN");
digitalWrite(7, HIGH); // 打开LED
break;
case 0xB946FF00:
Serial.println("MODE");
digitalWrite(7, LOW); // 关闭LED
break;
case 0xB847FF00:
Serial.println("jingyin");
break;
case 0xF30CFF00:
Serial.println("1");
break;
case 0xE718FF00:
Serial.println("2");
break;
case 0xA15EFF00:
Serial.println("3");
break;
case 0xF708FF00:
Serial.println("4");
break;
case 0xE31CFF00:
Serial.println("5");
break;
default:
Serial.println("Unknown");
break; // 添加默认情况处理
}
IrReceiver.resume(); // 等待接收下一组信号
}
}