第 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 乱跳 |
同一支探头、同一套代码,一换环境就崩。原因有三层:
- 玻璃电极内阻高达 10⁸–10⁹ Ω。这么高的源阻抗,任何一点 PCB 漏电流、湿气、助焊剂残留,都会变成可观的误差电压。
- 水泵在往水里注噪声。泵、加热棒、电磁阀的微小漏电流经水形成回路,直接叠加在 pH 信号上。
- 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 本课要点¶
- 自动化能做:监测记录、定时执行、阈值报警、保护性动作、远程查看。
- 自动化不能做:代替培菌、代替判断、修复根本问题、保证不漂移。
- 安全动作必须在硬件层实现(低水位浮球直接断泵,不经过 MCU)。
- 传感器优先级:浮球(硬件保护,不可省)> DS18B20(可靠免校准)> INA219(一读数监控三类负载)> pH / EC(决策必需,需隔离)> BH1750 > DO(可省)。
- pH 必须用数字电路 + 电气隔离,不能用 MCU 的模拟 ADC:玻璃电极内阻 10⁸–10⁹ Ω,水泵漏电流会直接污染信号(模拟方案的典型症状是"缓冲液里准、缸里乱跳")。数字方案做到 ±0.002 pH、年校准一次,可以长期在线——但仍要每 2 周擦球泡防生物膜。
- EC 是刚需、DO 不是:盐分累积只能靠 EC 判断(试纸测不出);而缺氧 99 % 是泵停/水流断,用 INA219 + 双温度差就能更早发现,DO 探头 ¥1,500 可省。
- INA219 是性价比最高的传感器:一个电流读数 = 堵转检测 + 通断确认 + 能耗统计。
- 软件三层架构:云(可断)→ 本地逻辑 → 硬件保护。上层失败不能影响下层。
- 报警分级:水温 <12 ℃ 与水位过低同级(不可逆后果)。
- 过度自动化反例:自动投喂/自动加酸/自动投药 = 用自动化放大错误。判据:"量"需依生物实时反馈调整的动作,不该自动化。
- 自动化会让你"手生" —— 每天亲眼看一下鱼和菜,无法被替代。
20.9 自查清单¶
- 列出自动化能做与不能做各三项。
- 为什么"低水位断泵"必须用硬件而不是软件?
- 为什么本项目加热棒走 220 V 而不走 12 V?
- 为什么模拟 pH 模块会出现"缓冲液里准、放进鱼缸就乱跳"?数字方案靠哪三层解决?
- pH 探头能长期浸没吗?为什么仍需每 2 周取出擦洗?
- INA219 一个传感器解决哪三个问题?
- 鱼缸与种植床的温度差能诊断什么?
- 三层软件架构分别是什么?上层断开时下层应该怎样?
- 为什么"水温 <12 ℃"要列为紧急级?
- 举出三个"过度自动化放大错误"的例子,并说出判断标准。
- 为什么自动化无法替代"每天观察"?
全课程结束¶
你已经走完了 20 课。从"鱼菜共生是什么"到"如何自动化"。
如果只带走一句话:
鱼菜共生是一门养细菌的技术。 鱼提供氨,细菌把氨变成肥,植物把肥带走,水把一切连起来。你所有的设计、所有的参数、所有的故障排查,最终都在这条链上。
下一步:
- 回到
index.md,按"路径 B"重走一遍关键课(1→3→5→6→11→12→13→18),加固骨架。 - 打开
模板-参数台账.md,开始记录你自己的系统。 - 对照 《采购与施工细化方案》(工程方案,不在本站),把课程参数与你已经采购的物料逐项核对。
祝你的第一缸鱼活下来。