1. 项目概述
这个基于STM32的智能鱼缸监控投喂系统是我去年指导的一个本科毕业设计项目,经过三个月的开发和调试,最终实现了一套完整的鱼缸自动化管理方案。作为一个嵌入式系统开发的老手,我发现这个项目特别适合作为电子类学生的毕业设计选题——它涵盖了传感器采集、自动控制、无线通信等多个关键技术点,而且最终效果直观可见,容易获得答辩老师的青睐。
系统核心功能包括:
- 实时监测鱼缸水位、水质和温度
- 自动控制水泵进行补水排水
- 定时定量投喂饲料
- OLED屏幕显示实时数据
- 通过WiFi实现远程监控和控制
整套系统的硬件成本控制在200元以内,软件开发难度适中,但涉及的知识面很广,特别能锻炼学生的综合能力。下面我就从硬件设计、软件实现到系统调试,详细分享这个项目的开发过程和技术要点。
2. 硬件系统设计
2.1 主控芯片选型
我们选择了STM32F103C8T6作为主控芯片,这是ST公司经典的Cortex-M3内核微控制器,理由很充分:
- 72MHz主频,性能足够处理多任务
- 64KB Flash + 20KB RAM,满足程序存储需求
- 丰富的外设接口:USART、I2C、SPI、ADC等
- 价格仅10元左右,性价比极高
- 完善的开发工具链和丰富的学习资源
提示:对于初学者,建议购买现成的STM32最小系统板,省去电源电路和调试接口的设计,可以更快上手开发。
2.2 传感器模块选择
系统需要监测三类关键参数:
-
水位检测:使用不锈钢探针式水位传感器
- 优点:结构简单,成本低(约5元)
- 缺点:长期使用可能腐蚀,需定期清洁
- 替代方案:非接触式超声波传感器(成本约30元)
-
水质监测:采用TDS(总溶解固体)传感器
- 测量范围:0-1000ppm
- 精度:±10%
- 输出:模拟电压信号
-
温度检测:DS18B20数字温度传感器
- 测量范围:-55°C ~ +125°C
- 精度:±0.5°C
- 单总线接口,布线简单
2.3 执行机构设计
系统需要控制三类执行设备:
| 设备类型 | 控制方式 | 驱动电路 | 注意事项 |
|---|---|---|---|
| 水泵 | 继电器 | ULN2003驱动 | 需加续流二极管保护 |
| 投食电机 | PWM | L298N电机驱动 | 注意电机堵转电流 |
| 电磁阀 | 继电器 | 三极管驱动 | 选择常闭型阀门 |
2.4 通信模块选型
为了实现远程监控,我们选择了ESP8266 WiFi模块:
- 支持802.11 b/g/n协议
- 内置TCP/IP协议栈
- 通过AT指令与STM32通信
- 成本仅15元左右
硬件连接示意图:
code复制STM32 <--UART--> ESP8266
|
V
传感器阵列
|
V
执行机构
3. 软件系统设计
3.1 系统架构设计
整个软件采用模块化设计,主要分为以下几个功能模块:
-
传感器数据采集模块
- 定时读取各传感器数据
- 数据滤波处理(均值滤波+阈值判断)
- 异常状态检测
-
控制逻辑模块
- 水位控制算法
- 投食定时器管理
- 水质监测逻辑
-
人机交互模块
- OLED显示驱动
- 按键输入处理
- 状态指示灯控制
-
通信模块
- WiFi连接管理
- 数据协议封装
- 指令解析处理
3.2 关键算法实现
3.2.1 水位控制算法
c复制void WaterLevelControl(void)
{
static uint8_t last_state = 0;
uint8_t current_state = GetWaterLevel();
// 水位过低
if(current_state < LOW_LEVEL && last_state >= LOW_LEVEL) {
StartPump();
last_state = current_state;
return;
}
// 水位正常
if(current_state >= LOW_LEVEL && current_state <= HIGH_LEVEL) {
if(last_state < LOW_LEVEL) {
StopPump();
}
last_state = current_state;
return;
}
// 水位过高
if(current_state > HIGH_LEVEL) {
OpenDrainValve();
last_state = current_state;
return;
}
}
3.2.2 定时投喂算法
c复制typedef struct {
uint8_t hour;
uint8_t minute;
uint8_t duration; // 投喂持续时间(秒)
} FeedSchedule;
FeedSchedule feed_times[3] = {
{8, 0, 5}, // 早上8点
{12, 0, 5}, // 中午12点
{18, 0, 5} // 晚上6点
};
void CheckFeedTime(void)
{
RTC_TimeTypeDef current_time;
HAL_RTC_GetTime(&hrtc, ¤t_time, RTC_FORMAT_BIN);
for(int i=0; i<3; i++) {
if(current_time.Hours == feed_times[i].hour &&
current_time.Minutes == feed_times[i].minute &&
current_time.Seconds < feed_times[i].duration) {
StartFeeding();
return;
}
}
StopFeeding();
}
3.3 通信协议设计
上位机与下位机之间采用简单的JSON格式通信协议:
数据上报格式(下位机→上位机)
json复制{
"temp": 26.5,
"tds": 120,
"water_level": 2,
"pump_status": 0,
"valve_status": 1,
"feed_status": 0
}
控制指令格式(上位机→下位机)
json复制{
"cmd": "set_feed_time",
"params": {
"index": 1,
"hour": 13,
"minute": 30
}
}
4. 系统实现与调试
4.1 开发环境搭建
-
硬件准备
- STM32最小系统板
- ST-Link V2调试器
- 各类传感器模块
- 继电器模块
- 电源模块(建议使用5V/2A开关电源)
-
软件工具
- Keil MDK-ARM开发环境
- STM32CubeMX配置工具
- 串口调试助手
- Wireshark网络抓包工具(用于调试WiFi通信)
4.2 常见问题及解决方案
在开发过程中,我们遇到了几个典型问题:
-
WiFi连接不稳定
- 现象:ESP8266频繁断开连接
- 原因:电源噪声干扰
- 解决:在模块电源引脚增加100μF电容
-
水位传感器误报
- 现象:水位信号跳动
- 原因:水面波动导致接触不稳定
- 解决:软件增加去抖动滤波算法
-
电机干扰MCU
- 现象:电机启动时MCU复位
- 原因:电机反向电动势干扰
- 解决:在电机两端并联续流二极管
4.3 系统优化建议
经过实际使用,我发现还可以从以下几个方面进行优化:
-
增加本地存储功能
- 使用EEPROM保存配置参数
- 记录历史数据用于分析
-
改进控制算法
- 引入PID控制提高水位调节精度
- 增加自适应投喂量算法
-
增强安全性
- 增加漏水检测功能
- 实现异常状态自动报警
5. 项目扩展方向
这个基础框架还可以扩展更多实用功能:
-
手机APP控制
- 开发Android/iOS客户端
- 实现远程视频监控
-
智能学习功能
- 记录鱼只进食习惯
- 自动优化投喂策略
-
多鱼缸组网
- 使用LoRa实现多节点组网
- 集中监控管理
这个项目最让我满意的是它的可扩展性——学生可以根据自己的兴趣和能力,选择不同的方向进行深入开发。比如对通信感兴趣的同学可以深入研究MQTT协议,对控制算法感兴趣的同学可以尝试实现更复杂的控制策略。
在实际开发中,我建议采用迭代式开发方法:先实现核心功能,确保基础功能稳定后再逐步添加高级功能。这样既能保证项目进度,又能根据实际情况调整设计方案。