本文最后更新于 2 个月前,文中所描述的信息可能已发生改变。
项目介绍
本文章基于ESP8266开发板来实现对空调的控制,基本控制原理为,通过点灯科技APP向ESP8266来发送指令,ESP8266通过库来实现对红外LED的编码控制,从而实现对空调的控制。可以查看上一篇文章「宿舍智能门」 - 鹤白居的小站
此项目源代码来源于B站博主DIY大白的视频ESP8266红外遥控格力空调。首先感谢博主的开源精神,我将基于该原博主进行代码升级和功能优化。
开始
材料准备
| 名称 | 数量 |
|---|---|
| ESP8266 | 1 |
| 红外LED | 1 |
| 杜邦线 | 若干 |
注意需要红外LED,分辨方法,通电之后肉眼看不见白光,而是只能使用手机摄像头能看见微弱的红光。
当然你仍然可以基于以前的开源项目-「宿舍智能门」 - 鹤白居的小站来继续在被控制端进行增加功能。这一次将使用RX引脚,兼容之前的项目。复用了这一段端口
接线方法
红外LED长针连接ESP8266的RX引脚如下图的 7 GPIO3 U0RXD,短针连接在GND。
测试代码
接下来,你就可以连接上电脑来刷写下面的测试代码,来测试是否能够点亮led
你通过串口需要向esp8266发送字符串 on 或者 off,然后通过手机摄像头,对准led观察是否有红色的闪光。多测试几次
当然你先需要安装下面的库文件。有疑问可以复制发送给ai,咨询什么是库文件,怎么安装,这里不做阐述。
注意
注意应为复用RX引脚,所以在下述刷代码的时候请不要连接任何设备在GPIO3,否则刷写不成功。
// 红外灯的测试配置
// 正极连接esp8266D2 负极连接GND
#include <IRremoteESP8266.h>
#include <IRsend.h>
#include <ir_Coolix.h> // 确保包含Coolix协议支持
// 引脚定义(ESP8266 D2=GPIO4;ESP32 D5=GPIO14)
const uint16_t kIrLed = 3; // ESP8266用3
IRsend irsend(kIrLed);
void setup() {
Serial.begin(115200);
irsend.begin(); // 初始化红外发送
Serial.println("设备启动,输入 'on' 发送开机码,'off' 发送关机码");
}
void loop() {
if (Serial.available() > 0) {
String cmd = Serial.readStringUntil('\n');
cmd.trim();
// 发送Coolix 48位开机码(适配sendCoolix48函数)
if (cmd == "on") {
irsend.sendCoolix48(0xB20800000000, 48); // 48位Coolix开机测试码
Serial.println("已发送开机码,查看LED是否闪烁");
}
// 发送Coolix 48位关机码
else if (cmd == "off") {
irsend.sendCoolix48(0xB20801000000, 48); // 48位Coolix关机测试码
Serial.println("已发送关机码,查看LED是否闪烁");
}
else {
Serial.println("未知指令,请输入 'on' 或 'off'");
}
}
delay(50);
}恭喜你
已经完成1/2,
下面是B站博主的源代码,不能直接使用,我将基于此进行修改合并
B站博主的源代码
//这个源代码来源于B站,我将基于此进行修改
#define BLINKER_WIFI//通讯方式
#include <Blinker.h>
#include <IRsend.h>
#include <IRremoteESP8266.h>
#include <ir_Coolix.h>
char auth[] = "";//这里填写设备密钥
char ssid[] = "";//这里填写wifi
char pswd[] = "";//这里填写wifi码
//暂存温度数据
int nowtemp = 25;
int num_Fan = 5;
//新建组件对象
BlinkerNumber NUM1("settemp");//温度数据组件
BlinkerButton Midea_power("btn-pwr");//电源开关组件
BlinkerButton Midea_setFan("btn-fan");//风速组件
BlinkerButton Midea_cool("btn-cool");//制冷模式组件
BlinkerButton Midea_dry("btn-dry");//干燥模式组件
BlinkerButton Midea_hot("btn-hot");//制热模式组件
BlinkerButton Midea_auto("btn-auto");//自动模式组件
BlinkerSlider Slider1("ran-wen");//温度调节滑块
//使用ESP32的D5针脚,如果你使用的是ESP8266,则把"5"改"4"即ESP8266的D2针脚
const uint16_t kIrLed = 4;
IRCoolixAC ac(kIrLed);
void printState() {
Serial.println("Coolix A/C remote is in the following state:");
Serial.printf(" %s\n", ac.toString().c_str());
}
//初始化
void setup()
{
Serial.begin(115200);
BLINKER_DEBUG.stream(Serial);
ac.begin();
Midea_power.attach(Midea_power_callback);
Midea_setFan.attach(Midea_setFan_callback);
Midea_cool.attach(Midea_cool_callback);
Midea_dry.attach(Midea_dry_callback);
Midea_hot.attach(Midea_hot_callback);
Midea_auto.attach(Midea_auto_callback);
Slider1.attach(slider1_callback);
Serial.println("Default state of the remote.");
printState();
Serial.println("Setting desired state for A/C.");
Blinker.attachHeartbeat(heartbeat);
Blinker.begin(auth, ssid, pswd);
}
void loop()
{
Blinker.run();
}
//电源开关
void Midea_power_callback(const String &state)
{
BLINKER_LOG("get button state: ", state);
if (state == BLINKER_CMD_ON)
{
ac.on();
ac.setMode(kCoolixCool);
ac.setTemp(25);
ac.send();
Midea_power.icon("fal fa-power-off");
Midea_power.color("#00FF00");
Midea_power.text("开");
Midea_power.print("on");
}
else if (state == BLINKER_CMD_OFF)
{
ac.off();
ac.send();
Midea_power.icon("fal fa-power-off");
Midea_power.color("#FF0000");
Midea_power.text("关");
Midea_power.print("off");
}
}
//电源开关
void slider1_callback(int32_t value)
{
BLINKER_LOG("get slider value: ", value);
nowtemp = value;
NUM1.print(nowtemp);
ac.setTemp(nowtemp);
ac.send();
}
//风速心跳包
void heartbeat()
{
switch (num_Fan)
{
case 1:
Midea_setFan.text("静音");
break;
case 2:
Midea_setFan.text("低速");
break;
case 3:
Midea_setFan.text("中速");
break;
case 4:
Midea_setFan.text("高速");
break;
case 5:
Midea_setFan.text("自动");
break;
}
Midea_setFan.print();
NUM1.print(nowtemp);
}
//风速按钮
void Midea_setFan_callback(const String &state)
{
if (state == BLINKER_CMD_BUTTON_TAP)
{
num_Fan++;
if (num_Fan >= 6)
{
num_Fan = 1;
}
switch (num_Fan)
{
case 1:
ac.setFan(kCoolixFanFixed);
Midea_setFan.text("静音");
break;
case 2:
ac.setFan(kCoolixFanMin);
Midea_setFan.text("低速");
break;
case 3:
ac.setFan(kCoolixFanMed);
Midea_setFan.text("中速");
break;
case 4:
ac.setFan(kCoolixFanMax);
Midea_setFan.text("高速");
break;
case 5:
ac.setFan(kCoolixFanAuto0);
Midea_setFan.text("自动");
break;
}
Midea_setFan.print();
ac.send();
}
}
//制冷模式
void Midea_cool_callback(const String &state)
{
if (state == BLINKER_CMD_BUTTON_TAP)
{
ac.setMode(kCoolixCool);
ac.send();
}
}
//干燥模式
void Midea_dry_callback(const String &state)
{
if (state == BLINKER_CMD_BUTTON_TAP)
{
ac.setMode(kCoolixDry);
ac.send();
}
}
//制热模式
void Midea_hot_callback(const String &state)
{
if (state == BLINKER_CMD_BUTTON_TAP)
{
ac.setMode(kCoolixHeat);
ac.send();
}
}
//自动模式
void Midea_auto_callback(const String &state)
{
if (state == BLINKER_CMD_BUTTON_TAP)
{
ac.setMode(kCoolixAuto);
ac.send();
}
}
//空调温度
void Slider1_callback(int32_t value)
{
BLINKER_LOG("get slider value: ", value);
nowtemp=value;
NUM1.print(nowtemp);
ac.setTemp(nowtemp);
ac.send();
}B站博主的BLINKER里面的界面配置,可以直接导入。
{¨config¨{¨headerColor¨¨transparent¨¨headerStyle¨¨dark¨¨background¨{¨img¨¨assets/img/bg/1.jpg¨}}¨dashboard¨|{¨type¨¨btn¨¨ico¨¨fal fa-air-conditioner¨¨mode¨Ê¨t0¨´关´¨t1¨¨文本2¨¨bg¨Ë¨cols¨Ë¨rows¨Ë¨key¨¨btn-pwr¨´x´É´y´Ê¨speech¨|÷¨lstyle¨É¨clr¨¨#EA0909¨}{ß9¨num¨ßE¨温度¨ßB¨fal fa-thermometer-three-quarters¨ßO¨#076EEF¨¨min¨É¨max¨¤U¨uni¨´℃´ßHËßIÍßJËßK¨settemp¨´x´Í´y´ÊßM|÷ßN˨rt¨»}{ß9¨ran¨ßEßRßO¨#00A90C¨ßV¤UßU¤HßHËßIÑßJËßK¨ran-wen¨´x´É´y´ÎßM|÷ßNË}{ß9ßAßB¨fal fa-fan¨ßDÉßE¨风速¨ßFßGßHËßIËßJËßK¨btn-fan¨´x´Ë´y´ÊßM|÷ßNÉßOßa}{ß9ßAßB¨fad fa-sun¨ßDÉßE¨干燥¨ßFßGßHËßIËßJËßK¨btn-dry¨´x´Ë´y´ÌßM|÷ßO¨#FBA613¨}{ß9ßAßB¨fad fa-fire-alt¨ßDÉßE¨制热¨ßFßGßHËßIËßJËßK¨btn-hot¨´x´Í´y´ÌßM|÷ßOßP}{ß9ßAßB¨fad fa-snowflakes¨ßDÉßE¨制冷¨ßFßGßHËßIËßJËßK¨btn-cool¨´x´É´y´ÌßM|÷ßOßT}{ß9ßAßB¨fad fa-user-robot¨ßDÉßE¨自动¨ßFßGßHËßIËßJËßK¨btn-auto¨´x´Ï´y´ÌßM|÷ßOßa}{ß9¨deb¨ßDÉßHÉßIÑßJÌßK¨debug¨´x´É´y´¤AßM|÷ßNÉ}÷ßY|ßX÷}正式开始刷写代码
以下代码可以直接刷写,注意安装库文件。
/****************************************************************************************
* v2.0 —— 智能风速匹配版
* 可以在其中修改,可以自己修改开机的模式
* 开门+板载灯控制+开关空调,自定义空调模式
****************************************************************************************/
#include <Servo.h>
#define BLINKER_WIFI
#include <Blinker.h>
#include <NTPClient.h>
#include <WiFiUdp.h>
#include <PubSubClient.h>
#include <IRremoteESP8266.h>
#include <IRsend.h>
#include <ir_Coolix.h>
// ====================== 配置 ======================
const char AUTH[] = ""; //电灯科技密钥测试
// const char AUTH[] = ""; //电灯科技密钥正式
const char WIFI_SSID[] = ""; //WIFI名称
const char WIFI_PSWD[] = ""; //WIFI密码
const char* CUSTOM_HOSTNAME = "开门猫"; //设备名称
const char* mqtt_server = ""; //mqtt服务器
const int mqtt_port = 1883; //mqtt端口
const char* mqtt_topic = "switch/state"; //mqtt主题订阅
// ====================== 硬件 ======================
const int SERVO_PIN = 0;
const int ONBOARD_LED_PIN = 2; // 低电平亮
const uint16_t kIrLed = 3;
const int MIN_ANGLE = 0;
const int MAX_ANGLE = 90;
// ====================== 参数 ======================
const int OPEN_KEEP_TIME = 2000;
const int MOVE_TIME = 300;
const int VIBRATE_DELAY = 250;
// ▼▼▼▼▼▼▼▼▼▼▼ 季节性配置区 ▼▼▼▼▼▼▼▼▼▼▼
// 夏天制冷填: kCoolixCool 冬天制热填: kCoolixHeat 其他可选: kCoolixAuto(自动), kCoolixDry(除湿), kCoolixFan(送风)
const uint8_t DEFAULT_AC_MODE = kCoolixCool;
// 2. 设置默认温度:
const int DEFAULT_AC_TEMP = 20; //(16-30)
// 3. 设置默认风速等级 (只需改这就行,硬件自动匹配):
// 1=静音(Fixed)
// 2=低速(Min)
// 3=中速(Med)
// 4=高速(Max) - 推荐夏天用这个
// 5=自动(Auto)
const int DEFAULT_FAN_LEVEL = 4;
// ▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲
// ====================== 对象 ======================
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "pool.ntp.org", 8*3600, 60000);
WiFiClient espClient;
PubSubClient mqttClient(espClient);
Servo myServo;
IRsend irsend(kIrLed);
IRCoolixAC ac(kIrLed);
// ====================== Blinker 组件 ======================
BlinkerButton btn_servo("key-servo");
BlinkerButton btn_light("key-light");
BlinkerButton btn_pwr("btn-pwr");
BlinkerButton btn_fan("btn-fan");
BlinkerButton btn_cool("btn-cool");
BlinkerButton btn_dry("btn-dry");
BlinkerButton btn_hot("btn-hot");
BlinkerButton btn_auto("btn-auto");
BlinkerSlider slider_temp("ran-wen");
BlinkerNumber NUM1("settemp");
// ====================== 状态变量 ======================
bool lightState = false;
bool timeSynced = false;
bool lightManualOverride = false;
static int lastHour = -1;
bool isOpening = false;
unsigned long servoTimer = 0;
enum ServoState { IDLE, GO_TO_90, STAY_90, GO_TO_0 } servoState = IDLE;
bool ac_power = false;
uint8_t ac_mode = kCoolixCool;
uint8_t ac_temp = 25;
uint8_t ac_fan = kCoolixFanAuto0; // 这个现在由函数自动管理
int fan_level = 5; // 当前等级
// ====================== 核心辅助函数 ======================
// 【新功能】智能风速设置函数:输入等级,自动设置变量和硬件指令
void applyFanLevel(int level) {
if (level < 1) level = 1;
if (level > 5) level = 5;
fan_level = level; // 更新全局等级变量
// 根据等级自动匹配硬件指令
switch(fan_level) {
case 1: ac_fan = kCoolixFanFixed; break; // 静音
case 2: ac_fan = kCoolixFanMin; break; // 低速
case 3: ac_fan = kCoolixFanMed; break; // 中速
case 4: ac_fan = kCoolixFanMax; break; // 高速
case 5: ac_fan = kCoolixFanAuto0; break; // 自动
}
}
String getModeText() {
switch(ac_mode) {
case kCoolixAuto: return "自动";
case kCoolixCool: return "制冷";
case kCoolixDry: return "除湿";
case kCoolixHeat: return "制热";
default: return "送风";
}
}
String getFanText() {
switch(fan_level) {
case 1: return "静音"; case 2: return "低速";
case 3: return "中速"; case 4: return "高速"; case 5: return "自动";
default: return "未知";
}
}
void sendAcState() {
if (!ac_power) { ac.off(); ac.send(); Serial.println("【空调】已关机"); return; }
ac.on(); ac.setMode(ac_mode); ac.setTemp(ac_temp); ac.setFan(ac_fan); ac.send();
Serial.printf("【空调】已发送 → %s %d°C %s风 (等级%d)\n", getModeText().c_str(), ac_temp, getFanText().c_str(), fan_level);
}
void updateAppState() {
btn_light.print(lightState ? "on" : "off");
if (ac_power) {
btn_pwr.color("#00FF00"); btn_pwr.text("已开机"); btn_pwr.print("on");
} else {
btn_pwr.color("#FF0000"); btn_pwr.text("已关机"); btn_pwr.print("off");
}
NUM1.print(ac_temp); slider_temp.print(ac_temp);
btn_fan.text(getFanText()); btn_fan.print();
String c="#CCCCCC", d="#CCCCCC", h="#CCCCCC", a="#CCCCCC";
if(ac_power){
if(ac_mode==kCoolixCool) c="#00B0FF";
if(ac_mode==kCoolixDry) d="#FFC107";
if(ac_mode==kCoolixHeat) h="#FF5722";
if(ac_mode==kCoolixAuto) a="#4CAF50";
}
btn_cool.color(c); btn_cool.print();
btn_dry.color(d); btn_dry.print();
btn_hot.color(h); btn_hot.print();
btn_auto.color(a); btn_auto.print();
}
// ... 灯光和门锁逻辑保持不变,省略以节省空间,功能与v4.1完全一致 ...
void updateLightStateAccordingToTime() {
if (!timeSynced) return;
int h = timeClient.getHours();
bool shouldBeOn = (h >= 8 && h < 12) || (h >= 14 && h < 24);
bool currentIsOn = (digitalRead(ONBOARD_LED_PIN) == LOW);
bool newTimeSlot = (h != lastHour);
if (newTimeSlot) { lightManualOverride = false; lastHour = h; Serial.printf("【自动灯光】进入 %02d:00,清除反转\n", h); }
if (currentIsOn != shouldBeOn) {
if (lightManualOverride && !newTimeSlot) return;
lightState = shouldBeOn; digitalWrite(ONBOARD_LED_PIN, lightState ? LOW : HIGH);
btn_light.print(lightState ? "on" : "off"); Serial.printf("【自动灯光】%02d:%02d → 自动%s\n", h, timeClient.getMinutes(), lightState?"开":"关");
}
}
void toggleLightWithOverride() {
lightManualOverride = true; lightState = !lightState;
digitalWrite(ONBOARD_LED_PIN, lightState ? LOW : HIGH);
btn_light.print(lightState ? "on" : "off"); Serial.println("【灯光】手动反转");
}
void rotateServoSequence() {
if (isOpening) return;
isOpening = true; servoState = GO_TO_90; servoTimer = millis(); myServo.write(MAX_ANGLE);
Serial.println("【门锁】开门"); Blinker.print("门", "开");
}
void handleServoNonBlock() {
if (!isOpening) return;
if(servoState==GO_TO_90 && millis()-servoTimer>=VIBRATE_DELAY){ Blinker.vibrate(); servoState=STAY_90; servoTimer=millis(); }
else if(servoState==STAY_90 && millis()-servoTimer>=OPEN_KEEP_TIME){ myServo.write(MIN_ANGLE); Serial.println("【门锁】关门"); servoState=GO_TO_0; servoTimer=millis(); }
else if(servoState==GO_TO_0 && millis()-servoTimer>=MOVE_TIME){ isOpening=false; servoState=IDLE; }
}
// ====================== setup ======================
void setup() {
Serial.begin(115200);
Serial.println(F("\n=== 终极融合版 v4.2 (智能风速) ==="));
WiFi.hostname(CUSTOM_HOSTNAME);
pinMode(ONBOARD_LED_PIN, OUTPUT); digitalWrite(ONBOARD_LED_PIN, HIGH);
myServo.attach(SERVO_PIN); myServo.write(MIN_ANGLE);
irsend.begin(); ac.begin();
Blinker.begin(AUTH, WIFI_SSID, WIFI_PSWD);
delay(3000); WiFi.hostname(CUSTOM_HOSTNAME);
timeClient.begin();
for(int i=0; i<10; i++) { if(timeClient.forceUpdate()) { timeSynced=true; break; } delay(1000); }
if(timeSynced) Serial.println("时间同步成功");
btn_servo.attach([](const String &s) { rotateServoSequence(); });
btn_light.attach([](const String &s) { toggleLightWithOverride(); });
// ========== 空调逻辑优化区 ==========
btn_pwr.attach([](const String &state){
if(state==BLINKER_CMD_ON && !ac_power){
ac_power = true;
// 1. 读取默认模式
ac_mode = DEFAULT_AC_MODE;
// 2. 读取默认温度
ac_temp = DEFAULT_AC_TEMP;
// 3. 读取默认等级,并自动计算硬件指令!
applyFanLevel(DEFAULT_FAN_LEVEL);
Serial.println("【空调】一键启动(智能匹配风速)");
} else if(state==BLINKER_CMD_OFF){ ac_power=false; }
sendAcState(); updateAppState();
});
slider_temp.attach([](int32_t v){ if(ac_power){ v=constrain(v,17,30); ac_temp=v; sendAcState(); updateAppState(); }});
// 风速按钮:现在非常简洁,直接调用函数
btn_fan.attach([](const String &s){
if(ac_power){
int nextLevel = (fan_level >= 5) ? 1 : fan_level + 1; // 循环 1->2->3->4->5->1
applyFanLevel(nextLevel); // 一行代码搞定设置和硬件映射
sendAcState(); updateAppState();
}
});
btn_cool.attach([](const String&s){if(ac_power&&s==BLINKER_CMD_BUTTON_TAP){ac_mode=kCoolixCool;sendAcState();updateAppState();}});
btn_dry.attach([](const String&s){if(ac_power&&s==BLINKER_CMD_BUTTON_TAP){ac_mode=kCoolixDry;sendAcState();updateAppState();}});
btn_hot.attach([](const String&s){if(ac_power&&s==BLINKER_CMD_BUTTON_TAP){ac_mode=kCoolixHeat;sendAcState();updateAppState();}});
btn_auto.attach([](const String&s){if(ac_power&&s==BLINKER_CMD_BUTTON_TAP){ac_mode=kCoolixAuto;sendAcState();updateAppState();}});
Blinker.attachHeartbeat(updateAppState);
mqttClient.setServer(mqtt_server, mqtt_port);
mqttClient.setCallback([](char*t,byte*p,unsigned int l){
String m=""; for(unsigned int i=0;i<l;i++)m+=(char)p[i];
if(m=="on") rotateServoSequence();
if(m=="light") toggleLightWithOverride();
});
updateAppState();
Serial.println("系统就绪");
}
void loop() {
Blinker.run();
timeClient.update();
if(!mqttClient.connected()){
String id="ESP8266-"+String(random(0xffff),HEX);
if(mqttClient.connect(id.c_str())) mqttClient.subscribe(mqtt_topic);
}
mqttClient.loop();
handleServoNonBlock();
static unsigned long lastCheck = 0;
if(millis() - lastCheck >= 30000){ updateLightStateAccordingToTime(); lastCheck = millis(); }
if(Serial.available()){
String c=Serial.readStringUntil('\n'); c.trim(); c.toLowerCase();
if(c=="on") rotateServoSequence();
else if(c=="light") toggleLightWithOverride();
}
}注意:这里面可以自定义默认开机的空调模式,详情见注释
// ▼▼▼▼▼▼▼▼▼▼▼ 季节性配置区 ▼▼▼▼▼▼▼▼▼▼▼
// 夏天制冷填: kCoolixCool 冬天制热填: kCoolixHeat 其他可选: kCoolixAuto(自动), kCoolixDry(除湿), kCoolixFan(送风)
const uint8_t DEFAULT_AC_MODE = kCoolixCool;
// 2. 设置默认温度:
const int DEFAULT_AC_TEMP = 20; //(16-30)
// 3. 设置默认风速等级 (只需改这就行,硬件自动匹配):
// 1=静音(Fixed)
// 2=低速(Min)
// 3=中速(Med)
// 4=高速(Max) - 推荐夏天用这个
// 5=自动(Auto)
const int DEFAULT_FAN_LEVEL = 4;
// ▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲APP配置
使用了可以遥控空调的代码记得使用新的app配置
如下:
{¨config¨{¨headerColor¨¨transparent¨¨headerStyle¨¨dark¨¨background¨{¨img¨¨assets/img/bg/f1.jpg¨¨isFull¨»}}¨dashboard¨|{¨type¨¨btn¨¨ico¨¨fal fa-air-conditioner¨¨mode¨Ê¨t0¨´关´¨t1¨¨文本2¨¨bg¨Ë¨cols¨Ë¨rows¨Ë¨key¨¨btn-pwr¨´x´É´y´Ê¨speech¨|÷¨lstyle¨É¨clr¨¨#EA0909¨}{ßA¨num¨ßF¨温度¨ßC¨fal fa-thermometer-three-quarters¨ßP¨#076EEF¨¨min¨É¨max¨¤U¨uni¨´℃´ßIËßJÍßKËßL¨settemp¨´x´Í´y´ÊßN|÷ßOË}{ßA¨ran¨ßFßSßP¨#00A90C¨ßW¤UßV¤HßIËßJÑßKËßL¨ran-wen¨´x´É´y´ÎßN|÷ßO˨rt¨«}{ßAßBßC¨fal fa-fan¨ßEÉßF¨风速¨ßGßHßIËßJËßKËßL¨btn-fan¨´x´Ë´y´ÊßN|÷ßOÉßPßa}{ßAßBßC¨fad fa-sun¨ßEÉßF¨干燥¨ßGßHßIËßJËßKËßL¨btn-dry¨´x´Ë´y´ÌßN|÷ßP¨#FBA613¨}{ßAßBßC¨fad fa-fire-alt¨ßEÉßF¨制热¨ßGßHßIËßJËßKËßL¨btn-hot¨´x´Í´y´ÌßN|÷ßPßQ}{ßAßBßC¨fad fa-snowflakes¨ßEÉßF¨制冷¨ßGßHßIËßJËßKËßL¨btn-cool¨´x´É´y´ÌßN|÷ßPßU}{ßAßBßC¨fad fa-user-robot¨ßEÉßF¨自动¨ßGßHßIËßJËßKËßL¨btn-auto¨´x´Ï´y´ÌßN|÷ßPßa}{ßA¨deb¨ßEÉßIÉßJÑßKÍßL¨debug¨´x´É´y´¤DßN|÷ßOÊ}{ßAßBßC¨far fa-door-open¨ßEÊßF¨文本1¨ßGßHßIÊßJÍßKÍßL¨key-servo¨´x´Ë´y´ÑßPßaßOË}{ßAßBßC¨far fa-lightbulb-on¨ßEÉßF´´ßGßHßIËßJËßKËßL¨key-light¨´x´Ï´y´¤BßOÉßPßU}÷ßc|÷}注意
注意
直接使用esp8266RX口来驱动红外LED会有功率过于小的问题,你需要设置一个新的电路来驱动LED,可以查看B站博主的视频来构建。
不添加电路只能实现5m范围的遥控
再次提醒,因为使用了RX引脚,所以在上传代码的时候如果RX被LED占用会刷写不上代码。
结束
恭喜你,现在你可以通过这个来控制空调了。