跳转至

第 20 课 自动化与传感器

Part VI · 拓展 | 前置:第 5–8、10、18 课 | 原书:无对应章节(原书仅在零散处提及) 一句话:自动化不能替代"理解系统",它只能把"你必须到场才能做的事"变成"它会替你做的事"。先把手动流程跑顺,再上自动化。


20.1 先明确自动化的边界

20.1.1 自动化能做什么

能做 对应课程
监测并记录(温度、pH、水位、光照、电流) 第 8 课检测体系
定时执行(投喂、补光、潮汐周期) 第 12、17 课
阈值报警(pH 越界、水位过低、泵堵转、漏水) 第 18 课故障排查
保护性动作(低水位断泵、堵转断电重启) 第 10 课
远程查看(不在家时知道系统状态) 第 18 课

20.1.2 自动化不能做什么(重要)

不能做 原因
代替培菌 菌群生长是生物过程(第 13 课),不可加速
代替判断 传感器告诉你 pH 7.2,但"是否加酸"要结合 KH、氨、温度、菜种判断(第 6、7 课)
修复根本问题 泵堵了,报警能提醒你,但清叶轮还是要人做
保证不漂移 再好的传感器也会漂(数字方案也要年校准);且"读数正常"可能是被噪声污染的正常——见 20.3.2

原书的一个警告(3.2.1):精确的 DO 测量仪很贵或难获得,所以对小系统而言,依赖对鱼类行为和蔬菜生长的经常监控、确保水体不断循环和空气泵持续充气就已经足够了。

这句话是"自动化的克制哲学"。它在 2014 年是对的,今天只对了一半:

  • 仍然成立:不必追求全参数实时监测,DO 确实可以靠观察替代
  • 已经过时:pH 与 EC 的测量成本已降到家庭可负担(数字电路 + I²C,一两百元级),而这两个参数直接决定"该不该换水、该不该补肥"——是决策必需,不是锦上添花

所以本课程的主张是:pH + EC 值得测准(数字方案),其余靠观察。

20.1.3 一个判断:什么时候值得自动化

问自己三个问题:
① 这件事每天/每周要做,且耗时 >10 分钟?     → 值得
② 这件事忘做的后果是不可逆的(死鱼)?        → 值得
③ 这件事本身需要"判断"?                      → 不值得(自动化只做"执行",不做"判断")

按此筛选本项目的自动化优先级:

优先级 功能 理由
P0 低水位断泵 后果不可逆(烧泵 + 失水)
P0 泵堵转检测 + 断电重启 后果不可逆(缺氧)
P1 水温监测 + 加热控制 罗非鱼 <12 ℃ 死亡(第 17 课)
P1 投喂定时 每天必做,忘做影响生长
P1 补光定时 每天必做,影响产量
P2 pH 监测 有用但需频繁校准,且"看趋势"才能用
P2 光照强度 辅助决策(是否加遮阳/补光)
P3 漏水检测 保险性质
P4 溶氧实时监测 探头昂贵、维护麻烦(原书也不推荐小系统做)

20.2 本项目的硬件架构

本项目有一块自研主板(见 ../hardware/ 与采购方案 §3)。下面把它与课程知识对应起来。

20.2.1 系统拓扑

                       ┌─────────────────────────┐
   12V DC 8A ─────────▶│  降压 12V→5V(5A)       │
   (96W 电源)           │  再 LDO 5V→3.3V          │
                       └───────┬─────────────────┘
                               │
                    ┌──────────▼──────────┐
                    │   ESP32-S3-WROOM-1  │
                    │  (WiFi/BLE, 16MB)   │
                    └──┬───┬───┬───┬───┬──┘
                       │   │   │   │   │
        ┌──────────────┘   │   │   │   └──────────────┐
        │                  │   │   │                  │
   ┌────▼────┐      ┌──────▼┐ ┌▼───┐ ┌▼─────┐  ┌─────▼─────┐
   │ 4路继电器│      │ ADC   │ │I²C │ │GPIO  │  │ WS2812B   │
   │ 光耦隔离 │      │ pH    │ │BH1750│ │浮球×2│  │ 蜂鸣器    │
   └─┬─┬─┬─┬─┘      │ INA219│ │     │ │漏水  │  └───────────┘
     │ │ │ │        │ DS18B20│ └─────┘ │舵机  │
     │ │ │ │        └───────┘          └──────┘
     │ │ │ └──▶ 加热棒(220V 150W,自带机械温控)
     │ │ └────▶ 补光灯(220V 150W)
     │ └──────▶ 气泵(220V 5W)
     └────────▶ 12V 潜水泵(经 MOS 或继电器)

