admin管理员组文章数量:1619276
网上那么多教程~没有一个本喵喜欢的,那本喵就自己做一个吧
🌟【一站式教程】精通ESP32:使用VSCode与PlatformIO构建FreeRTOS项目、WIFI网页智能灯控系统、蓝牙、有趣的小功能 — 从轻松入门到项目实战
📚 目录
- 🎉 简介
- 🔍 ESP32概述
- ✨ 为什么选择FreeRTOS
- 🚀 VSCode与PlatformIO的优势
- 📦 准备工作
- 💻 安装VSCode
- 🔌 安装PlatformIO插件
- 🛠 配置环境
- 🔑 基础知识
- 📚 FreeRTOS基础
- 🔧 ESP32硬件概览
- 🚀 第一个FreeRTOS项目
- 🎯 创建项目
- 📂 工程结构解析
- 🎓 简单任务创建
- ⬆️ 编译与上传
- 🚧 ESP32特定功能探索
- 📡 WiFi功能实现,项目实战一个网页智能灯控系统
- 🔵 蓝牙功能实现
- 💤 深度睡眠模式
- 🚀 学习路径
一、🎉 简介
🔍 ESP32概述
ESP32是一款低功耗微控制器,由Espressif Systems生产,支持Wi-Fi和蓝牙功能。它拥有丰富的外设接口和强大的处理能力,非常适合物联网项目。
✨ 为什么选择FreeRTOS
FreeRTOS是一个开源的实时操作系统(RTOS),为多任务环境提供丰富的API。它能够让开发者更高效地管理任务优先级、内存和时间片,使得ESP32能够同时处理多个操作并保持高效和稳定。
// FreeRTOS任务示例代码
void TaskFunction( void *pvParameters )
{
for( ;; )
{
// 任务功能代码
}
}
🚀 VSCode与PlatformIO的优势
乖乖,Vscode插件那么多,不会有人喜欢用传统开发模式吧?不会吧不会吧??
二、 📦 准备工作
💻 安装VSCode
Visual Studio Code (VSCode) 是一款免费、开源的代码编辑器,由Microsoft开发。它支持多种编程语言的代码高亮、智能提示、代码调试等功能,非常适合进行嵌入式开发。安装VSCode是开始使用PlatformIO的第一步。
访问VSCode官网:https://code.visualstudio/
根据您的操作系统选择相应的安装包下载。
打开下载的安装包并遵循安装向导进行安装。
🔌 安装PlatformIO插件
PlatformIO是一个开源的生态系统,用于物联网开发,支持多种开发板,包括ESP32。作为VSCode的一个插件,PlatformIO极大地简化了跨平台的嵌入式开发。
打开VSCode。
访问侧边栏的"扩展"选项(或使用快捷键Ctrl+Shift+X)。
在搜索框输入"PlatformIO"。
找到PlatformIO IDE插件并点击"安装"。
按F1键打开顶部状态栏、打开后搜索PlatformIO:PlatformIO Home,点击
❗确保网络良好,等待PlatformIO core初始化,这段时间PlatformIO将从Github拉取资源
三、 🔑 基础知识
在深入开发之前,理解FreeRTOS和ESP32的基础知识是非常重要的。
📚 FreeRTOS基础
FreeRTOS是一个小型开源实时操作系统(RTOS),适用于嵌入式设备。在FreeRTOS中,程序被分为多个任务,通过调度器管理,允许多任务并发执行。
任务:任务是程序的一个独立执行流,可以是无限循环的,也可以执行特定任务后结束。
信号量与互斥量:用于任务间同步和互斥访问资源。
队列:允许任务间安全地交换数据。
任务实例:
// 创建一个简单的任务
xTaskCreate(
vTaskFunction, /* 任务函数 */
"TaskName", /* 任务名称 */
STACK_SIZE, /* 堆栈大小 */
NULL, /* 传递给任务的参数 */
TASK_PRIORITY, /* 任务优先级 */
NULL /* 任务句柄 */
);
🔧 ESP32硬件概览
以Esp32WROOM系列为例,熟悉硬件IO和功能,在软件中配置好对应功能,就是我们首要要做的事情
🚀 第一个FreeRTOS项目](#第一个FreeRTOS项目)
年前本喵手焊的一个小ESP32板子,就作为本篇教程的演示道具啦~
🎯 创建项目
打开PlatfrormIO Home后,点击新建项目(New Project按钮)
输入项目名,在Board搜索esp32,我这里选择Adafruit Esp32 Feather
选择Arduino Framework
点击Finish
项目创建完毕❗初次使用耐心等待库文件下载完成
📂 工程结构解析
第一个项目只需要关注platformio.ini(ESP32配置文件,诸如启用wifi等功能),main.cpp包含你想要运行的代码
🎓 简单任务创建(FreeRTOS异步数字串口发送)
在main.cpp文件中输入以下代码
#include <Arduino.h>
#include <freertos/FreeRTOS.h>
#include <freertos/task.h>
// 定义串口引脚
const int serialPin = 1; // 根据实际情况修改
// 定义任务句柄
TaskHandle_t task1Handle, task2Handle;
//发送数字,从一开始,每次加三
void task1(void *pvParameters) {
int value = 1;
while (1) {
Serial.print(value);
Serial.println();
vTaskDelay(pdMS_TO_TICKS(1000)); // 每秒发送一次
value += 3;
}
}
//发送数字,从二开始,每次加一
void task2(void *pvParameters) {
int value = 2;
while (1) {
Serial.print(value);
Serial.println();
vTaskDelay(pdMS_TO_TICKS(1000)); // 每秒发送一次
value += 1;
}
}
void setup() {
Serial.begin(115200);
// 创建任务
xTaskCreate(task1, "Task1", 10000, NULL, 1, &task1Handle);
xTaskCreate(task2, "Task2", 10000, NULL, 1, &task2Handle);
}
void loop() {
// 空循环,Arduino框架需要有loop函数
}
⬆️ 编译与上传
选择你的Esp32下载串口
等待一段时间
读取串口消息,运行成功,在不配置串口波特率情况下,Esp32默认波特率为115200~
四、🚧 ESP32特定功能探索
📡 WiFi功能实现(AP模式,WIFI网页控制开关灯)[Captive Portal模式]
Captive Portal模式可以在设备首次连接到Wi-Fi网络时捕获网络请求,并强制用户进入一个特定的网页,这样免除了我们手动输入ip地址进入控制网页~~
#include <WiFi.h>
#include <DNSServer.h>
#include <WebServer.h>
// SSID & Password
const char* ssid = "ESP32-Access-Point"; // 你的SSID
const char* password = "123456789"; // 你的密码
// DNS服务器和Web服务器的端口
const byte DNS_PORT = 53;
DNSServer dnsServer;
WebServer server(80);
// LED引脚设置为GPIO 15,这里需要改成自己的gpio端口
const int ledPin = 15;
// 设置HTML页面内容
String HTML = "<!DOCTYPE html><html><body>"
"<h1>ESP32 LED Control plan</h1>"
"<p><a href=\"/LED/on\">open LED</a></p>"
"<p><a href=\"/LED/off\">close LED</a></p>"
"</body></html>";
void handleRoot() {
server.send(200, "text/html", HTML);
}
void handleLedOn() {
digitalWrite(ledPin, HIGH);
server.send(200, "text/html", "<p>LED Opend</p><a href=\"/\">return</a>");
}
void handleLedOff() {
digitalWrite(ledPin, LOW);
server.send(200, "text/html", "<p>LED Closed</p><a href=\"/\">return</a>");
}
void setup() {
Serial.begin(115200);
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, LOW); // 默认LED关闭
// 设置ESP32为AP模式
WiFi.softAP(ssid, password);
Serial.println("ESP32作为Access Point启动");
// 启动DNS服务器,将所有域名请求重定向到本地
dnsServer.start(DNS_PORT, "*", WiFi.softAPIP());
// 设置Web服务器路由
server.on("/", handleRoot);
server.on("/LED/on", handleLedOn);
server.on("/LED/off", handleLedOff);
// 捕获所有未定义的请求并重定向到根目录
server.onNotFound([]() {
server.send(200, "text/html", HTML);
});
server.begin();
Serial.println("Web服务器已启动");
}
void loop() {
dnsServer.processNextRequest(); // 处理DNS重定向
server.handleClient(); // 处理HTTP请求
}
将这段代码放入main.cpp,由于Captive Portal模式,该页面将会自动打开
上传编译运行效果
🔵 蓝牙功能实现
#include <Arduino.h>
#include <BLEDevice.h>
#include <BLEUtils.h>
#include <BLEServer.h>
// 定义BLE服务和特征值的UUID
#define SERVICE_UUID "12345678-1234-5678-1234-56789abcdef0"
#define CHARACTERISTIC_UUID "abcdef12-3456-7890-1234-56789abcdef0"
void setup() {
Serial.begin(115200);
BLEDevice::init("ESP32_BLE");
BLEServer *pServer = BLEDevice::createServer();
BLEService *pService = pServer->createService(SERVICE_UUID);
BLECharacteristic *pCharacteristic = pService->createCharacteristic(
CHARACTERISTIC_UUID,
BLECharacteristic::PROPERTY_READ |
BLECharacteristic::PROPERTY_WRITE
);
pCharacteristic->setValue("Hello World");
pService->start();
BLEAdvertising *pAdvertising = BLEDevice::getAdvertising();
pAdvertising->addServiceUUID(SERVICE_UUID);
pAdvertising->setScanResponse(true);
pAdvertising->setMinPreferred(0x06); // 函数间隔,该值越小功耗越高
pAdvertising->setMinPreferred(0x12);
BLEDevice::startAdvertising();
Serial.println("BLE服务已启动");
}
void loop() {
// 这里不需要做任何事情
}
配对成功~~~
💤 深度睡眠模式
#include <Arduino.h>
#include <esp_sleep.h>
void setup() {
Serial.begin(115200);
delay(1000); // 等待串口连接
Serial.println("ESP32即将进入深度睡眠模式...");
// 设置唤醒源为定时器,唤醒时间为10秒后
esp_sleep_enable_timer_wakeup(10 * 1000000);
esp_deep_sleep_start();
}
void loop() {
// 在深度睡眠模式下,设备不执行loop()
}
运行结果:
esp32睡着了,没有结果😱
🚀 学习路径
项目里的所有代码都在这啦~~点个赞再走吧嘿嘿
https://github/TheRoadToReality/esp32-tutorial
进一步学习资料
https://www.youtube/watch?v=aZ13q9g28ygesp32机械狗项目,全开源
https://www.youtube/watch?v=ApGwxX6VVzkesp32 web server
版权声明:本文标题:【一站式教程】精通ESP32:使用VSCode与PlatformIO构建FreeRTOS项目、WIFI网页智能灯控系统、蓝牙、有趣的小功能 — 从轻松入门到项目实战~ 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/dianzi/1728800185a1174392.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论