合宙 EPS32-C3 把玩记录(二):WiFi 与一个 Web 程序

了解一下相关的库

  • 串口通信

这个库是自带的,不需要引入。

据我的理解,单片机的串口就是控制台程序的控制台,可以返回一些信息给上位机。

会用到的几个指令:

1
2
3
4
5
6
7
Serial.begin(Baudrate);	//参数为串口通信的波特率
Serial.end();
Serial.read(); //读取串口收到数据的第一个字节
Serial.peek(); //读取串口数据中下一字节的内容
Serial.flush(); //清空缓冲区
Serial.print/println(); //不用多说
Serial.write(); //写二进制数据
  • WiFi.h

#include <WiFi.h>

AP(接入点) Mode

创建一个接入点。

1
2
3
4
5
WiFi.mode(WiFi_AP);			//设置工作在 AP 模式
WiFi.softAPConfig(local_IP, gateway, subnet);
//定义本机 IP(这个不大确定)、网关 IP 和子网掩码
//IPAddress 数据类型格式:IPAddress local_IP(192,168,4,22);
WiFi.softAP(SSID,PASSWD); //启动 AP,参数不多解释,返回 bool

更多函数见 WiFi.h AP 常用方法说明

STA(站点) Mode

接入一个 AP。

1
2
3
WiFi.mode(WIFI_STA); 		//设置工作在 STA 模式
WiFi.start(SSID,PASSWD) //连接至 AP,参数不多解释
Serial.println(WiFi.localIP()); //打印本机 IP,省的去路由器管理界面看

更多函数见 WiFi.h STA 常用方法说明

  • WebServer.h

#include <WebServer.h>

创建一个简单的网站服务器。真的很简单。

一个个函数讲有点难理解,我放在这节的例程里面说明。

写一个测试程序吧

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <WiFi.h>
#include <WebServer.h>
//引入所需要的两个库

const char *SSID = "YOUR_SSID";
const char *PASSWORD = "YOUR_PASSWORD";

WebServer server(80); //网站服务器将运行在 80 端口

void handleIndex() //收到 HTTP 请求的回调函数
{
server.send(200, "text/plain", "Hello from ESP32!");
//发送 HTTP 相应,内容分别为:状态码,Content-Type,响应体
}

void setup()
{
Serial.begin(9600); //开启串口,波特率设置为 9600
Serial.println();

WiFi.mode(WIFI_STA); //设置工作在 STA 模式
WiFi.begin(SSID, PASSWORD); //连接至指定 AP
while (WiFi.status() != WL_CONNECTED) //等待网络连接成功
{
delay(500);
Serial.print("."); //将连接信息输出至串口
}
Serial.println("WiFi connected!");

Serial.println("IP address: ");
Serial.println(WiFi.localIP()); //打印本机 IP

server.on("/", handleIndex); //注册链接(类似与注册一个路由),并选择回调函数
//同样的,还可以注册别的链接,如
//server.on("/test", handleIndexTest);

server.begin(); //开启 HTTP 服务器
Serial.println("WebServer begin!");
}

void loop()
{
server.handleClient(); //不断相应 HTTP 请求
}

访问串口返回的 IP,即可看到 Hello from ESP32! 这句话啦。

还有个 Web Server 叫 ESPAsyncWebServer

自带的 WebServer 是同步的,只支持处理一个连接。对于这种体量的机器其实足够了。

顺便学习一下一个第三方库吧。

添加库

对于这款 ESP32,需要下载并导入两个库(源码 ZIP 即可):

me-no-dev/AsyncTCP: Async TCP Library for ESP32

me-no-dev/ESPAsyncWebServer: Async Web Server for ESP8266 and ESP32

在 Arduino 的项目 > 加载库 > 添加 .ZIP 库中导入这两个库。

用 ESPAsyncWebServer 重写刚刚的例程吧

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <WiFi.h>
#include <ESPAsyncWebServer.h>
//注意替换为新的库

const char *SSID = "YOUR_SSID";
const char *PASSWORD = "YOUR_PASSWORD";

ESPAsyncWebServer server(80); //同样替换为新的对象

void handleIndex(AsyncWebServerRequest *request) //回调函数有更改
{
request->send(200, "text/plain", "Hello, world!");
//发送 HTTP 相应,内容相同
}

void setup()
{
Serial.begin(9600); //开启串口,波特率设置为 9600
Serial.println();

WiFi.mode(WIFI_STA); //设置工作在 STA 模式
WiFi.begin(SSID, PASSWORD); //连接至指定 AP
while (WiFi.status() != WL_CONNECTED) //等待网络连接成功
{
delay(500);
Serial.print("."); //将连接信息输出至串口
}
Serial.println("WiFi connected!");

Serial.println("IP address: ");
Serial.println(WiFi.localIP()); //打印本机 IP

server.on("/", handleIndex); //注册链接(类似与注册一个路由),并选择回调函数
//同样的,还可以注册别的链接,如
//server.on("/test", handleIndexTest);

server.begin(); //开启 HTTP 服务器
Serial.println("WebServer begin!");
}

void loop()
{
//不用在这儿监听 HTTP 请求了
}

理论上来讲,上面的代码应该是正确的……

但 Arduino 在编译的时候报错,内容是 ESPAsyncWebServer 库中的某些代码。

有待我弄清楚出错的原因。


合宙 EPS32-C3 把玩记录(二):WiFi 与一个 Web 程序
https://blog.udon.eu.org/archives/9b58c98e.html
作者
Kare Udon
发布于
2022年3月27日
许可协议