前言

其实在大二的时候就接触过 ESP8266,用人家(正点原子)封装好阿固件实现 WiFi 透传,而且耳闻 ESP8266 开发简单,但是一直没有机会接触到并且尝试开发。

最近又在很多地方看到使用 ESP8266 或者 ESP32 为基础做出来的作品,看到稚晖君对 ESP32 的好评,并且在一些机缘巧合下开新坑

目前对 ESP32 & ESP8266 开发还不算太熟悉,后期会继续更新(咕咕咕)。

曲折的环境搭建过程

其实刚开坑搭建环境时走了非常多弯路,遇到的问题那就一个字。

刚开始的时候使用 Arduino 1.8.x 来进行开发,但是连个语法提示都没有,编译速度还慢,而且库放置的位置也不能自定义,极其不方便。

后来参考文章来用 Vscode 的 Arduino 插件来协助经行开发,但是发现能够自定义的内容还是非常有限,比如说这个插件只有“验证”和“上传”两个按键,我对这块芯片掌握非常空白。

后来又尝试 Arduino 2.0.x(beta 不稳定),一开始打开的时候觉得非常不错,直到新建个项目都会崩溃。。

再后来又尝试 Arduino CLI 配合 VSCode 插件,然后甚至手动配置 VSCode 调用工具链来进行编译,上传。但是使用一段时间后又觉得编译速度还是慢了,而且查文档、配置任务的成本还很大,然后我又踏上了寻找更好的开发环境的旅程。

然后又尝试了一下 VSCode 的 Espressif 插件,但是尝试了一下不支持(也可能是没有发现) ESP8266 的开发,而且不支持 Arduino 内核,还是没有成功。

最最后不抱希望地去尝试 VSCode 地 PlatformIO 插件(以前尝试用这个插件开发过 STM32,感觉很差所以一开始并没有好感),发现意外地容易上手,而且支持很多其他功能,例如:OTA升级,打包 SPIFFS 镜像,配置其他脚本等等,我最后的结论是 PlatformIO 真香

1. 开发环境的安装

1.1 Visual Studio Code

https://code.visualstudio.com/

1.2 Python

烧录和自定义脚本需要用到 Python (3.5版本以上)

https://python.org/download

1.3 PlatformIO

在 VSCode 拓展市场下载并安装 PlatformIO

VSCode 下载 PlatformIO

PlatformIO 菜单页面介绍

2. 初步开发尝试

2.1 新建项目

在PlatformIO主页点击New Project按键新建工程。

PlatformIO 菜单页面介绍

第一次创建项目时会自动下载对应的驱动,速度较慢

项目创建完成后,项目目录如下:
项目目录

2.2 编写程序

src/main.cpp文件中编写程序,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <Arduino.h>

#define LED_PIN 0 //在本开发板种,LED对应的引脚为 IO0

void setup() {
Serial.begin(115200);
pinMode(LED_PIN, OUTPUT);
}

void loop() {
/* 点亮 LED */
Serial.println("LED ON");
digitalWrite(LED_PIN, LOW);
delay(1000);

/* 熄灭 LED */
Serial.println("LED OFF");
digitalWrite(LED_PIN, HIGH);
delay(1000);
}

2.3 编译和烧录

再次打开面板,可以看到以下内容

项目目录

点击Build进行编译,再点击Upload进行烧录(会自动检测串口并烧录),最后点击Monitor监控串口。

也可以直接点击UPload and Monitor一键编译烧录加串口监控。
(也可以点击左下角快捷按键来进行操作)

注意监控串口需要在platformio.ini文件中添加monitor_speed = 115200配置串口速率为115200,否则会使用默认的波特率来监控而显示乱码。

编译烧录演示

你已经学会点灯了,赶紧设计一套基于ESP32 的专业定制化系统吧

3 相关例程和资料

3.1 资料 & 文档

想要进一步开发就需要先知道从哪找资料和代码。

以下是一些我常用的资料:

3.2 ESP8266 和 ESP32 例程

PlatformIO 在创建项目的时候同时会下载依赖,这些依赖里面就有 ESP8266 和 ESP32 的例程。

