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

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

Alt text

前言

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),具体如下所示;

Alt text

注意:记得每个LED添加限流电阻。

开发环境准备

ESP8266 WiFi库

具体ESP8266 WiFi库的使用说明以及文档可以参考:
https://arduino-esp8266.readthedocs.io/en/latest/esp8266wifi/readme.html

Station (STA) 模式用于将 ESP 模块连接到AP建立的 Wi-Fi 网络;

Alt text

下面是一个作为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中串口监视器,会打印出相应的信息,具体如下所示;
Alt text

这里ESP8266的IP地址是172.16.3.188,也就是我们用浏览器访问的web server的地址。

注意:这里的地址不一定都相同,每个设备地址也会有差异。

在浏览器的地址栏输入172.16.3.188,刷新网页即可进入我们设计好的网页,在这里就可以对LED进行控制了,具体如下所示;

Alt text

结论

本文简单介绍了使用ESP8266构建一个简易的Web server,可以通过网页上的按钮对硬件设备进行控制,其实除了控制LED之外,我们还可以通过本文的内容做一些修改,就可以很轻松地对直流电机,继电器等设备进行控制。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/154637.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网站SSL证书过期了

当网站的SSL证书到期时&#xff0c;这可能会对网站的安全性和可信度产生负面影响。SSL证书是保证网站安全连接的重要组成部分&#xff0c;它通过加密传输数据&#xff0c;确保用户与网站之间的信息传输安全可靠。然而&#xff0c;一旦SSL证书过期&#xff0c;可能会引发一系列问…

VM——绘制亮度均匀性曲线

1、需求:检测汽车内饰氛围灯的亮度均匀性,并绘制均匀性曲线 2、结果: 3、方法: 主要分为3步 (1)提取氛围灯ROI,忽略背景 (2)对提取到的ROI图进行切片处理,计算出每个切片的亮度均值 (3)绘制均匀性曲线 3.1 提取氛围灯ROI step1: 转成黑白图 step2:通过blob和…

北斗成为全球民航通用卫星导航系统

北斗成为全球民航通用卫星导航系统 日前&#xff0c;包含北斗卫星导航系统&#xff08;以下简称“北斗系统”&#xff09;标准和建议措施的《国际民用航空公约》附件10最新修订版正式生效。这标志着北斗系统正式加入国际民航组织&#xff08;ICAO&#xff09;标准&#xff0c;成…

【Flink】系统架构

DataStream API 将你的应用构建为一个 job graph&#xff0c;并附加到 StreamExecutionEnvironment 。当调用 env.execute() 时此 graph 就被打包并发送到 JobManager 上&#xff0c;后者对作业并行处理并将其子任务分发给 Task Manager 来执行。每个作业的并行子任务将在 task…

2023.11.19使用flask制作一个文件夹生成器

2023.11.19使用flask制作一个文件夹生成器 实现功能&#xff1a; &#xff08;1&#xff09;在指定路径上建立文件夹 &#xff08;2&#xff09;返回文件夹的路径和建立成功与否的提示 main.py import os from flask import Flask, request, jsonify, render_templateapp F…

【外汇天眼】交易之路:从无知到觉醒,揭秘成功交易员的五个成长阶段

世界顶尖交易员的成功背后隐藏的真正秘诀引人瞩目。许多人梦想着像电影中的主角一样&#xff0c;成为一名成功的金融交易员。尽管开设交易账户相对简单&#xff0c;但要达到稳定盈利的境界确实非常不容易。众所周知&#xff0c;在衍生品市场中&#xff0c;有80%甚至90%以上的交…

企业AI虚拟ip形象定制的应用场景

随着AI人工智能和云计算等新技术的不断发展和应用&#xff0c;AI智能数字人已经演化成为了更加智慧的生命体&#xff0c;在服务企业和人类方面有了更高质量&#xff0c;特别是作为品牌形象代言人&#xff0c;通过高逼真模拟人类的外貌、声音和行为&#xff0c;在使得品牌在竞争…

城市交通领域的新趋势:地铁列车可视化

随着城市化进程的不断加速&#xff0c;地铁作为一种便捷、快速的城市交通方式&#xff0c;受到了越来越多人的青睐。地铁列车可视化&#xff0c;作为地铁运营管理中的一项重要工作&#xff0c;不仅可以提高列车运行效率和安全性&#xff0c;还可以为乘客提供更加舒适、便捷的乘…

leetcode算法之分治-归并

