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的电池,撑半年没问题。

我的经验: 如果你用ESP32做低功耗设计,记得把WiFi模块的“Modem-sleep”模式打开。我曾经忘了开这个,结果电池三天就废了。后来加上这行代码 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?

三个理由:

  1. 集成无线:自带WiFi和蓝牙,省掉一个通信模块。对于农业气象站这种需要远程数据传输的场景,这是刚需。
  2. 性能冗余:双核240MHz,跑FreeRTOS毫无压力。你可以一个核跑传感器采集,一个核跑网络协议栈,互不干扰。
  3. 生态成熟: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的开发环境,写第一行代码。准备好了吗?