4、数据采集节点:基于ESP32/STM32的节点硬件设计、低功耗策略

数据采集节点,说白了就是田里那些“站岗”的小盒子。它得把土壤湿度、温度、光照这些物理量变成电信号,再想办法传到云端。我做了这么多年物联网,见过太多节点因为功耗没控好,或者选型翻车,导致整个项目烂尾。今天咱们就聊聊,怎么把这套硬件搭得既稳当又省电。

4.1 主控芯片选型:ESP32 vs STM32

选主控是第一步,也是最容易纠结的一步。我个人习惯是这么看的:

  • ESP32:自带Wi-Fi和蓝牙,适合需要直接上云的场景。价格便宜,生态成熟,Arduino库一抓一大把。但它的ADC(模数转换)精度一般,而且休眠功耗偏大。
  • STM32:功耗控制极其优秀,外设丰富,ADC精度高。适合做低功耗、高可靠性的节点。缺点是没有内置无线,得外挂LoRa或NB-IoT模块。

我遇到过一个小伙子,非要用ESP32做电池供电的土壤传感器,结果三天就得换一次电池。后来换成STM32L0系列,配合LoRa,一节18650撑了半年。你想想看,选型不对,后面全是坑。

对比项 ESP32 STM32(以L0/L4为例)
无线能力 内置Wi-Fi/BLE 需外挂模块
休眠功耗 ~10μA(深度睡眠) ~0.3μA(停机模式)
ADC精度 12位,噪声较大 12/16位,低噪声
开发难度 低,Arduino友好 中等,需HAL/LL库
典型场景 大棚内Wi-Fi覆盖区 野外电池供电节点

核心建议:如果节点附近有220V电源,或者Wi-Fi信号稳定,选ESP32快速出活。如果是野外、电池供电、要求长期稳定,老老实实上STM32。

4.2 传感器接口与信号调理

传感器是节点的“眼睛”,但眼睛看到的东西不一定准。我见过太多人直接把传感器输出接到MCU的GPIO上,结果数据跳得像心电图。嗯,这里要注意信号调理。

4.2.1 模拟量传感器

比如土壤湿度传感器、光照传感器,输出通常是0-3.3V的模拟电压。但MCU的ADC输入阻抗有限,直接接会导致分压,读数偏低。

我的做法是加一级电压跟随器,用LM358或MCP6001这种轨到轨运放。成本几毛钱,但能保证ADC读到真实值。

// 伪代码:ADC读取示例(ESP32)
#define SOIL_SENSOR_PIN 34

void setup() {
  analogReadResolution(12); // 12位精度
}

void loop() {
  int raw = analogRead(SOIL_SENSOR_PIN);
  float voltage = raw * (3.3 / 4095.0);
  // 根据传感器手册换算成湿度百分比
  float humidity = map(voltage, 0.0, 3.3, 0.0, 100.0);
  Serial.printf("土壤湿度: %.1f%%\n", humidity);
  delay(5000);
}

4.2.2 数字量传感器

像DS18B20温度传感器、SHT30温湿度传感器,走I2C或OneWire总线。这类传感器接口简单,但要注意总线长度。我在一个50米的大棚里拉I2C线,结果数据全乱套。后来加了PCA9546 I2C多路复用器,才把问题解决。

避坑指南:I2C总线超过1米,建议加电平转换或改用RS485。我曾经在3米长的I2C线上折腾了两天,最后发现是电容太大导致信号畸变。

4.3 低功耗策略:从硬件到软件

低功耗是农业物联网的命门。你想想看,一个节点部署在田里,总不能每个月去换电池吧?我总结了一套“三步走”策略。

4.3.1 硬件层面的省电

  • 电源选型:用DC-DC降压芯片(如TPS5430)代替LDO,效率能从50%提到90%。
  • 传感器供电控制:用MOS管(如AO3400)做电源开关,只在采集时给传感器供电。
  • 外设休眠:LoRa模块、NB-IoT模块都有休眠模式,记得在代码里调用。

