第三章 核心器件选型(一):主控芯片选型(ESP32 vs STM32)、水位传感器选型(超声波 vs 压力式)

好,咱们进入核心器件的选型环节。这一章我打算把两个最关键的决策点放在一起讲:主控芯片水位传感器。为什么?因为这两者直接决定了你的终端能不能干活、能干多好、成本多少。

我个人习惯是,先定传感器,再定主控。但为了讲解方便,咱们先聊主控芯片。毕竟它是整个系统的“大脑”。

3.1 主控芯片:ESP32 vs STM32

做洪水预警终端,主控芯片的选择其实就两个主流方向:ESP32STM32。这两款芯片我都用过,各有各的脾气。

先看一张对比表,心里有个底:

对比项 ESP32 STM32(以F103为例)
核心架构 双核 Xtensa LX6 ARM Cortex-M3/M4
主频 240 MHz 72 MHz(F103)
WiFi/蓝牙 内置 需外挂模块
ADC精度 12位(实际噪声较大) 12位(更稳定)
功耗 较高(WiFi开启时) 较低(可深度睡眠)
开发环境 Arduino IDE / ESP-IDF Keil / STM32CubeIDE
价格(批量) 约15-25元 约8-20元
适合场景 需要联网、快速原型 工业级、低功耗、高可靠

3.1.1 为什么我推荐ESP32作为首选?

说实话,在农业物联网这个领域,ESP32 是更省心的选择。原因很简单:它自带 WiFi 和蓝牙。你想想看,洪水预警终端需要把数据传到云端吧?需要远程报警吧?ESP32 直接就能连上路由器,省掉一个通信模块的钱和空间。

我在项目中遇到过一件事:用 STM32 做原型,结果发现还得加一个 ESP8266 做 WiFi 透传。板子空间紧张不说,两个芯片之间的通信协议还得自己调。折腾了两周,最后干脆换成 ESP32,一天搞定。

当然,ESP32 也有短板。它的 ADC(模数转换)噪声比较大。如果你要用它直接读取模拟水位传感器,嗯,这里要注意——数据可能会跳得你怀疑人生。我一般会加一个外部 ADC 芯片,比如 ADS1115,或者干脆用数字接口的传感器。

我的建议: 如果你做的是原型验证、小批量部署,或者终端需要联网,直接选 ESP32。开发快、成本低、社区资源多。遇到问题,百度一下,基本都有答案。

3.1.2 什么时候必须用STM32?

别急,STM32 也不是吃素的。如果你遇到以下情况,我建议你老老实实用 STM32:

  • 电池供电,要求超低功耗:ESP32 的 WiFi 一开,电流直奔 200mA 以上。STM32 的深度睡眠可以做到几微安。
  • 环境恶劣,需要工业级温度范围:STM32 的 -40°C 到 85°C 是实打实的,ESP32 在高温下偶尔会掉 WiFi。
  • 需要高精度模拟采集:比如接压力式水位传感器,STM32 的内置 ADC 比 ESP32 稳定得多。
  • 产品要过认证(CE、FCC 等):STM32 的射频干扰更可控,ESP32 的 WiFi 模块有时会带来额外的 EMI 问题。

我曾经在一个水库项目中用过 STM32L4 系列,配合 NB-IoT 模块,电池撑了两年。换成 ESP32 的话,估计半年就得换一次电池。所以,选型没有绝对的好坏,只有合不合适

避坑指南: 我曾经犯过一个错——用 ESP32 的 WiFi 做 OTA 升级,结果在田间地头信号不好,升级到一半断连,设备变砖。后来我加了看门狗和回滚机制才解决。如果你要用 OTA,务必做好容错设计。

3.2 水位传感器:超声波 vs 压力式

水位测量是洪水预警的核心。传感器选错了,后面的算法再牛也白搭。目前主流方案就两种:超声波水位传感器压力式水位传感器

先看对比:

对比项 超声波水位传感器 压力式水位传感器
测量原理 发射超声波,计算回波时间 测量水压,换算水位
安装方式 非接触式(安装在水面上方) 接触式(投入水中)
精度 ±1cm 左右 ±0.5cm 左右(高精度型号)
量程 常见 0.3m - 5m 常见 0 - 10m(可定制更深)
受环境影响 温度、风速、水面波动影响大 受水温、水质影响较小
维护成本 低(不接触水体) 较高(需定期清理探头)
价格 约 50-200 元 约 100-500 元

