一、基本介绍
项目名:基于 STM32 的宠物自动喂食器系统设计
项目编号:mcuclub-dz-744
单片机类型:STM32F103C8T6
具体功能:
1、通过称重模块HX711获取储存箱内食物的重量,如果重量低于设置最小值,则自动打开舵机1进行加食物(舵机SG90),直到重量大于设置最大值;
2、通过时钟模块多少302获取当前的时间,可以设置宠物投喂的时间,时间到达后,自动打开舵机2投喂5s,5s后自动关闭
3、通过按键设置投喂的时间和重量;
4、通过显示模块OLED显示当前时间,食物重量;
5、将检测的数据通过WiFi模块ESP8266上次到阿里云,手机可以远程设置投喂时间重量、控制投喂和加料;
二、资料总览
实物资料
三、32单片机部分资料展示
1、实物图展示
单片机型号:STM32F103C8T6
供电接口:TYPE-C
板子类型:PCB集成板,厚度1.2,两层板(上下层覆铜接地)
器件类型:元器件基本上为插针式,个别降压芯片会使用贴片式。
2、原理图展示
软件版本:AD2013
电路连线方式:网络标号连线方式
注意:原理图只是画出了模块的引脚图,而并不是模块的内部结构图
3、PCB图展示
由原理图导出,中间有一个项目编号,隐藏在单片机底座下,插入单片机后不会看到。
两层板,上下覆铜接地。
四、系统框图
绘制软件:VISIO
此次设计是基于STM32F103C8T6单片机的基于STM32的宠物自动喂食器系统设计;该设计主要可以分为三部分:输入、输出和中控。中控部分采用STM32F103C8T6单片机作为主控芯片,主要是对输入进行处理然后控制输出;
输入又可以分为四部分:第一部分是称重模块,获取当前的食物重量;第二部分时钟模块,通过此模块可以获取当前的时间;第三部分是独立按键,通过按键模块可以进行切换界面、设置参数、控制继电器开关;第四部分是供电电路,主要是用来对整个系统进行供电;
输出主要可以分为四个部分:第一部分是显示部分,显示当前时间,重量以及投喂和加料的开关;第二部分是语音播报模块,当时间到达进行语音播报;第三部分是舵机模块,通过两个舵机模拟投喂和加料。
除此之外,WIFI模块还可以做为输出和输入,检测到当前的三个定时的时和分以及开关。还能设置当前重量最大值和最小值,三个定时的时间和开关。手动打开的投喂和加料。
五、部分程序展示
软件版本:keil5
注意:逻辑程序和驱动程序分开,分布于main.c和其他.c文件
/**********************************
函数名:处理函数
传参值:无
返回值:无
**********************************/
void Manage_Function(void)
{
if(display_num == 0) //测量界面
{
if(weight_value < weight_min) //当重量小于最小值加料标志位为1
{
flag_jl = 1;
}
else if(weight_value > weight_max) //当重量大于最大值加料标志位为0
{
flag_jl = 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_bb == 0)
{
Huart3_Send_Str("时间到达,开始投喂");
flag_bb = 1;
}
}
}
else //设置界面关闭加料和投喂
{
flag_bb = 0;
flag_jl = 0;
flag_tw = 0;
}
if(flag_jl == 1) //当加料标志位为1舵机1打开
{
duoji_pwm1 = 15;
}
else //否则关闭
{
duoji_pwm1 = 5;
}
if(flag_tw == 1) //当投喂标志位为1舵机2打开
{
duoji_pwm2 = 15;
flag_begin_5s_tw = 1; //五秒计时打开
if(flag_finish_5s_tw == 1) //当五秒到达标志位为1
{
duoji_pwm2 = 5; //舵机2关闭
flag_begin_5s_tw = 0;
flag_tw = 0;
}
}
else //否则关闭舵机2
{
flag_bb = 0;
duoji_pwm2 = 5;
flag_begin_5s_tw = 0;
}
if(flag_finish_5s == 1) //5秒上传一次数据
{
flag_begin_5s = 0;
Aliyun_Send_Data();
flag_begin_5s = 1;
}
}