1. 项目概述
作为一名嵌入式开发工程师,我最近完成了一个很有意思的智能鱼缸控制系统的开发项目。这个系统以STM32F103C8T6单片机为核心,通过多种传感器实现了鱼缸环境的智能化管理。在实际使用中,我发现它确实能大大减轻养鱼爱好者的日常维护负担。
这个系统最核心的功能包括:
- 实时监测水温、水位和水质浊度
- 自动调节温度(通过加热片和风扇)
- 自动补水(通过水泵)
- 定时喂食(通过舵机控制)
- 本地OLED显示和按键控制
- 远程手机APP监控和控制
2. 硬件设计详解
2.1 主控芯片选型
选择STM32F103C8T6主要基于以下几点考虑:
- 性价比高:这款芯片价格在10-15元之间,性能完全满足需求
- 资源丰富:具有64KB Flash和20KB SRAM,足够存储程序和数据
- 外设齐全:内置多个UART、I2C、ADC接口,方便连接各种外设
- 开发资料多:社区支持好,遇到问题容易找到解决方案
注意:STM32F103系列有多个型号,C8T6是性价比最高的选择,比CBT6便宜但功能相当。
2.2 传感器选型与电路设计
2.2.1 温度传感器
选用DS18B20数字温度传感器,相比模拟传感器有以下优势:
- 精度高(±0.5℃)
- 单总线接口,节省IO资源
- 防水设计,可直接浸入水中
接线方式:
code复制DS18B20 STM32
VCC → 3.3V
GND → GND
DATA → PA0(通过4.7K上拉电阻)
2.2.2 水位传感器
使用常见的模拟水位传感器,需要注意:
- 供电电压5V(提高检测灵敏度)
- 输出接STM32的ADC引脚(如PA1)
- 需要定期校准(空水位和满水位对应的ADC值)
2.2.3 浊度传感器
浊度传感器选择要点:
- 选择带温度补偿的型号(减少水温影响)
- 同样使用ADC接口(如PA2)
- 需要做防水处理(传感器部分不能浸入水中)
2.3 执行机构设计
2.3.1 加热控制
使用PTC加热片配合继电器控制:
- 继电器选用5V驱动的常开型
- 加热片功率建议25-50W(根据鱼缸大小)
- 控制引脚加光耦隔离(保护单片机)
2.3.2 水泵控制
小型潜水泵控制要点:
- 选用12V直流泵
- 通过MOS管驱动(比继电器寿命长)
- 加装单向阀防止倒流
2.3.3 喂食机构
使用SG90舵机自制喂食器:
- 3D打印喂食盒
- 舵机扭矩要足够(至少2kg·cm)
- 设置机械限位防止卡死
3. 软件设计实现
3.1 开发环境搭建
- 安装Keil MDK5(建议版本5.36)
- 配置STM32CubeMX生成基础工程
- 添加必要的库:
- DS18B20驱动库
- OLED显示库
- ESP8266 AT指令库
3.2 主程序流程
c复制int main(void)
{
// 硬件初始化
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_ADC_Init();
MX_USART1_UART_Init();
// 外设初始化
Sensor_Init();
OLED_Init();
ESP8266_Init();
while (1)
{
// 数据采集
Read_Sensors();
// 数据处理
Process_Data();
// 显示更新
Update_Display();
// 自动控制
Auto_Control();
// 通信处理
Handle_Communication();
// 按键检测
Check_Buttons();
HAL_Delay(100); // 100ms周期
}
}
3.3 关键算法实现
3.3.1 温度PID控制
c复制void Temp_PID_Control(float current_temp)
{
static float integral = 0;
static float last_error = 0;
float error = target_temp - current_temp;
integral += error;
float derivative = error - last_error;
float output = Kp*error + Ki*integral + Kd*derivative;
// 输出限幅
output = (output > 100) ? 100 : (output < 0) ? 0 : output;
// PWM输出控制加热片
Set_Heater_PWM(output);
last_error = error;
}
3.3.2 水位控制逻辑
c复制void Water_Level_Control(void)
{
if(water_level < low_threshold)
{
Pump_On(); // 开启水泵
buzzer_flag = 1; // 触发报警
}
else if(water_level > high_threshold)
{
Pump_Off(); // 关闭水泵
buzzer_flag = 0;
}
}
4. 机智云平台对接
4.1 平台配置步骤
- 在机智云开发者中心创建新产品
- 定义数据点:
- 温度(可读)
- 水位(可读)
- 浊度(可读)
- 加热开关(可写)
- 水泵开关(可写)
- 生成产品密钥(Product Key)
4.2 ESP8266固件烧写
- 下载机智云GAgent固件
- 使用串口工具烧写(波特率115200)
- 配置WiFi信息:
at复制AT+CWJAP="SSID","password"
AT+CGSLP=0,0,0,0
4.3 通信协议处理
c复制void Handle_WIFI_Data(void)
{
if(USART1_RX_STA&0x8000) // 接收完成
{
len = USART1_RX_STA&0x3FFF;
USART1_RX_BUF[len] = 0;
// 解析机智云协议
if(strstr(USART1_RX_BUF, "heater"))
{
if(strstr(USART1_RX_BUF, "on"))
Heater_On();
else
Heater_Off();
}
USART1_RX_STA = 0;
}
}
5. 系统调试经验
5.1 常见问题排查
-
传感器读数不稳定:
- 检查电源滤波(加100uF电容)
- 软件增加滑动平均滤波
- 检查接线是否松动
-
ESP8266连接失败:
- 确认WiFi密码正确
- 检查天线是否完好
- 尝试降低波特率(9600)
-
继电器频繁动作:
- 增加控制死区(如温度±0.5℃内不动作)
- 适当延长控制周期
5.2 性能优化技巧
-
降低功耗:
- 空闲时进入STOP模式
- 传感器定时采样而非连续
- 关闭不用的外设时钟
-
提高响应速度:
- 关键中断设为最高优先级
- 使用DMA传输传感器数据
- 优化OLED刷新逻辑
-
增强稳定性:
- 添加看门狗
- 重要参数备份到Flash
- 异常状态自动复位
6. 实际使用效果
经过一个月的实际运行测试,系统表现稳定:
- 温度控制精度:±0.3℃
- 水位控制误差:<5mm
- 喂食时间误差:<1分钟
- 平均功耗:<3W
- 网络断线率:<1次/周
用户反馈:
- 手机远程查看很方便
- 自动换水功能很实用
- 喂食时间可以灵活设置
- 温度控制比手动精准很多