ESP32 实战教程:搭建 Web 服务器实现 LED 远程开关控制

ESP32 实战教程:搭建 Web 服务器实现 LED 远程开关控制

一.实验材料

        1.esp32板子

        2.led

        3.220欧的电阻

        4.面包板

二.实验思路

其实做这个实验的核心就是让 ESP32 既当 “WiFi 热点 / 联网设备”,又当 “Web 服务器”,还能响应网页的操作去控制硬件,说白了就是把 “网络请求” 和 “GPIO 引脚控制” 串起来,具体拆成这几步想就很清晰:

1. 先想清楚 “怎么让设备联网”

首先得让 ESP32 能和电脑 / 手机通信,最直接的就是两种方式:要么让 ESP32 连家里的路由器(STA 模式),要么让它自己建个 WiFi 热点(SoftAP 模式)。新手做的话优先选热点模式,不用依赖路由器,手机直接连 ESP32 的热点就能通信,少了 “找路由器 IP、配网络” 的麻烦,先把核心功能跑通再说。

2. 再想 “怎么让 ESP32 变成 Web 服务器”

Web 服务器的本质就是 “监听 80 端口,接收浏览器的请求,返回对应的内容”。所以第一步要初始化 WebServer 库,指定监听 80 端口;然后给不同的 “访问路径” 绑定对应的处理函数 —— 比如访问根路径 “/” 就返回带按键的网页,访问 “/on” 就执行开灯操作,访问 “/off” 就执行关灯操作。这里的关键是:浏览器点一下按键,其实就是给 ESP32 发了一个 HTTP 请求,ESP32 识别请求的路径,就知道该做什么了。

3. 接着想 “网页该怎么写”

网页不用搞复杂,核心就是两个按键,点一下能触发对应的请求。首先 HTML 要简单,加个样式让按键好看点(新手也能看懂),还要动态显示当前 LED 状态 —— 比如开灯后网页上能显示 “当前状态:开启”,这样用户能直观看到效果。按键的实现很简单,用<a>标签套<button>,点击后跳转到 “/on” 或 “/off” 路径,本质就是让浏览器给 ESP32 发这个路径的请求。

4. 最后把 “网络请求” 和 “硬件控制” 绑起来

ESP32 收到 “/on” 请求时,就把控制 LED 的 GPIO 引脚设为高电平(开灯);收到 “/off” 请求时,把引脚设为低电平(关灯)。操作完硬件后,一定要重定向回根路径,这样用户点完按键会自动回到带状态的主页,而不是停留在空白的 “/on” 页面,体验更顺。

三.实验代码

#include <WiFi.h> #include <WebServer.h> #define ledpin 2 const char* ssid="你的WiFi名称"; const char* password="你的WiFi密码"; WebServer server(80); void handleRoot() { // 获取当前LED状态 String ledState = digitalRead(ledpin) ? "开启" : "关闭"; // 构建HTML页面内容 String html = "<!DOCTYPE html>"; html += "<html lang='zh-CN'>"; html += "<head>"; html += "<meta charset='UTF-8'>"; html += "<meta name='viewport' content='width=device-width, initial-scale=1.0'>"; html += "<title>ESP32 LED控制</title>"; html += "<style>"; html += "body { font-family: Arial, sans-serif; text-align: center; margin-top: 50px; }"; html += ".btn { padding: 15px 30px; font-size: 20px; margin: 10px; border: none; border-radius: 8px; cursor: pointer; }"; html += ".on { background-color: #4CAF50; color: white; }"; html += ".off { background-color: #f44336; color: white; }"; html += ".status { font-size: 24px; margin: 20px 0; color: #333; }"; html += "</style>"; html += "</head>"; html += "<body>"; html += "<h1>ESP32 LED控制器</h1>"; html += "<div>当前状态:LED " + ledState + "</div>"; // 开灯按键,点击后访问/on路径 html += "<a href='/on'><button>开灯</button></a>"; // 关灯按键,点击后访问/off路径 html += "<a href='/off'><button>关灯</button></a>"; html += "</body>"; html += "</html>"; // 发送HTML页面给客户端 server.send(200, "text/html", html); } void callbackon(){ digitalWrite(ledpin,HIGH); Serial.println("开灯"); } void callbackoff(){ digitalWrite(ledpin,LOW); Serial.println("关灯"); } void setup(){ Serial.begin(115200); pinMode(ledpin,OUTPUT); digitalWrite(ledpin,LOW); WiFi.begin(ssid,password); int num=0; while(WiFi.status()!=WL_CONNECTED&&num<100){ Serial.print("."); delay(50); num++; } if(WiFi.status()==WL_CONNECTED){ Serial.println(WiFi.localIP()); } else{ Serial.println("连接失败"); while(1); } server.on("/",handleRoot); server.on("/on",callbackon); server.on("/off",callbackoff); server.begin(); } void loop(){ server.handleClient(); } ​

