ESP32作为服务器,使用网页控制LED小灯

项目描述

ESP32-S开发板加入局域网,使用platformIO编写好ESP32的代码后,编译下载到ESP32中,访问ESP32的IP地址,使用网页控制连接着的LED小灯

项目准备:

ESP32-S开发板 一根数据线 电脑 LED小灯

  • 开发环境:vscode + PlatformIO

原理剖析


这个ESP32作为服务器,浏览器作为客户端,这是一个简单的B/S架构。

  • 在这个项目中我们说为什么要电脑和ESP32加入同一个局域网?

从前面的有关于Linux网络管理中我们知道了,两台服务器要想实现简单通信,是要在同一网段之下才能进行的(比如说:192.168.3.87和192.168.3.51)。那么在验证通信的时候,我们说要先把自己ping通,再去ping通另一台服务器,这样两台主机就可以通信了。

  • 假设电脑和ESP32之间可以正常通信,那么这样的基于B/S的架构是怎么工作的呢?


第一步:个人计算机要想从浏览器上获取一个网页,首先在浏览器中输入要访问的域名(比如:www.baidu.com),输入的域名会经过三大运营商转换成IP地址,根据转换后的IP地址访问到百度的页面(域名转换成IP地址的过程是由DNS域名解析服务负责的)。
可以打开终端,使用ping命令ping一下:

这里可以看到百度给我返回的IP地址是:220.181.38.149。同样我们在浏览器中输入这个IP地址也可以搜索到百度页面

由于企业的服务器很多,分布在各个地区,企业使用CDN加速器,根据每一个客户端的IP地址就近的分配一台服务器(这样的就近原则跟京东快递是一样的)
第二步:服务器接收到来自客户端的请求,要进行处理,向客户端返回一个页面等信息,这个过程也被称为响应。
这样浏览器就接收到服务器的网站页面了。

环境搭建

打开vscode,安装好PlatformIO

点击小蚂蚁的图标,在Home中点击New Project创建一个新项目。

这里使用的是基于Arduino的开发框架,点击Finish。

会得到一个类似于这样的一个目录结构。

代码实现

在创建好的目录结构中新建一个data文件夹,如图所示

data文件夹中创建一个www的文件夹,这个www文件夹存放一些有关于网页的代码。
将已经编写好的html等相关文件放入到www文件夹中。
链接:data压缩包
提取码:1234
目录结构如图所示:

在src文件夹中存放ESP32的主程序,也就是main.cpp,就是在这里写ESP32的代码。
代码如下:

#include <WiFi.h>
#include <ESPAsyncWebServer.h>
#include <SPIFFS.h>
#define BITS 10
#define PWM_PIN 15
#define LED_BUILTIN 5
String pwm_val;const char *ssid = "ChinaNet-fnAr";const char *password = "zhang411707";AsyncWebServer server(80);void setup()
{Serial.begin(115200);pinMode(LED_BUILTIN, OUTPUT);digitalWrite(LED_BUILTIN, HIGH);// 設定PWMpinMode(PWM_PIN, OUTPUT);analogSetAttenuation(ADC_11db);// 設定類比輸入電壓上限3.6VanalogSetWidth(BITS);// 取樣設成10位元ledcSetup(0, 5000, BITS);// 設定PWM,通道0、5KHz、10位元ledcAttachPin(PWM_PIN, 0);if (!SPIFFS.begin(true)){Serial.println("掛載SPIFFS分區出錯啦~");return;}WiFi.mode(WIFI_STA);WiFi.begin(ssid, password);Serial.println("");while (WiFi.status() != WL_CONNECTED){Serial.print(".");delay(500);}Serial.print("\nIP位址:");Serial.println(WiFi.localIP());server.serveStatic("/", SPIFFS, "/www/").setDefaultFile("index.html");server.serveStatic("/img", SPIFFS, "/www/img/");server.serveStatic("/favicon.ico", SPIFFS, "/www/favicon.ico");server.on("/sw", HTTP_GET, [](AsyncWebServerRequest *request){if (request->hasParam("led")) {AsyncWebParameter* p = request->getParam("led");if (p->value() == "ON") {digitalWrite(LED_BUILTIN, LOW);} else if (p->value() == "OFF") {digitalWrite(LED_BUILTIN, HIGH);}}request->send(200, "text/plain", "OK!");});server.on("/pwm", HTTP_GET, [](AsyncWebServerRequest *req){if (req->hasParam("val")) {AsyncWebParameter* p = req->getParam("val");pwm_val = p->value();ledcWrite(0, pwm_val.toInt());}req->send(200, "text/plain", "OK");});server.begin();Serial.println("HTTP伺服器開工了~");
}void loop() {}

