【物联网毕设】基于Arduino与树莓派的智能鱼缸系统设计与实现
1. 项目背景与整体设计
养鱼爱好者都知道,维持鱼缸环境稳定是个技术活。水温忽高忽低、水中含氧量不足、水位不稳定等问题,都可能让心爱的观赏鱼遭殃。传统的人工监测方式不仅费时费力,还容易因疏忽造成损失。这正是我选择智能鱼缸系统作为毕业设计的原因——用物联网技术解决实际问题。
整个系统的设计思路很明确:用Arduino作为"感官系统",负责采集鱼缸环境数据;用树莓派作为"大脑",处理数据并做出决策;最后通过微信小程序让用户随时查看鱼缸状态。这种分层设计既保证了系统响应速度,又实现了远程监控功能。
硬件配置上,我选择了性价比最高的方案:
- Arduino UNO开发板(克隆版,价格只有原版的1/3)
- DS18B20防水温度传感器
- 低成本水位传感器
- 电位器模拟溶解氧传感器(真品要3000+,学生党伤不起)
- 树莓派3B作为主控制器
- 四个继电器模块控制各类水泵
2. 硬件搭建与传感器连接
2.1 温度监测模块
DS18B20防水温度传感器是我的首选,它有三个突出优点:
- 防水性能好,可以直接浸入水中
- 测量精度达±0.5℃
- 采用单总线协议,节省IO口资源
接线时有个坑要注意:DS18B20需要上拉电阻。我直接买了配套模块省事,否则得自己接个4.7kΩ电阻。接线方式很简单:
- VCC接5V
- GND接地
- DATA接数字引脚2(需在代码中定义)
实际测试时发现个有趣现象:加热棒工作时会干扰传感器读数。解决方法是在加热棒和传感器之间加个隔板,减少热传导影响。代码中设置了25℃的阈值,低于这个值就启动加热棒。
2.2 水位控制模块
水位传感器我选了最便宜的型号(学生预算有限),但使用时发现两个问题:
- 长期通电会导致探针腐蚀
- 读数波动较大(±50的误差)
我的解决方案很巧妙:
- 通过数字引脚7控制传感器供电,只在读数时通电
- 在代码中加入滤波算法,取10次读数的平均值
- 设置550-640的阈值区间防止继电器频繁动作
水位控制逻辑分为三档:
- 低于550(水位过低):启动注水泵
- 550-640(正常范围):水泵全停
- 高于640(水位过高):启动抽水泵
2.3 溶解氧模拟模块
真正的溶解氧传感器贵得离谱(3000+),和导师商量后决定用电位器模拟。虽然不够精确,但作为毕业设计演示完全够用。关键是要做好标定:
- 电位器旋钮最小位置对应0mg/L
- 最大位置对应10mg/L
- 5mg/L作为阈值控制充氧泵
接线时注意:
- 电位器中间引脚接模拟输入A1
- 两侧引脚分别接5V和GND
- 使用map()函数将模拟值映射到氧浓度值
3. 树莓派数据处理中心
3.1 硬件连接与通信
Arduino和树莓派通过USB连接是最简单的方案,但要注意供电问题:
- 树莓派单独使用5V/2.5A电源
- Arduino外接独立电源(树莓派USB供电不足)
- 所有执行机构(水泵/加热棒)单独供电
通信协议选择Serial,波特率设为9600。我在代码中添加了特殊标识符来区分不同传感器数据:
- "T"开头表示温度
- "W"开头表示水位
- "O"开头表示氧浓度
3.2 数据库设计与Web服务
选用MySQL存储历史数据,表结构设计如下:
| 字段名 | 类型 | 说明 |
|---|---|---|
| id | INT | 自增主键 |
| timestamp | DATETIME | 记录时间 |
| temp | FLOAT | 水温(℃) |
| water_level | INT | 水位值 |
| oxygen | INT | 氧浓度(mg/L) |
用Django搭建Web服务提供两个API接口:
- POST接口:接收Arduino上传的数据
- GET接口:为小程序提供最新数据
关键代码片段:
# views.py from django.http import JsonResponse from .models import SensorData def post_data(request): if request.method == 'POST': temp = request.POST.get('temp') level = request.POST.get('level') oxygen = request.POST.get('oxygen') new_data = SensorData.objects.create( temp=temp, water_level=level, oxygen=oxygen ) return JsonResponse({'status':'success'}) def get_data(request): latest = SensorData.objects.last() return JsonResponse({ 'temp': latest.temp, 'level': latest.water_level, 'oxygen': latest.oxygen })4. 微信小程序开发
小程序界面设计遵循KISS原则(Keep It Simple, Stupid):
- 顶部显示当前水温、水位、氧浓度
- 中间区域用仪表盘展示数据趋势
- 底部预留手动控制按钮(后续扩展)
关键实现步骤:
- 注册微信开发者账号
- 使用wx.request调用树莓派API
- 每30秒自动刷新数据
- 使用ECharts-for-WeChat实现数据可视化
遇到的最大坑是HTTPS问题:微信要求所有网络请求必须使用HTTPS。我的解决方案是在树莓派上配置Nginx反向代理,并使用Let's Encrypt免费证书。
5. 系统优化与问题排查
实际运行中发现几个典型问题:
供电不足问题:
- 现象:多个水泵同时工作时系统重启
- 原因:Arduino的5V引脚输出电流有限
- 解决:为每个执行机构单独配置5V电源
数据丢包问题:
- 现象:树莓派偶尔收不到Arduino数据
- 原因:USB接触不良
- 解决:更换高质量USB线并加固接口
继电器误动作:
- 现象:水泵无故启动
- 原因:电磁干扰导致
- 解决:在继电器线圈两端并联续流二极管
6. 项目扩展与改进方向
虽然基本功能已经实现,但还有很大优化空间:
增加摄像头监控:
- 使用树莓派官方摄像头模块
- 定时拍摄鱼缸照片
- 通过小程序查看实时画面
改进溶解氧检测:
- 使用光学法传感器(价格适中)
- 加入温度补偿算法
- 定期自动校准
添加喂食功能:
- 舵机控制的自动喂食器
- 定时投喂或远程手动控制
- 记录喂食日志
这个项目让我深刻体会到物联网开发的乐趣——从硬件选型到代码编写,从通信协议到界面设计,每个环节都充满挑战。最开心的时刻莫过于看到系统稳定运行,所有传感器数据准确显示在小程序上。如果你也在做类似项目,建议先从核心功能入手,再逐步扩展,这样更容易获得成就感。
