前言
其实在大二的时候就接触过 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
在 VSCode 拓展市场下载并安装 PlatformIO
2. 初步开发尝试
2.1 新建项目
在PlatformIO主页点击New Project
按键新建工程。
第一次创建项目时会自动下载对应的驱动,速度较慢
项目创建完成后,项目目录如下:
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
void setup() { Serial.begin(115200); pinMode(LED_PIN, OUTPUT); }
void loop() { Serial.println("LED ON"); digitalWrite(LED_PIN, LOW); delay(1000);
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("");
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和密码替换掉。
烧录成功后串口打印结果如下:
在网页端访问可以看到如下结果:
如果能正常访问,那么就说明 ESP8266 上的 Web 服务器已经正常运行。3.3 分享
以下是一个基于 ESP32 的 Web 服务器的项目,能够在 PlatformIO 实现串口烧录和 OTA 更新(一键上传),同时还部署了一个Bongo Jams
(可以看看哦)。
https://github.com/9cats/ESP32_BongoJams
目前还是 ESP32 的版本,后续会更新(咕咕咕)。
参考
点击查看更新记录