(粗糙代码)

代码里的收获:

1.server.on        是用来实现点击html页面上的设定按键,调用函数,达到开关灯,和进入原始界面的效果

2.server.handleClient()        是用来持续保持监听的

四.实验图片

五.遇到的问题与解决

做这个 ESP32 Web 服务器控制 LED 的实验,看似简单,但新手很容易卡在各种小问题上,我把实操中遇到的核心问题和对应的解决办法整理如下:

问题 1:连接 ESP32 热点后,浏览器访问 IP 地址一直打不开网页

现象:手机 / 电脑连好了 ESP32 的 WiFi 热点,输入串口显示的 IP(比如 192.168.4.1),浏览器提示 “无法访问”“连接超时”。排查 & 解决

  1. 先看串口监视器:确认代码上传成功后,串口有没有打印 “WiFi 热点已启动,IP 地址:192.168.4.1”,如果没打印,大概率是 WiFi 初始化失败,重新上传代码或重启 ESP32。
  2. 检查设备网络:手机连 ESP32 热点后,关掉手机的移动数据(避免系统自动切换网络);电脑连热点后,确认 IPv4 地址是 192.168.4.x 网段(不是的话手动设置:IP 填 192.168.4.2,网关填 192.168.4.1)。
  3. 端口是否被占用:确认代码里 WebServer 监听的是 80 端口(默认端口,浏览器访问时不用加端口号),如果改了端口,访问时要加 “IP: 端口号”(比如 192.168.4.1:8080)。
问题 2:网页能打开,但点击 “开灯 / 关灯” 按键没反应,LED 不亮

现象:网页加载正常,能看到按键和状态,但点击按键后,LED 没变化,网页状态也不更新。排查 & 解决

  1. 先查引脚配置:确认代码里的ledPin是实际控制的引脚(比如板载 LED 是 GPIO2,有些开发板是 GPIO13),可以先写个简单的闪烁程序测试引脚是否正常。
  2. 查路由绑定:确认代码里server.on("/on", handleOn)server.on("/off", handleOff)这两行没写错,路径名(/on、/off)要和 HTML 里<a href='/on'>的路径完全一致(区分大小写!比如 / On 和 /on 是两个路径)。
  3. 查电平逻辑:有些 LED 是 “低电平点亮”(共阳接法),这时要把digitalWrite(ledPin, HIGH)改成LOWLOW改成HIGH,可以先手动给引脚接 3.3V/GND 测试 LED 点亮逻辑。
问题 3:HTML 页面显示乱码(中文变成问号 / 方块)

现象:网页里的 “开灯”“当前状态” 等中文显示异常,英文正常。排查 & 解决:核心是没加字符编码声明!在 HTML 的<head>里必须加<meta charset='UTF-8'>,而且要放在<head>的最前面,ESP32 返回 HTML 时,浏览器才会用 UTF-8 解码中文。另外,Arduino IDE 编写代码时,要确保文件编码也是 UTF-8(IDE 顶部 “文件”->“首选项”,确认 “编码” 选 UTF-8)。

问题 4:代码上传失败,提示 “端口被占用” 或 “无法连接开发板”

现象:点击上传后,IDE 提示 “Failed to upload”,串口监视器也打不开。排查 & 解决

  1. 关闭占用串口的软件:比如串口助手、其他 IDE 的串口监视器,Windows 用户可以在 “设备管理器” 里看 ESP32 对应的 COM 口是否被占用。
  2. 重启开发板:上传前先按 ESP32 的 “BOOT” 键,再点击上传,直到 IDE 显示 “Connecting...” 再松开,解决引导模式问题。
  3. 检查数据线:用原装数据线(有些数据线只有充电功能,没有数据传输),插电脑后置 USB 口(前置口电压不稳)。
问题 5:网页点击按键后,跳转到空白页面,不返回主页

现象:点击 “开灯” 后,浏览器跳转到http://192.168.4.1/on,页面空白,需要手动刷新才能看到状态变化。排查 & 解决:忘记加重定向代码!在“开灯”()和“关灯”()函数里,必须加server.redirect("/");,让 ESP32 处理完 GPIO 操作后,自动跳回根路径(主页),而不是停留在 /on 或 /off 路径(这两个路径没有返回任何 HTML 内容)。

Read more

