项目名称:Aquarium Guardian (智能鱼缸管家)

 

一、 实际应用场景描述

 

在一个典型的家庭或办公室观赏鱼缸场景中,鱼友(用户)通常依赖经验或日历提醒来进行换水。然而,鱼缸的水质受多种因素影响:

 

* 生物因素:鱼的密度、排泄物。

* 环境因素:温度、光照时长。

* 化学因素:鱼粮残留腐败、硝化系统效率波动。

 

本项目模拟一个基于 Python 的物联网 (IoT) 边缘计算节点,该节点连接虚拟的传感器(pH值传感器、温度传感器、TDS溶解性固体总量传感器),实时监测水质。当关键指标超过预设阈值或距离上次换水时间过长时,系统将通过控制台/日志发出“及时换水”的警报。

 

二、 引入痛点

 

传统的鱼缸维护存在以下四大痛点:

 

1. 滞后性:肉眼看到鱼浮头或水体发混时,往往为时已晚,鱼已应激。

2. 不精确:凭感觉换水,新手容易换水过少(无效)或过多(破坏硝化系统)。

3. 多参数耦合:仅凭 pH 值无法判断水质好坏,必须结合 TDS 和温度综合考量。

4. 遗忘:忙碌的生活节奏下,容易忘记定期维护,导致氨氮积累。

 

三、 核心逻辑讲解

 

本系统的核心逻辑基于多条件决策树 (Decision Tree) 与状态机 (State Machine) 思想:

 

1. 数据采集层 (Sensor Layer):模拟从硬件传感器读取原始数据(如 

"random.uniform(6.5, 8.0)" 模拟 pH 值)。

2. 数据处理层 (Processing Layer):对数据进行滤波(此处简化为直接读取)和标准化。

3. 决策引擎 (Decision Engine):这是核心。系统不会单一依赖某个指标,而是采用加权评分机制。

   * 若 

"TDS > 400" \rightarrow 触发换水标志。

   * 若 

"pH" 超出 

"[6.8, 7.8]" 的安全范围 \rightarrow 触发换水标志。

   * 若 

"当前时间 - 上次换水时间 > 7天" \rightarrow 触发换水标志。

4. 输出层 (Output Layer):一旦触发任意条件,打印醒目红色警告 “及时换水”。

 

四、 代码模块化实现

 

我们将代码分为三个模块:

"config.py" (配置)、

"sensors.py" (传感器模拟)、

"main.py" (主逻辑)。

 

1. 配置文件:

"config.py"

 

"""

配置文件:存储所有常量和阈值

"""

 

# 水质安全阈值 (基于淡水热带鱼常见标准)

WATER_QUALITY_THRESHOLDS = {

    "PH_MIN": 6.8,

    "PH_MAX": 7.8,

    "TDS_MAX": 400, # 单位:ppm (Parts Per Million)

    "TEMP_MIN": 22, # 摄氏度

    "TEMP_MAX": 28 # 摄氏度

}

 

# 维护周期 (秒)

MAINTENANCE_CYCLE_SECONDS = 7 * 24 * 60 * 60 # 7天

 

2. 传感器模拟模块:

"sensors.py"

 

"""

智能仪器课程相关:传感器数据采集与模拟

使用随机数生成器来模拟真实传感器的噪声和数据波动

"""

import random

import time

 

class VirtualWaterSensor:

    """

    虚拟水质传感器类

    模拟智能仪器中的数据采集卡(DAQ)功能

    """

    

    def __init__(self, base_ph=7.0, base_tds=200):

        self.base_ph = base_ph

        self.base_tds = base_tds

        

    def read_ph(self):

        """

        读取pH值

        模拟真实环境的微小波动 (+/- 0.2)

        """

        noise = random.uniform(-0.2, 0.2)

        return round(self.base_ph + noise, 2)

    

    def read_tds(self):

        """

        读取TDS值 (溶解性固体总量)

        随时间推移,TDS会逐渐升高,模拟污染物积累

        """

        # 这里为了演示,我们让TDS随机波动,但在主循环中会增加趋势

        noise = random.uniform(-10, 30) # 倾向于增加

        value = self.base_tds + noise

        self.base_tds = min(value, 600) # 限制最大值

        return int(self.base_tds)

    

    def read_temperature(self):

        """读取水温"""

        return round(random.uniform(23.0, 27.0), 1)

 

3. 主程序逻辑:

"main.py"

 

"""

智能鱼缸换水提醒系统 - 主执行文件

核心逻辑:基于规则(Rule-based)的专家系统

"""

import time

import datetime

from config import WATER_QUALITY_THRESHOLDS, MAINTENANCE_CYCLE_SECONDS

from sensors import VirtualWaterSensor

 