4.3.2 软件层面的省电

这是大头。以STM32为例,我常用的模式是:

  1. 停机模式(Stop Mode):电流降到1μA以下,RTC继续跑,定时唤醒。
  2. 待机模式(Standby Mode):电流0.3μA,但唤醒后相当于复位。
  3. 事件驱动:不要轮询,用外部中断唤醒。比如雨量传感器,平时睡觉,有雨滴触发中断再干活。
// STM32进入停机模式示例(HAL库)
void EnterStopMode(void) {
  HAL_RTCEx_SetWakeUpTimer_IT(&hrtc, 60, RTC_WAKEUPCLOCK_CK_SPRE_16BITS); // 60秒唤醒
  HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
  // 唤醒后重新配置时钟
  SystemClock_Config();
}

4.3.3 通信策略

无线通信是耗电大户。我建议:

  • 减少发送频率:土壤温度变化慢,每15分钟发一次就够了。
  • 数据聚合:采集10次,算个平均值再发,别每次都发原始数据。
  • 动态调整:晴天少发,雨天多发(因为土壤变化快)。

警告:不要用Wi-Fi做电池供电节点的通信方式。ESP32的Wi-Fi发射电流高达200mA,一节2000mAh的电池,连续发Wi-Fi撑不过10小时。老老实实用LoRa或NB-IoT。

4.4 节点硬件架构总览

下面这张图是我自己画的一个典型低功耗节点架构。你可以看到,从电源到传感器,再到MCU和通信模块,每个环节都有省电的考量。

低功耗数据采集节点硬件架构 电源模块 DC-DC + 电池管理 传感器组 土壤/温湿度/光照 MCU ESP32 / STM32 通信模块 LoRa / NB-IoT 本地存储 Flash / EEPROM 设计要点: 1. 电源模块为所有单元供电,DC-DC效率是关键。 2. 传感器通过MOS管独立供电,采集完立即断电。 3. MCU在休眠时切断通信模块电源,仅保留RTC唤醒。

4.5 实战:搭建一个STM32L0 + LoRa节点

说了这么多理论,咱们来点实际的。下面是我在果园项目里用过的方案,你可以直接抄作业。

4.5.1 硬件清单

  • 主控:STM32L051C8T6(48MHz,64KB Flash)
  • 通信:SX1278 LoRa模块(433MHz)
  • 传感器:SHT30(温湿度)+ 土壤湿度探头(模拟量)
  • 电源:18650电池 + TP4056充电板 + TPS63060升降压
  • 其他:RTC(内部)、Flash(W25Q64,存离线数据)

4.5.2 功耗实测数据

工作模式 电流 说明
休眠(停机模式) 1.2 μA RTC运行,所有外设断电
传感器采集 5 mA 持续约100ms
LoRa发送 120 mA 持续约300ms
平均功耗(15分钟周期) 约 8 μA 一节2000mAh电池可用约28年(理论)

小技巧:实际使用中,电池自放电和低温环境会缩短寿命。我建议每两年换一次电池,或者加一块太阳能板做浮充。

4.6 常见问题与避坑

最后,分享几个我踩过的坑,希望你别再走一遍。

  • ADC参考电压不稳:直接用电池供电时,电压会下降,导致ADC读数漂移。加一个TL431做基准电压源,或者用MCU内部参考。
  • LoRa天线匹配:天线不匹配,发射功率再大也白搭。我见过有人用一根导线当天线,通信距离不到10米。老老实实买配套的弹簧天线或吸盘天线。
  • 看门狗定时器:低功耗模式下,看门狗容易误触发。记得在进入休眠前暂停看门狗,或者用RTC中断代替。

嗯,数据采集节点这块,核心就是“选对芯片、控好功耗、调好信号”。你把这三点拿捏住,后面的系统搭建就顺了。