💡 划重点

  • 主控:ESP32-S3,自带 Wi-Fi 与低功耗能力,方便户外数据上报
  • 传感器:BMP280 采集大气压/温度,水位传感器检测钓点水深变化
  • 供电:18650 锂电池搭配 TP4056 充电模块,支持太阳能板长期补电
  • 成本:整体物料控制在 110 元以内,个人 DIY 友好的入门方案
  • 输出:通过 OLED 显示屏本地查看,同时可以通过 Wi-Fi 将数据推送到手机或云平台,形成水位与气压变化曲线,辅助判断鱼情

需求洞察

目标用户:喜欢野钓、库钓、溪钓的户外爱好者,尤其是对天气变化敏感、需要微物信号判断鱼口的进阶钓友。

真实痛点

  1. 钓鱼时气压变化直接关系鱼开口程度,单纯凭经验很难实时感知毫巴级别的微小波动;
  2. 野钓水域水位上涨或下落,往往意味着上游来水、闸口放水等,直接影响钓位安全与鱼群迁移,手动观察费时且不连续;
  3. 钓鱼时携带设备不宜复杂,市面上现成的钓鱼气压计价格偏高、功能单一,无法记录历史数据。

为什么值得做

利用 ESP32-S3 的 Wi-Fi 功能,结合价格低廉的 BMP280(约 5 元)和水位传感器(约 10 元),可以做出一个可以持续记录、本地显示、甚至推送信息的小装置。加装太阳能补电后,可以做到连续工作数日,非常适合户外长时间守钓。110 元的总成本,只有同类成品价格的三分之一不到,且完全开源,方便钓友二次开发。

方案设计

感知层

控制层

执行层

日志与联网层

供电设计

物料清单

物料名称 数量 用途 估算单价(元) 小计(元)
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):

*微调说明*:这里未使用 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 数据上报和深度睡眠优化。

调试步骤

  1. 单传感器检测:先单独连接 BMP280,运行 I2C 扫描确认地址(通常 0x76),读取气压值在 950~1050 hPa 间为正常。
  2. 水位校准:将水位传感器探头放入已知深度的清水中,记录 ADC 值,建立线性回归公式:水深(cm)=k*ADC + b,写入代码。
  3. 显示联调:将 OLED 接好,确保能正常显示字符,调整对比度。
  4. 告警测试:用手快速按压 BMP280(模拟降压)或将水位传感器快速插入深水,看蜂鸣器和 LED 是否动作。
  5. 供电联调:接上锂电池和太阳能板,测量 TP4056 充电指示,确认阴天待机时长。
  6. 入壳外场测试:抽一天到水边,记录半天数据,对比天气预报与水位变化,微调阈值。

设计图

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

感知输入包含 BMP280 气压/温度和水位传感器模拟量,控制处理由 ESP32-S3 完成滤波和逻辑判断,执行反馈驱动 OLED 显示和蜂鸣器、LED 提醒,数据上报通过 Wi-Fi 的 MQTT 发送到手机端。整体形成一套低成本的户外钓况监测与提醒系统。