1. 项目概述:打造智能鱼缸环境监测系统
作为一名电子爱好者兼养鱼达人,我最近完成了一个基于STM32的智能鱼缸监测系统。这个项目完美解决了我在养鱼过程中遇到的各种痛点——再也不用担心忘记检查水质,或是半夜被缺氧的鱼儿惊醒。系统能实时监控鱼缸的水位、氧气浓度、PH值、温度和湿度,并在异常时自动报警和调节。
核心硬件配置选择了高性价比方案:STM32F103C8T6作为主控,搭配常见的LCD1602显示屏、DHT11温湿度传感器、蜂鸣器报警模块和小型直流电机。传感器数据通过ADC采集,系统阈值可编程调节,特别适合需要稳定水环境的观赏鱼养殖。
提示:虽然使用电位器模拟传感器方便调试,但实际应用时建议替换为真实传感器,数据会更准确可靠。
2. 硬件设计与选型解析
2.1 主控芯片:STM32F103C8T6
选择这款ARM Cortex-M3内核单片机主要考虑三点:首先,它具备3个12位ADC(实际用到3个通道),正好满足水位、氧气和PH值的模拟量采集需求;其次,72MHz主频能轻松处理多传感器数据;最重要的是,它的价格仅10元左右,性价比极高。
我在PCB布局时特别注意了ADC部分的电路设计:
- 为每个ADC输入通道添加了0.1μF去耦电容
- 模拟地和数字地通过0Ω电阻单点连接
- 电位器分压电路采用1%精度的金属膜电阻
2.2 传感器模块选型
DHT11温湿度传感器虽然精度一般(温度±2℃,湿度±5%RH),但对鱼缸监测已经足够。它的单总线接口仅需一个GPIO,硬件连接简单。实际安装时要避免直接浸入水中,我通常用热熔胶固定在鱼缸侧壁上方2cm处。
电位器模拟方案在原型阶段非常实用:
- 水位传感器:10K线性电位器,通过浮球机构机械连接
- PH传感器:多圈精密电位器,后期可替换为工业PH电极
- 氧气传感器:带刻度旋钮的电位器,方便设定阈值
2.3 显示与报警模块
LCD1602显示屏虽然尺寸小,但显示关键参数足够用。我优化了显示布局:
code复制SW O3 PH WD SD
23 45 6.8 25 60
第一行依次表示:水位(SW)、氧气(O3)、酸碱度(PH)、温度(W)、湿度(D)
第二行为具体数值,这种布局信息密度高且易读
蜂鸣器选用有源5V型,驱动电路加了NPN三极管(8050)做电流放大。电机控制则采用L298N模块,方便后续扩展为双氧泵控制。
3. 系统软件设计详解
3.1 开发环境搭建
推荐使用Keil MDK 5.25以上版本,安装时注意:
- 务必安装STM32F1系列的Device Family Pack
- 在Manage Run-Time Environment中勾选CMSIS-CORE和Device-Startup
- 设置编译器优化等级为-O1,避免高优化导致时序问题
工程包含以下关键文件:
main.c:主程序逻辑dht11.c:温湿度传感器驱动lcd1602.c:显示屏驱动adc.c:模拟量采集处理gpio.c:外设初始化
3.2 核心算法实现
ADC采集采用均值滤波算法:
c复制#define SAMPLE_TIMES 8
int Get_ADC_Average(uint8_t channel) {
int sum = 0;
for(int i=0; i<SAMPLE_TIMES; i++){
sum += Get_ADC(channel);
delay_ms(2);
}
return sum/SAMPLE_TIMES;
}
氧气控制逻辑采用迟滞比较,避免临界状态频繁切换:
c复制if(O2_level < 30){ // 低于阈值启动
Buzzer_On();
Motor_On();
} else if(O2_level > 35){ // 高于上限才停止
Buzzer_Off();
Motor_Off();
}
3.3 显示优化技巧
原始代码直接显示ADC原始值,我做了数值映射处理:
c复制// 水位值映射 (0-4095)→(0-100%)
int water_level = ADC_num1 * 100 / 4096;
// PH值映射 (0-4095)→(0-14)
float ph_value = ADC_num3 * 14.0 / 4096;
// 温度补偿 (DHT11读数+校准值)
real_temp = wendu + temp_offset;
4. Proteus仿真要点
4.1 仿真模型配置
- STM32F103C6模型(与C8T6引脚兼容)
- 虚拟终端显示调试信息
- ADC参考电压设为3.3V
- DHT11模型需设置初始温湿度值
关键仿真参数设置:
code复制ADC_CLOCK = 14MHz /8 = 1.75MHz
DHT11_TIMEOUT = 100ms
LCD1602_RW = GND (始终写入)
4.2 调试常见问题
问题1:ADC读数不稳定
解决方法:
- 检查电位器电源是否稳定
- 添加软件滤波(如中值+均值组合滤波)
- 调整ADC采样周期为239.5 cycles
问题2:DHT11无响应
排查步骤:
- 确认时序初始化正确
- 检查上拉电阻(4.7KΩ)是否添加
- 测量DATA线波形是否符合时序
问题3:LCD显示乱码
处理方案:
- 重新初始化LCD
- 检查4/8位模式设置
- 调整延时函数精度
5. 实际应用优化建议
5.1 传感器升级方案
原型阶段后建议替换为专业传感器:
- 水位检测:采用光电式液位传感器,型号WL-102
- PH检测:工业PH电极+信号调理电路
- 氧气检测:JXBS-3001-DO溶解氧传感器
5.2 电源管理改进
实测发现电机启动时会导致电压跌落,改进措施:
- 增加1000μF电解电容储能
- 采用独立LDO给MCU供电
- 添加TVS二极管防反接
5.3 扩展功能设想
- 通过ESP8266模块接入物联网平台
- 添加TDS(总溶解固体)检测功能
- 开发手机APP实时监控
- 增加喂食定时控制
6. 关键参数调试记录
在实验室环境下,我记录了各传感器的校准数据:
| 传感器 | 理论值 | 实测值 | 补偿公式 |
|---|---|---|---|
| DHT11温度 | 25.0℃ | 23.7℃ | T_real = T_read + 1.3 |
| PH电极 | 7.0 | 6.8 | PH = 0.97*V_read + 0.2 |
| 水位 | 50% | 53% | LV = 0.94*ADC_val |
电机控制参数优化过程:
- 初始氧泵开启时间:持续运行
- 发现问题:水中气泡过多
- 优化方案:改为间歇工作(开2分钟/停5分钟)
- 最终效果:氧气稳定在35-40单位
这个项目从原型到稳定运行历时三周,期间最大的收获是理解了环境参数之间的相互影响。比如温度升高会导致溶解氧降低,而PH值又受二氧化碳含量影响。下次准备加入更多传感器,打造真正智能化的水族生态系统。