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。下一节,我会带你搭建开发环境,把第一行代码跑起来。