十、通过网络服务将esp8266引脚状态显示在网页中

news2024/12/23 23:33:21

ESP8266在服务器模式运行时,我们可以使用浏览器来显示它的引脚状态。

1、实现目标

学习如何通过esp8266建立基本网站,在该网站上实时显示esp8266的引脚值。

2、原理图

FLASH按键与D3引脚连接,可以通过FLASH按键改变D3引脚的电平。当没有按下该按键时,D3引脚将会保持高电平状态。当按下该按键后,D3引脚会变为低电平。

3、示例代码1

/*
 *程序目的:使用ESP8266建立基本服务器。网站页面显示esp8266的D3引脚电平。
           没有按下FLASH按键D3引脚保持高电平状态,按下该按键后,D3引脚
           为低电平。
 */
#include <ESP8266WiFi.h>        // 本程序使用 ESP8266WiFi库
#include <ESP8266WiFiMulti.h>   // ESP8266WiFiMulti库
#include <ESP8266WebServer.h>   // ESP8266WebServer库

#define buttonPin D3            // 按键D3引脚

ESP8266WiFiMulti wifiMulti;         // 建立ESP8266WiFiMulti对象,对象名称是'wifiMulti'
ESP8266WebServer esp8266_server(80);// 建立ESP8266WebServer对象,对象名称为esp8266_server
                                    // 括号中的数字是网路服务器响应http请求的端口号
                                    // 网络服务器标准http端口号为80,因此这里使用80为端口号
bool pinState;                      // 存储D3引脚状态

void setup() {
  Serial.begin(115200);               // 启动串口通讯
  pinMode(buttonPin, INPUT_PULLUP);   // 按键引脚设置为输入上拉模式

  // 通过addAP函数存储 WiFi名,WiFi密码
  wifiMulti.addAP("zjd", "1233211234567");
  wifiMulti.addAP("SHHOO", "shhoo2018");

  Serial.print("\r\nConnecting ...");      // 通过串口监视器输出信息告知用户esp8266正在尝试连接WiFi                               
  while (wifiMulti.run() != WL_CONNECTED)        
  {
    delay(1000);                                            
    Serial.print('.');          
  }

  Serial.print("\r\n");                              // WiFi连接成功后
  Serial.print("Connection Successful\r\n");         // esp8266将通过串口监视器输出
  Serial.print("WiFi: " + WiFi.SSID() + "\r\n");     // 连接的WiFI名称
  Serial.print("IP address: ");                      //  esp8266的IP地址  
  Serial.println(WiFi.localIP());    

  
  esp8266_server.begin();                            // 启动网站服务
  esp8266_server.on("/", handleRoot);                // 设置服务器根目录即'/'的函数'handleRoot'
  esp8266_server.onNotFound(handleNotFound);         // 设置处理404情况的函数"handleNotFound" 

  Serial.println("HTTP esp8266_server started");     // ESP8266网络服务功能已经启动    
}


void loop() {
  esp8266_server.handleClient();     // 处理http服务器访问
  pinState = digitalRead(buttonPin); // 获取引脚状态
}


/*处理网站根目录"/"的访问请求*/
void handleRoot()
{
  String displayPinState;                      // 存储按键状态的字符串变量
   
  if(pinState == HIGH)                          // 当按键引脚D3为高电平          
  {
    displayPinState = "Button State: HIGH";    // 字符串赋值高电平信息
  }
 
  else  if(pinState == LOW)                    // 当按键引脚D3为低电平          
  {
    displayPinState = "Button State: LOW";     // 字符串赋值低电平信息
  }

  esp8266_server.send(200, "text/plain", displayPinState);
} 


/*处理404情况的函数*/
void handleNotFound()
{
  esp8266_server.send(404, "text/plain", "404: Not found");    // 当浏览器请求的网络资源无法在服务器找到时,esp8266调用此函数
}

3.1、在按键没有按下时,会看到以下页面

3.2、在按键按下时,刷新会看到以下页面

4、示例代码2

以上示例中,我们需要刷新网页页面才能将按键的最新状态显示在网页中。为了实现页面的自动刷新,请您参考以下示例程序。

/*
 *程序目的:使用ESP8266建立基本服务器。网站页面显示esp8266的D3引脚电平。
           没有按下FLASH按键D3引脚保持高电平状态,按下该按键后,D3引脚
           为低电平。页面状态每隔5秒刷新一次
 */
#include <ESP8266WiFi.h>        // 本程序使用 ESP8266WiFi库
#include <ESP8266WiFiMulti.h>   // ESP8266WiFiMulti库
#include <ESP8266WebServer.h>   // ESP8266WebServer库

