1. 项目概述与设计背景
作为一名长期从事嵌入式开发的工程师,我最近指导了几位学生完成基于STM32的智能鱼缸系统毕业设计。这个项目看似简单,实则涵盖了传感器数据采集、自动控制、无线通信等多个物联网核心技术点,非常适合作为嵌入式入门练手项目。
传统鱼缸管理存在几个痛点:人工投喂容易过量或遗漏、水温波动影响鱼类健康、水质恶化难以及时发现。我们这个系统通过STM32F103C8T6作为主控,搭配多种传感器和执行机构,实现了以下核心功能:
- 实时监测水温、水位、浊度等关键参数
- 根据预设阈值自动触发换水、投食、加热等操作
- 通过OLED屏本地显示状态信息
- 借助ESP8266 WiFi模块实现远程监控
硬件选型心得:STM32F103系列性价比极高,72MHz主频完全能满足此类控制需求,且开发资料丰富。ESP8266作为最成熟的WiFi模块之一,AT指令稳定可靠,大大降低了物联网功能开发门槛。
2. 硬件系统架构详解
2.1 核心控制器电路设计
主控电路采用最小系统设计,包含:
- STM32F103C8T6核心芯片
- 8MHz晶振+32.768kHz RTC晶振
- 复位电路(10kΩ上拉+0.1μF电容)
- BOOT选择跳线
- SWD调试接口
电源部分特别需要注意:
c复制// 典型电源电路配置
AMS1117-3.3V稳压芯片
输入电容:10μF钽电容(耐压16V以上)
输出电容:22μF MLCC+0.1μF去耦电容
2.2 传感器模块接口设计
-
水位检测:采用不锈钢探针式传感器,通过比较器电路转换为数字信号
- 接线方式:VCC→10kΩ上拉→传感器→比较器LM393
- 防腐蚀处理:探针需做镀金处理
-
温度采集:DS18B20单总线数字传感器
c复制// 典型接线示意图 VDD ──┬── 4.7kΩ上拉电阻 │ DS18B20 │ GND ──┘ -
水质检测:TDS传感器模拟输出,需接STM32 ADC通道
- 注意:需定期校准,建议每月用标准溶液校准一次
2.3 执行机构驱动电路
-
水泵控制:
- 采用5V微型潜水泵
- 驱动电路:S8050三极管+1N4007续流二极管
c复制// 典型驱动代码 void Pump_Control(uint8_t state) { GPIO_WriteBit(GPIOA, GPIO_Pin_1, (state)? Bit_SET : Bit_RESET); } -
投食电机:
- 使用28BYJ-48步进电机
- ULN2003驱动板
- 关键参数:64步/圈,减速比1:64
-
加热棒控制:
- 固态继电器(SSR-40DA)
- 过零检测电路防止浪涌电流
3. 软件系统实现细节
3.1 主程序控制流程优化
经过多次迭代,最终采用状态机架构:
mermaid复制graph TD
A[系统初始化] --> B[传感器数据采集]
B --> C{数据异常?}
C -->|是| D[执行对应控制]
C -->|否| E[刷新显示]
D --> F[网络数据上传]
E --> F
F --> B
关键定时器配置:
c复制// 定时器2用于系统心跳(1ms)
TIM_TimeBaseInitTypeDef TIM_Init;
TIM_Init.TIM_Period = 1000-1;
TIM_Init.TIM_Prescaler = 72-1;
TIM_TimeBaseInit(TIM2, &TIM_Init);
// 定时器3用于PWM生成(控制电机速度)
TIM_OCInitTypeDef PWM_Init;
PWM_Init.TIM_OCMode = TIM_OCMode_PWM1;
PWM_Init.TIM_OutputState = TIM_OutputState_Enable;
PWM_Init.TIM_Pulse = 500; // 50%占空比
TIM_OC1Init(TIM3, &PWM_Init);
3.2 传感器数据处理算法
-
温度采样滤波:
c复制#define SAMPLE_SIZE 5 float Temp_Filter(void) { static float buffer[SAMPLE_SIZE]; static uint8_t index = 0; buffer[index] = DS18B20_ReadTemp(); index = (index + 1) % SAMPLE_SIZE; float sum = 0; for(uint8_t i=0; i<SAMPLE_SIZE; i++) { sum += buffer[i]; } return sum/SAMPLE_SIZE; } -
水位状态判断:
- 采用迟滞比较防止抖动
- 触发阈值:低水位<30%,高水位>80%
3.3 WiFi通信协议设计
自定义轻量级协议帧格式:
code复制| 帧头(0xAA) | 长度 | 命令字 | 数据 | 校验和 |
典型控制指令示例:
python复制# Python上位机发送投食指令
def send_feed_cmd():
frame = bytearray([0xAA, 0x03, 0xF1, 0x00])
frame.append(sum(frame) & 0xFF) # 校验和
ser.write(frame)
4. 上位机开发关键技巧
4.1 PyQt5界面设计要点
-
布局管理:
python复制# 创建主窗口布局 layout = QVBoxLayout() # 传感器数据显示区 sensor_group = QGroupBox("实时数据") grid = QGridLayout() grid.addWidget(QLabel("水温:"), 0, 0) grid.addWidget(temp_label, 0, 1) sensor_group.setLayout(grid) layout.addWidget(sensor_group) -
数据可视化:
- 使用PyQtGraph库实现动态曲线
- 优化技巧:双缓冲机制防止闪烁
4.2 串口通信异常处理
常见问题解决方案:
-
端口占用:
python复制try: ser = serial.Serial(port, 115200, timeout=1) except serial.SerialException as e: QMessageBox.critical(self, "错误", f"串口打开失败: {str(e)}") -
数据粘包:
- 添加帧间隔(至少50ms)
- 实现超时重传机制
5. 系统调试与优化经验
5.1 硬件调试坑点记录
-
电源干扰问题:
- 现象:WiFi模块工作时MCU复位
- 解决方案:增加100μF电解电容并联0.1μF陶瓷电容
-
传感器误触发:
- 原因:导线过长引入干扰
- 改进:采用双绞线+屏蔽层接地
5.2 软件性能优化
-
内存优化:
- 使用
__packed关键字压缩结构体
c复制typedef __packed struct { uint8_t head; float temperature; uint16_t checksum; } SensorData; - 使用
-
低功耗设计:
- 空闲时进入STOP模式
- 通过RTC唤醒(1Hz中断)
6. 项目扩展方向建议
-
手机APP控制:
- 改用BLE模块(如HC-08)
- 开发Flutter跨平台应用
-
AI喂食策略:
- 添加摄像头模块
- 使用OpenCV实现鱼类活动量检测
- 动态调整投喂量
-
云平台接入:
- 通过MQTT协议连接阿里云IoT
- 实现多设备统一管理
这个项目我从原型开发到最终稳定运行历时两个月,最大的体会是:物联网系统开发必须重视模块化设计。比如将传感器驱动、网络通信、控制逻辑等分离为独立模块,这样当某个功能需要调整时(如更换WiFi模块),只需修改对应模块而不影响整体架构。