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

相关推荐
π同学2 小时前
ESP-IDF+vscode开发ESP32第四讲——I2C
vscode·esp32·i2c
weixin_462901972 小时前
esp32测试DH11模块
单片机
蓝凌y2 小时前
51单片机之按键扫描
单片机·嵌入式硬件·51单片机
果果燕2 小时前
ARM嵌入式学习(三)---汇编应用:LED点亮
arm开发·单片机·嵌入式硬件
Hello_Embed2 小时前
嵌入式上位机开发入门(五):UDP 编程 —— Server 端实现
笔记·单片机·网络协议·udp·嵌入式
凌盛羽3 小时前
在MDK-ARM编译后用python解析map文件在编译窗口输出Flash和RAM使用及剩余情况
arm开发·python·stm32·单片机·mysql·链表·esp32
项目題供诗3 小时前
51单片机入门-红外遥控(十七)
单片机·嵌入式硬件·51单片机
24zhgjx-fuhao3 小时前
OSPF网络类型:NBMA与P2MP
网络·智能路由器
博晶网络3 小时前
小体积MR100A工业级4G插卡路由器模块全球通版评测
物联网·智能路由器·测试覆盖率