16、ESP32 Web

news2024/11/19 19:30:38

        Web 服务器具有移动响应能力,可以使用本地网络上的任何设备作为浏览器进行访问。

        示例功能:

  • 构建 Web 服务器控制连接到 ESP32 的 LED
  • 在本地网络的浏览器上输入 ESP32 IP 地址访问 Web 服务器
  • 通过单击 Web 服务器上的按钮,更改 LED 状态
// 使用 ESP32 构建 Web 服务器,控制 LED

#include <Arduino.h>
#include <WiFi.h>

const char* ssid = "么么";    // Wifi
const char* password = "yaoqiao321";    // 密码

WiFiServer server(80);      // 设置 web 服务器端口号 80

// Variable to store the HTTP request
String header;  // HTTP 请求变量

const int LED = 2;
String led_state = "off";   // 当前 LED 状态

unsigned long currentTime;      // 当前时间
unsigned long previousTime;     // 上次时间
const long timeoutTime = 2000;  // 超时时间 2S

void setup()
{
    Serial.begin(115200);

    pinMode(LED, OUTPUT);
    digitalWrite(LED, LOW);

    // 连接 WIFI,打印 IP
    Serial.print("Connecting to ");
    Serial.println(ssid);
    WiFi.begin(ssid, password);
    while (WiFi.status() != WL_CONNECTED)
    {
        delay(500);
        Serial.print(".");
    }
    Serial.println();
    Serial.print("IP address: ");
    Serial.println(WiFi.localIP());

    server.begin();     // 启动 web 服务器
}

