NodeMCU ESP8266构建Web Server网页端控制设备
NodeMCU ESP8266构建Web Server网页端控制设备

前言
NodeMCU ESP8266 内部集成了TCP/IP协议栈,可以快速构建网络功能,搭建联网应用的硬件平台;
- ESP8266可以作为WiFi接入点(
Station),这样可以方便连接互联网,通过HTTP协议和云端服务器进行连接,数据处理; - ESP8266可以作为热点(
Access Point),这样方便其他设备的接入,可以作为网络服务器;
本文我们将把ESP8266配置为接入点(Station),自动连接到局域网中,实现通过网页端控制板载LED的亮和灭。
原理
我们会在ESP8266上构建一个webserver,并且会实现一个页面,用户通过客户端的访问该页面,在页面上可以对ESP8266上的LED进行控制。
整体架构图如下所示;

- ESP8266上的程序构建一个
Web server,并且实现相应的网页界面; - ESP8266连接到网络
UNCLE_MAC; - 手机端连接到网络
UNCLE_MAC,并访问ESP8266的web server地址; - 通过网页进行设备的控制;
下面我们进一步介绍一下如何实现这个功能。
实现
原理图
通过面包板连接LED到ESP8266开发板上,这里我们连接一个LED到GPIO 4(D2),另一个连接到GPIO 2(D1),具体如下所示;

注意:记得每个LED添加限流电阻。
开发环境准备
ESP8266 WiFi库
具体ESP8266 WiFi库的使用说明以及文档可以参考:
https://arduino-esp8266.readthedocs.io/en/latest/esp8266wifi/readme.html
Station (STA) 模式用于将 ESP 模块连接到AP建立的 Wi-Fi 网络;

下面是一个作为station的示例代码:
#include <ESP8266WiFi.h>void setup()
{Serial.begin(115200);Serial.println();WiFi.begin("network-name", "pass-to-network");Serial.print("Connecting");while (WiFi.status() != WL_CONNECTED){delay(500);Serial.print(".");}Serial.println();Serial.print("Connected, IP address: ");Serial.println(WiFi.localIP());
}void loop() {}
代码实现
复制下面的代码到Arduino IDE,但是修改所需要的WiFi名称和WiFi密码,即可实现上述功能,具体代码如下;
// 包含WiFi库
#include <ESP8266WiFi.h>// 设置 WiFi名称和密码
const char* ssid = "此处替换实际的WiFi名称";
const char* password = "此处替换实际的WiFi密码";// 设置 web 服务器端口
WiFiServer server(80);// 保存 HTTP 请求的变量
String header;// 当前设备的输出状态
String output5State = "off";
String output4State = "off";// 引脚的编号,用于GPIO的配置和输出
const int output5 = 5;
const int output4 = 4;// 当前系统时间
unsigned long currentTime = millis();
// 上个系统时间
unsigned long previousTime = 0; // 定义超时时间 (例如: 2000ms = 2s)
const long timeoutTime = 2000;void setup() {Serial.begin(115200);// 初始化输出pinMode(output5, OUTPUT);pinMode(output4, OUTPUT);// 设置初始输出为LOWdigitalWrite(output5, LOW);digitalWrite(output4, LOW);// WiFi的网络连接Serial.print("Connecting to ");Serial.println(ssid);WiFi.begin(ssid, password);while (WiFi.status() != WL_CONNECTED) {delay(500);Serial.print(".");}// 打印设备的IP地址,并连接web服务器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 = ""; // 将客户端接收的数据保存到 String 变量中currentTime = millis();previousTime = currentTime;while (client.connected() && currentTime - previousTime <= timeoutTime) { // 客户端连接的时候,进行循环currentTime = millis(); if (client.available()) { // 判断是否有数据从客户端发送过来char c = client.read(); // 读取一个字节Serial.write(c); // 打印到串口监视器上header += c;if (c == '\n') { // 如果介绍的数据是换行符 \n// 检测是否是空行,作为HTTP请求的结束 if (currentLine.length() == 0) {// HTTP 头经常包含 (HTTP/1.1 200 OK)// 下面作为HTTP请求的返回 client.println("HTTP/1.1 200 OK");client.println("Content-type:text/html");client.println("Connection: close");client.println();// 打开GPIO的输出状态if (header.indexOf("GET /5/on") >= 0) {Serial.println("GPIO 5 on");output5State = "on";digitalWrite(output5, HIGH);} else if (header.indexOf("GET /5/off") >= 0) {Serial.println("GPIO 5 off");output5State = "off";digitalWrite(output5, LOW);} else if (header.indexOf("GET /4/on") >= 0) {Serial.println("GPIO 4 on");output4State = "on";digitalWrite(output4, HIGH);} else if (header.indexOf("GET /4/off") >= 0) {Serial.println("GPIO 4 off");output4State = "off";digitalWrite(output4, LOW);}// 显示刷新网页client.println("<!DOCTYPE html><html>");client.println("<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">");client.println("<link rel=\"icon\" href=\"data:,\">");// on/off 按钮的CSS样式// 可以在这里修改自己想要的风格client.println("<style>html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;}");client.println(".button { background-color: #195B6A; border: none; color: white; padding: 16px 40px;");client.println("text-decoration: none; font-size: 30px; margin: 2px; cursor: pointer;}");client.println(".button2 {background-color: #77878A;}</style></head>");// 网页的标题client.println("<body><h1>ESP8266 Web Server</h1>");// 显示当前GPIO5的状态client.println("<p>GPIO 5 - State " + output5State + "</p>");if (output5State=="off") {client.println("<p><a href=\"/5/on\"><button class=\"button\">ON</button></a></p>");} else {client.println("<p><a href=\"/5/off\"><button class=\"button button2\">OFF</button></a></p>");} // 显示当前GPIO4的状态client.println("<p>GPIO 4 - State " + output4State + "</p>");if (output4State=="off") {client.println("<p><a href=\"/4/on\"><button class=\"button\">ON</button></a></p>");} else {client.println("<p><a href=\"/4/off\"><button class=\"button button2\">OFF</button></a></p>");}client.println("</body></html>");// 发送空行,结束HTTP请求client.println();// 跳出当前的循环break;} else { // 获取到空行,则清空currentLine中的数据currentLine = "";}} else if (c != '\r') { currentLine += c; }}}// Clear the header variableheader = "";client.stop();Serial.println("Client disconnected.");Serial.println("");}
}
测试结果
将程序编译并下载到ESP8266开发板上,打开Arduino ide中串口监视器,会打印出相应的信息,具体如下所示;

