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