3.2.1 超声波传感器:简单、便宜、但别太信它

超声波传感器,说白了就是“声呐”的简化版。你往水面发射一束声波,等它弹回来,算算时间差,水位就出来了。常用的模块有 HC-SR04、JSN-SR04T 等。

它的优点很明显:非接触式。你不用把传感器泡在水里,不用担心腐蚀、结垢。安装也简单,找个支架固定在河道上方就行。

但是,超声波传感器有个致命弱点:怕干扰。我在项目中遇到过这样的情况:河面上有雾气,超声波信号被散射了,读数直接跳变 20 厘米。还有一次,水面有波浪,回波信号乱七八糟,滤波算法写到崩溃。

所以,如果你要用超声波,记住几点:

  • 加温度补偿:声速受温度影响很大,不加补偿误差能到 5%。
  • 做多次采样取中值:别信单次测量值,至少采 10 次,去掉最大最小,取平均。
  • 避开盲区:超声波传感器一般有 20-30cm 的盲区,太近测不到。
代码示例:ESP32 读取超声波传感器(带温度补偿)
#include <OneWire.h>
#include <DallasTemperature.h>

#define TRIG_PIN 5
#define ECHO_PIN 18
#define ONE_WIRE_BUS 4

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

float getDistance() {
    // 发送10us脉冲
    digitalWrite(TRIG_PIN, LOW);
    delayMicroseconds(2);
    digitalWrite(TRIG_PIN, HIGH);
    delayMicroseconds(10);
    digitalWrite(TRIG_PIN, LOW);
    
    // 读取回波时间(微秒)
    long duration = pulseIn(ECHO_PIN, HIGH, 30000); // 超时30ms
    
    if (duration == 0) return -1; // 无回波
    
    // 读取温度
    sensors.requestTemperatures();
    float tempC = sensors.getTempCByIndex(0);
    
    // 声速 = 331.4 + 0.6 * T (m/s)
    float speedOfSound = 331.4 + 0.6 * tempC;
    
    // 距离 = 时间 * 声速 / 2 (单位: cm)
    float distance = (duration * speedOfSound) / 20000.0;
    
    return distance;
}

3.2.2 压力式传感器:稳定、可靠、但贵

压力式水位传感器,说白了就是一个防水压力计。你把它沉到水底,水压越大,水位越高。常用的有扩散硅式、陶瓷电容式等。

它的优势在于:不受水面波动、雾气、漂浮物影响。只要水是通的,它就能稳定输出。精度也更高,好的型号能做到 ±0.1% FS。

但是,压力式传感器也有坑。我踩过最大的坑是:线缆密封问题。有一次我把传感器丢进河里,结果线缆接头进水了,读数直接漂到满量程。后来我学乖了,所有接头都用热缩管加防水胶带,再套一个防水盒。

另外,压力式传感器需要定期校准。因为探头表面会结垢、长藻类,影响压力传导。我一般建议每三个月清洗一次,每年做一次零点校准。

我的选择建议:
  • 如果河道干净、水面平静、预算有限 → 选超声波
  • 如果水质浑浊、有漂浮物、要求高精度 → 选压力式
  • 如果两者都想要 → 可以同时装,互相校验,冗余设计

3.3 我的最终选型方案

好了,说了这么多,我直接给出我的推荐方案吧。这个方案我在三个项目中验证过,效果不错:

  • 主控芯片:ESP32-WROOM-32D。理由:自带 WiFi,开发快,社区资源多。如果要求低功耗,可以加一个 RTC 唤醒,平时深度睡眠。
  • 水位传感器:JSN-SR04T 防水超声波模块(量程 4.5m)。理由:便宜、非接触、安装简单。配合 DS18B20 做温度补偿,精度可以做到 ±1cm。
  • 备用方案:如果客户要求高精度,换成 4-20mA 输出的压力式传感器,比如米科 MIK-P300。ESP32 通过 ADS1115 读取模拟信号。

嗯,这一章就到这里。下一章咱们聊聊通信模块的选型——LoRa、NB-IoT、4G,到底哪个适合你的场景?到时候见。