💡 划重点
- 主控:ESP32-S3,自带 Wi-Fi 与低功耗能力,方便户外数据上报
- 传感器:BMP280 采集大气压/温度,水位传感器检测钓点水深变化
- 供电:18650 锂电池搭配 TP4056 充电模块,支持太阳能板长期补电
- 成本:整体物料控制在 110 元以内,个人 DIY 友好的入门方案
- 输出:通过 OLED 显示屏本地查看,同时可以通过 Wi-Fi 将数据推送到手机或云平台,形成水位与气压变化曲线,辅助判断鱼情
需求洞察
目标用户:喜欢野钓、库钓、溪钓的户外爱好者,尤其是对天气变化敏感、需要微物信号判断鱼口的进阶钓友。
真实痛点:
- 钓鱼时气压变化直接关系鱼开口程度,单纯凭经验很难实时感知毫巴级别的微小波动;
- 野钓水域水位上涨或下落,往往意味着上游来水、闸口放水等,直接影响钓位安全与鱼群迁移,手动观察费时且不连续;
- 钓鱼时携带设备不宜复杂,市面上现成的钓鱼气压计价格偏高、功能单一,无法记录历史数据。
为什么值得做:
利用 ESP32-S3 的 Wi-Fi 功能,结合价格低廉的 BMP280(约 5 元)和水位传感器(约 10 元),可以做出一个可以持续记录、本地显示、甚至推送信息的小装置。加装太阳能补电后,可以做到连续工作数日,非常适合户外长时间守钓。110 元的总成本,只有同类成品价格的三分之一不到,且完全开源,方便钓友二次开发。
方案设计
感知层:
- BMP280:通过 I2C 连接,采集大气压强与温度,精度 ±1 hPa,可以检测天气系统性变化,用于预测窗口期。
- 水位传感器:电阻式或触点式,通过 ADC 读取浸水深度,输出与水位正相关电压,经过校准后能得到相对水深变化。
控制层:
- 主控 ESP32-S3,运行 MicroPython 以降低开发门槛,也便于现场修改阈值。
- 每 10 分钟采集一次气压和水位,进行简单滑动平均滤波,减小风浪和偶然波动干扰。
- 当气压出现快速下降(≥1 hPa/小时)或水位发生明显上涨(≥5 cm/小时)时,触发提醒。
执行层:
- SSD1306 OLED 显示当前气压、水温、水位值以及变化趋势箭头。
- 蜂鸣器短鸣进行声音提醒,同时板载 LED 闪烁。
- 可选振动马达,夜间或嘈杂环境下提醒更明显。
日志与联网层:
- ESP32-S3 连接 Wi-Fi 后,使用 MQTT 将数据上报到手机端 MQTT Dashboard(如 MQTT Dash 或自制 App),实现远程查看、历史数据记录。
- 本地也可将数据循环存入 ESP32 的 RTC 内存,断电不丢失最近 24 小时记录。
供电设计:
- 18650 锂电池(3000 mAh)经 TP4056 充电模块管理,由 5V 小型太阳能板输入。晴天光照 4 小时即可满足全天待机(平均功耗约 80 mA,含 Wi-Fi 间隔发射)。
- 深度睡眠模式可让整机待机功耗降到 5 mA 以下,实现阴雨天三天以上续航。
物料清单
| 物料名称 | 数量 | 用途 | 估算单价(元) | 小计(元) |
|---|---|---|---|---|
| ESP32-S3 开发板 | 1 | 主控 | 28 | 28 |
| BMP280 模块 | 1 | 气压温度采集 | 5 | 5 |
| 水位传感器(电阻式) | 1 | 检测水位变化 | 10 | 10 |
| SSD1306 OLED 128x64 | 1 | 本地数据显示 | 12 | 12 |
| TP4056 充电模块 | 1 | 锂电池充放电管理 | 3 | 3 |
| 18650 锂电池 | 1 | 储能 | 15 | 15 |
| 5V 1W 太阳能板 | 1 | 户外电能补充 | 18 | 18 |
| 无源蜂鸣器模块 | 1 | 声音提醒 | 3 | 3 |
| 面包板 + 跳线 | 1 套 | 连接与固定 | 8 | 8 |
| 电阻 10kΩ、100Ω 等 | 若干 | 分压、LED限流 | 2 | 2 |
| 开关、排母等小零件 | 若干 | 电源控制 | 3 | 3 |
| 合计 | 107 |
目标成本 110 元,合计 107 元,符合要求。
接线与结构
基本接线方案(依据指定 GPIO):
- BMP280 I2C:VCC → 3.3V,GND → GND,SCL → GPIO 8,SDA → GPIO 9。
- 水位传感器:信号脚 → GPIO 1(ADC1-0),VCC → 3.3V,GND → GND。注意如果传感器输出范围 0~5V,需要用两个电阻分压到 0~3.3V,避免烧毁 ESP32-S3 引脚。
- TP4056:BAT+、BAT- 接锂电池,OUT+ 接 ESP32 的 5V 输入或 VIN、OUT- 接 GND。太阳能板输出接 TP4056 的 IN+ 和 IN-。
- SSD1306:I2C 同 BMP280 共用 SCL(8)、SDA(9),地址不同不会冲突。
- 蜂鸣器:正极接 GPIO 4,负极接 GND,加 100Ω 限流电阻。
- LED 指示:GPIO 5 串 220Ω 电阻到 GND。
*微调说明*:这里未使用 GPIO 1 的默认弱上拉,水位传感器为模拟信号,需确认 ADC 采集功能正常,ESP32-S3 的 ADC1 通道 0 正好对应 GPIO 1,无需更改。
结构上,将 ESP32-S3、传感器和电池装入小小的防水盒中,水位传感器引出线缆固定至钓竿支架或岸边测量杆,太阳能板固定于盒盖,面向天空。调试时注意接口打防水胶,避免潮湿短路。
核心代码
以下为 MicroPython 驱动骨架,可在 Thonny 或 uPyCraft 中烧录运行:
import ujson, esp32
# 初始化 I2C
i2c = SoftI2C(scl=Pin(8), sda=Pin(9), freq=100000)
# 初始化外设
bmp = bmp280.BMP280(i2c)
oled = ssd1306.SSD1306_I2C(128, 64, i2c)
adc_water = ADC(Pin(1), atten=ADC.ATTN_11DB) # 0-3.3V
# 蜂鸣器和 LED
buzzer = Pin(4, Pin.OUT)
led = Pin(5, Pin.OUT)
# Wi-Fi 连接 (低功耗前使用)
# wlan = network.WLAN(network.STA_IF)
# wlan.active(True)
# wlan.connect('SSID', 'PASS')
def read_sensors():
pressure = bmp.pressure # hPa
temp = bmp.temperature # °C
water_raw = adc_water.read() # 0-4095
water_level = water_raw * 3.3 / 4095 * 100 # 假设计算为 cm
def alert():
for _ in range(3):
buzzer.on()
led.on()
time.sleep(0.1)
buzzer.off()
led.off()
time.sleep(0.1)
def main():
last_press = None
last_water = None
while True:
p, t, w = read_sensors()
oled.fill(0)
oled.text(f'P:{p:.0f}hPa T:{t:.1f}C', 0, 0)
oled.text(f'Water:{w:.1f}cm', 0, 20)
# 简单趋势判断
if last_press and last_water:
if p < last_press - 0.5: # 半小时降压>0.5hPa
oled.text('Pressure Down!', 0, 40)
alert()
if w > last_water + 5: # 水位上涨5cm
oled.text('Water Rising!', 0, 50)
alert()
oled.show()
last_press = p
last_water = w
time.sleep(600) # 10分钟采集一次
main()
此代码框架实现了基本采集、显示和提醒,可根据需要进行 MQTT 数据上报和深度睡眠优化。
调试步骤
- 单传感器检测:先单独连接 BMP280,运行 I2C 扫描确认地址(通常 0x76),读取气压值在 950~1050 hPa 间为正常。
- 水位校准:将水位传感器探头放入已知深度的清水中,记录 ADC 值,建立线性回归公式:水深(cm)=k*ADC + b,写入代码。
- 显示联调:将 OLED 接好,确保能正常显示字符,调整对比度。
- 告警测试:用手快速按压 BMP280(模拟降压)或将水位传感器快速插入深水,看蜂鸣器和 LED 是否动作。
- 供电联调:接上锂电池和太阳能板,测量 TP4056 充电指示,确认阴天待机时长。
- 入壳外场测试:抽一天到水边,记录半天数据,对比天气预报与水位变化,微调阈值。
设计图
钓鱼水位与气压提醒结构flow
1
感知输入
→
2
控制处理
→
3
执行反馈
→
4
数据上报
感知输入包含 BMP280 气压/温度和水位传感器模拟量,控制处理由 ESP32-S3 完成滤波和逻辑判断,执行反馈驱动 OLED 显示和蜂鸣器、LED 提醒,数据上报通过 Wi-Fi 的 MQTT 发送到手机端。整体形成一套低成本的户外钓况监测与提醒系统。