class AquariumMonitor:

    def __init__(self):

        self.sensor = VirtualWaterSensor()

        self.last_water_change_time = time.time() # 记录上次换水时间

        self.alert_status = False

        

    def check_water_quality(self):

        """

        核心决策函数

        返回 True 表示水质异常,需要换水

        """

        ph = self.sensor.read_ph()

        tds = self.sensor.read_tds()

        temp = self.sensor.read_temperature()

        

        print(f"\n[{datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')}] 检测中...")

        print(f" -> pH: {ph}, TDS: {tds} ppm, Temp: {temp}°C")

        

        # 1. 检查化学指标

        if not (WATER_QUALITY_THRESHOLDS["PH_MIN"] <= ph <= WATER_QUALITY_THRESHOLDS["PH_MAX"]):

            print(" [诊断] pH值超出安全范围!")

            return True

            

        if tds > WATER_QUALITY_THRESHOLDS["TDS_MAX"]:

            print(f" [诊断] TDS超标 ({tds} > {WATER_QUALITY_THRESHOLDS['TDS_MAX']})!")

            return True

            

        # 2. 检查时间周期

        elapsed_time = time.time() - self.last_water_change_time

        if elapsed_time > MAINTENANCE_CYCLE_SECONDS:

            days_passed = int(elapsed_time / (24 * 3600))

            print(f" [诊断] 已超过 {days_passed} 天未换水!")

            return True

            

        return False

    

    def simulate_water_change(self):

        """模拟换水操作"""

        print("\n✅ 正在换水... 水质重置中...")

        self.last_water_change_time = time.time()

        self.sensor.base_tds = 150 # 换水后TDS降低

        self.sensor.base_ph = 7.0

        self.alert_status = False

        print("✅ 换水完成,计时器重置。")

        

    def run(self):

        """主运行循环"""

        print("🐠 智能鱼缸监控系统启动 🐠")

        print("按 Ctrl+C 退出程序")

        

        try:

            while True:

                need_change = self.check_water_quality()

                

                if need_change and not self.alert_status:

                    # ANSI转义码实现红色字体

                    print("\n" + "!" * 50)

                    print("\033[91m*** 警 报:水质恶化,请及时换水!***\033[0m")

                    print("!" * 50)

                    self.alert_status = True # 防止重复报警

                    

                elif not need_change:

                    print(" [状态] 水质良好,无需操作。")

                    self.alert_status = False

                    

                time.sleep(5) # 每5秒检测一次 (实际应用中可能是几分钟)

                

        except KeyboardInterrupt:

            print("\n程序已手动停止。")

 

 

if __name__ == "__main__":

    monitor = AquariumMonitor()

    # 为了演示效果,我们可以在这里先模拟一次换水

    monitor.simulate_water_change()

    monitor.run()

 

五、 README 文件

 

# Aquarium Guardian - 智能鱼缸换水提醒系统

 

## 项目简介

这是一个基于 Python 的智能鱼缸水质监测模拟项目。项目旨在解决传统养鱼中依赖人工经验判断水质的问题,通过模拟多传感器数据采集与阈值分析,实现自动化的换水提醒功能。

 

## 核心功能

* **多参数监测**: 模拟监测 pH 值、TDS (总溶解固体) 和水温。

* **智能决策**: 结合化学指标与时间周期双重逻辑判断是否需要换水。

* **防抖报警**: 内置状态锁,避免同一问题持续刷屏报警。

 

## 环境依赖

* Python 3.8+

 

## 使用说明

1. 克隆或下载本项目文件 (`config.py`, `sensors.py`, `main.py`)。

2. 打开终端,进入项目目录。

3. 运行主程序:

 

bash

 

python main.py

 

4. 观察控制台输出。程序会每 5 秒打印一次检测数据。

5. 等待几轮检测,TDS 值会因模拟积累而升高,最终触发 "及时换水" 警报。

 

## 扩展建议

* 接入真实的 Raspberry Pi 和物理传感器 (如 DFRobot 的 pH 传感器)。

* 增加 SMTP 邮件发送或微信推送功能。

* 将数据存储到 SQLite 数据库并绘制历史曲线。

 

六、 核心知识点卡片 (Key Takeaways)

 

类别 知识点 说明

智能仪器 传感器模拟 使用软件算法模拟硬件传感器的噪声和非线性特性。

编程范式 面向对象 (OOP) 将 

"Sensor" 和 

"Monitor" 封装为类,提高代码复用性和可维护性。

系统设计 分层架构 分离 Config (配置)、Sensor (采集)、Logic (决策) 层。

算法逻辑 多条件决策 并非单一指标触发,而是综合时间、化学指标进行判断。

工程实践 防抖 (Debounce) 使用 

"alert_status" 变量防止在循环检测中重复触发警报。

 

七、 总结

 

作为一名全栈工程师,在设计这个智能鱼缸系统时,我不仅仅关注“能不能跑”,更关注工程的健壮性。

 

1. 从理论到代码:我们将《智能仪器》课程中的传感器信号链(采集-处理-输出)转化为了 Python 类的实现。

2. 模块化思维:通过 

"config.py" 管理阈值,使得后期调整参数无需改动核心逻辑,符合工业级开发规范。

3. 实用价值:虽然目前使用的是模拟数据,但代码结构清晰地预留了硬件接口。只需替换 

"sensors.py" 中的 

"read_xxx()" 方法,即可无缝对接真实的 Arduino 或 Raspberry Pi GPIO 引脚读取到的串口数据。

 

这个项目的精髓在于:它不仅是提醒你换水,更是在教你如何用代码去量化生活中模糊的经验。

利用AI解决实际问题,如果你觉得这个工具好用,欢迎关注长安牧笛!

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