🔌 用 ESP32 + WiFi 做远程控制插座(从原理到实战)
智能家居的本质,不是"设备变多",
而是------电源可以被远程控制。
本文带你做一个最经典、最有成就感的 IoT 项目:
👉 用 ESP32 实现远程控制插座
一、项目目标(不是Demo,是产品雏形)
实现一个具备以下能力的智能插座:
| 功能 | 说明 |
|---|---|
| 本地按键控制 | 无网络也能使用 |
| WiFi远程控制 | 手机/网页开关 |
| 状态查询 | 实时获取开关状态 |
| 断电记忆 | 上电恢复状态 |
| 可扩展云平台 | MQTT/APP |
二、系统架构
text
手机 / 浏览器
↓
WiFi 路由器
↓
ESP32
↓
继电器
↓
市电插座(220V)
ESP32 负责:
👉 网络通信 + 控制逻辑
继电器负责:
👉 强电开关隔离
三、硬件组成
1️⃣ ESP32
特点:
- 内置 WiFi
- 支持 Web Server
- GPIO 足够
- 成本低(核心优势)
2️⃣ 继电器模块
作用:
👉 控制 220V 电源通断
接线方式:
text
ESP32 GPIO → IN
5V → VCC
GND → GND
⚠️ 强电安全重点
必须注意:
- 使用带光耦隔离的继电器
- 低压与高压分区布线
- PCB 预留安全距离
- 严禁直接用 GPIO 控市电
3️⃣ 本地按键
实现:
👉 手动开关
4️⃣ 指示灯(可选)
显示:
- 通电状态
- 网络状态
四、通信方案设计
我们选择:
👉 HTTP + WebServer(最简单稳定)
ESP32 内部开一个 HTTP 服务:
| 接口 | 功能 |
|---|---|
| /on | 开 |
| /off | 关 |
| /status | 查询 |
五、软件架构设计
模块划分:
text
WiFi管理
Web服务器
GPIO控制
状态管理
按键扫描
六、核心代码实现(Arduino风格)
1️⃣ WiFi连接
cpp
#include <WiFi.h>
const char* ssid = "YourWiFi";
const char* password = "12345678";
void wifi_init()
{
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
}
}
2️⃣ WebServer初始化
cpp
#include <WebServer.h>
WebServer server(80);
3️⃣ GPIO定义
cpp
#define RELAY_PIN 5
#define KEY_PIN 0
bool relayState = false;
4️⃣ 控制接口
开
cpp
void handleON()
{
relayState = true;
digitalWrite(RELAY_PIN, HIGH);
server.send(200, "text/plain", "ON");
}
关
cpp
void handleOFF()
{
relayState = false;
digitalWrite(RELAY_PIN, LOW);
server.send(200, "text/plain", "OFF");
}
状态查询
cpp
void handleStatus()
{
server.send(200, "text/plain", relayState ? "ON":"OFF");
}
5️⃣ 路由注册
cpp
void server_init()
{
server.on("/on", handleON);
server.on("/off", handleOFF);
server.on("/status", handleStatus);
server.begin();
}
6️⃣ 按键控制(本地逻辑)
cpp
void key_scan()
{
static uint8_t last = 1;
uint8_t now = digitalRead(KEY_PIN);
if(last == 1 && now == 0)
{
relayState = !relayState;
digitalWrite(RELAY_PIN, relayState);
}
last = now;
}
7️⃣ 主函数
cpp
void setup()
{
pinMode(RELAY_PIN, OUTPUT);
pinMode(KEY_PIN, INPUT_PULLUP);
wifi_init();
server_init();
}
void loop()
{
server.handleClient();
key_scan();
}
七、手机控制方法
只需浏览器访问:
text
http://ESP32_IP/on
http://ESP32_IP/off
即可控制插座。
八、断电记忆(产品必备)
使用 NVS:
cpp
#include <Preferences.h>
Preferences prefs;
保存状态:
cpp
prefs.putBool("relay", relayState);
恢复状态:
cpp
relayState = prefs.getBool("relay", false);
九、系统运行流程
text
上电
↓
连接WiFi
↓
启动Web服务
↓
等待请求
↓
控制继电器
↓
返回状态
十、工程优化建议(非常关键)
1️⃣ 防抖处理
按键需软件防抖:
cpp
delay(10);
或状态机
2️⃣ WiFi断线重连
cpp
if(WiFi.status() != WL_CONNECTED)
{
WiFi.reconnect();
}
3️⃣ 继电器保护
避免频繁开关:
- 增加最小间隔时间
4️⃣ EMI处理(产品级)
- RC吸收
- TVS
- 电源滤波
十一、进阶升级路线
🚀 MQTT 云控
替换 HTTP:
👉 支持远程(跨公网)
🚀 App 控制
- 安卓 / iOS
- UI更友好
🚀 定时任务
text
定时开 / 关
🚀 电量统计
加入:
- 电流检测芯片(HLW8012)
十二、应用场景
- 台灯
- 热水器
- 加湿器
- 远程电源管理
- 智能家居
总结一句话
智能插座的核心,不是"控制电",
而是让"电源成为可编程资源"。
当你用 ESP32 控制继电器那一刻,
你已经在做一个真正的 IoT 产品。
📌 推荐下一篇
- 《MQTT实战:让智能插座接入云平台》
- 《ESP32 OTA升级:远程更新固件》
- 《低功耗设计:WiFi设备如何省电?》