一、实验目标

使用 ESP32 搭建一个简单 Web 服务器,完成以下两部分任务:

通过本实验,掌握 ESP32 的 WiFi 联网、Web 路由处理与 GPIO 控制基础。

二、实验器材

三、实验步骤

步骤1:硬件确认

  1. 使用 USB 数据线连接 ESP32 与电脑。
  2. 观察开发板电源指示灯是否正常亮起。
  3. 确认板载 LED 引脚(多数 ESP32 DevKit 为 GPIO2,即 D2)。
  4. 若使用外接 LED,请串联限流电阻(220Ω~1kΩ)。

步骤2:软件准备

  1. 打开 Arduino IDE。
  2. 设置开发板:工具 → 开发板 → ESP32 Arduino → ESP32 Dev Module
  3. 选择端口:工具 → 端口 → 选择对应串口
  4. 准备好可用 WiFi(2.4GHz)。

步骤3:编写 Web 服务器程序

第一部分:仅静态页面显示

本阶段代码仅用于验证 Web 服务器的基本功能,页面上不会有控制按钮。

#include <WiFi.h>
#include <WebServer.h>

const char* ssid = "你的WiFi名称";
const char* password = "你的WiFi密码";

WebServer server(80);

void handleRoot() {
  String html = R"rawliteral(
<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>实验1</title>
</head>
<body style="font-family:Arial; text-align:center; margin-top:50px;">
  <h1>ESP32 Web服务器实验</h1>
  <h2>第一部分:静态页面显示</h2>
  <p>如果你能看到这个页面,说明实验成功。</p>
</body>
</html>
)rawliteral";
  server.send(200, "text/html; charset=UTF-8", html);
}

void setup() {
  Serial.begin(115200);
  
  // 连接 WiFi
  WiFi.begin(ssid, password);
  Serial.print("连接WiFi");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  
  Serial.println("\n连接成功");
  Serial.print("访问地址: http://");
  Serial.println(WiFi.localIP());

  server.on("/", handleRoot);
  server.begin();
}

void loop() {
  server.handleClient();
}

第二部分:网页按钮控制 LED

在第一部分的基础上,增加对 GPIO 的控制逻辑和带按钮的网页。

#include <WiFi.h>
#include <WebServer.h>

const char* ssid = "你的WiFi名称";
const char* password = "你的WiFi密码";
const int LED_PIN = 2; // D2 常见为 GPIO2

WebServer server(80);

String makePage() {
  String state = digitalRead(LED_PIN) ? "ON" : "OFF";
  String html = R"rawliteral(
<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>实验2</title>
</head>
<body style="font-family:Arial; text-align:center; margin-top:50px;">
  <h1>第二部分:按钮控制 LED</h1>
  <p>当前状态:<b>)rawliteral" + state + R"rawliteral(</b></p>
  <a href="/on"><button style="padding:10px 20px;">点亮 LED</button></a>
  <a href="/off"><button style="padding:10px 20px;">熄灭 LED</button></a>
</body>
</html>
)rawliteral";
  return html;
}

void handleRoot() {
  server.send(200, "text/html; charset=UTF-8", makePage());
}

void handleOn() {
  digitalWrite(LED_PIN, HIGH);
  server.sendHeader("Location", "/");
  server.send(303);
}

void handleOff() {
  digitalWrite(LED_PIN, LOW);
  server.sendHeader("Location", "/");
  server.send(303);
}

void setup() {
  Serial.begin(115200);
  pinMode(LED_PIN, OUTPUT);
  digitalWrite(LED_PIN, LOW);
  
  WiFi.begin(ssid, password);
  Serial.print("连接WiFi");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("\n连接成功");
  Serial.print("访问地址: http://");
  Serial.println(WiFi.localIP());

  server.on("/", handleRoot);
  server.on("/on", handleOn);
  server.on("/off", handleOff);
  server.begin();
}

void loop() {
  server.handleClient();
}

步骤4:上传程序

  1. 点击上传按钮(→)。
  2. 如上传失败,尝试按住 BOOT 再点击上传。
  3. 出现“上传成功”后进入下一步。

步骤5:访问网页

  1. 打开串口监视器(115200)。
  2. 记录串口打印的 IP 地址(例如 192.168.1.88)。
  3. 在同一局域网设备浏览器访问:http://该IP地址

步骤6:效果验证

  1. 页面正常显示实验标题与说明(静态页面部分完成)。
  2. 点击“点亮 LED”,LED 亮。
  3. 点击“熄灭 LED”,LED 灭。
  4. 刷新页面,状态显示能同步变化。

步骤7:进阶实验(无路由器时)

也可以使用 ESP32 开启热点 (AP 模式),手机直接连接它进行控制。

将上述代码中的 WiFi 连接部分 (setup 函数中) 替换为以下代码:

const char* ap_ssid = "ESP32-LAB";
const char* ap_pass = "12345678"; // 至少8位

WiFi.mode(WIFI_AP);
WiFi.softAP(ap_ssid, ap_pass);

Serial.println("AP已开启");
Serial.print("AP IP: ");
Serial.println(WiFi.softAPIP()); // 通常 192.168.4.1

验证方法:手机连接热点 ESP32-LAB,浏览器访问 http://192.168.4.1

四、常见问题及解决

问题1:无法访问网页

  • 检查手机/电脑与 ESP32 是否在同一 WiFi。
  • 检查串口中的 IP 是否正确。
  • 检查 ssid/password 是否填写错误。

问题2:LED 不亮或不灭

  • 检查 LED_PIN 是否与板卡 D2 实际映射一致。
  • 外接 LED 是否串联限流电阻。
  • 检查代码是否正确下载到当前板子。

问题3:上传失败

  • 按住 BOOT 再上传。
  • 更换支持数据传输的 USB 线。
  • 重新选择正确端口。

问题4:网页打开很慢或不稳定

  • 检查 WiFi 信号强度。
  • 降低同网络内高带宽占用。