目录 1.排序数组2.数组中的逆序对3.计算右侧小于当前元素的个数4.翻转对 1.排序数组 排序数组 //分治-归并 class Solution {int tmp[50010]; public:vector<int> sortArray(vector<int>& nums) {mergeSort(nums,0,nums.size()-1);return nums;}void mergeS…

源启容器平台KubeGien 打造云原生转型的破浪之舰

云原生是应用上云的标准路径&#xff0c;也是未来发展大的趋势。如何将业务平滑过渡到云上&#xff1f;怎样应对上云期间的各项挑战呢&#xff1f;中电金信基于金融级数字底座“源启”打造了一款非常稳定可靠、多云异构、安全可控、开放灵活的容器平台产品——源启容器平台Kube…

主播-产品痛点话术

—、用户体验差我们的产品在用户体验方面存在一些问题。首先&#xff0c;产品的操作流程不够顺畅&#xff0c;导致用户在使用过程中经常遇到困扰。另外&#xff0c;我们的产品界面设计不够美观&#xff0c;无法给用户带来愉悦的使用体验。针对这些问题&#xff0c;我们将对产品…

Linux ps -ef|grep去除 grep --color=auto信息

linux 监控 进程判断是否启动可通过该指令实现 ps -ef|grep java指令结果为 # -v 参数有过滤作用 ps -ef|grep java |grep -v grep

Unity 头顶图文字性能优化

如图&#xff1a;常规的排版&#xff0c;会有很多Batches。这是优化后的Batches只有3。 常用解决方案&#xff1a; 1、创建两个Canvas&#xff0c;一个放所有文本Text&#xff0c;一个放所有Image。但这里有会有两个问题&#xff1a;一旦文字夹在两个Image中间&#xff0c;还有…

外汇天眼:经济调控之术!升息如何化解通货膨胀的困扰?

为了遏制通货膨胀&#xff0c;美国在过去的一段时间一直持续进行升息。尽管通胀数据的降幅并不迅速&#xff0c;但至少上涨势头得到了抑制。那么&#xff0c;升息为何能够遏制通胀呢&#xff1f;本文将简要探讨这一问题。 通货膨胀的根本原因在于货币供应量过多&#xff0c;也就…

深度学习卫星遥感图像检测与识别 -opencv python 目标检测 计算机竞赛

文章目录 0 前言1 课题背景2 实现效果3 Yolov5算法4 数据处理和训练5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **深度学习卫星遥感图像检测与识别 ** 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐…

中间件安全:Apache Tomcat 弱口令.(反弹 shell 拿到服务器的最高控制权.)

中间件安全&#xff1a;Apache Tomcat 弱口令. Tomcat 是 Apache 软件基金会&#xff08;Apache Software Foundation&#xff09;的 Jakarta 项目中的一个核心项目&#xff0c;由 Apache、Sun 和其他一些公司及个人共同开发而成。 通过弱口令登录后台&#xff0c;部署 war 包…

重生之我是一名程序员 34

哈喽啊大家晚上好&#xff01; 今天给大家带来的知识是——库函数qsort。首先&#xff0c;给大家介绍一下qsort函数&#xff0c; qsort函数是C标准库中的一种排序函数&#xff0c;用于对数组中的元素进行快速排序。它接受四个参数&#xff1a;待排序数组的基地址&#xff0c;数…

区块链技术与应用 【全国职业院校技能大赛国赛题目解析】第五套智能合约安全漏洞测试

第五套题的智能合约安全漏洞测试题目 环境 : ubuntu20 Truffle v5.8.3 (core: 5.8.3) Ganache v7.8.0 Solidity v0.8.3 Node v18.16.0 Web3.js v1.8.2 前言 请在测试的时候开启ganache打开,并且在truffle的配置文件配好ganache,之前两个帖子忘说了/(ㄒoㄒ)/~~ truffle-con…

YOLO改进系列之注意力机制(GAM Attention模型介绍)

模型结构 为了提高计算机视觉任务的性能&#xff0c;人们研究了各种注意力机制。然而以往的方法忽略了保留通道和空间方面的信息以增强跨维度交互的重要性。因此&#xff0c;liu提出了一种通过减少信息弥散和放大全局交互表示来提高深度神经网络性能的全局注意力机制。作者的目…

一文讲解eBPF helper 函数的设计与实现

您是否想为内核添加一个新的 eBPF 辅助&#xff08;helper&#xff09;函数&#xff0c;但不知道从何入手&#xff1f;或者&#xff0c;您是否曾遇到过类似于 R2 typectx expectedfp, pkt, pkt_meta, map_value 的 eBPF verifier 报错&#xff1f;本文将从代码层面对 eBPF 辅助…