esp8266美的空调红外遥控器:基于Arduino与点灯科技Blinker的智能控制实现(一)

项目背景

随着物联网技术的发展,传统家电的智能化改造成为热门话题。本文将介绍如何利用Arduino开发esp8266板和Blinker物联网平台,实现利用wifi对美的空调的远程控制。通过红外信号发送,我们在不具备红外模块的手机上可以轻松实现开关机、温度调节、模式切换、扫风控制等功能。 

解决问题:IRremoteESP8266库未包含美的遥控,部分手机型号没有红外功能,无法异地开关空调(如下班提前开空调)

硬件准备

  • ESP8266开发板(如NodeMCU)

  • 红外发射模块

  • 网络连接设备(Wi-Fi路由器)

  • 杜邦线若干(测试可以)

接线图

图1. ESP8266红外模块的接线示意图
  • 红外发射模块:连接至ESP8266的GPIO引脚(如D4)

  • 电源:确保模块供电稳定

  • 地线:与ESP8266共地

软件实现

1. Blinker平台配置

在点灯科技(Blinker)平台创建设备,并添加以下组件:

  • 按钮:开关机控制

  • 滑块:温度调节(17-30℃)

  • 滑块:模式选择(自动、制冷、制热等)

  • 滑块:风速调节(自动、20%-100%)

  • 按钮:扫风控制(上下/左右)

  • 按钮:ECO模式

  • 按钮:防直吹功能

图2. Blinker平台的组件布局示例

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");  // 开启蓝色/关闭灰色
    }      
  }

功能说明

  1. 开关机控制:通过Blinker平台的按钮组件,实现空调的远程开关机。

  2. 温度调节:滑块组件可精确设置温度(17-30℃,步长0.5℃)。

  3. 模式切换:支持自动、制冷、制热、抽湿、送风五种模式。

  4. 风速调节:提供自动和五档风速选择。

  5. 扫风控制:独立控制上下/左右扫风功能。

  6. ECO模式:节能模式一键开启。

  7. 防直吹:防止冷风直吹人体。

使用的库

本文使用了以下库:

测试与优化

  1. 信号稳定性:确保红外模块与空调之间的无障碍距离。

  2. 参数调整:根据实际情况微调载波频率和信号占比。

  3. 界面优化:在Blinker平台调整组件布局,提升用户体验。

  4. 信号增强:可添加放大电路

总结

通过本文的实现方案,我们成功将传统美的空调改造为智能设备,实现了远程控制和参数调节。未来可以进一步扩展功能,如添加温度传感器实现自动调温,或结合语音助手实现语音控制。

希望本文对你有所帮助!如有任何问题,欢迎在评论区交流。

完整代码

#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");  // 
    }      
  }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值