红外遥控风扇——arduino
- 本节课任务
- 红外遥控
- 红外遥控通信过程
- 红外遥控套件
- 红外遥控接线
- 实现风扇的多种换挡方式
- 用本节课所学的红外遥控,控制RGB彩灯变换颜色,至少配置4种
本节课任务
1、了解红外遥控技术在生活中的运用。
2、学会编程测试红外遥控器的键值。
3、制作多种换挡方式的换挡风扇。
红外遥控
组成:红外遥控器+红外接收器
基本原理:红外遥控的发射电路是采用红外发光二极管来发出经过调制的红外光波;红外接收电路由红外接收二极管、三极管或硅光电池组成,它们将红外发射器发射的红外光转换为相应的电信号。
红外遥控是目前使用最广泛的一种通信和遥控手段。具有体积小、功耗低、功能强、成本低等特点。
红外遥控通信过程
红外遥控套件
红外接受器
接收器引脚定义:
红外遥控器
红外遥控接线
实现风扇的多种换挡方式
在红外遥控换挡风扇的基础上,再增加一种按键换挡方式,实现
即可红外遥控换挡,也可以按键换挡。
// 包含必要的红外遥控接收头库 IRremote.h
#include <IRremote.h>
// 定义三个布尔型变量anjian0, anjian1, anjian2用于存储输入端口的状态
volatile boolean anjian0 = LOW; // 3号引脚状态
volatile boolean anjian1 = LOW; // 4号引脚状态
volatile boolean anjian2 = LOW; // 5号引脚状态
// 初始化红外接收模块,接收数据连接到串口2,并启用接收功能
IRrecv irrecv_2(2); // 对应硬件的红外接收模块通道
decode_results results_2; // 存储解码结果
// 设置程序的初始化函数
void setup() {
// 将输入引脚3、4、5设置为输入模式
pinMode(3, INPUT);
pinMode(4, INPUT);
pinMode(5, INPUT);
// 开启红外接收模块的工作
irrecv_2.enableIRIn();
}
// 主循环函数,持续监听并处理红外信号
void loop() {
// 更新anjian0、anjian1、anjian2的状态
anjian0 = digitalRead(3);
anjian1 = digitalRead(4);
anjian2 = digitalRead(5);
// 当检测到红外信号时,解码并获取数据值
if (irrecv_2.decode(&results_2)) {
// 获取解码后的值并将其转换成字符串,然后识别其对应类型的名称
ir_item = results_2.value;
String type = "UNKNOWN";
String typelist[] = {"UNKNOWN", "NEC", "SONY", "RC5", "RC6", "DISH", "SHARP", "PANASONIC", "JVC", "SANYO", "MITSUBISHI", "SAMSUNG", "LG", "WHYNTER"};
if (results_2.decode_type >= 1 && results_2.decode_type <= 13) {
type = typelist[results_2.decode_type];
}
// 打印接收到的红外类型及相应的动作,如调整模拟输出的亮度
Serial.println("IR TYPE: " + type + " ");
// 根据特定的红外编码值,控制模拟输出9的电压(0-127或0-VCC)
if (ir_item == "0xFF9867") {
analogWrite(9, 0);
}
if (ir_item == "0xFFA25D") {
analogWrite(9, 127);
}
if (ir_item == "0xFF629D") {
analogWrite(9, 255);
}
// 恢复接收,继续监听新的红外指令
irrecv_2.resume();
} else {
// 如果未接收到红外信号,则根据anjian0, anjian1, anjian2的状态调整模拟输出
if (anjian0 == HIGH) {
analogWrite(9, 0);
}
if (anjian1 == HIGH) {
analogWrite(9, 127);
}
if (anjian2 == HIGH) {
analogWrite(9, 255);
}
}
}
用本节课所学的红外遥控,控制RGB彩灯变换颜色,至少配置4种
颜色。
```c++
// 包含IRremote库,用于红外信号处理
#include <IRremote.h>
// 定义一个长整型变量,存储接收到的红外码值
long ir_item;
// 创建IR接收模块实例,连接到第2个串口(通常GPIO 2)
IRrecv irrecv_2(2);
decode_results results_2;
// 函数setup() 初始化 IR 接收模块,开启接收模式
void setup() {
irrecv_2.enableIRIn(); // 启动IR接收,并等待数据
}
// 主循环函数loop()
void loop() {
// 检查是否有新的红外信号解码成功
if (irrecv_2.decode(&results_2)) {
// 获取并保存解码后的红外码值
ir_item = results_2.value;
// 将接收到的红外码对应的类型转换为字符串,存储在变量type中
String type = "UNKNOWN";
String typelist[] = {"UNKNOWN", "NEC", "SONY", "RC5", "RC6", "DISH", "SHARP", "PANASONIC", "JVC", "SANYO", "MITSUBISHI", "SAMSUNG", "LG", "WHYNTER"};
if (results_2.decode_type >= 1 && results_2.decode_type <= 13) { // 检查是否在预定义的类型列表内
type = typelist[results_2.decode_type]; // 如果在,则赋值对应类型名
}
// 打印接收到的红外类型和值
Serial.print("IR TYPE: " + type + " ");
// 根据特定的红外码值控制LED状态,这里仅示例四个条件
if (ir_item == "0xFF9867") {
analogWrite(9, 255); // LED9亮起
analogWrite(10, 0); // LED10关闭
analogWrite(11, 0); // LED11关闭
}
if (ir_item == "0xFFA25D") {
analogWrite(9, 0); // LED9关闭
analogWrite(10, 255); // LED10亮起
analogWrite(11, 0); // LED11关闭
}
if (ir_item == "0xFF629D") {
analogWrite(9, 0); // LED9关闭
analogWrite(10, 0); // LED10关闭
analogWrite(11, 255); // LED11亮起
}
if (ir_item == "0xFFE21D") {
analogWrite(9, 255); // LED9亮起
analogWrite(10, 255); // LED10亮起
analogWrite(11, 0); // LED11关闭
}
// 继续监听红外信号
irrecv_2.resume();
} else {
// 如果没有新信号,暂停接收
}
}