智能空调解决方案:8266+红外控制模块
前言
炎炎夏日, 你是否有这样的困惑:
- 睡觉时,并不觉得热,然而后半夜被热醒,然后在极其不爽的情绪下,开启空调继续谁?
- 睡觉时,空调温度刚刚好,然而后半夜下雨了,被冻醒?
看完我们今天的内容,我相信以上两个问题都能被解决,而且方法绝对简单,好了,废话少说,让我们直接开始吧。
智能空调解决方案
准备工作
环境准备
这块我们就不展开讲了,包括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 |
esp8266
的vv
引脚是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
协议,比如红外编码解码,所以毫无意外刚开始就卡在遥控器解码这里了,结果差点放弃,然后我又不死心地搜了一些相关博客,最终顺利完成。