void loop()
{
    WiFiClient client = server.available();     // 新客户端

    // 有客户端连接
    if (client)
    {
        Serial.println("New Client.");      // 新客户

        String currentLine = "";    // 存储客户端传入数据

        currentTime = millis();
        previousTime = currentTime;

        // 客户端连接时循环,2S刷新
        while (client.connected() && currentTime - previousTime <= timeoutTime)
        {
            currentTime = millis();

            if (client.available())     // 接收到客户端字节
            {
                char c = client.read();
                Serial.write(c);
                header += c;

                // 其他字符存储
                if ((c != '\r') && (c != '\n')) {
                    currentLine += c;
                }
                
                // 结束请求,返回响应
                else if (c == '\n')
                {
                    if (currentLine.length() == 0)
                    {
                        client.println("HTTP/1.1 200 OK");          // 发送响应头 HTTP/1.1 200 OK
                        client.println("Content-type:text/html");   // 发送内容类型 text/html
                        client.println("Connection: close");        // 发送内容
                        client.println();                           // 发送换行
                        
                        if (header.indexOf("GET /LED/on") >= 0)  // 返回指定字符串在原字符串中第一次出现的位置。没有指定的字符串返回-1
                        {
                            Serial.println("LED ON");
                            led_state = "on";
                            digitalWrite(LED, HIGH);
                        }
                        else if (header.indexOf("GET /LED/off") >= 0)
                        {
                            Serial.println("LED OFF");
                            led_state = "off";
                            digitalWrite(LED, LOW);
                        }

                        // 创建网页
                        // 发送 HTML 网页
                        client.println("<!DOCTYPE html><html>");        // 正在发送 HTML
                        client.println("<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">");   // 在 Web 浏览器中有响应
                        client.println("<link rel=\"icon\" href=\"data:,\">");      // 防止对网站图标的请求

                        // CSS 按钮样式
                        client.println("<style>html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;}");      // Helvetica字体,中心对齐
                        client.println(".button { background-color: #4CAF50; border: none; color: white; padding: 16px 40px;");     // 按钮 #4CAF50 色、无边框、白色文本和填充,大小 16px 40px
                        client.println("text-decoration: none; font-size: 30px; margin: 2px; cursor: pointer;}");   // 文本修饰 none,字体大小 30px、边距 2px、指向指针的光标
                        client.println(".button2 {background-color: #555555;}</style></head>");     // 第二个按钮改变颜色(OFF)
                        
                        // Web 标题
                        client.println("<body><h1>ESP32 Web Server</h1>");
                        
                        // 显示 LED 当前状态
                        client.println("<p>LED - State " + led_state + "</p>");
                        // 当前是 OFF 显式 ON,当前是 ON 显式 OFF
                        if (led_state == "off")
                        {
                            client.println("<p><a href=\"/LED/on\"><button class=\"button\">ON</button></a></p>");
                        } else
                        {
                            client.println("<p><a href=\"/LED/off\"><button class=\"button button2\">OFF</button></a></p>");
                        } 

                        // HTTP 响应以空行结束
                        client.println();
                        break;
                    }
                    else
                        currentLine = "";   // 有换行符,清除 currentLine
                }
            }
        }
        
        header = "";
        client.stop();      // 关闭连接
        Serial.println("Client disconnected.");
    }
}

代码烧录到 ESP32,返回 IP 地址。

用同网络环境下的设备访问这个 IP。

  点击按钮,可以控制 ESP32 IO 电平

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

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

相关文章

C#语言基础

一、复杂数据类型 1. 枚举 1.1 基本概念 1.1.1 枚举是什么 枚举是一个被命名的整型常量的集合&#xff0c;一般用它来表示状态、类型等等 1.1.2 申明枚举和申明枚举变量 申明枚举和申明枚举变量是两个概念 申明枚举&#xff1a;相当于是创建一个自定义的枚举类型 申明枚…

C#实战—代码实现收发文件智能化

在信息化的今天&#xff0c;收发电子文档几乎是每个朋友都要经历的事情。比如班级学委和班长需要收发作业&#xff0c;企业管理者需要收发工作文件。但是&#xff01;&#xff01;&#xff01; 每到要交结果时&#xff0c;往往会发现总会有一些人没有即使交上&#xff0c;50个…

【Leetcode每日一题】 综合练习 - 全排列 II(难度⭐⭐)(71)

1. 题目解析 题目链接&#xff1a;47. 全排列 II 这个问题的理解其实相当简单&#xff0c;只需看一下示例&#xff0c;基本就能明白其含义了。 2.算法原理 算法思路梳理 为了生成给定数组nums的全排列&#xff0c;同时避免由于重复元素导致的重复排列&#xff0c;我们可以遵…

面试中算法(2的整数次幂)

判断一个正整数是否是2的整数次幂&#xff08;如16是2的4次方&#xff0c;返回true;18不是2的整数次幂&#xff0c;则返回false&#xff09;&#xff0c;要求性能尽可能高。 使用一个整型变量&#xff0c;让它从1开始不断乘以2&#xff0c;将每一次乘2的结果和 目标整数进行比较…

【python的魅力】:教你如何用几行代码实现文本语音识别

文章目录 引言一、运行效果二、文本转换为语音2.1 使用pyttsx32.2 使用SAPI实现文本转换语音2.3 使用 SpeechLib实现文本转换语音 三、语音转换为文本3.1 使用 PocketSphinx实现语音转换文本 引言 语音识别技术&#xff0c;也被称为自动语音识别&#xff0c;目标是以电脑自动将…

【网站项目】社区互助平台

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

Object Desktop - Stardock 软件开发商系列套件

Windows 的一大优势在于可高度自定义&#xff0c;能让我们把它打造成一个最符合自己需求的工作和娱乐工具。 在桌面增强工具套件 Object Desktop 中&#xff0c;包含了 Stardock 旗下 10 款生产力和美化工具&#xff0c;可帮助我们打造出美观、实用、高效的 Windows 系统。 St…

Leetcode—163. 缺失的区间【简单】Plus

2024每日刷题&#xff08;126&#xff09; Leetcode—163. 缺失的区间 实现代码 class Solution { public:vector<vector<int>> findMissingRanges(vector<int>& nums, int lower, int upper) {int n nums.size();vector<vector<int>> an…

文件(夹)批量重命名数字、字母、日期、中文数字大写小写

首先&#xff0c;需要用到的这个工具&#xff1a; 度娘网盘 提取码&#xff1a;qwu2 蓝奏云 提取码&#xff1a;2r1z 目标是重命名下面5个文件&#xff08;也可以是文件夹等&#xff0c;任意&#xff09;&#xff0c;从大写中文数字“贰”开始 打开工具&#xff0c;找到“文…

SNR: Signal to Noise Ratio

https://www.xx.com/watch?vmyrZ_R6xIZA Fang, Y., Armin, A., Meredith, P. et al. Accurate characterization of next-generation thin-film photodetectors. Nature Photon 13, 1–4 (2019). https://doi.org/10.1038/s41566-018-0288-z Wang, F., Zhang, T., Xie, R. e…

[XYCTF新生赛]-PWN:fmt解析(scanf格式化字符串漏洞,任意地址写)

查看保护 查看ida 这里没什么好说的 完整exp&#xff1a; from pwn import* context(log_leveldebug) #pprocess(./fmt) premote(gz.imxbt.cn,20975) backdoor0x4012BEp.recvuntil(bgift: ) printf_addrint(p.recv(14),16) print(hex(printf_addr)) libcELF(./libc-2.31.so) …

【计算机网络】循环冗余校验:Cyclic Redundancy Check

1. 任务目标 利用循环冗余校验&#xff08;CRC&#xff09;检测错误。 循环冗余校验&#xff08;英语&#xff1a;Cyclic redundancy check&#xff0c;通称 CRC&#xff09;是一种根据网上数据包或计算机文件等数据产生简短固定位数校验码的一种散列函数&#xff0c;主要用来…

消息队列与信号量(基本概念及操作接口介绍)

一、消息队列 基本概念 System V消息队列是Unix系统中一种进程间通信&#xff08;IPC&#xff09;机制&#xff0c;它允许进程互相发送和接收数据块&#xff08;消息&#xff09; 操作系统可以在内部申请一个消息队列&#xff0c;可以让不同的进程向消息队列中发送数据块&…

Java中使用RediSearch进行高效数据检索

RediSearch是一款构建在Redis上的搜索引擎&#xff0c;它为Redis数据库提供了全文搜索、排序、过滤和聚合等高级查询功能。通过RediSearch&#xff0c;开发者能够在Redis中实现复杂的数据搜索需求&#xff0c;而无需依赖外部搜索引擎。本文将介绍如何在Java应用中集成并使用Red…

2024抖音直播带货-直播间拆解:抖店运营从入门到精通(56节课)

起号原理方式以及节点处理 类目的选择选品思路 付费流量投放原理 直播间进阶玩法 课程内容 直播间搭建标准自然起号(0-1)原理 方式 以及节点处理 老号重启(0-1)原理 方式 以及节点处理 账号在线人数稳定 原理 方式 以及节点处理 账号销售额放大 原理 方式 以及节点处理…

【Linux】namespace 隔离、cgroup 控制

文章目录 五、namespace 隔离dd -- 读取、转换并输出数据mkfs -- 格式化文件系统df -- 显示文件系统磁盘使用情况mount -- 加载文件系统到指定的加载点unshare -- 创建子进程&#xff0c;同时与父程序不共享namespace一个 demo 六、cgroup(Control Group) 相关命令pidstat -- 监…

Stable Diffusion AI绘画

我们今天来了解一下最近很火的SD模型 ✨在人工智能领域&#xff0c;生成模型一直是研究的热点之一。随着深度学习技术的飞速发展&#xff0c;一种名为Stable Diffusion的新型生成模型引起了广泛关注。Stable Diffusion是一种基于概率的生成模型&#xff0c;它可以学习数据的潜…

nginx变量自定义日志收集

内置变量 $remote_addr&#xff1b;存放了客户端的地址&#xff0c;注意是客户端的公网IP&#xff0c;也就是一家人访问一个网站&#xff0c;则会显示为路由器的公网IP。 $args&#xff1b;变量中存放了URL中的指令 [rootlocalhost conf.d]# cat pc.conf server {listen 80;se…

二.Django项目之电商购物商城 -- 校验用户输入密码是否合法

Django项目之电商购物商城 – 校验用户输入密码是否合法 需要开发文档和前端资料的可私聊 一. 创建用户逻辑操作 1. 创建用户app – users python manage.py startapp users2.注册app users.apps.UsersConfig,3. 创建视图 from django.shortcuts import render from djan…