1. 项目背景与核心功能解析
作为一名在嵌入式系统领域摸爬滚打多年的工程师,我见过太多华而不实的"智能"设备。但这款基于STM32的智能鱼缸系统确实抓住了养鱼爱好者的真实痛点——水质管理和精准投喂。传统鱼缸维护需要人工监测水温、PH值,投喂量也难以精确控制,这正是我们做这个毕设项目的初衷。
系统通过STM32F103C8T6作为主控芯片(选择这款芯片是因为其性价比高,且内置ADC和PWM功能完美适配本项目需求),整合了多个传感器模块:
- DS18B20数字温度传感器(精度±0.5℃)
- PH-4502C水质检测模块(测量范围0-14PH)
- 5V潜水泵(流量300L/H)
- SG90舵机控制的投食机构(旋转角度精确到1°)
硬件选型经验:PH传感器一定要选带防水探头和温度补偿的型号,实测普通模块在水下使用三个月后就会出现数据漂移。
系统工作流程是这样的:每30分钟自动采集一次环境数据(这个间隔是通过实测得出的平衡点——既不会频繁唤醒耗电,又能及时发现问题),当检测到水温超过28℃或PH值超出6.5-7.5范围时,通过OLED屏幕显示告警并启动相应调节机制。投喂系统支持两种模式:定时定量投喂和手机APP远程手动投喂。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 硬件架构设计与关键电路实现
2.1 主控模块设计要点
STM32最小系统板的选择直接影响整个项目的稳定性。经过对比测试,我们最终采用的核心配置:
- 主频设置为72MHz(在功耗和性能间取得平衡)
- 启用内部RC振荡器(省去外部晶振,减少故障点)
- 预留SWD调试接口(必须!后期调试救命用的)
电源部分最容易出问题,我们的解决方案:
c复制// 电源监测代码示例
void Power_Check(void) {
if(__HAL_PWR_GET_FLAG(PWR_FLAG_PVDO)) {
Buzzer_Alert(3); // 电压不足报警
}
}
配合硬件上的AMS1117-3.3V稳压芯片和1000μF的滤波电容,实测即使输入电压波动到5V±10%,系统也能稳定工作。
2.2 传感器接口电路
温度传感器采用单总线接法,注意要加上拉电阻:
code复制DS18B20接线方案:
VCC —— 3.3V
DQ —— PB12(开漏输出模式)
GND —— GND
加上拉电阻4.7KΩ
PH传感器接口需要特别注意信号调理:
- 原始信号经过LM358运放做电压跟随
- 再用TL431提供2.5V基准电压
- 最后接入STM32的ADC1通道5(PA5)
血泪教训:第一次测试时没加电压跟随器,传感器输出阻抗导致ADC采样值波动达15%,添加运放后误差降到1%以内。
3. 软件系统架构与核心算法
3.1 多任务调度实现
采用FreeRTOS实时操作系统(内存占用仅6KB),创建了三个主要任务:
- 传感器数据采集任务(优先级3)
- 人机交互任务(优先级2)
- 设备控制任务(优先级4)
任务间通过消息队列通信,关键代码如下:
c复制// 创建传感器数据消息队列
xQueueSensor = xQueueCreate(5, sizeof(SensorData_t));
// 数据采集任务
void vTaskSensor(void *pvParameters) {
SensorData_t data;
while(1) {
data.temp = DS18B20_Read();
data.ph = PH_Read();
xQueueSend(xQueueSensor, &data, portMAX_DELAY);
vTaskDelay(pdMS_TO_TICKS(1800000)); // 30分钟间隔
}
}
3.2 自适应投喂算法
传统定时投喂容易导致过度喂食,我们开发的算法会综合以下因素动态调整投喂量:
- 当前水温(温度越高代谢越快)
- 最近24小时投喂总量
- 鱼类活动状态(通过红外传感器检测)
算法核心逻辑:
c复制float calculate_feed_amount(float temp, float daily_total) {
float base = 0.2f; // 基础投喂量(g)
float temp_factor = temp > 25 ? 1.5f : 1.0f;
float history_factor = daily_total > 2.0f ? 0.7f : 1.0f;
return base * temp_factor * history_factor;
}
4. 手机APP通信方案
4.1 ESP8266 WiFi模块配置
选用AT指令固件版本1.6.2(实测最稳定),硬件接线:
code复制ESP8266 —— STM32
TX —— PA3
RX —— PA2
VCC —— 3.3V
EN —— 10K上拉
通信协议采用自定义的轻量级JSON格式:
json复制{
"cmd": "feed",
"param": {
"amount": 0.5,
"time": "14:00"
}
}
4.2 安卓APP开发关键点
使用Android Studio开发,重点解决两个问题:
- 长连接保持:采用心跳包机制(每30秒一次)
- 数据同步:使用SQLite本地缓存+网络更新策略
网络通信核心代码:
java复制// WiFi连接管理
public class FishTankConnector {
private static final int PORT = 8080;
private Socket socket;
public void connect(String ip) throws IOException {
socket = new Socket(ip, PORT);
startHeartbeatThread(); // 启动心跳线程
}
}
5. 系统调试与性能优化
5.1 低功耗设计
通过以下措施使待机功耗降至8mA:
- 传感器间歇工作模式(采集后立即断电)
- STM32进入STOP模式(保留RAM数据)
- 外设电源MOS管控制(非使用时段彻底断电)
唤醒源配置代码:
c复制// 配置RTC唤醒中断
void HAL_RTCEx_WakeUpTimerEventCallback(RTC_HandleTypeDef *hrtc) {
__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU); // 清除唤醒标志
SystemClock_Config(); // 重新配置系统时钟
}
5.2 抗干扰措施
在实验室完美的环境下跑得好好的,放到真实鱼缸旁就各种抽风——这是嵌入式开发的常态。我们最终实施的解决方案:
- 所有信号线加磁珠滤波
- 电源入口处增加TVS二极管
- 传感器电缆改用屏蔽线
- 软件上增加中位值平均滤波算法
滤波算法实现:
c复制#define FILTER_SIZE 5
float median_filter(float new_val) {
static float buffer[FILTER_SIZE] = {0};
static uint8_t index = 0;
buffer[index++] = new_val;
if(index >= FILTER_SIZE) index = 0;
// 排序取中值
float temp[FILTER_SIZE];
memcpy(temp, buffer, sizeof(buffer));
bubble_sort(temp, FILTER_SIZE);
return temp[FILTER_SIZE/2];
}
6. 项目完整源码解析
工程采用Keil MDK开发,目录结构如下:
code复制/Firmware
/CMSIS // 内核支持文件
/Drivers // HAL库驱动
/Middlewares // FreeRTOS
/Src
main.c // 主程序入口
sensor.c // 传感器驱动
control.c // 设备控制逻辑
wifi.c // 网络通信
/Inc // 头文件
主程序状态机逻辑:
c复制void main(void) {
HAL_Init();
SystemClock_Config();
MX_FreeRTOS_Init();
// 外设初始化
Sensor_Init();
OLED_Init();
WiFi_Init();
// 启动RTOS调度器
osKernelStart();
while(1) {
// 看门狗喂狗
IWDG->KR = 0xAAAA;
}
}
关键传感器读取函数:
c复制float read_ph_value(void) {
uint32_t adc_val = 0;
for(int i=0; i<10; i++) {
adc_val += HAL_ADC_GetValue(&hadc1);
HAL_Delay(10);
}
adc_val /= 10;
// 转换公式:y = 0.0178x + 0.214
return 0.0178f * adc_val + 0.214f;
}
7. 实际部署中的问题与解决方案
7.1 水质传感器校准
出厂标定的PH传感器在实际使用中会出现偏差,我们开发了三点校准法:
- 准备PH4.0、7.0、9.2的标准缓冲液
- 分别测量ADC原始值
- 用最小二乘法计算校准曲线
校准工具界面设计:
python复制# Python校准工具代码片段
import numpy as np
def calculate_coefficients(ph_values, adc_values):
A = np.vstack([adc_values, np.ones(len(adc_values))]).T
k, b = np.linalg.lstsq(A, ph_values, rcond=None)[0]
return k, b
7.2 机械结构优化
最初的投食机构使用普通舵机直接驱动,存在两个问题:
- 饲料容易卡在出口处
- 潮湿环境导致舵机生锈
改进方案:
- 增加不锈钢振动片防止堵塞
- 改用防水舵机(型号JX-PDI-6221MG)
- 添加硅胶防潮密封圈
8. 论文写作要点与创新点提炼
8.1 论文核心结构建议
- 引言部分:重点分析传统鱼缸管理的痛点
- 相关工作:对比现有智能鱼缸产品的不足
- 系统设计:突出多传感器数据融合
- 实验部分:展示30天连续运行的稳定性数据
8.2 创新点表述技巧
不要简单说"使用了STM32",而要强调:
- 基于环境参数的自适应投喂算法
- 低功耗无线监控方案
- 机电一体化的防卡料设计
- 三点式水质传感器校准方法
实测数据最能说明问题:
code复制| 指标 | 传统方案 | 本系统 |
|----------------|---------|--------|
| 温度控制精度 | ±2℃ | ±0.5℃ |
| 日均耗电量 | 15Wh | 5Wh |
| 投喂量误差 | 20% | 5% |
9. 项目扩展方向
在实际使用中,我发现还可以进一步优化:
- 增加摄像头实现鱼类活动分析
- 接入智能家居系统(如Home Assistant)
- 开发Web管理后台
- 添加硝酸盐/亚硝酸盐检测
一个有趣的发现:通过分析投食时鱼群的聚集速度,可以间接判断鱼类健康状况。这为后续研究提供了新思路——将简单的喂食动作转化为健康监测手段。
