项目背景
随着物联网技术的发展,传统家电的智能化改造成为热门话题。本文将介绍如何利用Arduino开发esp8266板和Blinker物联网平台,实现利用wifi对美的空调的远程控制。通过红外信号发送,我们在不具备红外模块的手机上可以轻松实现开关机、温度调节、模式切换、扫风控制等功能。
解决问题:IRremoteESP8266库未包含美的遥控,部分手机型号没有红外功能,无法异地开关空调(如下班提前开空调)
硬件准备
-
ESP8266开发板(如NodeMCU)
-
红外发射模块
-
网络连接设备(Wi-Fi路由器)
-
杜邦线若干(测试可以)
接线图

-
红外发射模块:连接至ESP8266的GPIO引脚(如D4)
-
电源:确保模块供电稳定
-
地线:与ESP8266共地
软件实现
1. Blinker平台配置
在点灯科技(Blinker)平台创建设备,并添加以下组件:
-
按钮:开关机控制
-
滑块:温度调节(17-30℃)
-
滑块:模式选择(自动、制冷、制热等)
-
滑块:风速调节(自动、20%-100%)
-
按钮:扫风控制(上下/左右)
-
按钮:ECO模式
-
按钮:防直吹功能

2. 代码实现
#define BLINKER_PRINT Serial // 启用Blinker库的调试信息输出到串口[1](@ref)
#define BLINKER_WIFI // 定义Blinker使用WiFi通信模式[2](@ref)#include <Arduino.h>
#include "IRsendMeidi.h"
#include <IRsend.h>
#include <Blinker.h> // Blinker物联网平台库[1](@ref)
char auth[] = "你的设备密钥"; // 填写Blinker设备密钥
char ssid[] = "你的WiFi名称"; // 填写WiFi名称
char pswd[] = "你的WiFi密码"; // 填写WiFi密码
const uint8_t IR_LED = 14; //设置发送信号的GPIO引脚号
IRsendMeidi irsendmeidi(IR_LED); //声明类对象
创建点灯科技模块
// 新建Blinker组件对象
BlinkerButton Button1("KTon");// 创建开机按钮组件
BlinkerButton Button2("KToff");// 创建关机按钮组件
BlinkerButton Button3("SwingUD"); // 上下扫风按钮
BlinkerButton Button4("SwingLR"); // 左右扫风按钮
BlinkerButton Button5("ECO"); // eco按钮
BlinkerButton Button6("Nstraight"); // 防直吹按钮
BlinkerSlider Slider1("Temp"); // 创建温度滑块组件
BlinkerSlider Slider2("Pattern"); // 创建模式滑块组件
BlinkerSlider Slider3("Speed"); // 创建风速滑块组件
setup与loop函数
void setup() {
// 初始化串口
Serial.begin(115200);
irsendmeidi.begin_2(); //初始化
irsendmeidi.setZBPL(38); //设置红外载波频率,单位kHz,不调用此函数则默认38,由于未知原因,我设置为40,示波器测得频率为38左右,当发送信号后没反应时,尝试更改此值。
irsendmeidi.setCodeTime(500,1600,550,4400,4400,5220); //设置信号的高低电平占比,分别为标记位,1位,0位,前导码低电平,前导码高电平,间隔码高电平
//不调用此函数默认为(500,1600,550,4400,4400,5220)
// 初始化Blinker
Blinker.begin(auth, ssid, pswd);
Button1.attach(button1Callback); // 绑定按钮回调函数
Button2.attach(button2Callback); // 绑定按钮回调函数
Button3.attach(button3Callback); // 绑定扫风按钮回调
Button4.attach(button4Callback);
Button5.attach(button5Callback);
Button6.attach(button6Callback);
Slider1.attach(slider1Callback);
Slider2.attach(slider2Callback);
Slider3.attach(slider3Callback);
}
void loop() {
Blinker.run(); // 必须保持Blinker心跳
}
开机函数(按钮均可参考)
// 开机函数
void button1Callback(const String &state) {
BLINKER_LOG("收到开机指令: ", state);
if (state == BLINKER_CMD_BUTTON_TAP) {
irsendmeidi.setPowers(1);
Button1.print("空调已开启");
}
}
温度函数(滑块均可参考)
// 温度函数
void slider1Callback(int32_t value)
{
// 2. 转换滑块值为实际温度
int targetTemp = value; // 映射到17.0-30.0℃
Slider1.color("#1E90FF");
// 3. 发送红外指令
irsendmeidi.setTemps(targetTemp);
// 4. 更新APP显示
Slider1.print(targetTemp); // 显示如22.5℃
BLINKER_LOG("设置温度: ", targetTemp);
}
扫风回调函数(开关均可参考)
void button3Callback(const String &state) {
BLINKER_LOG("上下扫风状态:", state);
if (state == "on") {
// 发送红外指令
irsendmeidi.setSwingUD(1); // 1=开启扫风,0=关闭扫风
// 动态反馈显示
Button3.print("on");
Button3.color("#FFFF00"); // 开启蓝色/关闭灰色
} else if(state=="off"){
irsendmeidi.setSwingUD(0); // 1=开启扫风,0=关闭扫风
// 反馈开关状态
Button3.print("off");
Button3.color("#FFFF00"); // 开启蓝色/关闭灰色
}
}
功能说明
-
开关机控制:通过Blinker平台的按钮组件,实现空调的远程开关机。
-
温度调节:滑块组件可精确设置温度(17-30℃,步长0.5℃)。
-
模式切换:支持自动、制冷、制热、抽湿、送风五种模式。
-
风速调节:提供自动和五档风速选择。
-
扫风控制:独立控制上下/左右扫风功能。
-
ECO模式:节能模式一键开启。
-
防直吹:防止冷风直吹人体。
使用的库
本文使用了以下库:
-
IRsendMeidi库:用于控制美的空调的红外信号发送。该库基于
IRremoteESP8266
开发,具体代码和使用方法请访问 GitHub项目页面。 -
参考原作者链接:ESP8266美的空调红外控制库(Arduino) - 光水似影
-
IRremoteESP8266库:用于红外信号的发送和接收。更多详情请访问 IRremoteESP8266库。
测试与优化
-
信号稳定性:确保红外模块与空调之间的无障碍距离。
-
参数调整:根据实际情况微调载波频率和信号占比。
-
界面优化:在Blinker平台调整组件布局,提升用户体验。
-
信号增强:可添加放大电路
总结
通过本文的实现方案,我们成功将传统美的空调改造为智能设备,实现了远程控制和参数调节。未来可以进一步扩展功能,如添加温度传感器实现自动调温,或结合语音助手实现语音控制。
希望本文对你有所帮助!如有任何问题,欢迎在评论区交流。
完整代码
#define BLINKER_PRINT Serial // 启用Blinker库的调试信息输出到串口[1](@ref)
#define BLINKER_WIFI // 定义Blinker使用WiFi通信模式[2](@ref)#include <Arduino.h>
#include "IRsendMeidi.h"
#include <IRsend.h>
#include <Blinker.h> // Blinker物联网平台库[1](@ref)
char auth[] = "你的设备密钥"; // 填写Blinker设备密钥
char ssid[] = "你的WiFi名称"; // 填写WiFi名称
char pswd[] = "你的WiFi密码"; // 填写WiFi密码
const uint8_t IR_LED = 14; //设置发送信号的GPIO引脚号
IRsendMeidi irsendmeidi(IR_LED); //声明类对象
// 新建Blinker组件对象
BlinkerButton Button1("KTon");// 创建开机按钮组件
BlinkerButton Button2("KToff");// 创建关机按钮组件
BlinkerButton Button3("SwingUD"); // 上下扫风按钮
BlinkerButton Button4("SwingLR"); // 左右扫风按钮
BlinkerButton Button5("ECO"); // eco按钮
BlinkerButton Button6("Nstraight"); // 防直吹按钮
BlinkerSlider Slider1("Temp"); // 创建温度滑块组件
BlinkerSlider Slider2("Pattern"); // 创建模式滑块组件
BlinkerSlider Slider3("Speed"); // 创建风速滑块组件
void setup() {
// 初始化串口
Serial.begin(115200);
irsendmeidi.begin_2(); //初始化
irsendmeidi.setZBPL(38); //设置红外载波频率,单位kHz,不调用此函数则默认38,由于未知原因,我设置为40,示波器测得频率为38左右,当发送信号后没反应时,尝试更改此值。
irsendmeidi.setCodeTime(500,1600,550,4400,4400,5220); //设置信号的高低电平占比,分别为标记位,1位,0位,前导码低电平,前导码高电平,间隔码高电平
//不调用此函数默认为(500,1600,550,4400,4400,5220)
// 初始化Blinker
Blinker.begin(auth, ssid, pswd);
Button1.attach(button1Callback); // 绑定按钮回调函数
Button2.attach(button2Callback); // 绑定按钮回调函数
Button3.attach(button3Callback); // 绑定扫风按钮回调
Button4.attach(button4Callback);
Button5.attach(button5Callback);
Button6.attach(button6Callback);
Slider1.attach(slider1Callback);
Slider2.attach(slider2Callback);
Slider3.attach(slider3Callback);
}
void loop() {
Blinker.run(); // 必须保持Blinker心跳
}
// 开机函数
void button1Callback(const String &state) {
BLINKER_LOG("收到开机指令: ", state);
if (state == BLINKER_CMD_BUTTON_TAP) {
irsendmeidi.setPowers(1);
Button1.print("空调已开启");
}
}
// 关机函数
void button2Callback(const String &state) {
BLINKER_LOG("收到关机指令: ", state);
if (state == BLINKER_CMD_BUTTON_TAP) {
irsendmeidi.setPowers(0);
Button2.print("空调已关闭");
}
}
// 模块函数
void slider2Callback(int32_t value)
{
// 2. 转换滑块值
int pattern = value; // 映射到0自动,1制冷,2制热,3抽湿,4送风
Slider2.color("#FF00FF");
// 3. 发送红外指令
irsendmeidi.setModes(pattern);
// 4. 更新APP显示
const char* modeNames[] = {"自动", "制冷", "制热", "抽湿", "送风"};
Slider2.print(pattern); // 显示如"制冷"
BLINKER_LOG("设置模式: ", pattern);
}
// 风速函数
void slider3Callback(int32_t value)
{
// 2. 转换滑块值为实际温度
int speed = value; // 设置风速,0自动,1为20%,2为40%,3为60%,4为80%,5为100%
Slider3.color("#00FFFF");
// 3. 发送红外指令
irsendmeidi.setFanSpeeds(speed);
// 4. 更新APP显示
Slider3.print(speed); // 显示如"60%"
BLINKER_LOG("设置风速: ", speed);
}
// 新增
void button3Callback(const String &state) {
BLINKER_LOG("上下扫风状态:", state);
if (state == "on") {
// 发送红外指令
irsendmeidi.setSwingUD(1); // 1=开启扫风,0=关闭扫风
// 动态反馈显示
Button3.print("on");
Button3.color("#FFFF00"); // 开启蓝色/关闭灰色
} else if(state=="off"){
irsendmeidi.setSwingUD(0); // 1=开启扫风,0=关闭扫风
// 反馈开关状态
Button3.print("off");
Button3.color("#FFFF00"); // 开启蓝色/关闭灰色
}
}
// 新增左右扫风回调函数
void button4Callback(const String &state) {
BLINKER_LOG("左右扫风状态:", state);
if (state == "on") {
// 发送红外指令
irsendmeidi.setSwingLR(1); // 1=开启扫风,0=关闭扫风
// 动态反馈显示
Button4.print("on");
Button4.color("#800080"); // 开启紫色/关闭灰色
} else if(state=="off"){
irsendmeidi.setSwingLR(0); //
// 反馈开关状态
Button4.print("off");
Button4.color("#800080"); //
}
}
// 新增ECO回调函数
void button5Callback(const String &state) {
BLINKER_LOG("ECO状态 :", state);
if (state == "on") {
// 发送红外指令
irsendmeidi.setEco(1); // 1=开启
// 动态反馈显示
Button5.print("on");
Button5.color("#00FF00"); // 开启绿色/关闭灰色
} else if(state=="off"){
irsendmeidi.setEco(0); //
// 反馈开关状态
Button5.print("off");
Button5.color("#00FF00"); //
}
}
// 新增防直吹回调函数
void button6Callback(const String &state) {
BLINKER_LOG("防直吹状态:", state);
if (state == "on") {
// 发送红外指令
irsendmeidi.setFZC(1); // 1=开启
// 动态反馈显示
Button6.print("on");
Button6.color("#FFC0CB"); // 开启粉色/关闭灰色
} else if(state=="off"){
irsendmeidi.setFZC(0); //
// 反馈开关状态
Button6.print( );
Button6.color("#FFC0CB"); //
}
}