#define buttonPin D3            // 按键D3引脚

ESP8266WiFiMulti wifiMulti;          // 建立ESP8266WiFiMulti对象,对象名称是'wifiMulti'
ESP8266WebServer esp8266_server(80); // 建立ESP8266WebServer对象,对象名称为esp8266_server
                                     // 括号中的数字是网路服务器响应http请求的端口号
                                     // 网络服务器标准http端口号为80,因此这里使用80为端口号
bool pinState;                       // 存储D3引脚状态

void setup() {
  Serial.begin(115200);               // 启动串口通讯
  pinMode(buttonPin, INPUT_PULLUP);   // 按键引脚设置为输入上拉模式

  // 通过addAP函数存储 WiFi名,WiFi密码
  wifiMulti.addAP("zjd", "1233211234567");
  wifiMulti.addAP("SHHOO", "shhoo2018");

  Serial.print("\r\nConnecting ...");      // 通过串口监视器输出信息告知用户esp8266正在尝试连接WiFi                               
  while (wifiMulti.run() != WL_CONNECTED)        
  {
    delay(1000);                                            
    Serial.print('.');          
  }

  Serial.print("\r\n");                              // WiFi连接成功后
  Serial.print("Connection Successful\r\n");         // esp8266将通过串口监视器输出
  Serial.print("WiFi: " + WiFi.SSID() + "\r\n");     // 连接的WiFI名称
  Serial.print("IP address: ");                      //  esp8266的IP地址  
  Serial.println(WiFi.localIP());    

  
  esp8266_server.begin();                            // 启动网站服务
  esp8266_server.on("/", handleRoot);                // 设置服务器根目录即'/'的函数'handleRoot'
  esp8266_server.onNotFound(handleNotFound);         // 设置处理404情况的函数"handleNotFound" 

  Serial.println("HTTP esp8266_server started");     // ESP8266网络服务功能已经启动    
}


void loop() {
  esp8266_server.handleClient();     // 处理http服务器访问
  pinState = digitalRead(buttonPin); // 获取引脚状态
}


/*处理网站根目录"/"的访问请求*/
void handleRoot()
{
  esp8266_server.send(200, "text/html", sendHTML(pinState));
} 


/*处理404情况的函数*/
void handleNotFound()
{
  esp8266_server.send(404, "text/plain", "404: Not found");    // 当浏览器请求的网络资源无法在服务器找到时,esp8266调用此函数
}


/*
 *建立用于发送给客户端浏览器的HTML代码。此代码将会每隔5秒刷新页面。
 *通过页面刷新,引脚的最新状态也会显示于页面中
 */
String sendHTML(bool buttonState)
{
  String htmlCode = "<!DOCTYPE html> <html>\n";
  htmlCode +="<head><meta http-equiv='refresh' content='5'/>\n";
  htmlCode +="<title>ESP8266 Butoon State</title>\n";
  htmlCode +="<style>html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;}\n";
  htmlCode +="body{margin-top: 50px;} h1 {color: #444444;margin: 50px auto 30px;} h3 {color: #444444;margin-bottom: 50px;}\n";
  htmlCode +="</style>\n";
  htmlCode +="</head>\n";
  htmlCode +="<body>\n";
  htmlCode +="<h1>ESP8266 BUTTON STATE</h1>\n";

  if(buttonState)
  {
    htmlCode +="<p>Button Status: HIGH</p>\n";
  }
  else
  {
    htmlCode +="<p>Button Status: LOW</p>\n";
  }

  htmlCode +="</body>\n";
  htmlCode +="</html>\n";

  return htmlCode;
}

(1)在以上示例程序中的handleRoot函数中,esp8266_server.send(200, "text/html", sendHTML(pinState))语句的的3个参数 sendHTML(pinState)调用了sendHTML函数。该函数的作用是建立一个可以定时刷新的HTML网页代码。通过定时刷新网页,开发板的引脚状态将会不断地在页面中进行更新。

(2)此HTML网页代码是由sendHTML函数产生的。该函数建立了一个字符串变量,该字符串变量所存储的信息正是网页HTML代码。值得注意的是,该HTML代码会不断地检查变量pinState状态,并且根据pinState的状态改变HTML代码的信息,从而实现在网页上显示引脚状态。

(3)此HTML代码中真正实现定时刷新网页功能的语句是代码中如下语句:

htmlCode +="<head><meta http-equiv='refresh' content='5'/>\n";

