智能空调解决方案:8266+红外控制模块

发布时间 2023-08-09 23:00:30作者: 云中志

前言

炎炎夏日, 你是否有这样的困惑:

  • 睡觉时,并不觉得热,然而后半夜被热醒,然后在极其不爽的情绪下,开启空调继续谁?
  • 睡觉时,空调温度刚刚好,然而后半夜下雨了,被冻醒?

看完我们今天的内容,我相信以上两个问题都能被解决,而且方法绝对简单,好了,废话少说,让我们直接开始吧。

智能空调解决方案

准备工作

环境准备

这块我们就不展开讲了,包括Arduino IED的安装和配置、esp8266开发板的使用等, 可以参考我们之前的内容。

材料部分

序号 名称 数量 备注
1 esp8266开发板 1 开发板
2 红外发射模块 1 用来发射控制信息,38KHZ
3 红外接收模块 1 用来接收空调遥控器红外信号,解码信息,38KHZ
4 DHT11温湿度传感器 1 用来采集房间内的温度和湿度
5 杜邦线 若干 模块连接

本次项目成本总计15元左右,最贵的是esp8266开发,12元左右

解码空调遥控器信息

这里主要是通过红外接收模块和esp8266开发板,接收并解析红外信息,为后面控制空调做准备,也就是把空调各种控制信息,包括开、关、温度加减、风速等控制信号输出并保存,这样我们在后续的控制中,可以直接通过esp8266+红外发射模块来发射这些信息,从而实现空调的智能控制。

接收端接线

这里的接线比较简单,因为红外模块只有三个引脚,一个信号线,两个电源引脚,所以连接很简单:

序号 红外引脚 esp8266
1 out d5(GPIO14)
2 VVC 3V
3 GND G

电源部分可以连接3V3或者5V都可以,发送端建议连接5V,不然距离太远发送的红外信号太弱,空调接收不到。

解码

这里解码我们要用到IRremoteESP8266包下的一个示例项目,如果没有这个包的小伙伴先去安装这个包:

安装完成之后,连接esp8266,然后打开Arduino IDE,打开IRremoteESP8266的示例项目IRrecvDumpV2:

因为示例项目的默认接收引脚是14,这也是我们前面接线用14号引脚的原因:

将示例代码上传至esp8266,然后我们打开串口监视器,端口115200,拿遥控器对准红外接收模块,按下对应的键,终端便会展示该按键对应的控制信息:

这里我们把相关信息保存下,方便后面使用。

空调控制红外信息发射

发射端连线
序号 红外引脚 esp8266
1 out d2(GPIO4)
2 VVC VV
3 GND G

esp8266vv引脚是5v,电压高一点确保红外信号可以发射远一点

温湿度传感器连线
序号 红外引脚 esp8266
1 out d5(GPIO14)
2 VVC 3V
3 GND G

发射端编码

编码本身很简单,主要还是实现思路,先说我的需求:

  • 通过温度传感器来采集温度,温度作为控制依据;
  • 当温度高于某个值(比如30度),且空调未开启,则发送开启空调指令;
  • 当温度低于某个值(比如26度),且空调是开启的,则发送关闭指令

下面是代码实现

#include <Arduino.h>
#include <IRremoteESP8266.h>
#include <IRsend.h>
#include <DFRobot_DHT11.h>;  // 温度传感器DHT11依赖

#define DHT11_PIN 13  // 温度传感器引脚,GPIO13--D7
const uint16_t kIrLed = 4;  // ESP8266 GPIO pin to use. Recommended: 4 (D2).

