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 存储芯片选型:数据不能丢
农业站的数据存储,说白了就两个场景:
- 实时存储:采集到的数据先存起来,等Wi-Fi/4G通了再上传
- 日志存储:记录设备运行状态、异常事件、固件版本等
我常用的存储方案有这几种:
| 芯片类型 | 容量 | 接口 | 适用场景 |
|---|---|---|---|
| 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口用好。到时候我会分享一些我实际画板子时踩过的坑,保证有用。