这条语句是告诉网页需要定时刷新,刷新频率5秒钟,即每5秒钟刷新一次页面。您可以通过改变此行语句中的数值5来调整页面刷新频率。

(4)每一次页面刷新,浏览器都会向NodeMCU发送HTTP请求。NodeMCU在收到浏览器请求后,将会把最新的HTML代码信息返回给浏览器。浏览器收到最新的HTML代码后将会在页面中显示引脚的状态。

(5)HTML代码

<!DOCTYPE html> 
<html>
  <head>
    <meta http-equiv='refresh' content='5'/>
    <title>ESP8266 Butoon State</title>
    <style>
      html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;}
	  "body{margin-top: 50px;} 
	  h1 {color: #444444;margin: 50px auto 30px;} 
	  h3 {color: #444444;margin-bottom: 50px;}\n";
    </style>
  </head>
  <body>
	<h1>ESP8266 BUTTON STATE</h1>
	<p>Button Status: HIGH</p>
  </body>
</html>

4.1、没有按下按键时的页面显示信息

4.2、按下按键时的页面显示信息

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

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

相关文章

中型企业适合用什么样的CRM管理软件,求推荐?

中型企业适合用什么样的CRM管理软件&#xff0c;求推荐&#xff1f; CRM管理软件是现代企业必不可少的管理软件之一&#xff0c;很多企业都会选择CRM管理软件来经营客户资源&#xff0c;但能够精准地选择到适合自己企业的CRM管理软件则是困难的。 中型企业需要与自己业务流程…

数据可视化之finebi和tableau电力系统分析实现对比

通过一个电力系统简单案例&#xff0c;尝试实际执行finebi和Tableau数据可视化设计的各项基本步骤&#xff0c;以熟悉Tableau和finebi数据可视化设计技巧&#xff0c;提高大数据可视化应用能力。 一、工具/准备工作 在开始本实验之前&#xff0c;请认真阅读课程的相关内容。 …

写给小白的TensorFlow的入门课

文章目录前言学习AI的必要性和业务的关系最简单的例子要做什么&#xff1f;数据图形化展示构建计算图形计算图形最小化误差MacOS 中配置运行环境安装验证安装简单模型训练识别数字图片的模型训练Softmax Regression算法大概步骤大致算法实现结语参考链接前言 深度学习就是从大…

抖音电商发布2023年食品健康行业8大趋势,新减负、新养生等成为关键词

2022抖音电商食品健康峰会暨年货盛典在杭州成功举行。抖音电商食品健康行业还联合欧睿共同发布了《2023年度食品健康行业趋势洞察报告》。图片来源&#xff1a;抖音电商抖音电商食品健康行业负责人白华在会上透露&#xff0c;过去一年&#xff0c;抖音电商食品健康行业呈现出有…

虚拟机数据库改密码ERROR 1396 (HY000): Operation ALTER USER failed for ‘root‘@‘localhost‘

注&#xff1a;原因为MySql 8.0.11 换了新的身份验证插件&#xff08;caching_sha2_password&#xff09;, 原来的身份验证插件为&#xff08;mysql_native_password&#xff09;。而客户端工具Navicat Premium12 中找不到新的身份验证插件&#xff08;caching_sha2_password&a…

Java实现多线程

目录 基本概念 1、程序、进程、线程 2、使用线程的优点 3、线程的分类 4、线程的生命周期 多线程的实现方法 1、继承Thread类 2、实现Runnable接口 3、实现Callable接口 4、使用线程池 线程同步 1、同步代码、同步方法 2、同步机制中的锁 3、锁&#xff08;Lock&…

【电商】电商后台---采购管理模块

从供应商的管理到合同的管理&#xff0c;再到商品系统的模块的介绍、商品价格与税率维护策略&#xff0c;不知不觉已经完成了几篇文章&#xff0c;前期的准备工作完成后&#xff0c;接下来就应该进入到采购管理模块了。 几天来一直在构思如何写&#xff0c;写的内容让大家看过觉…

使用天地图加载Geoserver的图层

一、写在前面 在项目中往往使用地图作为底图(比如 天地图卫星图等)&#xff0c;再其上覆盖你的通过geoserver发布自定义图层。本文记录了我的实现方法。 二、过程 2.1 我遇到的难题 遇到难题1&#xff1a;使用无人机拍摄制作的正射影像图有几百MB甚至1个G&#xff0c;直接展示图…

YOLO系列目标检测算法——PP-YOLOE

YOLO系列目标检测算法目录 - 文章链接 YOLO系列目标检测算法总结对比- 文章链接 YOLOv1- 文章链接 YOLOv2- 文章链接 YOLOv3- 文章链接 YOLOv4- 文章链接 Scaled-YOLOv4- 文章链接 YOLOv5- 文章链接 YOLOv6- 文章链接 YOLOv7- 文章链接 PP-YOLO- 文章链接 …

深入浅出面向对象设计模式(Java)

设计模式是什么 设计模式是面向对象的一种思想。 设计模式的基本原则&#xff1f; 单一职责原则开放封闭原则里氏替换原则接口隔离原则依赖翻转原则 基本分类和为什么分为3类&#xff1f; 创建型&#xff08;怎么优雅创建对象&#xff09; 结构性&#xff08;对象的结构&am…

巧用Hibernate 完成多数据库的DDL脚本创建

巧用Hibernate 完成多数据库的DDL脚本创建 spring boot jpa 默认的orm框架就是Hibernate。 由hibernate完成数据库的读写也是主流的方式之一。但是不同数据库之间&#xff0c;建表、建索引的方言语句都有较多差别&#xff0c;很难做到一套SQL在所有数据库上进行执行。 那么Hibe…

C++11之线程库

文章目录一、thread二、mutex三、lock_guard 与 unique_lock1. lock_guard2. unique_lock四、atomic五、condition_variable在 C11 之前&#xff0c;涉及到多线程问题&#xff0c;都是和平台相关的&#xff0c;比如 Windows 和 Linux 下各有自己的接口&#xff0c;这使得代码的…

PHP另类判断 - 数组是一维还是二维

之前有一个需求&#xff0c;需要判断一个数组是一维还是二维数组&#xff0c;如果是二维的话就要使用foreach循环来处理 在网上搜了一下给出来的都是下面所写的方式&#xff1a; if(count($updata) count($updata,1)) {// 一维 } else {// 二维 }首先我要说的是&#xff0c;上…

第三十七章 数论——博弈论(1)

第三十七章 数论——博弈论&#xff08;1&#xff09;一、Nim游戏1、题目2、结论3、结论验证4、代码二、集合——Nim游戏1、问题2、思路—SG()函数2、代码实现&#xff08;记忆化搜索&#xff09;一、Nim游戏 1、题目 2、结论 这里直接说结论&#xff1a; 假设有nnn堆石子&am…

【LeetCode每日一题】——275.H 指数 II

文章目录一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【解题思路】七【题目提示】八【时间频度】九【代码实现】十【提交结果】一【题目类别】 二分查找 二【题目难度】 中等 三【题目编号】 275.H 指数 II 四【题目描述】 给你一个整数数…

Jmeter分布式测试

因为jmeter本身的性能问题&#xff0c;有时候为了尽量模拟业务场景&#xff0c;需要模拟大量的并发请求&#xff0c;此时单台压力机就显得力不从心。针对这个情况&#xff0c;jmeter的解决方案是支持分布式压测&#xff0c;即将大量的模拟并发分配给多台压力机&#xff0c;来满…

三优两重政策解读

什么是三优两重&#xff1a; 优秀大数据产品、优秀大数据解决方案、优秀大数据应用案例和重点大数据企业、重点大数据资源&#xff1b; 1、申报主体 在山东省内注册登记&#xff0c;具备独立承担民事责任的能力&#xff0c;包括各类政府机关、企事业单位及社会组织。 ①.大数据…

【从零开始学习深度学习】33.语言模型的计算方式及循环神经网络RNN简介

目录1. 语言模型1.1 语言模型的计算1.2 nnn元语法的定义2. 循环神经网络RNN2.1 不含隐藏状态的神经网络2.2 含隐藏状态的循环神经网络2.3 应用&#xff1a;基于字符级循环神经网络的语言模型3. 总结1. 语言模型 语言模型&#xff08;language model&#xff09;是自然语言处理…

多媒体服务器核心实现(流管理)

多媒体服务器比较多&#xff0c;实现的功能也很复杂&#xff0c;但其核心就是是转协议&#xff0c;流管理&#xff0c;连接管理&#xff0c;就是一个时序状态机和信令结合的系统。现在的生态有很多现成的轮子&#xff0c;c/c go实现的均可以拿来就用&#xff0c;只需要按一定的…

插槽,依赖注入,动态组件,异步组件,内置组件

插槽&#xff1a;父组件和子组件内容的一个通信 子组件使用<slot>接收父组件传入的内容 如果内容有多个标签时&#xff0c;使用<template>包裹 默认插槽&#xff1a; <template v-slot:default><h2>标题</h2><p>插槽内容</p> <…