2、主控芯片选型:STM32 vs ESP32 vs Arduino,性能对比、功耗分析、外设资源评估,我为什么推荐ESP32。
做农业气象站,第一步就是选“大脑”。
说白了,主控芯片决定了你的气象站能做什么、能做多好、能用多久。市面上常见的选项就三个:STM32、ESP32、Arduino。我这些年三个平台都用过,踩过不少坑,今天跟你聊聊我的真实感受。
2.1 三款芯片的“底子”对比
先看硬指标。我直接给你一张表,一目了然。
| 参数 | STM32F103C8T6 | ESP32-WROOM-32 | Arduino Uno (ATmega328P) |
|---|---|---|---|
| 核心架构 | ARM Cortex-M3 | Xtensa LX6 双核 | AVR 8位 |
| 主频 | 72 MHz | 240 MHz | 16 MHz |
| SRAM | 20 KB | 520 KB | 2 KB |
| Flash | 64 KB | 4 MB (外挂) | 32 KB |
| WiFi/蓝牙 | 无 | 双模蓝牙 + WiFi | 无 |
| ADC精度 | 12位 | 12位 | 10位 |
| 工作电压 | 2.0V - 3.6V | 2.3V - 3.6V | 5V |
| 典型价格 | ¥8 - 15 | ¥15 - 25 | ¥25 - 40 (开发板) |
你看,光从纸面数据看,ESP32几乎是碾压级的。双核240MHz,520KB内存,还自带WiFi和蓝牙。STM32的强项是稳定和低功耗,但缺了无线功能。Arduino嘛……说实话,做教学还行,做产品有点吃力。
2.2 功耗分析:野外气象站的生命线
农业气象站通常放在田里、山上,拉电线不现实。所以功耗是核心指标。
我做过一个对比测试,用同样的锂电池供电,挂同样的传感器:
- Arduino Uno:运行模式约50mA,深度睡眠约5mA。5V供电,效率低。我试过用18650电池带它,两天就没电了。
- STM32:运行模式约30mA,停止模式约10μA。低功耗确实强,但你要自己写代码控制时钟和电源域,有点麻烦。
- ESP32:运行模式约80mA(开WiFi时飙到200mA+),但深度睡眠可以做到5μA以下。关键是它有个“ULP协处理器”,可以在深度睡眠下继续采集传感器数据。
嗯,这里要注意。ESP32开WiFi确实耗电,但农业气象站不需要一直联网。我一般设置成:每30分钟醒来一次,采集数据、上传、然后继续睡。这样算下来,平均功耗不到0.5mA。一块10000mAh的电池,撑半年没问题。
WiFi.setSleep(true);,续航直接翻了五倍。
2.3 外设资源评估:够用 vs 好用
农业气象站需要接哪些外设?我列一下常见的:
- 温湿度传感器(DHT22、SHT30)—— 需要1个GPIO
- 风速风向传感器(脉冲输出或RS485)—— 需要1个GPIO或1个UART
- 雨量计(脉冲计数)—— 需要1个GPIO
- 光照传感器(BH1750、MAX44009)—— 需要I2C
- 大气压传感器(BMP280)—— 需要I2C或SPI
- 土壤湿度传感器(模拟输出)—— 需要1个ADC
- 4G模块或LoRa模块(数据远传)—— 需要UART
- OLED显示屏(本地调试)—— 需要I2C
你算算,至少需要:3-4个GPIO、1个I2C、1个UART、1个ADC。Arduino Uno只有14个数字IO和6个模拟输入,勉强够用,但一旦你想加个SD卡存储或者多接几个传感器,IO就不够了。
STM32的F103系列有37个IO,资源很富裕。但问题是——它没有WiFi。你要另外加ESP8266或者4G模块,成本和复杂度都上去了。
ESP32呢?它有34个GPIO,3个UART,2个I2C,2个SPI,2个12位ADC。而且WiFi和蓝牙是集成的。你想想看,一个芯片搞定采集、处理、无线传输,省了多少事。
我为什么推荐ESP32?
三个理由:
- 集成无线:自带WiFi和蓝牙,省掉一个通信模块。对于农业气象站这种需要远程数据传输的场景,这是刚需。
- 性能冗余:双核240MHz,跑FreeRTOS毫无压力。你可以一个核跑传感器采集,一个核跑网络协议栈,互不干扰。
- 生态成熟:Arduino IDE、MicroPython、ESP-IDF都能用。社区资源丰富,遇到问题一搜就有答案。
2.4 避坑指南:我踩过的三个坑
说了这么多ESP32的好,也得说说它的坑。毕竟没有完美的芯片。
坑一:ADC线性度差
ESP32的ADC在中间段还算准,但靠近0V和3.3V时非线性严重。我曾经用它直接读取土壤湿度传感器的模拟输出,结果数据飘得离谱。后来我加了外部ADC(ADS1115),问题才解决。如果你对模拟量精度要求高,建议外挂ADC。
坑二:WiFi干扰传感器
ESP32的WiFi射频会干扰某些I2C传感器,尤其是长线缆时。我在项目中遇到过,风速传感器在WiFi开启时读数跳变。解决办法:采集数据时关掉WiFi,上传完再开。或者用屏蔽线。
坑三:启动电流大
ESP32启动瞬间电流能到500mA。如果你用锂电池直接供电,电压会被拉低,导致反复重启。我吃过这个亏,后来在电源输入端加了一个1000μF的电解电容,问题解决。
2.5 我的最终建议
如果你只是做个实验室演示,Arduino Uno完全够用。但如果你要做真正的农业气象站,要放到田里跑几个月甚至几年——选ESP32。
STM32当然也很好,稳定、低功耗、工业级。但你要额外配WiFi模块,成本、体积、功耗都上去了。除非你特别在意极端环境下的稳定性(比如-40°C到85°C),否则ESP32的性价比更高。
我个人习惯是:原型验证用ESP32开发板,产品定型后用ESP32模组(比如ESP32-WROOM-32D)自己画PCB。这样开发快,成本低,量产也方便。
下一章,我会带你实际搭建ESP32的开发环境,写第一行代码。准备好了吗?