当前位置: 首页 > news >正文

基于stm32F4的智能宠物喂食器的设计:LVGL界面、定时喂食喂水通风

宠物喂食器

  • 一、功能设计
  • 二、元器件选型
  • 三、UI设计
  • 四、原理图设计
  • 五、源代码设计
  • 六、成品展示

实物链接:https://m.tb.cn/h.5iCUX6H?tk=PL65WXCEipQ CZ3457
在这里插入图片描述

一、功能设计

1、设计一个触摸屏作为人机交互
2、通过触摸屏设置时间定时喂食喂水通风
3、获取当前水槽的水位并显示
4、获取环境温湿度并显示

二、元器件选型

1、触摸屏采用2.8寸电阻触摸屏
2、单片机采用STM32F407ZGT6
3、喂水使用直流水泵
4、喂食使用舵机
5、通风使用风扇
6、控制开关使用继电器
7、温湿度获取使用DHT11
8、水位检测使用水位传感器

三、UI设计

1、UI使用LVGL
2、UI设计环境使用SquareLine Studio
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
3、生成代码导入到vsCode进行仿真运行,编译比较快
在这里插入图片描述

4、调试UI界面比较满意后导入UI代码到keil5下载到单片机运行

在这里插入图片描述

四、原理图设计

1、STM32F407ZGT6最小系统设计
在这里插入图片描述

在这里插入图片描述

2、继电器控制电路设计

3、水泵和舵机电路设计

五、源代码设计

1、移植正点原子LVGL最小工程
在这里插入图片描述

2、导入生成的UI代码

在这里插入图片描述

3、编写IO控制程序,舵机控制程序,系统时间、定时喂食喂水程序、事件记录程序

void scan_timeout(void)
{

    int32_t remain_time[SCAN_TIME_NUM];
    static int32_t p_time = 0x7fffffff;
    static uint8_t p_num;
    TimeTypeDef remain_time_min = {0};
    char sprbuff[64];
    int32_t n_num = 0;
    char buff[SCAN_TIME_NUM][8] = {"喂食","喂食","喂水","喂水","通风","通风"};
    char * pbuf = NULL;
		get_sys_date_time();//获取系统时间
    remain_time[0] = time_compare(&System.para.systime,&System.para.feed.time1     );//计算时间差
    remain_time[1] = time_compare(&System.para.systime,&System.para.feed.time2     );//计算时间差
    remain_time[2] = time_compare(&System.para.systime,&System.para.feedwater.time1);//计算时间差
    remain_time[3] = time_compare(&System.para.systime,&System.para.feedwater.time2);//计算时间差
    remain_time[4] = time_compare(&System.para.systime,&System.para.ventilate.time1);//计算时间差
    remain_time[5] = time_compare(&System.para.systime,&System.para.ventilate.time2);//计算时间差
    for(int i=0; i<SCAN_TIME_NUM; i++) //看看时间差哪个短 找到最短那个任务优先执行
    {
        if(p_time > remain_time[i]  && remain_time[i] >= 0)
        {
            remain_time_min.hour = remain_time[i] / 3600;
            remain_time_min.min = remain_time[i] % 3600 /60;
            remain_time_min.sec = remain_time[i] % 60;
            p_time = remain_time[i];
            pbuf = buff[i];
            p_num = i;
            if(p_time == 0)p_time = 0x7fffffff;
            printf("i = %d, remain_time[i]=%d\r\n",i,remain_time[i]);
        }
        if(remain_time[i] < 0)
        {
            n_num ++;
        }
    }
    if(n_num != SCAN_TIME_NUM)  //今天任务做完了吗? 哦 没有就进去
    {
			if(p_time < 30)  //如果距离任务还不到 XXX秒了,就进来运行任务
			{
					switch(p_num)
					{
					case 0:
							sprintf(sprbuff,"喂食时间到! %02d:%02d", System.para.feed.time1.hour,System.para.feed.time1.min);
							SW1_ON();
							break;
					case 1:
							sprintf(sprbuff,"喂食时间到! %02d:%02d", System.para.feed.time2.hour,System.para.feed.time2.min);
							SW1_ON();
							break;
					case 2:
							sprintf(sprbuff,"喂水时间到! %02d:%02d", System.para.feedwater.time1.hour,System.para.feedwater.time1.min);
							SW2_ON();
							break;
					case 3:
							sprintf(sprbuff,"喂水时间到! %02d:%02d", System.para.feedwater.time2.hour,System.para.feedwater.time2.min);
							SW2_ON();
							break;
					case 4:
							sprintf(sprbuff,"通风时间到! %02d:%02d", System.para.ventilate.time1.hour,System.para.ventilate.time1.min);
							SW3_ON();
							break;
					case 5:
							sprintf(sprbuff,"通风时间到! %02d:%02d", System.para.ventilate.time2.hour,System.para.ventilate.time2.min);
							SW3_ON();
							break;
					}
					lv_label_set_text(ui_MainInfoLabel7,sprbuff);
			}
			else if(pbuf != NULL)
			{
					sprintf(sprbuff,"主线任务 - %s %02d:%02d:%02d",pbuf,remain_time_min.hour,remain_time_min.min,remain_time_min.sec);
				  printf("%s\r\n",sprbuff);
					lv_label_set_text(ui_MainInfoLabel7,sprbuff);
					switch_all_off();
			}
		}else
    {
    lv_label_set_text(ui_MainInfoLabel7,"今日暂无任务");
    }
}

六、成品展示

**加粗样式**
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

http://www.dtcms.com/a/3595.html

相关文章:

  • ESP32S3入手体验测试
  • 电脑如何设置不同网段的IP地址,实现访问不同IP的PLC或HMI设备?
  • react_12
  • 驱动开发11-1 编写IIC驱动-读取温湿度数据
  • 记录paddlepaddle-gpu安装
  • Spring Boot 3 整合 xxl-job 实现分布式定时任务调度,结合 Docker 容器化部署(图文指南)
  • Codeforces Round 882 (Div. 2)
  • 【一、http】go的http基本请求方法
  • Python用RoboBrowser库写一个通用爬虫模版
  • AndroidAuto PCTS A118解决杂音问题
  • 升级 MacOS 系统后,playCover 内游戏打不开了如何解决
  • 苹果相机怎么磨皮 苹果手机怎么磨皮
  • 使用 uni-app 开发项目,日期和时间如何格式化?
  • HTTPS的加密方式超详细解读
  • 数据结构-邻接表广度优先搜索(C语言版)
  • 机器学习中的关键组件
  • OpenCV官方教程中文版 —— 图像修复
  • 利用MySQL玩转数据分析之基础篇
  • Proteus仿真--12864LCD显示计算器键盘按键实验(仿真文件+程序)
  • 学习小结,学而时习之,坚持学习之,温顾学习之
  • Webpack的Tree Shaking。它的作用是什么?
  • Docker Stack部署应用详解+Tomcat项目部署详细实战
  • Linux ----------------------- 文本处理工具
  • C语言 || volatile
  • 云安全-云原生k8s攻击点(8080,6443,10250未授权攻击点)
  • 【SpringBoot笔记42】SpringBoot集成knife4j生成接口文档
  • 【3D图像分割】基于Pytorch的VNet 3D图像分割5(改写数据流篇)
  • 【RabbitMQ】RabbitMQ 消息的堆积问题 —— 使用惰性队列解决消息的堆积问题
  • List 接口常用实现类底层分析
  • 『CV学习笔记』图像超分辨率等图像处理任务中的评价指标PSNR(峰值信噪比)