// 开空调指令
uint16_t ACon[273] = {4490, 4400,  504, 1670,  480, 594,  482, 1670,  480, 1668,  482, 592,  482, 594,  482, 1668,  482, 594,  480, 594,  482, 1668,  482, 592,  482, 592,  482, 1670,  480, 1668,  482, 592,  482, 1670,  482, 1668,  480, 594,  480, 1670,  480, 1670,  478, 1670,  480, 1670,  478, 1670,  478, 1672,  478, 596,  478, 1672,  480, 596,  478, 596,  480, 596,  476, 598,  454, 620,  452, 622,  402, 1750,  400, 674,  422, 652,  422, 652,  422, 652,  424, 650,  426, 650,  446, 628,  450, 626,  450, 1700,  474, 1676,  474, 1676,  476, 1674,  476, 1674,  476, 1674,  476, 1672,  478, 5276,  4326, 4434,  470, 1700,  448, 624,  454, 1700,  448, 1686,  466, 624,  452, 622,  452, 1680,  470, 622,  454, 622,  454, 1698,  452, 620,  454, 622,  454, 1696,  476, 1674,  478, 598,  478, 1670,  482, 1668,  480, 594,  482, 1668,  480, 1668,  482, 1668,  482, 1668,  482, 1668,  454, 1694,  456, 618,  456, 1696,  454, 620,  456, 618,  456, 618,  456, 618,  454, 620,  454, 620,  456, 1694,  456, 620,  424, 650,  424, 650,  424, 650,  426, 648,  426, 650,  424, 650,  424, 650,  448, 1702,  448, 1702,  450, 1700,  450, 1702,  472, 1678,  472, 1678,  474, 1676,  472, 5298,  4300, 4462,  444, 1682,  466, 1734,  416, 658,  416, 1732,  418, 658,  418, 1732,  418, 658,  416, 1734,  418, 658,  416, 1734,  414, 1736,  416, 658,  416, 684,  390, 1760,  392, 1758,  392, 684,  390, 684,  390, 684,  366, 708,  366, 710,  366, 708,  366, 708,  366, 734,  342, 734,  342, 734,  342, 734,  340, 734,  340, 760,  316, 760,  314, 760,  314, 786,  288, 812,  262, 840,  236, 814,  260, 840,  232};  // COOLIX B2BF80

// 关空调指令
uint16_t ACoff[199] = {4470, 4424,  478, 1696,  452, 596,  484, 1694,  452, 1696,  454, 594,  484, 590,  482, 1696,  454, 592,  484, 592,  478, 1698,  454, 622,  448, 574,  480, 1720,  428, 1720,  430, 644,  430, 1720,  432, 642,  432, 1720,  486, 1664,  462, 1688,  498, 1652,  492, 584,  520, 1630,  496, 1654,  518, 1632,  520, 554,  520, 556,  518, 556,  520, 556,  518, 1630,  518, 558,  518, 556,  430, 1720,  440, 1686,  452, 1698,  468, 630,  448, 628,  472, 602,  472, 602,  450, 626,  450, 624,  476, 598,  478, 596,  478, 1672,  454, 1696,  480, 1668,  480, 1670,  482, 1668,  484, 5262,  4336, 4424,  480, 1670,  478, 596,  478, 1674,  476, 1672,  478, 596,  476, 596,  476, 1674,  476, 598,  476, 598,  476, 1676,  474, 598,  476, 598,  476, 1696,  452, 1698,  454, 600,  474, 1696,  454, 602,  472, 1698,  452, 1698,  450, 1700,  450, 1700,  452, 622,  452, 1700,  450, 1700,  450, 1702,  448, 626,  448, 628,  446, 628,  424, 650,  424, 1728,  420, 654,  420, 656,  418, 1732,  418, 1732,  442, 1710,  440, 634,  440, 634,  442, 634,  440, 634,  440, 634,  440, 656,  418, 656,  418, 656,  420, 1730,  418, 1732,  418, 1732,  418, 1732,  418, 1732,  418};  // COOLIX B27BE0

int khz = 38; // 38kHz carrier frequency for the NEC protocol

// 温度传感器
DFRobot_DHT11 DHT;

IRsend irsend(kIrLed);  // Set the GPIO to be used to sending the message.

boolean acIsOn = false;
void setup() {
  irsend.begin();
  Serial.begin(115200, SERIAL_8N1, SERIAL_TX_ONLY);
}

void loop() {
  Serial.println("loop");

  // 读取温湿度
  DHT.read(DHT11_PIN);
  Serial.print("temp:");
  int temp = DHT.temperature;
  int hum = DHT.humidity;
  Serial.print(temp);
  Serial.print("  humi:");
  Serial.println(hum);

  // 如果温度高于30度且空调未开启,则开启空调
  if (!acIsOn && temp >= 30) {
    irsend.sendRaw(ACon, sizeof(ACon) / sizeof(ACon[0]), khz); delay(2000); //Send
    acIsOn = true;
  }

  // 如果温度低于28度,且空调已开启,则关闭空调
  if (acIsOn && temp < 28) {
    //delay(10000);
    irsend.sendRaw(ACoff, sizeof(ACoff) / sizeof(ACoff[0]), khz); delay(2000);//Send
  }
  delay(2000);
}

当然你还可以根据你的需要增加控制指令,比如温度低于某个温度(比如18度),开启制热模式,或者根据当前室温调整空调温度,方法类似。

结语

这个项目完全是兴起之作,本来以为应该很简单,然而当真正开始的时候,才发现我对红外通信知之甚少,比如NEC协议,比如红外编码解码,所以毫无意外刚开始就卡在遥控器解码这里了,结果差点放弃,然后我又不死心地搜了一些相关博客,最终顺利完成。

参考内容:https://www.elecfans.com/d/1939738.html