跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++

基于 ESP32C3 与 Arduino 的 Web 服务器 LED 远程控制实战

ESP32C3 开发板配合 Arduino IDE,通过 WiFi 模块搭建简易 Web 服务器,实现浏览器远程控制 GPIO 引脚 LED 亮灭。教程涵盖硬件连接、环境配置、代码编写及 HTTP 协议交互原理分析,适合物联网初学者快速上手嵌入式网络开发。

JavaCoder发布于 2026/4/8更新于 2026/10/25100 浏览
基于 ESP32C3 与 Arduino 的 Web 服务器 LED 远程控制实战

ESP32C3 SuperMini Web 控制入门

ESP32C3 SuperMini 是一款基于 Espressif ESP32-C3 WiFi/蓝牙双模芯片的 IoT 迷你开发板。它搭载 32 位 RISC-V CPU,内置 FPU(浮点单元),支持 IEEE 802.11 b/g/n WiFi 和蓝牙 5 (LE) 协议。该板附带外部天线以增强信号强度,提供 11 个 PWM 数字 I/O 引脚和 4 个 ADC 模拟 I/O 引脚,并支持 UART、I2C 和 SPI 等串行接口。

ESP32C3 SuperMini

ESP32C3 外观

一、环境准备

硬件清单

  • 1 块 ESP32C3 SuperMini 开发板
  • 1 台电脑
  • 1 根 USB Type-C 数据线

软件配置

1. 安装 Arduino IDE

前往 Arduino 官网 下载对应操作系统的 IDE 版本。

2. 添加开发板管理器

打开 Arduino IDE,进入 文件 > 首选项,在'附加开发板管理器网址'中添加:

https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json

然后进入 工具 > 开发板 > 开发板管理器,搜索 esp32,选择 esp32 by Espressif Systems 进行安装。

注意:建议安装 2.0.17-cn 版本,部分 3.x.x 版本可能存在安装或编译问题。

3. 选择开发板与端口
  • 开发板型号:在 工具 > 开发板 中选择 ESP32S3 Dev Module 或对应的 ESP32-C3 选项。
  • 串口号:在 工具 > 端口 中查看系统识别到的 COM 口(Windows 下通常为 COMx)。若未显示,请检查数据线是否支持数据传输,或确认串口驱动已安装。

二、代码编写与烧录

1. 基础测试:LED 闪烁

新建项目,将以下代码复制进去,点击上传按钮(右箭头图标)。

// 设置 LED 使用的 GPIO 引脚
int led = 8;

{
  
  (led, OUTPUT);
}

{
  (led, HIGH); 
  ();             
  (led, LOW);  
  ();             
}
void setup()
// 初始化 GPIO 为输出模式
pinMode
void loop()
digitalWrite
// 点亮 LED
delay
1000
// 延时 1000ms
digitalWrite
// 熄灭 LED
delay
1000
// 延时 1000ms

上传成功后,板载 LED 将以 1 秒间隔闪烁。

2. 进阶功能:Web 控制 LED

此段代码让 ESP32 连接 WiFi 并启动简易 Web 服务器,通过浏览器访问 IP 地址即可控制 LED。

#include <WiFi.h>

const char* ssid = "wifi";      // 替换为你的 WiFi 名称
const char* password = "1234";  // 替换为你的 WiFi 密码
WiFiServer server(80);          // 创建 HTTP 服务器对象

void setup() {
  Serial.begin(115200);
  pinMode(8, OUTPUT);
  delay(10);
  
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
  
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  
  Serial.println("");
  Serial.println("WiFi connected.");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
  
  server.begin();
}

void loop(){
  WiFiClient client = server.available();
  if (client) {
    Serial.println("New Client.");
    String currentLine = "";
    
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        Serial.write(c);
        
        if (c == '\n') {
          if (currentLine.length() == 0) {
            // 发送 HTTP 响应头
            client.println("HTTP/1.1 200 OK");
            client.println("Content-Type: text/html; charset=utf-8");
            client.println();
            
            // 返回 HTML 页面内容
            client.print("<div>");
            client.print("Click <a href=\"/L\">打开 LED</a><br><br>");
            client.print("Click <a href=\"/H\">关闭 LED</a>");
            client.print("</div>");
            client.println();
            break;
          } else {
            currentLine = "";
          }
        } else if (c != '\r') {
          currentLine += c;
        }
        
        // 解析请求路径并执行控制
        if (currentLine.endsWith("GET /H")) {
          digitalWrite(8, HIGH);
        }
        if (currentLine.endsWith("GET /L")) {
          digitalWrite(8, LOW);
        }
      }
    }
    client.stop();
    Serial.println("Client Disconnected.");
  }
}