编写好代码后就可以运行了。

先点击红箭头指向的对钩,build一下,接着就开始疯狂踩坑了。

代码剖析

这里对上面的部分代码进行剖析:

AsyncWebServer server(80);

创建一个WebServer对象,将http的默认端口80传入
将鼠标指向AsyncWebServer,同时按下Ctrl键,会跳转到ESPAsyncWebServer.h头文件中。

可以看到跳转到AsyncWebServer类中,可以看到这样的一个AsyncWebServer类中有protected修饰的属性,还有被public修饰的属性和方法。
那么这行代码创建了一个server对象,在创建的时候就调用了AsyncWebServer(uint16_t port); 这行带参构造函数
查看AsyncWebServer(uint16_t port);构造函数的具体实现

接下来看AsyncWebServer类中的这一行:

~AsyncWebServer();

这是AsyncWebServer类中被public修饰的析构函数
程序运行结束后,程序在server对象销毁前自动调用析构函数,无须手动调用,而且只运行一次


AsyncWebServer类中有这样的一个函数,

void begin();

这行函数是begin()方法启动服务器进行请求监听

开始填坑


从vscode中可以看到在电脑上找不到这个ESPAsyncWebServer.h,既然找不到这个头文件,那就手动的下载安装即可,这里给出两种解决方法:

  • 第一种:
    我百度了相关的资料,发现有很多类似的问题,都是缺少关键的头文件导致的。我发现ESPAsyncTCP.hESPAsyncWebServer.h头文件存在着某种依赖关系,必须同时下载安装才可以。可以尝试从github上下载这两个库:
    ESPAsyncWebServer
    ESPAsyncTCP

    直接下载zip压缩包即可。下载完成后通过Arduino IDE的Sketch > Include Library > ZIP-Library将这两个压缩包添加进去。
    可以从文档的Arduino的libraries目录中看到已经安装好的库文件。
  • 第二种(理论上是可以的,但是我在第一种方法的时候就已经解决了,这个方法没有试过,此方法慎用):

    vscode下面给出了有关于这个ESPAsyncWebServer.h头文件的地址,使用CtrL + 单击 访问链接,在页面中的第一个就是。

    我们需要下载这个库文件。

    通过文档可以知道,安装这个库,需要切换到当前的PlotformIO项目,在platformio.ini配置文件所在的当前目录运行下面的这个程序:
pio lib install "ottowinter/ESPAsyncWebServer-esphome@^2.1.0"

运行可能会失败,这是因为当前的目录中根本找不到pio.exe,这就需要我们将pio.exe的所在目录添加到PATH环境变量中,我们可以找到pio.exe所在的目录:C:\Users\用户名\.platformio\penv\Scripts
将这个路径添加到PATH环境变量中即可,如图所示:

再次运行上面的这个安装代码,即可运行成功。

安装好上面的两个头文件之后,再次运行代码,发现还是缺少一个头文件:AsyncTCP.h,


有了上一次的经验之后,直接点击下面给出的链接,运行代码安装:

pio lib install "esphome/AsyncTCP-esphome@^1.2.2"

再次运行,发现有一种奇怪的错误:src\main.cpp:xxx:x: error: stray '\xxx' in program,错误的源头是程序中包含空格等非法字符,手动去掉这些空格,再次运行,程序就运行成功了。
将程序编译 下载到ESP32中后,需要将data文件夹也烧录到ESP32的文件系统,到这里ESP32就可以作为服务器了。

实验现象

打开XCOM串口助手,可以看到ESP32的IP地址是:192.168.1.83

打开浏览器,在地址栏中输入ESP32的IP地址,就可以看到一个网页了

现在使用杜邦线连接LED小灯,在网页上操作就可以看到小灯的亮灭 和 亮度强弱了。
(本文是根据本人在编译代码中遇到的问题写的,由于每个人的开发环境不同,有可能错误也不相同,仅限参考)

参考链接

https://stackoverflow.com/questions/61498846/espasyncwebserver-h-with-esp32
https://registry.platformio.org/libraries/esphome/AsyncTCP-esphome/installation
https://registry.platformio.org/libraries/ottowinter/ESPAsyncWebServer-esphome/installation
https://github.com/me-no-dev/ESPAsyncWebServer
https://github.com/me-no-dev/ESPAsyncTCP

