一、项目全景与系统架构
大家好,我是你们这门课的老朋友。今天咱们正式开篇,聊聊这个水质监测项目到底长什么样。
说实话,我最早接触水质监测,是因为一个朋友做水产养殖。他跟我说,鱼塘里的溶氧量一旦掉下去,一晚上能死几万块钱的鱼。我当时就想,这事儿要是能用物联网搞定,那该多好。后来我确实帮他做了一个原型,效果还不错。嗯,这就是咱们这门课的灵感来源。
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 # 项目说明
这个结构,你照着建就行。后面每一章,咱们都会往里面填代码。
小结
这一章咱们把项目的全貌看了一遍。从背景到架构,从技术选型到环境搭建,算是开了个好头。下一章,咱们就要真正动手了——先让树莓派跑起来,把传感器接上,看看能不能读到数据。
记住一句话:物联网项目,最难的不是技术,而是把各个环节串起来。咱们这门课,就是带你一步步把这个「串」的过程走通。
有问题随时在群里问我。咱们下章见。