提示:如果上传后网络异常,可尝试按一下板子上的 Boot 键重启程序。

上传完成后,打开串口监视器查看打印的 IP 地址,在浏览器输入该地址即可看到控制页面。

三、原理分析

1. 核心功能逻辑

代码主要实现了两个步骤:

  1. WiFi 连接:ESP32 作为客户端连接路由器,获取局域网 IP。
  2. Web 服务:在 TCP 80 端口启动服务器,监听浏览器的 HTTP 请求,根据请求路径(/H 或 /L)切换 GPIO 电平。

2. Web 服务交互流程

基于 HTTP 协议 + TCP 80 端口 的 '请求 - 响应' 模型:

  • ESP32 监听 80 端口。
  • 浏览器发送 GET /H 请求。
  • ESP32 解析请求,执行 digitalWrite。
  • ESP32 返回 HTML 响应,随后断开连接。

3. 关键函数说明

代码 / 函数作用与使用说明
WiFi.begin(ssid, password)发起连接请求,需等待状态确认,不会立即成功。
WiFi.status()检测连接状态,关注 WL_CONNECTED 枚举值。
WiFi.localIP()获取 ESP32 在局域网中的 IP,用于浏览器访问。
while (WiFi.status() != WL_CONNECTED)循环等待连网,通常需 1~3 秒。
WiFiServer server(80)创建 TCP 服务器对象,指定 HTTP 默认端口。
server.available()检测是否有客户端连接,有则返回客户端对象。
client.read()逐字节读取 HTTP 请求数据。
client.println()向浏览器发送响应头及 HTML 内容。
client.stop()处理完请求后关闭连接,释放资源。
pinMode(8, OUTPUT)设置引脚 8 为输出模式。
digitalWrite(8, HIGH/LOW)控制引脚电平,HIGH 亮灯,LOW 灭灯。

4. 请求解析细节

浏览器发送的请求示例如下:

GET /H HTTP/1.1
Host: 192.168.1.100
...

代码通过逐字节读取拼接成 currentLine,利用 endsWith("GET /H") 判断意图。当检测到换行符且行内容为空时,表示请求头结束,此时返回 HTTP 响应头(如 200 OK)和 HTML 体。响应头结束后必须加一个空行,符合 HTTP 协议规范。

目录

  1. ESP32C3 SuperMini Web 控制入门
  2. 一、环境准备
  3. 硬件清单
  4. 软件配置
  5. 1. 安装 Arduino IDE
  6. 2. 添加开发板管理器
  7. 3. 选择开发板与端口
  8. 二、代码编写与烧录
  9. 1. 基础测试:LED 闪烁
  10. 2. 进阶功能:Web 控制 LED
  11. 三、原理分析
  12. 1. 核心功能逻辑
  13. 2. Web 服务交互流程
  14. 3. 关键函数说明
  15. 4. 请求解析细节

更多推荐文章

查看全部
  • Java 运行时常见异常类型与解决思路
  • C++11 新特性详解:Lambda 表达式、std::function 与 bind
  • 基于 Python 搭建个人 AI 知识库的六步实战指南
  • 从 MVP 到千万级并发:AI 在前后端开发中的差异化落地指南
  • Linux 信号产生机制详解:从键盘到硬件异常
  • Visual C++运行库安装失败修复指南
  • 字节跳动 Android 岗位面试全流程复盘与经验总结
  • Rembg WebUI 主题定制与功能扩展实战
  • Java 线程安全核心:synchronized、volatile 与 wait/notify
  • 动态规划时间复杂度和空间复杂度计算方法
  • Parsera 异步编程教程:提升网页抓取效率
  • VR、具身智能与人形机器人:构建现实世界的智能接口
  • C++ STL 无序容器 unordered_set 与 unordered_map 模拟实现
  • 文心大模型 4.5 开源部署指南:架构解析与实战落地
  • baoyu-skills: Claude Code 高效工作流技能集
  • Coze 低代码 AI 智能体平台:100 个落地用途与发布使用指南
  • Java 数组全面解析:定义、内存与工具类
  • 基于 Java 的消息队列选型:RabbitMQ、RocketMQ、Kafka 实战对比
  • 个人健康中枢的 AI 硬件革新与精准健康管理路径
  • Web UI 自动化测试 CI/CD:推送本地代码到 Git 远程仓库

相关免费在线工具

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online

  • JSON 压缩

    通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online

  • JSON美化和格式化

    将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online