3、硬件平台选型:主控芯片(ESP32/STM32)、传感器接口、存储芯片选型

好,咱们直接进入正题。硬件选型这事儿,说简单也简单,说复杂也复杂。我见过不少项目,软件写得漂漂亮亮,结果硬件选型没做好,最后整个系统跑起来各种别扭。说白了,选型就是给整个固件系统打地基,地基不稳,后面全是坑。

3.1 主控芯片:ESP32 vs STM32,怎么选?

我个人习惯,拿到一个农业空气质量站的需求,第一件事就是定主控。为什么?因为主控决定了你的开发方式、成本、功耗,甚至团队能不能按时交付。

咱们先看两个主流方案:

对比项 ESP32 STM32(如F4/H7系列)
无线能力 内置Wi-Fi + BLE,开箱即用 需外挂无线模块(ESP8266/ESP32作为协处理器)
处理性能 双核240MHz,够用 单核/双核,最高可达400MHz+,更强
ADC精度 12位,但噪声较大 12位/16位,精度更高,稳定性好
开发生态 Arduino/ESP-IDF,上手快 HAL/LL库,RTOS成熟,资料多
成本 约15-25元(模组) 约20-60元(芯片)
功耗 深睡约5μA,但Wi-Fi开启时功耗高 低功耗模式更灵活,可做到1μA以下

嗯,这里要注意。如果你做的是联网型的农业站,需要定时上传数据到云平台,我个人强烈建议用ESP32。为什么?因为省事。你想想看,一个传感器采集完数据,直接通过Wi-Fi就发出去了,不需要再折腾一个无线模块的驱动、AT指令解析、数据分包。我在项目中遇到过,用STM32+ESP8266的方案,光调试Wi-Fi模块的稳定性就花了两周,最后发现是电源纹波干扰了ESP8266的射频部分,折腾得够呛。

但如果你做的是高精度、低功耗的场景,比如野外太阳能供电,需要采集高精度模拟传感器信号(比如电化学气体传感器),那我建议用STM32。它的ADC内置了硬件过采样和校准功能,出来的数据干净很多。我曾经用ESP32的ADC去读一个电化学氨气传感器,数据跳得跟心电图似的,后来换了STM32的16位ADC,配合软件滤波,数据才稳下来。

我的选型建议:

  • 需要Wi-Fi直连、快速原型验证 → 选ESP32
  • 需要高精度模拟采集、超低功耗、工业级稳定性 → 选STM32
  • 预算敏感、量大的产品 → 选ESP32(模组便宜)
  • 需要跑复杂算法(如气象预测、传感器融合) → 选STM32 H7系列

3.2 传感器接口:别让信号死在路上

选完主控,接下来就是传感器接口。农业空气质量站常用的传感器,接口类型就那么几种:

  • I2C:温湿度(SHT30/40)、光照(BH1750)、CO2(SCD30)
  • SPI:高精度ADC(如ADS1256)、颗粒物传感器(如PMS5003的SPI模式)
  • UART:激光粉尘传感器(PMS系列)、GPS模块、4G模块
  • 模拟量(0-5V/4-20mA):电化学气体传感器、风速风向传感器
  • 单总线:DS18B20温度传感器(虽然现在用得少了)

这里我想重点说一下模拟量接口。很多做物联网的朋友,一上来就买那种工业级的4-20mA输出的气体传感器,觉得抗干扰能力强。没错,抗干扰是强,但你要注意:你的主控能不能直接读4-20mA? 答案是不能。你需要一个高精度电阻(比如250Ω)把电流信号转成电压信号,再送到ADC。而且这个电阻的精度和温漂直接影响测量结果。

我的经验: 如果你用4-20mA传感器,建议在信号输入端加一个TVS管(比如SMBJ5.0A)和RC低通滤波(电阻100Ω,电容0.1μF)。我在野外站点上吃过亏,雷雨天气时传感器信号线感应到了浪涌,直接把ADC引脚打坏了。从那以后,所有模拟输入口我都加了保护。

再说说I2C接口。农业站里I2C设备往往很多,温湿度一个、光照一个、CO2一个,可能还有气压计。这时候要注意总线电容。I2C总线上的设备越多,线越长,总线电容就越大,信号就容易变形。我建议:

  • 总线上挂的设备不要超过4-5个
  • 总线长度控制在30cm以内
  • 上拉电阻用4.7kΩ(如果总线长,可以换成2.2kΩ)
  • 如果设备超过5个,考虑用I2C多路复用器(如TCA9548A)

举个例子,我做过一个站,挂了6个I2C设备,结果SCL/SDA波形已经变成了正弦波,通信时好时坏。后来拆成两路I2C总线,问题就解决了。

3.3 存储芯片选型:数据不能丢

农业站的数据存储,说白了就两个场景:

  1. 实时存储:采集到的数据先存起来,等Wi-Fi/4G通了再上传
  2. 日志存储:记录设备运行状态、异常事件、固件版本等

我常用的存储方案有这几种:

芯片类型 容量 接口 适用场景
W25Q64(SPI Flash) 8MB SPI 存储固件、配置文件、少量数据
W25Q128(SPI Flash) 16MB SPI 存储固件+OTA升级包+数据缓存
MicroSD卡(SPI/SDIO) 32GB+ SPI/SDIO 大量数据记录(如每分钟一条,存一年)
EEPROM(如AT24C02) 2KB-64KB I2C 存储校准参数、设备ID、网络配置

嗯,这里我要特别提醒一下。很多人觉得SPI Flash便宜又好用,就直接用它存所有数据。但你要知道,SPI Flash的擦写寿命是有限的,一般是10万次。如果你每秒写一次数据,那不到两天就写废了。所以:

  • 频繁写入的数据(比如每分钟的传感器读数)→ 用SD卡或外部RAM+定时批量写入Flash
  • 不常改动的数据(比如Wi-Fi密码、校准系数)→ 用EEPROM
  • 固件和OTA包 → 用SPI Flash,因为写入次数少,容量大

我曾经踩过的坑: 有一款产品,用W25Q64存储传感器数据,每5分钟写一次。结果半年后,用户反馈设备频繁死机。查到最后发现,Flash的某个块已经写坏了,导致文件系统崩溃。后来我改成了环形缓冲区算法,把写入均匀分布到所有块上,同时加了一个磨损均衡策略,问题才解决。

另外,如果你用ESP32,它内部有NVS(非易失性存储),可以用来存一些小的配置参数,比如设备ID、校准值。但NVS的容量有限(大约几十KB),而且频繁写入也会磨损。我一般只用它存那些上电后需要立即读取的参数,比如Wi-Fi凭证。

最后说一句,选存储芯片时,别忘了看工作温度范围。农业站经常在户外,夏天暴晒下机箱内部温度可能到70-80℃,冬天北方可能到-30℃。普通消费级的Flash芯片在低温下可能读写失败。我建议选工业级的(-40℃~85℃),贵不了几块钱,但可靠性高很多。

好了,硬件选型这块就聊到这儿。下一章咱们开始讲具体的电路设计,包括电源树、传感器接口电路、以及怎么把ESP32和STM32的IO口用好。到时候我会分享一些我实际画板子时踩过的坑,保证有用。