ESP32作为服务器,使用网页控制LED小灯相关推荐

  1. 嵌入式学习笔记——寄存器实现控制LED小灯

    文章目录 前言 GPIO通用输出模式 初始化LED小灯的GPIO 原理图 初始化代码 初始化的效果 功能函数封装 直接分开宏定义两个 使用条件运算符 封装函数实现简单的功能 KEIL MDK一些技巧 ...

  2. 51单片机通过蓝牙控制led小灯

    51单片机通过蓝牙控制led小灯 本人第一次接触蓝牙模块,暂时从基础的地方做起. 目录@TOC 1.材料 2.接线 3.程序 4.展示结果 ** 材料 **:①hc-05蓝牙模块(淘宝上有很便宜),h ...

  3. 树莓派3B wiringPi 控制LED小灯

    材料准备 1.树莓派3B 2.LED小灯 3.220欧电阻一个(红红黑黑金) 4.面包板 5.杜邦线公母2条 线缆连接 代码 #include<wiringPi.h>//包含wiringP ...

  4. 应用8255A控制LED小灯开闭(附代码注释)

    设8255A的A口和B口都工作在方式0,A口作为输出口,接有8个开关;B口为输出口,接有8个发光二极管.系统硬件电路中不断扫描开关Ki,当K0闭合时,点亮LED0,LED2,LED4,LED6,其他L ...

  5. 外网远程控制LED小灯的实现

    注:该项目参考自Arduino中文社区kevinzhang19701楼主的帖子 :小题大做之远程LED控制 http://www.arduino.cn/forum.php?mod=viewthread ...

  6. 【自学51单片机】3 -- 硬件基础知识(电容、三极管、74HC245、74HC138三八译码器)介绍和闪烁LED小灯

    目录 1.电磁干扰 2.电容介绍 3.三极管在数字电路中的应用 3.1.三极管介绍 3.2.三极管的原理 3.3.三极管的应用 4.74HC245介绍 4.1.74HC245引入 4.2.74HC24 ...

  7. 51单片机实验——LED小灯的操作(一)

    目录 引言 led模块原理图解析 led小灯的操作 1.点亮led小灯 位操作法 总线操作法 2.闪烁led小灯 位操作法 总线操作法 3.led流水灯 位操作法 总线操作法 总线操作-数组循环遍历法 ...

  8. 单片机led灯闪烁实验总结_单片机很好玩3,花三分钟,使用普通LED小灯,制作手机“呼吸灯”...

    上一节为了解决单片机 IO 电流驱动能力不足,导致 LED 小灯亮度不高的问题,借助了三极管.单片机的 IO 通过三极管开关 LED 小灯的电流,最后的确明显让小灯的亮度更高了. 使用电路模拟软件 还 ...

  9. 使用esp 8266物联网开发板 + Mqtt制作远程控制LED小灯

    背景 某一天修家里的LED小夜灯的时候, 发现这东西, 貌似我也有能力捣鼓一个一样的, 我总是会被突如其来的想法打乱近期的计划, 不过也能收获许多意外之喜(啊~ 知识的味道), 搜了一下板子价格, 才 ...

最新文章

  1. 编程语言发展70年,用50种不同语言输出「Hello World」
  2. 整合Web应用与Axis2
  3. mapreduce框架详解
  4. P3932 浮游大陆的68号岛
  5. [原]动态打jar包程序,可用于手机图片音乐游戏的动态打包
  6. Angular zone学习笔记
  7. Tips--解决安装matplotlib无法使用pyplot的问题
  8. webrtc自动增益
  9. linux中级之ansible配置(roles)
  10. html页面发送post请求中文乱码,用XMLHTTP Post/Get HTML页面时的中文乱码问题之完全Script解决方案...
  11. 作业一:建立博客、自我介绍、速读教材、学习进度总结(1)
  12. vm9.02的序列号
  13. c语言烟花代码,C语言烟花程序
  14. 修改 设备的mac 地址
  15. 用php向新年问候,春节好早安问候语:适合新的一年发的朋友圈祝语
  16. 又双叒叕上调派送费,这次“四通一达”们能坚持多久?
  17. 软件测试工作学习必备指南——硬实力
  18. 电脑录屏软件帧率设置详解
  19. 曙光LINUX是什么系统,国产操作系统的曙光----深度操作系统Deepin
  20. 项目干系人管理-知识领域

热门文章

  1. H5中需要掌握的 ANIMATION 动画效果
  2. c语言中数组的变量j是什么,C语言中x[i][j]的意思是?
  3. 【百问网7天物联网智能家居】训练营学习笔记(二)(需求分析,框架建立)
  4. MSP430单片机的ADC详解
  5. 设置adobe reader pro的文本框字体属性
  6. Bounding-box regression in RCNN/Faster-RCNN/SSD
  7. smtplib 抄送邮件_python 2.7 利用smtplib发送、抄送邮件以及发送html表格
  8. 众多日历网页特效素材一键即可获取
  9. 心形曲线(java)
  10. 智慧大脑的搭建在智慧工地管理系统中有何作用