20.2.2 关键设计决策与课程依据

设计 依据
加热棒走 220 V,不走 12 V 150 W @ 12 V = 12.5 A,不可行(第 10 课功耗核算)
加热棒自带机械温控,与继电器串联 继电器粘连时的最后防线(第 18 课电力安全)
低水位浮球直接切断泵电源 防干转(第 10 课);硬件级保护,不依赖软件
pH/EC/DO 用数字电路 + I²C,不用 MCU 的 ADC pH 电极输出阻抗 10⁸–10⁹ Ω,模拟长走线必然拾噪(第 7 课)
传感器与主控之间必须电气隔离 水泵漏电流会耦合进水里,污染微伏级的 pH 信号(见 20.3.2)
气泵装止回阀 ×2 防停泵时水倒灌气泵(第 10 课)
控制盒 IP65,高于水面 ≥200 mm 电力安全(第 18 课)

20.2.3 为什么"低水位断泵"必须是硬件

这是本课最重要的一个设计原则:

软件方案:浮球 → ESP32 → 判断 → 继电器断开泵
风险:ESP32 死机 / 固件 bug / WiFi 阻塞 → 保护失效
硬件方案:浮球(常闭触点)→ 直接串在泵的 12V 供电回路上
风险:只有浮球本身坏,且可手动测试

原则:安全相关的动作,必须在最底层(硬件)实现,软件只做"提醒"。

这就是第 10 课说的"CHIFT-PIST 不做,就必须用传感器补回来"——但要补在正确的层。 本项目没做存水池(放弃了一个拓扑级的容错),所以必须用硬件级浮球来补,而不是靠软件。


20.3 传感器逐个解读

20.3.1 水温(DS18B20)

项 值
封装 304/316 不锈钢 6×50 mm,IP68
精度 ±0.5 ℃
范围 -55~125 ℃
接口 单总线(1-Wire),4.7 kΩ 上拉
为什么可靠 数字输出,不易漂移;无需校准

用法:

  • 放在鱼缸中层(不是底层——底层受底泥影响,不是表层——表层受气温影响)
  • 必须与加热棒位置分开(否则测的是加热棒附近,不是整体水温)
  • 两台(采购方案 B2 买 2 个):一个鱼缸、一个种植床 → 可以看两个位置的温差

温差的意义:如果鱼缸与种植床温差 >3 ℃,说明循环流量不足(水来不及把热量带走)。这是一个免费的"流量诊断"。

20.3.2 pH(数字电路 + 隔离)

这一节是本课 v2.1 改动最大的地方。 早期版本用模拟 pH 模块,结论是"pH 不适合在线监测"。 换成数字电路 + 电气隔离后,这个结论反过来了:pH 可以长期在线,一年校准一次。

为什么模拟方案会失败(这不是选型失误,是物理限制)

DFRobot SEN0161-V2 这类模拟模块的典型表现是:

场景 读数表现
泡在 7.00 缓冲液里 7.00 → 7.04,很准
放进鱼缸 6.4 ↔ 7.8 乱跳

同一支探头、同一套代码,一换环境就崩。原因有三层:

  1. 玻璃电极内阻高达 10⁸–10⁹ Ω。这么高的源阻抗,任何一点 PCB 漏电流、湿气、助焊剂残留,都会变成可观的误差电压。
  2. 水泵在往水里注噪声。泵、加热棒、电磁阀的微小漏电流经水形成回路,直接叠加在 pH 信号上。
  3. ADC 本身不隔离。模拟信号与 MCU 共地,而 MCU 的地又连着 12 V 电源的地——噪声有完整通路进来。

这不是"买到坏件"。有用户换过三块 Arduino、两个电源、反复校准,结果一样——只要还在用模拟输入,问题就无解。

数字方案怎么解决

