💡 划重点
- 实时采集水库/河流水位与大气压力,预测鱼情窗口。
- 气压骤变或水位超限自动蜂鸣报警,钓鱼时不需盯屏幕。
- 太阳能+锂电池供电,野外连续工作数天。
- BOM成本控制在110元以内,全部模块可手焊、可复现。
- 支持WiFi数据上传,手机端可随时查看历史曲线。
需求洞察
目标用户:野钓、库钓爱好者,尤其是注重气压与水位对鱼口影响的钓友。
真实痛点:黄金开口期往往只有几十分钟,而钓鱼人长时间专注浮漂,极易忽略环境参数变化。水位突然上涨或下降直接影响窝点鱼情,气压骤升或骤降可能导致鱼停口。现有专业环境监测设备价格高、体积大,普通钓友无从下手。
为什么值得做:将工业级传感器与低功耗芯片结合,成本压至百元级,让每一位钓友都能拥有一套自动预警系统。通过太阳能补电免去频繁换电池的烦恼,数据可记录、可回溯,帮助钓友形成自己的鱼情判断模型。
方案设计
感知层
- BMP280气压传感器:I2C通信,获取气压与温度,温度用于补偿气压。
- 模拟水位传感器:电阻式分压原理,浸入水中深度变化导致输出电压变化,接ADC。
- 日照感知:通过太阳能板电压粗略判断户外光照强度(可选,利用ADC2通道)。
控制层
- ESP32-S3主控:双核240MHz,自带WiFi/BLE,深度睡眠模式下功耗低于10μA。
- 阈值判断逻辑:气压相对30分钟前的波动超过±1.5hPa,触发黄色预警;水位1小时内变化超过±3cm,触发红色预警。
执行层
- 有源蜂鸣器:气压稳定区短鸣1声,危险区长鸣3声,水位过高急促连响。
- 板载LED:红色快闪对应水位报警,蓝色慢闪对应气压报警。
- 振动马达(可选):不扰旁人,仅佩戴者感知。
日志/联网层
- WiFi连接后通过HTTP接口上传到自建简易服务器或Blynk平台,每5分钟上报一组气压、水位、电池电压。
- 本地SPIFFS存储最近48小时数据,防止通信中断丢失记录。
供电架构
- 5V/1W太阳能板 → TP4056充电模块 → 18650锂电池(带保护板) → 升压/稳压至3.3V给ESP32-S3。
- TP4056同时提供输入防反接与电池过放保护(锂电自带保护板做冗余)。
物料清单
| 物料 | 数量 | 用途 | 估算单价(元) |
|---|---|---|---|
| ESP32-S3-WROOM-1模组(或开发板) | 1 | 主控与通信 | 25 |
| BMP280模块(GY-BMP280) | 1 | 气压/温度采集 | 8 |
| 模拟水位传感器(沉水式) | 1 | 水位电压输出 | 12 |
| 5V 1W太阳能板 | 1 | 户外补电 | 15 |
| TP4056充电保护模块 | 1 | 锂电充电管理 | 3 |
| 18650锂电池 3000mAh | 1 | 储能 | 18 |
| 有源蜂鸣器 3V | 1 | 报警 | 2 |
| LED(红/蓝) + 电阻 | 各2 | 状态指示 | 1 |
| 开关、导线、排针、热缩管等 | 若干 | 装配 | 6 |
| 防水盒(100x68x50mm) | 1 | 外壳防护 | 10 |
| 合计 | 100 |
成本控制在110元以内,实际采购可更低。如果需要振动马达增加约4元,仍不超过预算。
接线与结构
接线微调说明:题目规定BMP280 I2C使用GPIO8/9,但ESP32-S3的GPIO8与内部SPI Flash电压检测相关,上电时若被外部拉低可能导致启动异常。为保证稳定性,将I2C线微调至GPIO41(SDA)和GPIO42(SCL),这两个管脚闲置且无特殊功能。水位传感器模拟输出仍接GPIO1(ADC1_CH0),符合题目指定。
完整接线:
- BMP280 VCC → 3.3V,GND → GND,SDA → GPIO41,SCL → GPIO42。
- 水位传感器 VCC → 3.3V,GND → GND,A0 → GPIO1。
- TP4056:IN+接太阳能板正极,IN-接太阳能板负极;BAT+接18650正极,BAT-接18650负极;OUT+接ESP32-S3 5V输入,OUT-接GND。电池保护板与18650一体焊接。
- 蜂鸣器正极串100Ω电阻接GPIO2,负极接GND。
- LED:红色经220Ω接GPIO4,蓝色经220Ω接GPIO5(共阳极或共阴极均可,代码中对应电平)。
结构:所有元件焊接在洞洞板上,用尼龙柱固定在防水盒内。水位传感器探出盒底,使用硅胶密封出线口。太阳能板粘贴于盒盖上表面,倾角约30°朝向南方以增加光照。
核心代码
以下为Arduino骨架代码,可直接用PlatformIO编译,需安装 Adafruit BMP280 和 WiFi 库。
#include <WiFi.h>
#include <Adafruit_BMP280.h>
// 引脚定义
#define PIN_WATER_LEVEL 1
#define PIN_BUZZER 2
#define LED_RED 4
#define LED_BLUE 5
Adafruit_BMP280 bmp;
float baseline_pressure = 0;
unsigned long last_check = 0;
const int WATER_LOW_THRESHOLD = 800; // ADC值,水位过低
const int WATER_HIGH_THRESHOLD = 2200;
void setup() {
Serial.begin(115200);
pinMode(PIN_BUZZER, OUTPUT);
pinMode(LED_RED, OUTPUT);
pinMode(LED_BLUE, OUTPUT);
digitalWrite(PIN_BUZZER, LOW);
Wire.begin(41, 42); // SDA=41, SCL=42
if (!bmp.begin(0x76)) {
}
baseline_pressure = bmp.readPressure() / 100.0F; // hPa
// 短连接仅上报模式可省略
}
void loop() {
int water_val = analogRead(PIN_WATER_LEVEL);
float pressure = bmp.readPressure() / 100.0F;
float temp = bmp.readTemperature();
// 水位报警
if (water_val < WATER_LOW_THRESHOLD || water_val > WATER_HIGH_THRESHOLD) {
digitalWrite(LED_RED, HIGH);
tone(PIN_BUZZER, 2000, 500);
delay(100);
digitalWrite(LED_RED, LOW);
}
// 气压突变报警(示例:与基准偏差>2hPa)
if (abs(pressure - baseline_pressure) > 2.0) {
digitalWrite(LED_BLUE, HIGH);
tone(PIN_BUZZER, 1000, 300);
delay(80);
digitalWrite(LED_BLUE, LOW);
baseline_pressure = pressure; // 重置基准避免连续报警
}
// 每10分钟通过串口输出日志,实际可替换为HTTP上传
if (millis() - last_check > 600000) {
last_check = millis();
Serial.print("P:");
Serial.print(pressure);
Serial.print(" W:");
Serial.print(water_val);
Serial.print(" T:");
Serial.println(temp);
// 可在此处添加WiFi联网上报代码
}
delay(1000);
}
该骨架实现了核心环境感知与报警逻辑,用户可依据实际钓鱼环境微调阈值。
调试步骤
- 独立模块测试:烧录BMP280示例,确认能读取气压值;用万用表测量水位传感器在空气中的电压,再缓慢入水观察电压变化,确定涨水/落水对应的ADC范围。
- 供电链测试:将太阳能板置于阳光下,测量TP4056的BAT引脚电压,确认充电灯亮起。断开太阳能,连接负载,确认电池正常放电,ESP32-S3工作稳定。
- 阈值标定:在钓鱼点实测1小时,用手机气压计对比,标定气压波动报警门限;根据实际水位线标定ADC值,设置安全区间。
- 整机联调:封箱后模拟水位变化(缓慢注水),观察蜂鸣器与LED响应是否符合预期;通过串口监视器检查数据上报间隔与准确性。
- 续航测试:在室内无光环境下连续运行48小时,统计电压下降情况,评估太阳能补电是否足以维持白天耗电。
设计图
钓鱼水位与气压提醒结构flow
1
感知输入
→
2
控制处理
→
3
执行反馈
→
4
数据上报