基于STM32的自动宠物喂食器的Proteus仿真

文章目录

  • 一、宠物喂食器
    • 1.题目要求
    • 2.思路
      • 2.1 OLED显示汉字
      • 2.2 DS1302模块
      • 2.3 液位传感器
      • 2.4 压力传感器和步进电机驱动
    • 3.仿真图
      • 3.1 未仿真时
      • 3.2 开始仿真,OLED初始界面显示实时时间
      • 3.3 通过设置按键进入模式选择和喂食时间设置
      • 3.4 进入喂食时间设置
      • 3.5 设置好喂食时间,这里的时间指的是仿真内的时间,而非显现实时间
      • 3.6 到达喂食时间,电机转动,模拟喂食
      • 3.7 通过压力传感器模拟食物超过78g,大于设置阈值75g关闭电机
      • 3.8 通过返回按键返回上一次的操作界面
      • 3.9 通过液位模拟器模拟水位28%,低于30%阈值,开启水泵进行加水
      • 3.10 通过液位模拟器模拟水位34%,高于30%阈值,关闭水泵
      • 3.11 通过往上按键进入模式选择
      • 3.12 模式选择界面
      • 3.13 选择手动喂食模式,手动喂食模式下设置喂食时间,电机不转动(这里不演示)
    • 4.仿真程序
      • 4.1 程序说明
      • 4.2 主函数
      • 4.3 OLED显示函数
      • 4.4 DS1302获取实时时间函数
  • 二、总结


一、宠物喂食器

1.题目要求

基于STM32F103C8单片机做一个自动宠物喂食器,主要特点可以在自动喂食模式下通过按键设置喂食时间,待喂食时间达到,驱动步进电机转动模拟喂食;其中自动模式下,还有个液位传感器能够检测水位,低于一定水位需要开启水泵加水,而压力传感器则检测食物重量,达到一定重量,要关闭电机。而手动喂食模式电机不转动。

额外功能:DS1302时钟模块显示实时时间,OLED显示。

2.思路

2.1 OLED显示汉字

OLED要显示中文,这需要用到取模软件,如下所示:
在这里插入图片描述
参数设置为:
在这里插入图片描述

2.2 DS1302模块

这里晶振可以不画,仿真里面不影响
在这里插入图片描述

2.3 液位传感器

仿真里面没有液位传感器,这里用滑动变阻器代码,通过改变滑阻的阻值,输出不同的电压值来检测。而水泵的驱动则是NPN驱动继电器的电路,当PUMP为低电平时,继电器不闭合,水泵不工作,当PUMP为高电平时,继电器闭合,水泵工作。

在这里插入图片描述

2.4 压力传感器和步进电机驱动

这里的压力传感器用的是mpx4115,步进电机用ULN2003芯片驱动。
在这里插入图片描述

3.仿真图

3.1 未仿真时

在这里插入图片描述

3.2 开始仿真,OLED初始界面显示实时时间

在这里插入图片描述

3.3 通过设置按键进入模式选择和喂食时间设置

在这里插入图片描述

3.4 进入喂食时间设置

在这里插入图片描述

3.5 设置好喂食时间,这里的时间指的是仿真内的时间,而非显现实时间

在这里插入图片描述

3.6 到达喂食时间,电机转动,模拟喂食

在这里插入图片描述

3.7 通过压力传感器模拟食物超过78g,大于设置阈值75g关闭电机

在这里插入图片描述

3.8 通过返回按键返回上一次的操作界面

在这里插入图片描述

3.9 通过液位模拟器模拟水位28%,低于30%阈值,开启水泵进行加水

在这里插入图片描述

3.10 通过液位模拟器模拟水位34%,高于30%阈值,关闭水泵

在这里插入图片描述

3.11 通过往上按键进入模式选择

在这里插入图片描述

3.12 模式选择界面

在这里插入图片描述

3.13 选择手动喂食模式,手动喂食模式下设置喂食时间,电机不转动(这里不演示)

在这里插入图片描述

4.仿真程序

4.1 程序说明

主控芯片:STM32F103C8
HICK:64MHZ
Systick: 1ms
测试Led:PC13

模拟wifi模块(Uart1):9600(PA9:tx1,PA10:rx1)

OLED显示屏:SCL(PB10),SDA(PB11)

液位传感器:FLUID(PA0)

压力传感器:STRESS(PA1)

水泵:PUMP(PB0)

时钟DS1302:
RST(PB7)
SCLK(PB5)
IO(PB6)

KEY按键:
KEY1(PA2)
KEY2(PA3)
KEY3(PA4)
KEY4(PA5)
KEY5(PA6)
KEY6(PA7)
KEY7(PA8)

