在这里插入代码片
最近设计了一个项目基于单片机的智能宠物喂食器,与大家分享一下:
一、基本介绍
项目名:基于单片机的智能宠物喂食器
项目编号:mcuclub-dz-1100
单片机类型:STM32F103C8T6
具体功能:
1、通过时钟模块获取当前的时间,可以设置喂食的时间(三组,,有使能标志);
2、通过通过HX711监测当前实物的重量,喂食时间到投喂食物,重量大于最大值停止投喂,然后语音提醒宠物进食,
3、通过水位监测模块监测当前的水位,监测到水位小于最小值,声光报警提醒自动进行加水,直到水位大于最大值;
4、通过DHT11监测当前环境温湿度,监测到温度或者湿度大于最大值自动打开通风风扇;
5、通过人体热释电监测当前环境是否有宠物,喂食时间到达监测到宠物取消语音提醒;
3、通过按键可以设置喂食时间、重量、水位、温湿度阈值;可以控制各器件
4、通过显示屏显示数据;
6、通过WiFi模块将测量数据发送到手机端,手机可以设置喂食时间、设置参数,控制各器件
二、32实物图
单片机型号:STM32F103C8T6
板子为绿色PCB板,两层板,厚度1.2,上下覆铜接地。元器件基本上为插针式,个别降压芯片会使用贴片式。
供电接口:TYPE-C
三、原理图
软件版本:AD2013
电路连线方式:网络标号连线方式
注意:原理图只是画出了模块的引脚图,而并不是模块的内部结构原理图
四、PCB图
由原理图导出,封装很大一部分都是作者自己绘制,不提供封装库,只提供连接好的源文件。中间有一个项目编号,隐藏在单片机底座下,插入单片机后不会看到。
两层板,上下覆铜接地。
五、系统框图
此次设计是基于STM32F103C8T6单片机的基于STM32的智能宠物喂食器的设计;该设计主要可以分为三部分:输入、输出和中控。中控部分采用STM32F103C8T6单片机作为主控芯片,主要是对输入进行处理然后控制输出;
输入又可以分为七部分:第一部分是温度检测模块,通过此模块获取温湿度值;第二部分是水位检测模块,由此模块可以检测当前环境的水位值。第三部分是重量检测模块,由此模块可以获取当前重量值。第四部分是红外检测模块,由此模块可以获取当前是否有宠物;第五部分是时钟模块,由此模块可以获取当的时间;第六部分是按键模块,通过按键可以设置阈值以及控制继电器的开关;第七部分是供电电路,主要是用来对整个系统进行供电;
输出主要可以分为四个部分:第一部分是显示部分,显示当前时间,温度,湿度,水位,重量;第二部分是声光报警模块:当水位小于最小值进行报警;第三部分是语音播报模块:当重量检测模块由最小值到达最大值进行语音播报;第四部分是继电器模块:通过继电器进行投喂、加水和通风
除此之外WIFI模块可以做为输入和输出:获取到当前的温度,湿度,水位以及重量还可以设置阈值和控制继电器的开关。
六、软件设计流程
七、部分程序展示
软件版本:keil5
逻辑程序和驱动程序分开,分布于main.c和其他.c文件
/**********************************
函数名:处理函数
传参值:无
返回值:无
**********************************/
void Manage_Function(void)
{
if(display_num == 0) //测量界面
{
if(temp_value > temp_max*10 || humi_value > humi_max*10) //温度或湿度大于最大值打开通风
{
RELAY_TF = 1;
flag_tf = 0;
}
else //否则关闭通风
{
if(flag_tf == 0)
{
RELAY_TF = 0;
}
}
if((ds1302_buf[4] == time_hour_1 && ds1302_buf[5] == time_min_1 && ds1302_buf[6] == 0 && flag_time_1 == 1) ||
(ds1302_buf[4] == time_hour_2 && ds1302_buf[5] == time_min_2 && ds1302_buf[6] == 0 && flag_time_2 == 1) ||
(ds1302_buf[4] == time_hour_3 && ds1302_buf[5] == time_min_3 && ds1302_buf[6] == 0 && flag_time_3 == 1)) //达到定时时间打开投喂
{
flag_tw = 1;
}
if(flag_tw == 1) //当投喂标志位为 1
{
if(weight_value < weight_max) //重量小于最小值 打开投喂
{
RELAY_TW = 1;
}
else
{
flag_tw = 0;
RELAY_TW = 0;
flag_bb = 1;
}
}
else //否则关闭投喂开始语音播报
{
if(RELAY_TW == 1)
{
RELAY_TW = 0;
flag_bb = 1;
}
}
if(flag_bb == 1)
{
if(time_num % 80 == 0)
{
Huart2_Send_Str(" 过来吃饭了");
}
}
if(RT == 0) //当人体热释电触发关闭播报
{
flag_bb = 0;
}
if(water_value < water_min) //水位小于最小值打开加水
{
RELAY_JS = 1;
if(time_num % 20 == 0)
{
ALERT = !ALERT;
}
}
else if(water_value > water_max) //水位大于最大值关闭加水
{
RELAY_JS = 0;
ALERT = 0;
}
}
else //设置界面
{
ALERT = 0;
RELAY_TF = 0;
RELAY_TW = 0;
RELAY_JS = 0;
}
if(flag_finish_5s == 1) //5秒上传一次数据
{
flag_begin_5s = 0;
Aliyun_Send_Data();
flag_begin_5s = 1;
}
}