这里ESP8266的IP地址是172.16.3.188,也就是我们用浏览器访问的web server的地址。
注意:这里的地址不一定都相同,每个设备地址也会有差异。
在浏览器的地址栏输入172.16.3.188,刷新网页即可进入我们设计好的网页,在这里就可以对LED进行控制了,具体如下所示;

结论
本文简单介绍了使用ESP8266构建一个简易的Web server,可以通过网页上的按钮对硬件设备进行控制,其实除了控制LED之外,我们还可以通过本文的内容做一些修改,就可以很轻松地对直流电机,继电器等设备进行控制。
相关文章:
NodeMCU ESP8266构建Web Server网页端控制设备
NodeMCU ESP8266构建Web Server网页端控制设备 前言 NodeMCU ESP8266 内部集成了TCP/IP协议栈,可以快速构建网络功能,搭建联网应用的硬件平台; ESP8266可以作为WiFi接入点(Station),这样可以方便连接互联…...
搭建区块链
参考B站FISCO BCOS(十八) java SDK与区块链交互_哔哩哔哩_bilibili 林中有神君 一、搭建第一个区块链网络 根据官方文档搭建:搭建第一个区块链网络 — FISCO BCOS v2.9.0 文档 (fisco-bcos-documentation.readthedocs.io) 使用javajdk 控制台2.6之后 本处是2.9.2…...
Python通过selenium调用IE11浏览器报错解决方法
前提 正常安装Python 工具,selenium 包可以正常导入。IE浏览器驱动 IEDriverServer.exe 已经正确放置到已经添加path目录的文件下。 报错现象: 解决方法 打开浏览器进入 internet 选项 切换到安全页签 ,去除“应用保护模式” 再次调用验证…...
Ubuntu 1.84.2Visual Studio Code 下载配置与vscode查看内存Hex Editor插件,简单易懂
目录 前言 一 首先我为啥要重装Vs Code呢? 二 下载1.84.2Visual Studio Code 三 配置Vscode终端字体 四 安装插件 前言 这是一篇将老版本的VsCode下载至最新版的博文,从下载到调试全篇 一 首先我为啥要重装Vs Code呢? 因为我想安装这个…...
opencv-图像金字塔
图像金字塔是一种图像处理技术,它通过不断降低图像的分辨率,形成一系列图像。金字塔分为两种类型:高斯金字塔和拉普拉斯金字塔。 高斯金字塔(Gaussian Pyramid): 高斯金字塔是通过使用高斯滤波和降采样&a…...
字符串匹配算法——KMP
有文本串aabaabaaf,模式串aabaaf问文本串中是否出现过模式串 暴力解法 最不用动脑子的,直接两层for循环,逐个匹配,匹配到不相等的值时把文本串后移一位,再重新比较。这种方法的复杂度是O(mn),该方法低效的…...
电子学会C/C++编程等级考试2023年03月(一级)真题解析
C/C++等级考试(1~8级)全部真题・点这里 第1题:字符长方形 给定一个字符,用它构造一个长为4个字符,宽为3个字符的长方形,可以参考样例输出。 时间限制:1000 内存限制:65536输入 输入只有一行, 包含一个字符。输出 该字符构成的长方形,长4个字符,宽3个字符。样例输入…...
微信小程序汽车租赁系统
微信小程序汽车租赁系统 本系统包含了3类用户,分别为客户、员工以及管理员,客户主要是满足自身的租车需求,员工主要负责车辆的调度问题和维修状况,管理员则是主要对人员、车辆和订单的管理。以下是对各自功能的详细介绍: 客户可…...
docker部署微服务
目录 docker操作命令 镜像操作命令 拉取镜像 导出镜像 删除镜像 加载镜像 推送镜像 部署 pom文件加上 在每个模块根目录加上DockerFile文件 项目根目录加上docker-compose.yml文件 打包,clean,package 服务器上新建文件夹 测试docker-compo…...
统计voc格式数据中的xml标签、bndbox到excel表格中
有这么个需求是将xml的内容: 1,filename 2.label 3.bndbox:xmin,xmax,ymin,ymax。 … 将这些东西写入excel表格中,方便我统计标签数量和框的分布! 于是撰写了脚本:xml2csv.py 我的xml文件形式如下。大家的目标检测格式大同小异! <annotation><folder>UAV_d…...
51单片机利用I/O口高阻状态实现触摸控制LED灯
51单片机利用I/O口高阻状态实现触摸控制LED灯 1.概述 这篇文章介绍使用I/O口的高阻状态实现一个触摸控制LED灯亮灭的实验。该实验通过手触摸P3.7引脚,改变电平信号控制灯的亮灭。 2.实验过程 2.1.实验材料 名称型号数量单片机STC12C20521LED彩灯无1晶振12MHZ1电…...
自动驾驶术语汇总
目录 智驾级别芯片相关自动驾驶相关辅助驾驶相关预警相关传感器相关泊车相关安全相关车灯相关 智驾级别 L0-L2属于辅助驾驶,L4-L5才算自动驾驶 L0(Level 0):无自动化。这是大多数传统汽车的级别,所有的驾驶任务都需要…...
Jsonpath - 数据中快速查找和提取的强大工具
JSON(JavaScript Object Notation)在现代应用程序中广泛使用,但是如何在复杂的JSON数据中 查找和提取所需的信息呢? JSONPath是一种功能强大的查询语言,可以通过简单的表达式来快速准确地定位和提取JSON数据。本文将介…...
java中,通过替换word模板中的关键字后输出一个新文档
一、要用到的jar包 我已上传了相关的jar包,需要的可以通过以下链接直接下载: https://download.csdn.net/download/qq_27387133/88558034 具体jar包截图: 二、实现的代码 注意:文件要用docx格式!!! word变量替换的方法&#…...
MySQL数据库约束你真的懂吗?
✏️✏️✏️今天给各位带来的是关于数据库约束方面的知识 清风的CSDN博客 😛😛😛希望我的文章能对你有所帮助,有不足的地方还请各位看官多多指教,大家一起学习交流! 动动你们发财的小手,点点关…...
YOCTO 下载repo工具失败解决办法
curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo -o repocp repo ~/binchmod ax ~/bin/repo如果使用时报错, 切换ubuntu 到 python3 版本。gedit repo 修改repo默认链接地址:REPO_URL "https://gerrit.googlesource.com/git-repo"…...
github连接失败Host key verification failed.解决方案
问题描述 之前一直用的gitee协同协作,然后再最近一次云计算项目中团队使用的是github进行协作,但是按照常规步骤再GitHub上配置了ssh密钥后,却依然显示连接失败,无法推送和拉取代码,克隆仓库也是报错拒绝。具体报错信…...
【TIDB】TiDB认证考试PTCA 练习题 题库
目录 题目 答案 解析 题目 1.下列功能是由 TiKV 或 TiFlash 实现的为?( 选 2 项 ) A. 根据集群中 Region 的信息,发出调度指令 B. 对于 OLAP 和 OLTP 进行业务隔离 C. 将关系型数据转化为 KV 存储进行持久化 D. 将 KV 存储…...
PPP/INS紧组合算法
前言:在学习紧组合之前学会GNSS/INS松组合是很有必要的,i2NAV团队开源的KF_GINS项目可以作为GNSS/INS松组合学习模板,本文章主要对武汉大学i2NAV发布的PPP/INS紧组合学习资源进行算法层面的总结,链接: 武汉大学多源智…...
基于AI设计和柔性生产线,实现C2M个性化定制服务的规模化落地,消费者可自主选择款式、面料、印花等元素
Fruit of the Loom, Inc.(鲜果布衣)是全球领先的服装及运动用品制造企业,创立于1851年,现为伯克希尔哈撒韦公司全资子公司,总部位于美国肯塔基州鲍灵格林。公司旗下拥有Fruit of the Loom、Vanity Fair、Spalding、Rus…...
Wan2.2-T2V-A5B零基础部署教程:3步在本地电脑秒级生成视频
Wan2.2-T2V-A5B零基础部署教程:3步在本地电脑秒级生成视频 1. 为什么选择Wan2.2-T2V-A5B? 在当今内容创作爆炸的时代,视频已经成为最受欢迎的媒介形式。但传统视频制作流程复杂、耗时耗力,让许多创作者望而却步。Wan2.2-T2V-A5B…...
数据结构算法实践:用Nanbeige 4.1-3B生成代码与可视化讲解
数据结构算法实践:用Nanbeige 4.1-3B生成代码与可视化讲解 最近在准备计算机科学的教学材料时,我一直在想,有没有一种更高效、更直观的方法来讲解那些经典的数据结构和算法。传统的教学方式,要么是老师写板书,要么是放…...
拆解工厂物料管理四大核心难题:从采购到库存的工厂物料管理全流程优化
工厂物料管理是现代制造企业运营的生命线,其效率直接决定了企业的生产成本与市场竞争力。然而,许多企业在实际运营中面临着工厂物料管理的严峻挑战,尤其是在采购与库存这两个关键环节。低效的工厂物料管理会导致原材料积压、生产线停工待料、…...
Lighthouse性能优化终极指南:从性能杀手到体验加速器的实战秘籍
Lighthouse性能优化终极指南:从性能杀手到体验加速器的实战秘籍 【免费下载链接】lighthouse Automated auditing, performance metrics, and best practices for the web. 项目地址: https://gitcode.com/GitHub_Trending/lig/lighthouse Lighthouse是一款由…...
开发团队中的自组织与跨职能协作
在当今快速迭代的软件开发领域,自组织与跨职能协作已成为高效团队的核心特征。随着敏捷方法的普及,传统层级式管理逐渐被扁平化、自主化的团队模式取代。这种转变不仅提升了开发效率,还激发了团队成员的创造力和责任感。本文将深入探讨开发团…...
你还在用 Snipe-IT?一个更好用的国产替代来了
🍊 西柚 Ciyo 资产管理系统 v0.3 更新日志 本次 v0.3 版本围绕系统核心能力与实际使用反馈进行了集中优化,重点提升了岗位逻辑、数据管理能力与系统安全性,并进一步夯实了后续扩展能力的基础。 🚀 核心更新内容 🧩 岗…...
原神60帧限制破解指南:如何安全解锁高帧率游戏体验
原神60帧限制破解指南:如何安全解锁高帧率游戏体验 【免费下载链接】genshin-fps-unlock unlocks the 60 fps cap 项目地址: https://gitcode.com/gh_mirrors/ge/genshin-fps-unlock 你是否在原神中感受过画面卡顿?是否觉得60帧的限制让你无法充分…...
手把手教你用LongCat-Image-Editn:无需代码,在星图平台快速搭建个人AI修图站
手把手教你用LongCat-Image-Editn:无需代码,在星图平台快速搭建个人AI修图站 1. 为什么选择LongCat-Image-Editn 1.1 普通人也能用的AI修图神器 想象一下:你有一张完美的照片,但想换个背景;或者产品图需要更新&…...
【Matlab代码】基于Stackelberg博弈的光伏用户群优化定价模型(完美复现)
✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…...