层次 做法 效果
电路级 EZO-pH 内部完成高阻缓冲、ADC、温度补偿,对外只吐 ASCII MCU 侧不再有模拟电路
隔离级 探头侧与主控侧地不连通,用 I²C 隔离器跨接 切断噪声回路(关键)
探头级 Vanadium III 尖端 + Tyvek 液接界 + 双结结构 降低噪声、延长电极液寿命
固件级 合理性检查 + 突变丢弃 兜底

参数对比

项 模拟方案 数字方案(本项目)
精度 ±0.1 pH ±0.002 pH
分辨率 — 0.001
校准周期 2–4 周 12 个月
探头寿命 1–2 年 2.5 年+
标准 — ISO 10523
温度补偿 需自己做 内置
接口 0–3.0 V 模拟 I²C(0x63),ASCII

维护方式也要改

模拟方案下,pH 探头必须"测完取出、洗净泡回 KCl",所以不能长期在线。数字方案下:

做法 说明
可以长期浸没 双结 + Tyvek 液接界的设计就是为了长期浸没
但仍要防生物膜 每 2 周取出,用软布轻擦球泡(不要用纸巾,会划伤)
每季度做一次 7.00 点检 不重新校准,只验证;偏差 >0.05 才重新校准
每年一次完整校准 4.00 / 7.00 两点(或三点加 10.00)

校准系数存在 EZO 电路自己的 EEPROM 里,换主控、重烧固件都不用重校。

固件必须做的两件事

① 突变丢弃:1 分钟内 pH 变化 >0.5 → 丢弃该点,连续 3 次报警
② 趋势判断而非单点判断:pH 有日周期(第 5 课),看 7 天趋势

pH 之外,数字方案顺带解决了两个盲区

参数 模拟方案能做到吗 为什么重要
EC(电导率) 做不到 盐分累积只能靠 EC 判断,试纸测不出(第 8 课)
DO(溶氧) 做不到(探头贵且模拟难) 但本项目可用"水流 + 电流"间接替代,见下

关于 DO 要不要买:DO 探头约 ¥1,500,占电气预算 39 %。而缺氧 99 % 的原因是泵停/水流断,用电流检测(INA219,¥14)+ 两个温度探头看温差就能更早发现。 所以建议先不上 DO,等系统稳定运行半年再考虑。这与第 18 课"排查先看水流"的铁律一致。

20.3.3 水位(浮球 ×2)

位置 类型 作用
低位 常闭 水位过低 → 断电泵(硬件串联)
高位 常开 水位过高 → 报警(软件+蜂鸣器)

为什么需要高位:第 12 课的虹吸故障里有一种是"虹吸不停止"——如果进水不停、溢流又不够,水位会上涨。高位浮球能提前报警。

20.3.4 光照(BH1750)

项 值
量程 1–65535 lx
精度 ±20%
接口 I²C,地址 0x23

用法:

读数 含义 动作
长时间 < 5000 lx 光照不足 考虑补光
长时间 > 80000 lx 过强 考虑遮阳(第 16 课:叶菜抽薹)
日变化记录 判断朝向/遮挡 优化摆放

20.3.5 电流(INA219)

项 值
量程 ±3.2 A
分辨率 12 bit
优于 ACS712 ACS712-20A 分辨率仅 60 mA

用途(三合一):

用途 判断依据
泵堵转 / 空转检测 电流异常升高(堵转)或异常降低(空转/无水)
补光灯/加热棒工作状态 电流是否为 0 → 是否真的在通电
能耗统计 累计 kWh(第 10 课"抽 40 L 水约 1 度电"的实测校核)

INA219 是这块板子上"性价比最高的传感器":一个电流读数,同时监控了三类执行器,并且能发现"继电器吸合了但负载没通电"这种隐蔽故障。

20.3.6 其它

传感器 作用
漏水检测(2 根不锈钢探针) 接水盘积水 → 报警(第 18 课:泄漏是头号杀手)
舵机(MG90S) 投喂器转盘(第 17 课:定时定量)
蜂鸣器 + WS2812B 本地声光报警(不依赖网络)

20.4 软件架构建议

20.4.1 三层结构

