用 ESP32 + WiFi 做远程控制插座(从原理到实战)

🔌 用 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设备如何省电?》

相关推荐
Brilliantwxx9 小时前
【STM32】 NVIC 与 EXTI 中断 · 超详细源码级解析
stm32·单片机·嵌入式硬件
niuTaylor10 小时前
飞腾 FT-2000/4 Ubuntu 内存卡 / NVMe SSD 系统制作完整指南
linux·服务器·人工智能·驱动开发·单片机
思茂信息11 小时前
CST软件BCI仿真模型及仿真案例
开发语言·单片机·嵌入式硬件·算法·emc
李永奉12 小时前
中科蓝讯SDK开发-BT897X、BT891X、AB573X、AB572X 系列 触摸按键提示音功能实现
网络·单片机·嵌入式硬件·mcu·物联网
三佛科技-1873661339713 小时前
FT32F405RE02-LB是什么芯片?基于ARM Cortex M4带FPU的MCU芯片解析
stm32·单片机·嵌入式硬件
゛凌乱的记忆づ15 小时前
50元从零到成品:一套AI辅助的嵌入式实战入门教程——ADC采集篇
stm32·单片机·嵌入式硬件
女神下凡15 小时前
芯参谋(31):SPI NOR Flash 电路设计指南
arm开发·单片机·嵌入式硬件·fpga开发·设计规范
csg110716 小时前
上电没反应、运行中死机、现场“抽风”——单片机控制板异常排查六步法
单片机·嵌入式硬件
小程序设计16 小时前
基于单片机的恒温水箱设计
单片机·嵌入式硬件
小程序设计17 小时前
基于单片机的大棚温湿度自动监控系统
单片机·嵌入式硬件