这几个月没时间更新,所以断更了好几个月

接下来,我们回到正题

有没有人想过自己做一个小米空调伴侣

接下来,我们开始制作教程。

前言:为什么选择自制空调伴侣?

在智能家居飞速发展的今天,小米空调伴侣这类产品已经成为很多家庭的必备设备。它不仅能让传统空调变得智能,还能通过手机 APP 远程控制、定时开关,甚至与其他智能设备联动。但市售产品往往价格不菲,功能也未必完全符合个人需求。

有没有想过自己动手做一个呢?其实,通过 ESP32-CAM 开发板和一些简单的外围电路,我们完全可以打造一个功能更强大、成本更低的 "空调伴侣",还能根据自己的想法自由扩展功能。接下来,就让我们一步步实现这个目标吧!

一、系统设计与功能规划

1.1 功能需求分析

我们要制作的 DIY 空调伴侣需要具备以下核心功能:

  • 红外控制:学习并模拟空调遥控器的各种功能
  • 远程控制:通过手机 APP 随时随地控制空调
  • 状态显示:实时显示空调的运行状态(温度、模式等)
  • 定时功能:设定空调的开关时间
  • 数据记录:记录空调使用数据,分析能耗

1.2 系统架构设计

整个系统采用模块化设计,主要由以下部分组成:

  • 主控制器:ESP32-CAM 开发板(集成 WiFi 和蓝牙)
  • 红外模块:红外接收头和发射二极管
  • 显示模块:OLED 显示屏(可选)
  • 电源模块:支持 USB 或电池供电
  • 云平台:用于远程控制和数据同步

1.3 硬件选型

组件 型号 功能
主控制器 ESP32-CAM 核心控制与网络连接
红外接收头 HS0038 接收空调遥控器信号
红外发射管 940nm 发射控制信号给空调
显示屏 SSD1306 OLED 显示空调状态信息
电源管理 TP4056 + AMS1117 电池充电与稳压

二、硬件制作与电路连接

2.1 核心电路设计

首先,我们需要设计一个能够实现基本功能的电路。以下是主要连接方式:

plaintext

ESP32-CAM引脚        连接设备          连接说明
--------------------------------------------
GPIO2                红外接收头        数据输出
GPIO4                红外发射管        通过220Ω电阻连接
GPIO14               OLED SDA         I2C数据线
GPIO15               OLED SCL         I2C时钟线
3.3V                 OLED VCC         电源正极
GND                  OLED GND         电源负极

2.2 电源模块设计

为了让设备更加灵活,我们设计一个支持双电源的供电系统:

plaintext

USB电源 --> [电源选择电路] --> [TP4056充电管理] --> 锂电池
                          |
                          V
                    [AMS1117-3.3V稳压] --> ESP32-CAM

这个设计允许系统在有 USB 供电时使用外部电源,同时给电池充电;在没有 USB 连接时,自动切换到电池供电。

2.3 PCB 设计与制作

如果希望设备更加紧凑和专业,可以设计一块 PCB 电路板。以下是 PCB 设计的关键要点:

  • 采用双层 PCB 设计,尺寸约 50mm×30mm
  • 为红外发射管和接收头设计专用接口
  • 预留 OLED 显示屏接口
  • 设计电源开关和充电指示灯
  • 添加复位按钮和状态指示灯

制作完成后,将所有元件焊接到 PCB 上,确保连接牢固。

三、软件开发与功能实现

3.1 开发环境搭建

我们使用 Arduino IDE 作为开发环境,需要安装以下库:

  • ESP32 Arduino 核心库
  • IRremoteESP8266:红外收发库
  • Adafruit GFX 和 SSD1306:OLED 显示库
  • WiFi 和 HTTPClient:网络通信库

3.2 核心功能实现

下面是系统的核心代码框架:

cpp

运行

// 空调伴侣核心代码
#include <WiFi.h>
#include <IRremoteESP8266.h>
#include <IRrecv.h>
#include <IRsend.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

// 网络配置
const char* ssid = "你的WiFi名称";
const char* password = "你的WiFi密码";

// 红外引脚定义
const int RECV_PIN = 2;    // 红外接收引脚
const int SEND_PIN = 4;    // 红外发射引脚

// OLED显示屏定义
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);

// 空调状态变量
bool powerState = false;   // 电源状态
int temperature = 26;      // 当前温度
int mode = 0;              // 模式(0-自动,1-制冷,2-制热,3-除湿,4-送风)
int fanSpeed = 0;          // 风速(0-自动,1-低速,2-中速,3-高速)

// 红外信号存储
#define MAX_COMMANDS 10
uint64_t irCommands[MAX_COMMANDS];

// 初始化函数
void setup() {
  Serial.begin(115200);
  
  // 初始化红外
  irrecv.enableIRIn();
  irsend.begin();
  
  // 初始化OLED
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("SSD1306显示屏初始化失败"));
  }
  
  // 连接WiFi
  connectWiFi();
  
  // 显示欢迎信息
  displayWelcome();
  
  // 初始化红外命令
  initIRCommands();
}

// 主循环
void loop() {
  // 检查WiFi连接
  if (WiFi.status() != WL_CONNECTED) {
    connectWiFi();
  }
  
  // 处理红外接收
  if (irrecv.decode(&results)) {
    handleIRCommand(results.value);
    irrecv.resume();
  }
  
  // 处理网络请求
  handleNetworkRequests();
  
  // 更新显示
  updateDisplay();
  
  delay(100);
}

// 连接WiFi
void connectWiFi() {
  Serial.print("连接到WiFi: ");
  Serial.println(ssid);
  
  WiFi.begin(ssid, password);
  
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  
  Serial.println();
  Serial.println("WiFi连接成功");
  Serial.print("IP地址: ");
  Serial.println(WiFi.localIP());
}