┌─────────────────────────────────────┐
│  第 3 层:云 / App / 通知            │  远程查看、历史曲线
├─────────────────────────────────────┤
│  第 2 层:本地逻辑(ESP32)          │  采样、判断、执行、报警
├─────────────────────────────────────┤
│  第 1 层:硬件保护                   │  浮球断泵、加热棒机械温控
└─────────────────────────────────────┘

铁律:第 3 层断了,第 2 层必须继续工作;第 2 层死了,第 1 层必须还能保护。

对应本项目的验收标准(采购方案 §8):

验收项 判据
断电恢复 恢复供电后 60 s 内自动进入原状态,泵不停机
断网降级 拔网线后本地逻辑继续运行 ≥24 h,恢复后补传数据
泵堵转保护 堵住出水 30 s 内报警并断电重启一次

20.4.2 采样与控制周期

参数 建议周期 理由
水温 10 s 变化慢,但要做趋势
pH 30 s + 滑动平均 噪声大,需滤波
水位(浮球) 中断触发 状态量,不需轮询
电流 1 s 堵转要快速响应
光照 60 s 变化很慢
上报云端 60 s + 变化触发 省流量
数据落本地 5 min 断网不丢数据

20.4.3 报警分级

级别 触发 动作
🔴 紧急 水位过低 / 泵堵转 / 水温 <12 或 >33 ℃ / 漏水 立即断电保护 + 蜂鸣 + 推送
🟡 警告 pH <5.5 或 >7.5 / 流量下降 30% / 水温偏离目标 >3 ℃ 推送 + 指示灯光
🟢 提示 补光灯不亮 / nitrate 趋势上升 记录 + 日报

为什么"水温 <12 ℃"是紧急:罗非鱼 <12 ℃ 会死亡(第 17 课)。这是一个几小时内不可逆的事件,必须和"水位过低"同级。


20.5 一个反面案例:过度自动化

假设有人做了这样一个系统:

自动化投喂(每 6 小时)
+ 自动 pH 调节(检测到 pH >7 就加酸)
+ 自动补水(水位低就补)
+ 自动投药(检测到鱼病就投药)

会发生什么:

功能 问题
自动投喂 鱼吃不完 → 残饵 → 氨飙升(第 17 课)。自动化消除了"人观察摄食"的环节
自动 pH 加酸 撞上第 7 课的"假平稳"陷阱:酸被缓冲吃掉、pH 不动、继续加 → 缓冲耗尽 → pH 垂直坠落
自动补水 如果补水不加除氯 → 每次都杀一点菌(第 8 课)
自动投药 大多数鱼药杀硝化菌(第 17 课)→ 生物过滤器崩溃

结论:这四项里,三项是"用自动化把错误放大"。

正确做法:

应该自动 不该自动
投喂定时提醒(人来按) 投喂定量执行(无法感知鱼吃没吃完)
pH 报警 pH 自动加酸
补水提醒 补水自动执行(除非有除氯 + 定量)
环境数据记录 药物自动投放

一条判据:如果一个动作的"量"需要根据生物的实时反馈来调整,就不该自动化。

鱼吃多少、要不要加酸、要不要投药——这些都需要看生物的反应。自动化能做的是"监测和提醒",让你更快地做出判断。


20.6 本项目的分阶段落地

不要一次做全套。按这个顺序:

阶段 1:最小可用(第 1 个月)

✓ DS18B20 水温监测
✓ 低位浮球硬件断泵
✓ 补光灯 + 气泵定时(用机械/电子定时插座即可,不需要 MCU)
✓ 手动投喂 + 手动记录

→ 目标:验证水路与生物,不碰自动化

阶段 2:加入监测(第 2–3 月)

✓ ESP32 接入:水温 + 电流 + 浮球状态
✓ 本地声光报警(蜂鸣器 + WS2812B)
✓ 数据本地记录(SD 或 flash)
✓ WiFi 上报(可选)

阶段 3:加入 pH 与投喂(第 3–6 月)

✓ pH 传感器(开始校准记录台账)
✓ 舵机投喂器(定时定量,人可随时改量)
✓ 光照传感器
✓ 漏水检测

阶段 4:优化与后备(长期)

✓ 太阳能/电池备份(气泵优先)
✓ 加热控制接入(保留机械温控串联)
✓ 数据曲线分析(趋势而非单点)

每一阶段的前提:上一阶段的手动流程已经跑顺。 如果你还没养成"每周测 pH"的习惯,装了 pH 传感器也不会看。


