💡 划重点

  • 主控用 ESP32-S3,兼顾低功耗、Wi-Fi 与丰富 ADC。
  • BMP280 看气压趋势,水位传感器看岸边涨落,二者共同判断鱼情与安全。
  • 18650 锂电 + TP4056 + 太阳能板,户外可长期值守。
  • 本地 LED/蜂鸣器提醒,联网可选,整机成本约 98 元,控制在 110 元内。

需求洞察

目标用户是野钓、库钓、夜钓爱好者。他们常在水库、河湾、堤岸连续守钓数小时甚至过夜,最关心的不是“天气 App 明天有没有雨”,而是“眼前这个钓位接下来两小时会不会涨水、气压是不是在骤降”。真实痛点有三个:一是水位上涨往往悄无声息,装备被淹、人被困在低岸;二是气压变化直接影响鱼口,骤降前鱼口可能短暂变好,随后停口,钓鱼人却常错过窗口;三是户外没有市电,普通电子设备续航短、充电难。这个项目值得做,是因为它把气象站和岸边水位计合二为一,成本低、部署快,能给出本地实时提醒,而不是依赖远处气象站。

方案设计

感知层:BMP280 采集气压与温度,水位传感器采集钓位附近水位模拟量,可再加一路电池电压检测。控制层:ESP32-S3 定时轮询,做阈值判断与迟滞处理,避免水位临界抖动导致频繁报警。执行层:LED 与有源蜂鸣器做本地声光提醒,OLED 可显示气压、水位、电压。日志/联网层:通过 Wi-Fi 上报 MQTT 或 HTTP,本地 LittleFS 记录气压突变与水位峰值,断网时缓存,恢复后补传。电源层:TP4056 负责锂电充电,MT3608 升压到 5V 供开发板,太阳能板白天补电。

物料清单

物料 数量 用途 估算单价
ESP32-S3 开发板 1 主控与联网 25 元
BMP280 模块 1 气压、温度采集 6 元
水位传感器 1 岸边水位模拟量 8 元
TP4056 充电模块 1 锂电充电保护 3 元
18650 锂电 1 储能 15 元
5V 1W 太阳能板 1 户外补电 12 元
MT3608 升压模块 1 3.7V 升 5V 3 元
防水盒 1 主机防护 10 元
0.96 寸 OLED 1 本地显示 8 元
有源蜂鸣器、LED 1 套 声光提醒 3 元
杜邦线、电阻、开关 1 套 接线与调试 5 元
合计 98 元

接线与结构

BMP280:VCC 接 3.3V,GND 接 GND,SDA 接 GPIO8,SCL 接 GPIO9。水位传感器:VCC 接 3.3V,GND 接 GND,A0 接 GPIO1。提醒:LED 接 GPIO2,蜂鸣器接 GPIO3。TP4056:B+、B- 接 18650,OUT+ 接 MT3608 IN+,OUT- 共地,MT3608 输出 5V 接开发板 5V;太阳能板接 TP4056 IN+、IN-。GPIO1 是 ESP32-S3 的 ADC1_CH0,Wi-Fi 工作时 ADC2 会受限,因此水位放在 ADC1 更稳;GPIO8/9 作 I2C 可避开 USB 与 Strapping 引脚。结构上,主机放防水盒,BMP280 处开透气孔并加防水透气膜,水位探头固定在岸边支架,太阳能板朝南倾斜。

核心代码


#include <Wire.h>
#include <Adafruit_BMP280.h>

#define PIN_WATER  1
#define PIN_SDA    8
#define PIN_SCL    9
#define PIN_LED    2
#define PIN_BUZZER 3

Adafruit_BMP280 bmp;
float lastPressure = 0;
unsigned long lastRead = 0;

void setup() {
  Serial.begin(115200);
  pinMode(PIN_LED, OUTPUT);
  pinMode(PIN_BUZZER, OUTPUT);
  Wire.begin(PIN_SDA, PIN_SCL);
  if (!bmp.begin(0x76)) {
    Serial.println("BMP280未找到");
    while (1) delay(10);
  }
  analogReadResolution(12);
}

void loop() {
  if (millis() - lastRead < 60000) return;
  lastRead = millis();

  float p = bmp.readPressure() / 100.0F;
  int water = analogRead(PIN_WATER);
  float delta = (lastPressure == 0) ? 0 : p - lastPressure;
  lastPressure = p;

  Serial.printf("气压 %.1f hPa 水位 %d 变化 %.2f\n", p, water, delta);

  bool alert = false;
  if (water > 2200) alert = true;
  if (delta < -1.5) alert = true;

  digitalWrite(PIN_LED, alert);
  if (alert) {
    delay(200);
    digitalWrite(PIN_BUZZER, LOW);
  }
  delay(60000);
}

调试步骤

  1. 用万用表测 TP4056 输出与 MT3608 5V 输出,确认极性正确。
  2. 烧录 I2C 扫描程序,确认 BMP280 地址为 0x76 或 0x77。
  3. 水位传感器分别置于干燥、半湿、全浸状态,记录 ADC 值并设定阈值。
  4. 将 BMP280 读数与手机气压或气象站对比,校准偏差。
  5. 模拟气压骤降与水位超限,检查 LED、蜂鸣器是否触发。
  6. 接太阳能板,观察 TP4056 充电灯与电池电压变化。
  7. 放入防水盒做淋水测试,确认透气孔不进水。

设计图

钓鱼水位与气压提醒结构flow
1
感知输入
→
2
控制处理
→
3
执行反馈
→
4
数据上报