1. 项目概述与环境搭建

各位同学,欢迎来到《ESP32 WebSocket 控制 LED 灯实战》的第一章。

说实话,我刚开始做物联网项目时,最头疼的就是设备端和网页端怎么实时通信。传统的 HTTP 轮询就像你每隔几秒去问一次「饭好了没」——效率低,还占带宽。WebSocket 的出现,说白了就是让服务器和客户端之间拉了一条专用电话线,随时可以说话。

这一章,我们先打好地基。把开发板、协议原理、开发环境、电路连接全部捋清楚。别急,一步步来。

1.1 ESP32 开发板:为什么选它?

ESP32 是乐鑫科技推出的双核 Wi-Fi + 蓝牙芯片。我这些年用过不少 MCU,但 ESP32 确实是个「万金油」——性能够用、价格亲民、生态成熟。

参数 ESP32 传统 Arduino(如 Uno)
处理器 双核 Xtensa LX6 @ 240MHz 单核 ATmega328P @ 16MHz
无线通信 Wi-Fi + 蓝牙双模 无(需外接模块)
SRAM 520KB 2KB
Flash 4MB ~ 16MB 32KB
GPIO 34 个(可编程) 14 个
价格 约 15~30 元 约 20~40 元

我的建议: 新手买 ESP32-DevKitC 或 NodeMCU-32S 就行。别贪便宜买杂牌,供电不稳会让你怀疑人生。我曾经在项目里用过一批低价 ESP32,结果 Wi-Fi 连接经常掉线,排查了三天才发现是晶振虚焊。

1.2 WebSocket 协议原理:一句话讲清楚

WebSocket 是一种在单个 TCP 连接上实现全双工通信的协议。它和 HTTP 的关系是什么?

  • HTTP: 客户端请求,服务器响应。完事就断。下次再连。
  • WebSocket: 先通过 HTTP 升级握手,然后保持连接。双方随时可以发数据。

握手过程其实很简单:客户端发一个 Upgrade 请求,服务器回 101 Switching Protocols,之后就是 WebSocket 帧的天下。

避坑指南: 我曾经在项目中直接用裸 WebSocket 连公网服务器,结果被防火墙拦截了。后来发现很多企业网络只放行 80 和 443 端口。所以生产环境建议用 WSS(WebSocket Secure),走 443 端口,既安全又不会被拦。

为什么 WebSocket 适合控制 LED?你想想看:

  • 你按一下网页按钮,指令 10ms 内到达 ESP32
  • ESP32 可以实时反馈 LED 状态(亮/灭/亮度值)
  • 不需要轮询,省电省带宽
WebSocket 通信流程 浏览器(客户端) ESP32(服务器) ① HTTP Upgrade 请求 ② 101 Switching Protocols ③ 全双工通信(WebSocket 帧) 浏览器 → ESP32:LED_ON / LED_OFF / 亮度值 ESP32 → 浏览器:当前状态 / 心跳 / 错误信息 LED 灯(GPIO 控制) 连接建立后,不再需要 HTTP 头 数据帧开销仅 2~6 字节

1.3 Arduino IDE 环境配置

我个人习惯用 Arduino IDE 做 ESP32 开发。虽然也有 PlatformIO 等选择,但 Arduino IDE 对新手最友好,而且社区资源最多。

步骤 1:下载并安装 Arduino IDE

  • 访问 arduino.cc 下载最新版(我建议用 2.x 版本,界面更现代)
  • 安装时勾选「安装 USB 驱动」

步骤 2:添加 ESP32 板级支持包

  1. 打开 Arduino IDE,进入 文件 → 首选项
  2. 在「附加开发板管理器网址」中填入:
    https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
  3. 点击 工具 → 开发板 → 开发板管理器
  4. 搜索「ESP32」,找到「esp32 by Espressif Systems」,点击安装

注意: 安装过程需要下载约 200MB 的编译工具链。如果你在墙内,下载可能会很慢甚至失败。我曾经遇到过下载到 90% 断掉的情况。解决方案:挂代理,或者去乐鑫官网手动下载工具链压缩包,解压到 Arduino 的 hardware 目录下。

步骤 3:选择开发板

安装完成后,在 工具 → 开发板 → ESP32 Arduino 下选择你的板型。我用的 NodeMCU-32S,选「ESP32 Dev Module」就行。

常见板型 Arduino IDE 中选择
ESP32-DevKitC ESP32 Dev Module
NodeMCU-32S ESP32 Dev Module
ESP32-WROOM-32 ESP32 WROOM DA Module
ESP32-S3 ESP32S3 Dev Module

1.4 验证环境:点亮板载 LED

装好环境后,先跑个最简单的程序,确认一切正常。

void setup() {
  Serial.begin(115200);
  pinMode(2, OUTPUT);  // 板载 LED 通常接 GPIO2
  Serial.println("ESP32 启动成功!");
}

void loop() {
  digitalWrite(2, HIGH);
  delay(1000);
  digitalWrite(2, LOW);
  delay(1000);
}

小技巧: 如果 LED 不亮,先检查 GPIO 编号。不同开发板的板载 LED 可能接在不同的引脚上。NodeMCU-32S 是 GPIO2,有些板子是 GPIO5。实在不行,用万用表量一下引脚电压。

1.5 LED 电路连接

板载 LED 验证通过后,我们来接外部的 LED 灯。这是整个课程的控制对象。

所需元件

  • ESP32 开发板 × 1
  • 5mm LED(颜色随意,我习惯用红色,看得清楚) × 1
  • 220Ω 电阻 × 1
  • 面包板 × 1
  • 杜邦线(公对母) × 2

接线步骤

  1. LED 长脚(阳极) → 220Ω 电阻 → ESP32 GPIO 4
  2. LED 短脚(阴极) → ESP32 GND

重要: 一定要串电阻!LED 是电流型器件,不串电阻直接接 GPIO,电流会超过 ESP32 的 GPIO 最大输出能力(约 40mA)。我曾经见过有人直接把 LED 接到 3.3V 和 GND 之间,结果 LED 当场冒烟。嗯,那个人就是我刚入行的时候。

电路原理图(文字版)

ESP32 GPIO4 ──┬── 220Ω ──┬── LED(+) ── LED(-) ── GND
              │           │
              └───────────┘

为什么选 GPIO 4?因为 GPIO 4 在 ESP32 上默认没有特殊功能,而且离 GND 引脚近,布线方便。你当然可以用其他 GPIO,只要在代码里改一下引脚号就行。

1.6 本章小结

这一章我们做了四件事:

  • 认识了 ESP32 开发板,知道它为什么适合做物联网项目
  • 理解了 WebSocket 协议的核心原理——全双工、低开销、实时通信
  • 搭建了 Arduino IDE 开发环境,安装了 ESP32 板级支持包
  • 连接了 LED 电路,跑通了第一个点灯程序

我的经验: 环境搭建这一步,看起来简单,但最容易出问题。如果你卡住了,别硬扛。去论坛搜一下,十有八九是端口没选对、驱动没装好、或者板子没进入下载模式。ESP32 的下载模式是按住 BOOT 键再按一下 EN 键,松开 BOOT——这个操作我教了不下 50 个学生,每次都有人忘。