20.7 一个提醒:自动化会让你"手生"

这是本课程最后要给的一个反直觉建议。

自动化最大的隐性代价是:你会逐渐失去对系统的"感觉"。

一个每天手动测水温 pH、每天看鱼摄食的人,会在问题发生的第一天就察觉到"今天鱼吃得不太积极"。而一个只看 App 的人,可能等到"氨 >1 mg/L"报警才发现 —— 那时已经是第 3 天了。

所以建议:

该自动 该保留手动
记录、报警、定时 每天亲眼看一下鱼和菜
数据趋势计算 每周亲手测一次 pH 和硝酸盐
远程查看 亲手投喂或至少观察一次摄食

原书十条里的第一条是"每天观察和监控系统"。这条无法被自动化替代。

自动化的正确定位是:让你在不能到场的时候也不至于全灭,而不是"让你不用到场"。


20.8 本课要点

  1. 自动化能做:监测记录、定时执行、阈值报警、保护性动作、远程查看。
  2. 自动化不能做:代替培菌、代替判断、修复根本问题、保证不漂移。
  3. 安全动作必须在硬件层实现(低水位浮球直接断泵,不经过 MCU)。
  4. 传感器优先级:浮球(硬件保护,不可省)> DS18B20(可靠免校准)> INA219(一读数监控三类负载)> pH / EC(决策必需,需隔离)> BH1750 > DO(可省)。
  5. pH 必须用数字电路 + 电气隔离,不能用 MCU 的模拟 ADC:玻璃电极内阻 10⁸–10⁹ Ω,水泵漏电流会直接污染信号(模拟方案的典型症状是"缓冲液里准、缸里乱跳")。数字方案做到 ±0.002 pH、年校准一次,可以长期在线——但仍要每 2 周擦球泡防生物膜。
  6. EC 是刚需、DO 不是:盐分累积只能靠 EC 判断(试纸测不出);而缺氧 99 % 是泵停/水流断,用 INA219 + 双温度差就能更早发现,DO 探头 ¥1,500 可省。
  7. INA219 是性价比最高的传感器:一个电流读数 = 堵转检测 + 通断确认 + 能耗统计。
  8. 软件三层架构:云(可断)→ 本地逻辑 → 硬件保护。上层失败不能影响下层。
  9. 报警分级:水温 <12 ℃ 与水位过低同级(不可逆后果)。
  10. 过度自动化反例:自动投喂/自动加酸/自动投药 = 用自动化放大错误。判据:"量"需依生物实时反馈调整的动作,不该自动化。
  11. 自动化会让你"手生" —— 每天亲眼看一下鱼和菜,无法被替代。

20.9 自查清单

  • 列出自动化能做与不能做各三项。
  • 为什么"低水位断泵"必须用硬件而不是软件?
  • 为什么本项目加热棒走 220 V 而不走 12 V?
  • 为什么模拟 pH 模块会出现"缓冲液里准、放进鱼缸就乱跳"?数字方案靠哪三层解决?
  • pH 探头能长期浸没吗?为什么仍需每 2 周取出擦洗?
  • INA219 一个传感器解决哪三个问题?
  • 鱼缸与种植床的温度差能诊断什么?
  • 三层软件架构分别是什么?上层断开时下层应该怎样?
  • 为什么"水温 <12 ℃"要列为紧急级?
  • 举出三个"过度自动化放大错误"的例子,并说出判断标准。
  • 为什么自动化无法替代"每天观察"?

全课程结束

你已经走完了 20 课。从"鱼菜共生是什么"到"如何自动化"。

如果只带走一句话:

鱼菜共生是一门养细菌的技术。 鱼提供氨,细菌把氨变成肥,植物把肥带走,水把一切连起来。你所有的设计、所有的参数、所有的故障排查,最终都在这条链上。

下一步:

  1. 回到 index.md,按"路径 B"重走一遍关键课(1→3→5→6→11→12→13→18),加固骨架。
  2. 打开 模板-参数台账.md,开始记录你自己的系统。
  3. 对照 《采购与施工细化方案》(工程方案,不在本站),把课程参数与你已经采购的物料逐项核对。

祝你的第一缸鱼活下来。