MOTOR电机:
IN1(PB12)
IN2(PB13)
IN3(PB14)
IN4(PB15)

4.2 主函数

/* Includes ------------------------------------------------------------------*/
#include "Drv_UserSystem.h"/*** @brief  main function.* @param  none* @retval none*/
int main(void)
{UserSystemInit();//用户配置初始化		while (1){					if (stSysTime.flg._10ms + TEN_MILLISECOND < Time_millis()) //10ms{stSysTime.flg._10ms = Time_millis();Key_Scan();//按键扫描						}if (stSysTime.flg._50ms + FIFTY_MILLISECOND < Time_millis()) //50ms{stSysTime.flg._50ms = Time_millis();			OLED_Handel();//OLED显示						}if (stSysTime.flg._100ms + BEST_MILLISECOND < Time_millis()) //100ms{stSysTime.flg._100ms = Time_millis();	Receive_data_Handel();//数据接收判断Led_Flicker();//灯光闪烁 		ADC_Scan();	//液体/压力检测						IWDG_ReloadCounter();//清开门狗 }if (stSysTime.flg._1s + THOUSAND_MILLISECOND < Time_millis()) //1s{stSysTime.flg._1s = Time_millis();Pet_feeding_countdown();		Read_RTC();//DS1302读取当前时间				}}
}

4.3 OLED显示函数

