老猿
老王头物联网实践记录
居家自动化 · 传感器折腾 · 嵌入式小实验
旧设备改造

旧设备改造

不是每个旧家电坏了都要丢,不是每个不够智能的设备都要换新。加一块小板子,老东西也能用上新功能。

家里有些用了很多年的电器,功能没问题就是不够智能——不能远程控制,没有定时,不知道耗没耗电。花大几千换新的有点舍不得,其实加一块 ESP32 或者继电器模块就能解决。这个板块记录各种改造思路和实践过程。
💡
普通台灯变智能灯
继电器模块 + ESP32,手机控制定时开关

改造思路

在台灯的电源线路中串入一个继电器模块,ESP32 控制继电器的通断,就能控制台灯的开关。接入 Home Assistant 后,手机 App 可以控制,也可以设定时规则。

涉及 220V 交流电,接线时必须断电,不确定的地方不要动。如果没有电工基础,建议买成品智能插座替代,原理一样,更安全。

需要的材料

  • ESP32 开发板 × 1
  • 5V 单路继电器模块 × 1(某宝约 5 元)
  • 5V 电源模块(给 ESP32 供电)
  • 防水接线盒(装进去更安全美观)

接线方式

继电器控制端(低压侧)
VCC → ESP32 5V 或 3.3V(看模块规格)
GND → GND
IN → ESP32 GPIO(比如 GPIO5)
继电器输出端(高压侧)
COM → 220V 火线输入
NO → 台灯火线输出
(Normal Open,默认断开,通电后闭合)
#define RELAY_PIN 5 void setup() { pinMode(RELAY_PIN, OUTPUT); digitalWrite(RELAY_PIN, LOW); // 初始关闭 } void loop() { // 结合 MQTT 接收指令控制继电器 // client.subscribe("home/lamp/control"); // 收到 "ON" 时: digitalWrite(RELAY_PIN, HIGH); // 收到 "OFF" 时: digitalWrite(RELAY_PIN, LOW); }
❄️
老空调接入智能系统
红外发射模块模拟遥控器,手机语音控制

改造思路

用红外发射模块模拟空调遥控器发出的红外信号,ESP32 控制发什么信号,就相当于按了遥控器的哪个按键。不需要改空调本身,完全无损改造。

需要的材料

  • ESP32 开发板 × 1
  • 红外发射管模块 × 1(某宝约 3-5 元)
  • 红外接收模块 × 1(用来学习遥控器信号,约 3 元)

步骤

1
学习遥控器信号
用红外接收模块接收原始遥控器的每个按键信号,用 IRremoteESP8266 库解码,记录下每个按键对应的编码
2
接红外发射管
发射管的正极接 GPIO(比如 GPIO4),负极接 GND,注意发射管要对准空调红外接收窗口
3
写控制代码
通过 MQTT 接收指令,收到"开机"就发开机的红外编码,收到"26度"就发对应温度的编码
4
接入 Home Assistant
在 HA 里创建空调控制实体,就能在手机 App 里看到空调控制界面,也可以设定时或者温度联动
很多空调品牌在 Home Assistant 社区有现成的集成,可以先搜一下有没有直接支持你家空调品牌的插件,省去学习信号的步骤。
旧插排加功率监控
PZEM-004T 模块,实时知道每个设备用多少电

改造思路

在插排的火线上串入 PZEM-004T 功率检测模块,ESP32 通过串口读取电压、电流、功率、电量数据,发送到 Home Assistant,可以看到实时功率曲线和月度用电统计。

同样涉及 220V,接线时必须断电。PZEM-004T 模块有高压侧,处理不当有危险。

PZEM-004T 读取代码

#include <PZEM004Tv30.h> // RX接GPIO16,TX接GPIO17 PZEM004Tv30 pzem(Serial2, 16, 17); void loop() { float voltage = pzem.voltage(); float current = pzem.current(); float power = pzem.power(); float energy = pzem.energy(); Serial.print("电压: "); Serial.print(voltage); Serial.println("V"); Serial.print("电流: "); Serial.print(current); Serial.println("A"); Serial.print("功率: "); Serial.print(power); Serial.println("W"); Serial.print("电量: "); Serial.print(energy); Serial.println("kWh"); delay(2000); }
🌀
老风扇变智能风扇
温度传感器 + 继电器,自动控温

改造思路

给风扇电源串入继电器,ESP32 读取温度传感器,温度超过设定值自动开风扇,低于设定值自动关。夏天睡觉再也不用纠结要不要开风扇。

#include "DHT.h" #define DHTPIN 4 #define RELAY_PIN 5 #define TEMP_ON 28.0 // 超过28度开风扇 #define TEMP_OFF 26.0 // 低于26度关风扇 DHT dht(DHTPIN, DHT22); void setup() { Serial.begin(115200); pinMode(RELAY_PIN, OUTPUT); dht.begin(); } void loop() { delay(2000); float t = dht.readTemperature(); if (isnan(t)) return; Serial.print("温度: "); Serial.println(t); if (t >= TEMP_ON) { digitalWrite(RELAY_PIN, HIGH); Serial.println("开风扇"); } else if (t <= TEMP_OFF) { digitalWrite(RELAY_PIN, LOW); Serial.println("关风扇"); } }
ON 和 OFF 温度之间留 2 度的缓冲(迟滞控制),避免温度在临界点反复开关造成继电器频繁动作。
🚿
热水器定时预热
定时开关,洗澡前自动预热

改造思路

给热水器电源串入继电器,ESP32 通过 NTP 同步网络时间,在设定时间自动打开热水器预热,到设定时间或者到温度后自动关闭。不用记得提前去开,也不用一直开着费电。

#include <WiFi.h> #include <time.h> #define RELAY_PIN 5 void setup() { WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) delay(500); // 同步网络时间(北京时间 UTC+8) configTime(8 * 3600, 0, "pool.ntp.org"); pinMode(RELAY_PIN, OUTPUT); } void loop() { struct tm timeinfo; getLocalTime(&timeinfo); int hour = timeinfo.tm_hour; int min = timeinfo.tm_min; // 每天 21:30 开热水器,22:30 关 if (hour == 21 && min == 30) { digitalWrite(RELAY_PIN, HIGH); } else if (hour == 22 && min == 30) { digitalWrite(RELAY_PIN, LOW); } delay(30000); // 每30秒检查一次 }