4、主控芯片选型:ESP32 vs STM32 vs 树莓派,为什么选择ESP32?
做农业空气站,第一个要拍板的事就是:用哪颗芯片当大脑?
说实话,市面上能选的方案太多了。STM32、树莓派、ESP32,这三兄弟各有各的脾气。我当年第一次做环境监测产品时,也在这三个之间纠结了很久。今天咱们就掰扯清楚,为什么我最终选了ESP32,以及它的资源到底怎么分配。
4.1 三款芯片的硬碰硬对比
先看一张对比表,心里有个底:
| 对比项 | ESP32 | STM32(F4系列) | 树莓派(Zero W) |
|---|---|---|---|
| 核心架构 | 双核 Xtensa LX6 | 单核 Cortex-M4 | 单核 ARM Cortex-A53 |
| 主频 | 240 MHz | 168 MHz | 1 GHz |
| WiFi/蓝牙 | 内置双模 | 需外挂模块 | 内置WiFi |
| ADC精度 | 12位(2个SAR ADC) | 12位(3个) | 无(需外接) |
| 典型功耗 | ~80 mA(WiFi开启) | ~50 mA | ~150 mA |
| 价格(批量) | ¥15-25 | ¥20-40 | ¥80-120 |
| 开发难度 | 中等(Arduino/ESP-IDF) | 较高(HAL/LL库) | 低(Linux系统) |
看到这,你可能觉得STM32功耗更低,树莓派性能更强。但别急,咱们做的是农业空气站,不是跑AI训练。实际场景里,有些东西比参数更重要。
4.2 为什么我选ESP32?三个核心原因
第一,WiFi/蓝牙是刚需,ESP32天生自带。
农业空气站要上传数据到云平台,WiFi是标配。如果用STM32,你得额外加一个ESP8266或者W5500模块。多一个芯片,就多一份布线麻烦、多一份故障点。我在项目中遇到过,外挂WiFi模块的STM32板子,天线匹配没做好,信号死活调不好。而ESP32的射频是原厂调好的,省心太多。
第二,双核架构,一个干活一个联网。
ESP32有两个核心。我的习惯是:Core 0跑WiFi协议栈和蓝牙,Core 1跑传感器采集和逻辑控制。这样网络再卡顿,也不会影响数据采集的实时性。你想想看,如果单核芯片在采集数据时突然要处理WiFi重连,采样就会丢包。这在农业监测里是致命的。
第三,性价比太香了。
批量价15块钱,你买到一个双核240MHz、带WiFi蓝牙、12位ADC的芯片。同样的功能用STM32搭出来,成本至少翻倍。做产品嘛,成本控制是硬道理。
我的结论: 农业空气站这种物联网终端,ESP32是当前最平衡的选择。它不完美,但够用、便宜、好开发。
4.3 ESP32的GPIO资源分配
ESP32有34个GPIO,但不是所有都能随便用。嗯,这里要注意:有些引脚有特殊功能,踩过坑的人都知道。
我列一个典型的农业空气站引脚分配方案:
| 功能 | 引脚 | 备注 |
|---|---|---|
| PM2.5传感器(PWM输出) | GPIO 4 | 支持脉冲捕获 |
| 温湿度传感器(单总线) | GPIO 5 | DHT22/AM2301 |
| CO2传感器(UART) | GPIO 16 (TX), GPIO 17 (RX) | MH-Z19B常用 |
| 风速传感器(脉冲) | GPIO 18 | 中断引脚 |
| 风向传感器(模拟) | GPIO 36 (ADC1_CH0) | 必须用ADC1通道 |
| OLED显示屏(I2C) | GPIO 21 (SDA), GPIO 22 (SCL) | 标准I2C引脚 |
| 继电器控制 | GPIO 32, GPIO 33 | 输出控制 |
| SD卡模块(SPI) | GPIO 14 (CLK), 13 (MOSI), 12 (MISO), 27 (CS) | VSPI接口 |
避坑指南: 我曾经把风向传感器接到GPIO 2上,结果死活读不到数据。查了半天才发现,GPIO 2在启动时会被拉高,影响ADC采样。所以模拟输入尽量用ADC1的通道(GPIO 36-39),这些引脚没有额外功能,最干净。
4.4 ADC资源分配:别踩模拟输入的坑
ESP32有两个ADC模块:ADC1和ADC2。这里有个大坑——ADC2在WiFi开启时会被占用。你想想看,如果风向传感器接在ADC2上,WiFi一工作,数据就飘了。
我的建议: 所有模拟传感器全部接到ADC1的通道上(GPIO 36、39、34、35)。ADC2留给那些不常用的功能,或者干脆不用。
ADC的参考电压是0-3.3V,12位分辨率,也就是0-4095。但实际测量时,线性度在两端会变差。我一般只使用10%-90%的量程,也就是0.33V到2.97V之间,这样数据最准。
4.5 I2C与UART资源分配
I2C总线: ESP32有两个I2C控制器。我通常把传感器和显示屏挂在不同总线上,防止地址冲突。比如:
- I2C0(GPIO 21/22):挂OLED屏幕、光照传感器
- I2C1(GPIO 26/27):挂土壤湿度传感器、气压传感器
UART串口: ESP32有3个UART。分配方案如下:
- UART0(GPIO 1/3):调试日志输出(接USB转串口)
- UART1(GPIO 16/17):CO2传感器(MH-Z19B)
- UART2(GPIO 4/5):备用,接GPS模块或4G透传模块
小技巧: 调试时UART0会输出启动信息,如果你接的传感器也用UART0,会互相干扰。我习惯把调试口单独留出来,产品量产时甚至可以去掉这个接口,省一个USB转串口芯片的成本。
4.6 WiFi与蓝牙的资源分配
ESP32的WiFi和蓝牙共用同一个射频前端,不能同时全速工作。但在农业空气站场景里,这完全不是问题。
我的分配策略:
- WiFi: 主用。每5分钟上传一次数据到云平台。使用Station模式连接路由器。
- 蓝牙: 仅用于现场调试和固件升级。平时处于休眠状态,需要时通过按键唤醒。
代码里怎么切换?很简单:
// 初始化WiFi,蓝牙默认关闭
WiFi.begin(ssid, password);
btStop(); // 关闭蓝牙,节省资源
// 需要蓝牙调试时
esp_bt_controller_enable(ESP_BT_MODE_BTDM);
// 调试完毕
esp_bt_controller_disable();
这样做的好处是:WiFi连接稳定,蓝牙不占带宽。我曾经见过有人让WiFi和蓝牙同时跑,结果数据包互相干扰,丢包率高达30%。
4.7 总结:ESP32就是为物联网而生的
选芯片就像选工具,没有最好的,只有最合适的。ESP32在农业空气站这个场景里,把成本、性能、集成度平衡得刚刚好。
你想想看,一颗15块钱的芯片,集成了双核处理器、WiFi、蓝牙、ADC、I2C、UART,还能跑FreeRTOS。这在五年前根本不敢想。我当年做第一个物联网项目时,用STM32+ESP8266+外部ADC,板子面积大了一倍,成本高了30%,调试周期多了一个月。
所以,别犹豫了。咱们这个课程,就用ESP32。下一节,我会带你搭建开发环境,把第一行代码跑起来。