/******************************************************************************** 函数名:OLED_Handel* 描述  :OLED显示* 输入  :void* 输出  :void* 调用  :内部调用* 备注  :50ms
*******************************************************************************/
void OLED_Handel(void)
{  	if(Display_interface == 0){if(Back_clear_flag){Back_clear_flag = 0;OLED_Clear();}OLED_ShowNum(1,1,Year,2);OLED_Show_Character(1,2,23,16);//年	OLED_ShowNum(1,5,Month,2);OLED_Show_Character(1,4,24,16);//月	OLED_ShowNum(1,9,Day,2);OLED_Show_Character(1,6,25,16);//日			OLED_ShowNum(2,1,Hour,2);OLED_Show_Character(2,2,26,16);//时	OLED_ShowNum(2,5,Minute,2);OLED_Show_Character(2,4,27,16);//分	OLED_ShowNum(2,9,Second,2);OLED_Show_Character(2,6,28,16);//秒			OLED_Show_Character(3,1,29,16);//星		OLED_Show_Character(3,2,30,16);//期			OLED_ShowNum(3,5,Week,1);			}else if(Display_interface == 1){if(Back_clear_flag){Back_clear_flag = 0;OLED_Clear();}			OLED_Show_Character(1,1,5,16);//模OLED_Show_Character(1,2,6,16);//式	OLED_Show_Character(1,3,7,16);//选	OLED_Show_Character(1,4,8,16);//择		OLED_Show_Character(2,1,11,16);//喂	OLED_Show_Character(2,2,12,16);//食		OLED_Show_Character(2,3,13,16);//时	OLED_Show_Character(2,4,14,16);//间	if(key_Line == 1){if(clear_flag){clear_flag = 0;OLED_Part_Clear(2,13,16);}				OLED_Show_Character(1,8,21,16);//←								}else if(key_Line == 0){if(clear_flag){clear_flag = 0;OLED_Part_Clear(1,13,16);}OLED_Show_Character(2,8,21,16);//←								}				}		else if(Display_interface == 2)//模式选择{if(Back_clear_flag){Back_clear_flag = 0;OLED_Clear();}			OLED_Show_Character(1,1,19,16);//自OLED_Show_Character(1,2,20,16);//动		OLED_Show_Character(1,3,17,16);//喂	OLED_Show_Character(1,4,18,16);//食	OLED_Show_Character(2,1,15,16);//手OLED_Show_Character(2,2,16,16);//动	OLED_Show_Character(2,3,17,16);//喂	OLED_Show_Character(2,4,18,16);//食		if(key_Line == 1){if(clear_flag){clear_flag = 0;OLED_Part_Clear(2,13,16);}				OLED_Show_Character(1,8,21,16);//←					}else if(key_Line == 0){if(clear_flag){clear_flag = 0;OLED_Part_Clear(1,13,16);}OLED_Show_Character(2,8,21,16);//←								}			}		else if(Display_interface == 3)//喂食时间设置{if(Back_clear_flag){Back_clear_flag = 0;OLED_Clear();}OLED_ShowNum(2,3,Minute_tens,1);			OLED_ShowNum(2,4,Minute_ones,1);			OLED_ShowString(2,5,":");//:			OLED_ShowNum(2,6,Second_tens,1);			OLED_ShowNum(2,7,Second_ones,1);	if(key_Column == 0){if(clear_flag){clear_flag = 0;OLED_Part_Clear(3,1,16);}OLED_ShowString(3,7,"^");//^								}							else if(key_Column == 1){if(clear_flag){clear_flag = 0;OLED_Part_Clear(3,1,16);}				OLED_ShowString(3,6,"^");//^								}else if(key_Column == 2){if(clear_flag){clear_flag = 0;OLED_Part_Clear(3,1,16);}OLED_ShowString(3,4,"^");//^								}	else if(key_Column == 3){if(clear_flag){clear_flag = 0;OLED_Part_Clear(3,1,16);}OLED_ShowString(3,3,"^");//^								}				}			
}

4.4 DS1302获取实时时间函数

/******************************************************************************** 函数名:Read_RTC* 描述  :读RTC* 输入  :void* 输出  :void* 调用  :内部调用* 备注  :
*******************************************************************************/
void Read_RTC(void)
{static uint8_t time_count = 0;// 获取时间数据Second = Read_Clock(0X81);Minute = Read_Clock(0X83);Hour = Read_Clock(0X85);Day = Read_Clock(0X87);Month = Read_Clock(0X89);Week = Read_Clock(0X8B);Week = Week - 1;Year = Read_Clock(0X8D);if(++time_count > 2){			time_count = 0; // 输出时间数据printf("时间:%d年%d月%d日 %d时%d分%d秒 星期%d \r\n", Year, Month,    Day, Hour, Minute, Second, Week);}			
}

二、总结

今天主要讲了基于STM32的自动宠物喂食器的Proteus仿真。

感谢你的观看!

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/16098.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机毕业设计Python+Spark+PyTroch游戏推荐系统 游戏可视化 游戏爬虫 神经网络混合CF推荐算法 协同过滤推荐算法 steam 大数据

毕业设计&#xff08;论文&#xff09; 基于SpringBoot的游戏防沉迷系统的设计与实现 摘 要 随着网络游戏市场的持续火爆,其最明显的负面影响----“网络游戏沉迷问题”已成为当前社会普遍关心的热点问题。根据2010年8月1日实施的《网络游戏管理暂行办法》&#xff0c;网络游…

代码随想录算法训练营第三十四天|860.柠檬水找零、406.根据身高重建队列、452. 用最少数量的箭引爆气球

860.柠檬水找零 遇到账单20&#xff0c;优先消耗美元10&#xff0c;完成本次找零。因为5的用处更大&#xff0c;等到循环结束的时候&#xff0c;如果存在某个美元不够用的情况&#xff0c;那么就是无法找零。 406.根据身高重建队列 先考虑身高维度&#xff0c;将身高从大至小…

图书管理系统——Java版

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a;JavaSE 顺序表的学习&#xff0c;点我 目录 图书管理系统菜单 基本框架&#xff1a; 书&#xff1a; 书架&#xff1a; 用户&#xff…

数字化转型必备:营销策划流程图,打造你的数字市场地图

制作营销策划流程图是一个系统化的过程&#xff0c;它可以帮助你清晰地规划和展示营销活动的各个阶段。 以下是制作营销策划流程图的步骤&#xff1a; 1.确定营销目标&#xff1a; 明确你的营销活动旨在实现的具体目标&#xff0c;比如提升品牌知名度、增加销售额、吸引新客…

Java进阶学习笔记25——Objects类

为啥比较两个对象是否相等&#xff0c;要用Objects的equals方法&#xff0c;而不是用对象自己的equals方法来解决呢&#xff1f; Objects&#xff1a; Objects类是一个工具类&#xff0c;提供了很多操作对象的静态方法供我们使用。 package cn.ensource.d14_objects;import ja…

python使用pandas操作xlsx

python操作xlsx有很多种方法&#xff0c;以前使用其他控件操作&#xff0c;使用这个pandas之后发现更好用。场景&#xff0c;我需要读取xlsx模板&#xff0c;然后根据模板去获取数据&#xff0c;根据用户要求导出指定的xlsx文件。 读取文件 data pd.read_excel(sleepStageAh…

Hadoop概览以及编译hadoop说明

一、Hadoop概述 Hadoop 是一个用于跨计算机集群存储和处理大型数据集的软件框架。它旨在处理大数据&#xff0c;即传统数据库无法有效管理的极其庞大和复杂的数据集。Hadoop不是传统意义上的数据仓库&#xff0c;因为它们的用途不同&#xff0c;架构也不同。Hadoop 是一个跨分布…

uniapp开发微信小程序问题集锦(1)

1,uniapp实现微信小程序手机号快速登陆 看uniapp的官方文档&#xff0c;之前用的是uni.login会返回一个短code&#xff0c;后端是用不了的&#xff0c;后面通过询问才知道因该是使用button的方法getphonenumber这样能够获取到手机号&#xff0c;并返回一个长code&#xff0c;这…

分割大模型论文阅读——SAM-Med2D

SAM-Med2D 期刊分析摘要引言相关工作方法将医学知识纳入 SAM从 SAM 过渡到 SAM-Med2D评估 SAM-Med2D实验与评估实施细节定量评价定性比较讨论与结论期刊分析 期刊名: ArXiv 期刊信息: 暂无

AWS之云从业者题库笔记

elasticity&#xff1a;弹性durable&#xff1a;耐用的&#xff1b;持久的You can also use CloudWatch in hybrid cloud architectures by using the CloudWatch Agent or API to monitor your on-premises resources.cost allocation tags&#xff1a;成本分配标签cose elimi…

Vue2基础及其进阶面试(二)

vue2的生命周期 删除一些没用的 App.vue 删成这个样子就行 <template><router-view/></template><style lang"scss"></style>来到路由把没用的删除 import Vue from vue import VueRouter from vue-router import HomeView from .…

JAVASE之类和对象(2)

哪怕犯错&#xff0c;也不能什么都不做。 主页&#xff1a;趋早–Step 专栏&#xff1a;JAVASE gitte:https://gitee.com/good-thg 接上部分&#xff0c;我们继续来学习JAVAEE类和对象。 引言&#xff1a; 这篇文章接上一篇&#xff0c;后半部分&#xff0c;结束类和对象 目录 …

Spring Boot 3.0:未来企业应用开发的基石

文章目录 一、Spring Boot 3.0的核心特性二、Spring Boot 3.0的优势三、如何在项目中应用Spring Boot 3.01.更新项目依赖2.调整代码结构3.测试和部署 《学习Spring Boot 3.0》内容简介作者简介目录内容介绍 随着技术的飞速发展&#xff0c;企业应用开发的需求也在不断演变。Spr…

爽!AI手绘变插画,接单赚爆了!

我最近发现一款名叫Hyper-SD15-Scribble的AI项目&#xff0c;可以实现一键手绘变插画的功能&#xff0c;而且它搭载了字节出品的超快速生成图片的AI大模型Hyper-SD15&#xff0c;可以实现几乎实时生成图片&#xff0c;有了它&#xff0c;拿去接一些手绘商单分分钟出图&#xff…

跟TED演讲学英文:How to escape education‘s death valley by Sir Ken Robinson

How to escape education’s death valley Link: https://www.ted.com/talks/sir_ken_robinson_how_to_escape_education_s_death_valley Speaker: Sir Ken Robinson Date: April 2013 文章目录 How to escape educations death valleyIntroductionVocabularySummaryTranscri…

华为云部署前端项目发生的事

今天刚买了一个云服务&#xff0c;想着部署一下前端项目&#xff1a; 使用的是 docker nginx 部署 部署方法&#xff0c;在以往的文章中有介绍&#xff0c;如有兴趣可以看看docker 部署&#xff1b; 结果发现部署成功之后&#xff0c;竟然无法访问&#xff0c;从命令来看&…

MySQL正则替换整个单词

\b 是正则表达式规定的一个特殊代码&#xff08;好吧&#xff0c;某些人叫它元字符&#xff0c;metacharacter&#xff09;&#xff0c;代表着单词的开头或结尾&#xff0c;也就是单词的分界处。虽然通常英文的单词是由空格&#xff0c;标点符号或者换行来分隔的&#xff0c;但…

nanjing university

NJFU forest university 南林 Focus: NJFU specializes in forestry, environmental science, and related fields.Strengths:优势 If you’re passionate about environmental conservation, forestry, or related disciplines, NJFU might be a great fit.Consideration:注意…

WPF学习日常篇(一)--开发界面视图布局

接下来开始日常篇&#xff0c;我在主线篇&#xff08;正文&#xff09;中说过要介绍一下我的界面排布&#xff0c;科学的排布才更科学更有效率的进行敲代码和开发。日常篇中主要记录我的一些小想法和所考虑的一些细节。 一、主界面设置 主界面分为左右两部分&#xff0c;分为…

有什么免费视频翻译软件?安利5款视频翻译软件给你

随着“跨文化交流”话题的热度不断攀升&#xff0c;越来越多的视频内容跨越国界&#xff0c;触及全球观众。 在这一趋势下&#xff0c;视频翻译行业迎来了巨大的发展机遇。然而&#xff0c;面对众多的视频翻译工具&#xff0c;如何挑选出最合心意的那款呢&#xff1f; 现在&a…