admin管理员组

文章数量:1619290

网上那么多教程~没有一个本喵喜欢的,那本喵就自己做一个吧

🌟【一站式教程】精通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

本文标签: 蓝牙项目一站式实战入门