当测试工程师拿起AI写作笔:人机协作的精准实践

当测试工程师拿起AI写作笔:人机协作的精准实践

——论软件测试方法论在AI文本生产中的迁移应用 第一章 AI草稿:代码级别的需求评审 (测试视角:需求分析/静态测试) 当GPT类工具生成初稿时,测试工程师的本能反应是启动静态分析: 1. [边界值检查]   - 技术术语密度是否超出受众阈值?(如测试术语占比>15%需降维) - 案例复杂度是否跨越认知边界?(参照用户故事映射法) 2. [等价类划分] - 论点是否覆盖核心场景?(功能/性能/安全/兼容性维度) - 论据是否代表典型用户痛点?(缺陷聚类分析模型) 案例示范:某自动化测试方案文档初稿中,AI将「持续集成」误用为「连续集成」,类似变量命名规范的逻辑错误需在评审阶段拦截。 第二章 灵魂打磨:动态执行的深度测试 (测试视角:动态测试/探索性测试) 人工精修本质是动态测试过程,需建立系统化验证策略: | 测试类型 | 写作对应项 | 检测工具 | |----------------|---------------------|

llama.cpp量化模型部署实战:从模型转换到API服务

1. 为什么你需要关注llama.cpp:让大模型在普通电脑上跑起来 如果你对AI大模型感兴趣,肯定听说过动辄需要几十GB显存的“庞然大物”。想在自己的电脑上跑一个7B参数的模型,以前可能得配一张昂贵的专业显卡。但现在,情况不一样了。我今天要跟你聊的 llama.cpp,就是那个能让大模型“瘦身”并飞入寻常百姓家的神奇工具。 简单来说,llama.cpp是一个用C/C++编写的开源项目,它的核心目标只有一个:用最高效的方式,在消费级硬件(比如你的笔记本电脑CPU)上运行大型语言模型。它不像PyTorch那样是个庞大的深度学习框架,它更像一个“推理引擎”,专注于把训练好的模型,以最小的资源消耗跑起来。 我刚开始接触大模型部署时,也被各种复杂的依赖和巨大的资源需求劝退过。直到用了llama.cpp,我才发现,原来在我的MacBook Pro上,也能流畅地和Llama 2这样的模型对话。这背后的功臣,主要就是两点:纯C/C++实现带来的极致性能,以及模型量化技术带来的体积与速度革命。量化这个词听起来有点技术,你可以把它想象成给模型“压缩图片”

2026年高校论文AI率新规解读:哪些学校已明确AIGC检测要求

2026年高校论文AI率新规解读:哪些学校已明确AIGC检测要求

2026年高校论文AI率新规解读:哪些学校已明确AIGC检测要求 引言:AI率检测成为毕业"新门槛" 2026年毕业季,一个让无数毕业生焦虑的新词频繁出现在各大高校的通知文件中——AIGC检测。和传统的查重率不同,AIGC检测针对的是论文中由人工智能生成内容的占比,也就是我们常说的"AI率"。 从2024年下半年开始,教育部就多次发文要求高校加强对学术不端行为的管理,其中明确将"使用AI工具代写论文"纳入学术不端范畴。进入2026年,越来越多的高校不再只是口头警示,而是将AIGC检测正式写入毕业论文管理办法,成为论文答辩前必须通过的一道硬性关卡。 那么,目前到底有哪些学校已经明确了AIGC检测要求?各校的AI率标准又是多少?这篇文章将为你全面梳理和解读2026年的高校论文AI率新规。 一、政策背景:为什么高校越来越重视AI率检测 1.1 AI写作工具的普及倒逼政策升级 ChatGPT在2022年底横空出世后,以其为代表的大语言模型迅速普及。国内如文心一言、通义千问、讯飞星火等AI工具相继上线,AI写作的门槛被大幅降低。据不完全统计,2025年有超过60%的在校大学生使

基于YOLOv10n-SOEP-PST的跟随式助老机器人目标检测与识别系统详解

1. 基于YOLOv10n-SOEP-PST的跟随式助老机器人目标检测与识别系统详解 【CC 4.0 BY-SA版权 版权声明:本文为博主原创文章,遵循版权协议,转载请附上原文出处链接和本声明。 文章标签: 深度学习 同时被 2 个专栏收录 这个损失函数由五个部分组成:边界框坐标损失(前两行)、置信度损失(第三、四行)和分类损失(最后一行)。 λ c o o r d \lambda_{coord} λcoord 和 λ n o o b j \lambda_{noobj} λnoobj 是权重参数,用于平衡不同损失的重要性。 I i j o b j