一、项目全景与系统架构

大家好,我是你们这门课的老朋友。今天咱们正式开篇,聊聊这个水质监测项目到底长什么样。

说实话,我最早接触水质监测,是因为一个朋友做水产养殖。他跟我说,鱼塘里的溶氧量一旦掉下去,一晚上能死几万块钱的鱼。我当时就想,这事儿要是能用物联网搞定,那该多好。后来我确实帮他做了一个原型,效果还不错。嗯,这就是咱们这门课的灵感来源。

1.1 项目背景:为什么要做水质监测?

你想想看,无论是饮用水安全、河流污染监控,还是鱼塘养殖、工业废水排放,水质数据都是刚需。传统做法是什么?人工采样、送实验室、等报告。这一套下来,少则半天,多则两三天。黄花菜都凉了。

咱们要做的,是一套能7×24小时在线监测的系统。传感器扔水里,数据自动上传,手机上一看就明白。说白了,就是把「事后补救」变成「实时预警」。

我在一个河道治理项目里遇到过这样的情况:下游的监测站发现水质异常,但等查到上游排污口,已经过去6个小时了。要是当时有实时监测,至少能提前4小时锁定源头。这就是咱们做这件事的价值。

1.2 系统总体架构:三层模型

物联网系统,万变不离其宗,就是三层架构。咱们这个项目也一样,分成感知层、网络层、应用层。我画个图你感受一下:

层级 作用 咱们用啥
感知层 采集数据、执行控制 树莓派 + 传感器(pH、温度、浊度、溶解氧)
网络层 传输数据、连接设备 MQTT协议 + Wi-Fi/以太网
应用层 存储、展示、分析 Flask + MySQL + 前端页面

感知层是咱们的「手」——树莓派负责跑Python脚本,传感器负责感知水质。我习惯把树莓派当作一个「小电脑」,它比单片机灵活,能跑完整的Linux系统,调试起来方便很多。

网络层是「神经」——MQTT协议是物联网界的「微信」,轻量、实时、双向通信。数据从树莓派发到服务器,服务器也能给树莓派发指令。

应用层是「大脑」——Flask框架搭一个Web服务,把数据存进数据库,再画成图表展示出来。你拿手机浏览器就能看。

核心思路:传感器采集 → 树莓派处理 → MQTT上传 → Flask接收 → 数据库存储 → 网页展示。一条线串下来,清清楚楚。

1.3 技术选型:为什么选这些?

很多新手会问:老师,为啥不用Arduino?为啥不用Node.js?我一个个说。

Python

选Python,说白了就是「快」。写个传感器驱动,几行代码搞定。树莓派上Python生态非常成熟,Adafruit、RPi.GPIO这些库直接拿来用。我个人习惯用Python做原型验证,等产品定型了再考虑要不要换成C++。

树莓派

树莓派4B或者Zero 2W都行。它比单片机强在哪儿?能跑完整的Linux,能装Python环境,能连Wi-Fi,还能接摄像头。我在一个野外监测项目里用过树莓派Zero,功耗低、体积小,用充电宝就能供电,非常方便。

传感器

咱们用这几款:

  • DS18B20:数字温度传感器,精度高、接线简单
  • pH传感器模块:模拟信号输出,需要ADC转换
  • 浊度传感器:也是模拟信号,测水的浑浊程度
  • 溶解氧传感器:这个贵一点,但测溶氧量很关键

嗯,这里要注意:模拟传感器需要ADC(模数转换器)。树莓派没有模拟输入引脚,所以咱们得用MCP3008这个ADC芯片,或者直接用带ADC的扩展板。

MQTT

MQTT是物联网的标配协议。它基于发布/订阅模式,树莓派作为客户端发布数据,Flask服务器订阅这些数据。我曾经在一个项目里用HTTP轮询,结果服务器压力大、延迟高。换成MQTT后,数据几乎是实时推送的,体验好太多了。

Flask

Flask是Python的轻量级Web框架。选它不选Django,是因为咱们项目规模不大,Flask更灵活、更容易上手。你想想看,一个文件就能跑起一个Web服务,多爽。

避坑指南:我曾经在选型时犯过一个错——用了太重的框架,结果开发周期拉长了一倍。对于原型项目,记住一个原则:够用就行,别过度设计

1.4 开发环境搭建

好,理论说完了,咱们动手。环境搭建这一步,我建议你跟着我一步步来,别跳步。我踩过的坑,不想让你再踩一遍。

Python虚拟环境

为什么要用虚拟环境?说白了,就是隔离项目依赖。你同时做两个项目,一个用Flask 2.0,一个用Flask 3.0,没有虚拟环境就会打架。

# 创建虚拟环境
python3 -m venv water_env

# 激活虚拟环境(Linux/Mac)
source water_env/bin/activate

# 激活虚拟环境(Windows)
water_env\Scripts\activate

# 退出虚拟环境
deactivate

激活后,你会看到命令行前面多了个 (water_env) 字样。嗯,看到这个就说明成功了。

Git版本控制

Git是程序员的后悔药。写错了代码?git checkout回去。改坏了文件?git restore救回来。我刚开始做项目时也不爱用Git,直到有一次不小心删了整个项目文件夹……从那以后,我每写一个功能就commit一次。

# 初始化仓库
git init

# 添加文件到暂存区
git add .

# 提交到本地仓库
git commit -m "初始化项目结构"

# 关联远程仓库(可选)
git remote add origin https://github.com/你的用户名/water-monitor.git
git push -u origin main

VS Code配置

VS Code是我最顺手的编辑器。装这几个插件,开发效率翻倍:

  • Python:微软官方插件,代码补全、调试一把抓
  • Remote - SSH:可以直接连到树莓派上写代码
  • GitLens:在代码行旁边显示Git提交信息,谁改了什么一目了然
  • Thunder Client:轻量级API测试工具,调试Flask接口用

重要提醒:如果你用的是Windows系统,建议装一个WSL(Windows Subsystem for Linux)。树莓派是Linux环境,在Windows上开发容易遇到路径分隔符、权限等问题。WSL能让你在Windows上拥有一个完整的Linux终端,省去很多麻烦。

1.5 项目目录结构

我习惯在项目一开始就把目录结构搭好。这样后面写代码时,文件该放哪儿心里有数。

water-monitor/
├── sensor/              # 传感器驱动代码
│   ├── __init__.py
│   ├── temperature.py   # 温度传感器
│   ├── ph_sensor.py     # pH传感器
│   ├── turbidity.py     # 浊度传感器
│   └── do_sensor.py     # 溶解氧传感器
├── mqtt_client/         # MQTT客户端
│   ├── __init__.py
│   └── publisher.py     # 数据发布
├── server/              # Flask服务端
│   ├── __init__.py
│   ├── app.py           # 主程序
│   ├── models.py        # 数据库模型
│   └── routes.py        # 路由
├── static/              # 前端静态文件
│   ├── css/
│   └── js/
├── templates/           # HTML模板
├── requirements.txt     # Python依赖列表
└── README.md            # 项目说明

这个结构,你照着建就行。后面每一章,咱们都会往里面填代码。

小结

这一章咱们把项目的全貌看了一遍。从背景到架构,从技术选型到环境搭建,算是开了个好头。下一章,咱们就要真正动手了——先让树莓派跑起来,把传感器接上,看看能不能读到数据。

记住一句话:物联网项目,最难的不是技术,而是把各个环节串起来。咱们这门课,就是带你一步步把这个「串」的过程走通。

有问题随时在群里问我。咱们下章见。