目录
一、前言
二、项目简介
1.功能详解
2.主要器件
三、原理图设计
四、PCB硬件设计
PCB图
五、程序设计
六、实验效果
七、包含内容
项目分享
一、前言
项目成品图片:
哔哩哔哩视频链接:
STM32智能鱼缸/水族箱
(资料分享见文末)
二、项目简介
1.功能详解
基于STM32的智能鱼缸
功能如下:
- 可检测温度,水位,以及TDS水质,同时将数据显示到OLED屏幕上
- 当温度过高时,继电器1吸合散热,温度过低时继电器2吸合加热。异常下蜂鸣器触发报警
- 当水位过低时,继电器3工作,模拟进水操作。当水位过高时继电器4工作放水。
- 当TDS水质过高时,继电器3和4相继工作模拟换水。
- 可计时喂食时间,倒计时结束后,舵机转动模拟喂食操作。
- 阈值可通过按键调节
- 连接手机APP,远程查看数据信息,控制LED开关,阈值调节等
2.主要器件
- STM32F103C8T6最小系统板
- OLED 屏幕
- DS18B20温度传感器
- ESP8266-01S WiFi模块
- TDS电导率传感器
- 超声波传感器
- 继电器
- 舵机
- 大功率LED灯模块
- 有源蜂鸣器
三、原理图设计
四、PCB硬件设计
PCB图
五、程序设计
int main(void)
{
int time;
delay_init();
LED_Init();
OLED_Init();
Adc_Init();
DS18B20_Init(); // 温度初始化
HC_SR04Config(); // 超声波初始化
uart_init(115200);
timeInit(4999,7199); // 72M 0.1ms 500ms 串口数据初始化、
timeSendInit(9999,7199); // 72m 0.1ms 1s 发送数据定时
timePwmInit(199,7199); // PWM-> CH3->PA2 CH4->PA3 (调脉宽)TIM_SetCompare4(TIM2,100);
TIM_SetCompare4(TIM2,SG90_CLOSE); // 关闭喂食
OLED_ShowChLength(38,16,47,3); // 显示启动中
ESP8266Init(WIFIName,WIFIpwd);
OLED_Clear();
while(1){
DisplayUI();
if( time++ > 5 ){
time = 0;
temp = getTemperture(); // 获取温度
delay_ms(1000);
delay_ms(1000);
temp = getTemperture(); // 获取温度
TDS_Value_Conversion(); // 获取TDS水质值
}
level = Getlength(); // 获取水位
OLED_ShowNum(45,0,temp,2,16,1);
OLED_ShowNum(45,16,level,3,16,1);
OLED_ShowNum(45,32,TDS_value,3,16,1);
OLED_ShowNum(76,48,cacheFeedTime,3,16,1);
OLED_Refresh();
// 开始喂食
if( feedFlag ){
TIM_SetCompare4(TIM2,SG90_OPEN);
// 等待喂食结束
if( feedEndFlag ){
feedFlag = 0;
feedEndFlag = 0;
feedTime = cacheFeedTime;
TIM_SetCompare4(TIM2,SG90_CLOSE);
}
}
// 进入设置页面
if( !KEY_EDIT ){
while( !KEY_EDIT ); // 防抖
paramEdit(); // 进入参数设置
// 刷新参数提示按钮(每次进入设置以后出来这个按钮没有,需要更新一下)
if( !paramFlag ) OLED_ShowChLength(105,2,62,1);
else OLED_ShowString(105,2," ",16,1);
}
// 切换参数提醒设置
if( !KEY_NEXT ){
while( !KEY_NEXT );
paramFlag = !paramFlag;
if( !paramFlag ){ // 关闭提示
JD2 = 0;JD3 = 0;JD4 = 0;JD1 = 0;BUZZ = 0;
OLED_ShowChLength(105,2,62,1);
}else{
OLED_ShowString(105,2," ",16,1);
}
OLED_Refresh();
}
// 上位机更改数据
if( handleFlag ) handleData();
// 3s上传一次数据
if( sendFlag && 1){
ESP8266Pub(temp,level,TDS_value);
sendFlag = 0; // 重置标志位
sendDataTime = cacheSendTime; // 刷新发送时间
}
// 检查参数是否超出范围(开启了参数检查)
if( paramFlag ) paramCheck();
delay_ms(100);
}
}