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

相关推荐
yu859395814 小时前
STM32 智能红外循迹小车(含码盘测速 + 避障)
stm32·单片机·嵌入式硬件
风曦Kisaki14 小时前
#企业级网络架构Day01:网络概述,网络参考模型,交换机命令行
网络·架构·智能路由器
pengyi87101514 小时前
私网IP映射公网实操步骤,搭配代理IP快速落地
网络·tcp/ip·智能路由器
三品吉他手会点灯14 小时前
STM32 DAP 烧录报错-最终解决方法的原理和操作逻辑
stm32·单片机·嵌入式硬件
yongui4783415 小时前
STM32 三相电机FOC驱动方案(三电阻单电阻双模式)
stm32·单片机·嵌入式硬件
WeeJot嵌入式16 小时前
【串口】初始串口-轮询模式
stm32·单片机·嵌入式
yong999016 小时前
基于 51 单片机配合霍尔传感器实现计数 + 转速测量
单片机·嵌入式硬件
崇山峻岭之间17 小时前
单片机时钟配置01
单片机·嵌入式硬件
渴了喝洗衣液17 小时前
作业44444444
网络·智能路由器
踏着七彩祥云的小丑18 小时前
嵌入式——面试题
单片机·嵌入式硬件