例如 ESP8266 的库会默认下载在C:\Users\你的用户名\.platformio\packages\framework-arduinoespressif8266\libraries的文件夹下,每个子文件夹下都有相应的例程。

例如你想用 ESP8266 部署网页供移动设备访问,就可以在.\libraries\PostServer\examples\PostServer.ino文件夹下找到一个部署网页的例程。

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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>

#ifndef STASSID
#define STASSID "your-ssid"
#define STAPSK "your-password"
#endif

const char* ssid = STASSID;
const char* password = STAPSK;

ESP8266WebServer server(80);

const int led = LED_BUILTIN;

const String postForms = "<html>\
<head>\
<title>ESP8266 Web Server POST handling</title>\
<style>\
body { background-color: #cccccc; font-family: Arial, Helvetica, Sans-Serif; Color: #000088; }\
</style>\
</head>\
<body>\
<h1>POST plain text to /postplain/</h1><br>\
<form method=\"post\" enctype=\"text/plain\" action=\"/postplain/\">\
<input type=\"text\" name=\'{\"hello\": \"world\", \"trash\": \"\' value=\'\"}\'><br>\
<input type=\"submit\" value=\"Submit\">\
</form>\
<h1>POST form data to /postform/</h1><br>\
<form method=\"post\" enctype=\"application/x-www-form-urlencoded\" action=\"/postform/\">\
<input type=\"text\" name=\"hello\" value=\"world\"><br>\
<input type=\"submit\" value=\"Submit\">\
</form>\
</body>\
</html>";

void handleRoot() {
digitalWrite(led, 1);
server.send(200, "text/html", postForms);
digitalWrite(led, 0);
}

void handlePlain() {
if (server.method() != HTTP_POST) {
digitalWrite(led, 1);
server.send(405, "text/plain", "Method Not Allowed");
digitalWrite(led, 0);
} else {
digitalWrite(led, 1);
server.send(200, "text/plain", "POST body was:\n" + server.arg("plain"));
digitalWrite(led, 0);
}
}

void handleForm() {
if (server.method() != HTTP_POST) {
digitalWrite(led, 1);
server.send(405, "text/plain", "Method Not Allowed");
digitalWrite(led, 0);
} else {
digitalWrite(led, 1);
String message = "POST form was:\n";
for (uint8_t i = 0; i < server.args(); i++) {
message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
}
server.send(200, "text/plain", message);
digitalWrite(led, 0);
}
}

void handleNotFound() {
digitalWrite(led, 1);
String message = "File Not Found\n\n";
message += "URI: ";
message += server.uri();
message += "\nMethod: ";
message += (server.method() == HTTP_GET) ? "GET" : "POST";
message += "\nArguments: ";
message += server.args();
message += "\n";
for (uint8_t i = 0; i < server.args(); i++) {
message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
}
server.send(404, "text/plain", message);
digitalWrite(led, 0);
}

void setup(void) {
pinMode(led, OUTPUT);
digitalWrite(led, 0);
Serial.begin(115200);
WiFi.begin(ssid, password);
Serial.println("");

// Wait for connection
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.print("Connected to ");
Serial.println(ssid);
Serial.print("IP address: ");
Serial.println(WiFi.localIP());

if (MDNS.begin("esp8266")) {
Serial.println("MDNS responder started");
}

server.on("/", handleRoot);

server.on("/postplain/", handlePlain);

server.on("/postform/", handleForm);

server.onNotFound(handleNotFound);

server.begin();
Serial.println("HTTP server started");
}

void loop(void) {
server.handleClient();
}

注意将WiFi的SSID和密码替换掉。

烧录成功后串口打印结果如下:

POSTServer 例程烧录结果

在网页端访问可以看到如下结果:

网页端访问结果

如果能正常访问,那么就说明 ESP8266 上的 Web 服务器已经正常运行。

3.3 分享

以下是一个基于 ESP32 的 Web 服务器的项目,能够在 PlatformIO 实现串口烧录和 OTA 更新(一键上传),同时还部署了一个Bongo Jams(可以看看哦)。

https://github.com/9cats/ESP32_BongoJams

目前还是 ESP32 的版本,后续会更新(咕咕咕)。

参考

点击查看更新记录

更新记录

2022-5-9

第一次发布内容