第三章 核心器件选型(一):主控芯片选型(ESP32 vs STM32)、水位传感器选型(超声波 vs 压力式)
好,咱们进入核心器件的选型环节。这一章我打算把两个最关键的决策点放在一起讲:主控芯片和水位传感器。为什么?因为这两者直接决定了你的终端能不能干活、能干多好、成本多少。
我个人习惯是,先定传感器,再定主控。但为了讲解方便,咱们先聊主控芯片。毕竟它是整个系统的“大脑”。
3.1 主控芯片:ESP32 vs STM32
做洪水预警终端,主控芯片的选择其实就两个主流方向:ESP32 和 STM32。这两款芯片我都用过,各有各的脾气。
先看一张对比表,心里有个底:
| 对比项 | 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,或者干脆用数字接口的传感器。
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 的话,估计半年就得换一次电池。所以,选型没有绝对的好坏,只有合不合适。
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 的盲区,太近测不到。
#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,到底哪个适合你的场景?到时候见。