// 红外命令处理
void handleIRCommand(uint64_t command) {
  // 处理接收到的红外命令
  // ...
  
  // 更新空调状态
  updateAirconStatus();
}

// 发送红外命令
void sendIRCommand(int commandIndex) {
  if (irCommands[commandIndex] != 0) {
    irsend.sendNEC(irCommands[commandIndex], 32);
  }
}

// 更新显示内容
void updateDisplay() {
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(0, 0);
  
  // 显示电源状态
  display.print("电源: ");
  display.println(powerState ? "开" : "关");
  
  // 显示温度
  display.print("温度: ");
  display.print(temperature);
  display.println("°C");
  
  // 显示模式
  display.print("模式: ");
  display.println(getModeString(mode));
  
  // 显示风速
  display.print("风速: ");
  display.println(getFanSpeedString(fanSpeed));
  
  display.display();
}

// 获取模式字符串
String getModeString(int mode) {
  switch(mode) {
    case 0: return "自动";
    case 1: return "制冷";
    case 2: return "制热";
    case 3: return "除湿";
    case 4: return "送风";
    default: return "未知";
  }
}

// 获取风速字符串
String getFanSpeedString(int speed) {
  switch(speed) {
    case 0: return "自动";
    case 1: return "低速";
    case 2: return "中速";
    case 3: return "高速";
    default: return "未知";
  }
}

3.3 红外学习功能

为了实现对不同空调的控制,我们需要添加红外学习功能:

cpp

运行

// 红外学习模式
void startLearningMode() {
  display.clearDisplay();
  display.setTextSize(1);
  display.setCursor(0, 0);
  display.println("红外学习模式");
  display.println("请按下遥控器按键");
  display.display();
  
  while (!learnIRCommand());
  
  display.clearDisplay();
  display.setCursor(0, 0);
  display.println("学习完成!");
  display.display();
  delay(2000);
}

// 学习单个红外命令
bool learnIRCommand() {
  decode_results results;
  
  if (irrecv.decode(&results)) {
    irCommands[currentLearnIndex] = results.value;
    irrecv.resume();
    return true;
  }
  
  return false;
}

四、云平台与远程控制

4.1 选择云平台

为了实现远程控制,我们需要选择一个合适的云平台。这里推荐使用 Blynk 或自建 MQTT 服务器。

4.2 Blynk 平台配置

  1. 在手机上安装 Blynk 应用并注册账号
  2. 创建新项目,选择 ESP32 设备
  3. 添加按钮、滑块等控件到界面
  4. 获取认证令牌并添加到代码中

4.3 远程控制代码实现

cpp

运行

// Blynk远程控制代码
#include <BlynkSimpleEsp32.h>

char auth[] = "你的Blynk认证令牌";

// Blynk虚拟引脚处理函数
BLYNK_WRITE(V0) {
  powerState = param.asInt();
  sendIRCommand(powerState ? 0 : 1); // 0-开机命令, 1-关机命令
}

BLYNK_WRITE(V1) {
  temperature = param.asInt();
  // 根据温度值发送对应的红外命令
  sendTemperatureCommand(temperature);
}

// 连接Blynk
void connectBlynk() {
  Blynk.begin(auth, ssid, password);
  while (Blynk.connect() == false) {
    delay(1000);
  }
}

// 在loop中调用
void handleBlynk() {
  Blynk.run();
}

五、外壳设计与安装

5.1 3D 打印外壳

为了保护电路和美观,可以设计一个 3D 打印外壳。以下是设计要点:

  • 尺寸适合容纳 PCB 和电池
  • 为红外发射管和接收头设计专用窗口
  • 设计散热孔,确保设备正常工作
  • 考虑安装方式(壁挂或放置)

5.2 安装与调试

  1. 将 PCB 和组件安装到外壳中
  2. 连接所有线路,确保没有短路
  3. 安装电池并测试供电系统
  4. 进行红外功能测试
  5. 测试远程控制功能
  6. 调整参数,确保系统稳定运行

六、使用与扩展

6.1 基本使用方法

  1. 首次启动时,进入红外学习模式,学习空调遥控器的各种功能
  2. 通过手机 APP 连接到设备
  3. 在 APP 上控制空调的开关、温度、模式等
  4. 设置定时任务,实现智能控制

6.2 功能扩展建议

  1. 添加温湿度传感器:根据环境温湿度自动调节空调
  2. 语音控制:集成小爱同学或天猫精灵实现语音控制
  3. 能耗统计:记录空调使用数据,分析能耗情况
  4. 智能场景:与其他智能设备联动,实现更复杂的自动化场景

七、总结与展望

通过这个 DIY 项目,我们成功打造了一个功能强大的空调伴侣,不仅实现了小米空调伴侣的核心功能,还可以根据自己的需求进行扩展。整个项目成本不到 50 元,远低于市售产品价格。

未来,我们可以进一步优化系统性能,添加更多智能功能,甚至开发一个完整的智能家居控制系统。希望这个教程能激发你的创造力,让你也能体验到 DIY 的乐趣!

附录:材料清单与成本估算

材料 数量 单价 (元) 总价 (元)
ESP32-CAM 开发板 1 30 30
红外接收头 HS0038 1 3 3
红外发射管 1 1 1
OLED 显示屏 (128x64) 1 15 15
TP4056 充电模块 1 5 5
AMS1117-3.3V 稳压模块 1 3 3
锂电池 (18650) 1 10 10
杜邦线 / 电阻 / 电容等 1 套 5 5
总计 - - 72

注:成本估算不包括 3D 打印外壳和工具费用,QQ群号:810021151

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