2026 寒假 任务02 “我想用 ESP32 做一个 Web 服务器。用 C++ 代码: 让 ESP32 使用 AP 模式(Access Point)启动一个 Web Server,当手机访问 ESP32 的 IP 地址时,显示两个按钮 “ON” 和 “OFF”。点击按钮可以通过 GPIO 控制面包板上外接的 LED 灯(假设接在 GPIO 23)。”


方案思路:ESP32 自己做“路由器”

在这个模式下,ESP32 不去连接自己家里的 WiFi,而是它自己发射一个 WiFi 热点。

  1. 手机搜索并连接 ESP32 发出的 WiFi。
  2. 连接后,直接访问 ESP32 的地址控制灯光。

优点:这样我们走到哪里都能演示,完全不需要依赖环境的 WiFi。

第一部分:接线与“如何让它好看”

“感觉不好看”,通常是因为面包板上的杜邦线飞来飞去乱糟糟的。

1. 极简方案(最“好看”)

直接使用板载 LED(GPIO 2)。

  • ESP32 开发板上自带了一颗蓝灯,通常连接在 GPIO 2。
  • 你可以完全不接外面的线,代码里把 LED_PIN 改成 2,直接看板子上的灯亮灭,最整洁。

2. 外接 LED 优化方案(让面包板接线整齐)

如果你必须外接 LED(假设 GPIO 23),可以尝试**“紧凑型”接法**,避免使用很长的飞线。

电路逻辑: GPIO 23 –> LED 正极 (长脚) –> LED –> LED 负极 (短脚) –> 电阻 –> GND

实物插法建议(以此顺序插在面包板上):

  1. LED:跨插在面包板的两排孔上(比如长脚插 e10,短脚插 e11)。
  2. 电阻:一端插在 a11 (对应 LED 短脚),另一端插在 GND 所在的蓝色电源导轨上(如果电阻脚够长,直接跨过去,不用线)。
  3. 跳线:只需要一根短线,从 ESP32 的 D23 插到 a10 (对应 LED 长脚)。

这样在这个小区域内就形成了一个回路,线尽可能短,看起来会专业很多。

第二部分:AP 模式代码

请将 src/main.cpp 的内容替换为以下代码。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#include <Arduino.h>
#include <WiFi.h>
#include <WebServer.h>

// ================= 配置区域 =================
// 这次我们设置 ESP32 自己发出的 WiFi 名字和密码
const char* ap_ssid = "My_ESP32_Control";  // 手机搜到的 WiFi 名字
const char* ap_password = "12345678";      // 连接这个 WiFi 的密码(至少8位)

// 选择 LED 引脚
// 如果想最整洁,用板载 LED (通常是 2),如果外接用了 23 就写 23
#define LED_PIN 2
// ===========================================

WebServer server(80);

// HTML 页面代码(保持不变)
String getHTML()
{
  String html = R"rawliteral(
<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>ESP32 控制台</title>
  <style>
    body { font-family: Helvetica; text-align: center; margin-top: 50px; background-color: #f0f0f0;}
    h1 { color: #333; }
    .btn {
      display: inline-block; padding: 20px 40px; font-size: 30px;
      color: white; text-decoration: none; border-radius: 10px; margin: 20px;
      box-shadow: 2px 2px 5px rgba(0,0,0,0.3);
    }
    .on { background-color: #4CAF50; }
    .off { background-color: #f44336; }
  </style>
</head>
<body>
  <h1>💡 灯光控制中心</h1>
  <a href="/on" class="btn on">开启 ON</a>
  <br>
  <a href="/off" class="btn off">关闭 OFF</a>
</body>
</html>
)rawliteral";
  return html;
}

void handleRoot()
{
  server.send(200, "text/html", getHTML());
}

void handleLedOn()
{
  digitalWrite(LED_PIN, HIGH);
  Serial.println("LED ON");
  server.send(200, "text/html", getHTML());
}

void handleLedOff()
{
  digitalWrite(LED_PIN, LOW);
  Serial.println("LED OFF");
  server.send(200, "text/html", getHTML());
}

void setup()
{
  Serial.begin(115200);
  pinMode(LED_PIN, OUTPUT);
  digitalWrite(LED_PIN, LOW);

  // === 核心变化:启动 AP 模式 ===
  Serial.println("\n正在启动 AP 模式...");
  
  // 设置 ESP32 为 AP 模式
  WiFi.softAP(ap_ssid, ap_password);

  // 获取 ESP32 自己的 IP 地址(AP 模式下通常默认是 192.168.4.1)
  IPAddress IP = WiFi.softAPIP();
  
  Serial.print("AP 启动成功! WiFi 名称: ");
  Serial.println(ap_ssid);
  Serial.print("请手机连接该 WiFi,然后访问: http://");
  Serial.println(IP);

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

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

第三步:如何操作

1. 烧录代码

构建完点击 VS Code 底部的 右箭头图标 (→) 进行烧录。

2. 手机操作

  1. 打开手机的 设置 → 无线局域网 (Wi-Fi)
  2. 在列表里查找 My_ESP32_Control(或者你自己设定的热点名称)。
  3. 输入密码 12345678 进行连接。

    注意:手机可能会提示“该网络无法连接互联网”,这是正常的,选择“保持连接”即可。

3. 控制设备

  1. 打开手机浏览器。
  2. 在地址栏输入 192.168.4.1(这是 ESP32 在 AP 模式下的默认固定地址)。
  3. 你将会看到一个 Web 控制页面,点击页面上的按钮即可远程控制灯光!