1. 环境准备与工具配置
作为一个玩了十多年嵌入式开发的老鸟,我真心觉得ESP32搭配PlatformIO和VSCode是目前最舒服的开发组合。还记得以前用各种IDE配置环境的日子吗?那真是噩梦啊!现在用这个组合,5分钟就能搞定开发环境,特别适合刚入门的小伙伴。
先说说为什么选这个组合。VSCode是个超级轻量级的代码编辑器,启动速度快到飞起,而且插件生态丰富到爆炸。PlatformIO则是专门为物联网开发打造的生态系统,帮你自动处理各种依赖库和编译工具链,再也不用头疼环境配置了。
安装步骤其实超级简单。首先去VSCode官网下载最新版本,安装过程就是一路下一步。装好后打开VSCode,在扩展商店里搜索PlatformIO IDE,点安装就行。这里有个小坑要注意:安装过程中需要保持网络畅通,因为PlatformIO会自动下载必要的工具链,第一次初始化可能需要几分钟,耐心等待就好。
安装完成后,你会看到左边侧边栏多了一个小蚂蚁图标,那就是PlatformIO。点开它,选择"New Project",输入项目名称,比如"smart-home-demo"。在Board选项里搜索ESP32,我一般选"Espressif ESP32 Dev Module",这个兼容性最好。Framework选Arduino,虽然ESP-IDF更强大,但对新手来说Arduino框架更友好。
创建项目后,PlatformIO会自动生成项目结构。重点关注两个文件:platformio.ini是配置文件,src/main.cpp是主程序文件。platformio.ini里可以配置串口波特率、上传速度等参数,我一般会加上这几行:
monitor_speed = 115200
upload_speed = 921600
lib_deps =
adafruit/Adafruit Unified Sensor
这样配置后,串口监视器默认用115200波特率,上传速度更快,还自动安装了常用的传感器库。
2. FreeRTOS基础与多任务创建
FreeRTOS简直就是为ESP32量身定做的操作系统!ESP32是双核处理器,有了FreeRTOS才能真正发挥它的威力。我刚开始用的时候,最惊艳的就是可以同时跑多个任务而不会卡顿,这对智能家居项目太重要了。
先理解几个核心概念。任务(Task)就是独立的执行单元,比如一个任务负责WiFi连接,一个任务处理蓝牙数据,它们可以同时运行。队列(Queue)是任务间传递数据的安全方式,避免资源冲突。信号量(Semaphore)用来同步任务,比如确保某个资源同时只被一个任务使用。
创建任务超级简单。看这个例子,我们创建两个任务,一个控制LED闪烁,一个读取传感器数据:
#include <Arduino.h>
#include <freertos/FreeRTOS.h>
#include <freertos/task.h>
TaskHandle_t ledTaskHandle, sensorTaskHandle;
void ledTask(void *pvParameters) {
pinMode(2, OUTPUT);
while(1) {
digitalWrite(2, !digitalRead(2));
vTaskDelay(500 / portTICK_PERIOD_MS);
}
}
void sensorTask(void *pvParameters) {
while(1) {
// 读取传感器代码
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
}
void setup() {
xTaskCreate(ledTask, "LED Task", 2048, NULL, 1, &ledTaskHandle);
xTaskCreate(sensorTask, "Sensor Task", 4096, NULL, 1, &sensorTaskHandle);
}
void loop() {
vTaskDelete(NULL); // 删除默认的loop任务
}
这里有几个实用技巧:堆栈大小设置要合理,LED任务2048字节就够了,但传感器任务可能需要4096字节。优先级一般设为1,数字越大优先级越高。vTaskDelay用的是系统节拍数,用portTICK_PERIOD_MS转换时间更直观。
任务间通信很重要。比如传感器任务读到数据后要发给网络任务,可以用队列实现:
QueueHandle_t dataQueue = xQueueCreate(10, sizeof(sensor_data_t));
// 发送端
sensor_data_t data;
xQueueSend(dataQueue, &data, portMAX_DELAY);
// 接收端
sensor_data_t receivedData;
if(xQueueReceive(dataQueue, &receivedData, 1000 / portTICK_PERIOD_MS)) {
// 处理数据
}
这样设计的好处是解耦了各个功能,后续添加新功能很容易。我做过一个智能灯项目,同时处理网页控制、蓝牙遥控、定时开关,全靠FreeRTOS的多任务能力才没崩掉。
3. WiFi功能实现与网页控制
ESP32的WiFi功能强大到离谱,既可以做Station连接路由器,也能做AP直接提供热点。在智能家居项目中,我更

2543

被折叠的 条评论
为什么被折叠?



