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

news2024/12/23 18:34:25

文章目录

  • 一、宠物喂食器
    • 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.coloradmin.cn/o/1698360.html

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

相关文章

Mistral AI 团队发布 Mistral-7B-Instruct-v0.3

抱抱脸上线了 Mistral-7B-v0.3 的基础版和指令微调版。 相比于Mistral-7B-v0.2&#xff0c;新版本更新如下&#xff1a; – 词汇量从 32000 扩展到 32768 – 支持 v3 分词器 – 支持函数调用 Mistral-7B-v0.3&#xff1a;网页链接 Mistral-7B-Instruct-v0.3&#xff1a;网页…

SpringBoot项目中访问HTML页面

在这种情况下&#xff0c;如果你要访问静态页面&#xff0c;肯定是不能正确访问的&#xff1a;会出现如下错误&#xff1a; 那么&#xff0c;此时&#xff0c;你应该&#xff1a; 静态资源映射&#xff1a; import org.springframework.context.annotation.Configuration; im…

2010-2024年别克维修手册和电路图线路接线图资料更新

经过整理&#xff0c;2010-2024年别克汽车全系列已经更新至汽修帮手资料库内&#xff0c;覆盖市面上99%车型&#xff0c;包括维修手册、电路图、新车特征、车身钣金维修数据、全车拆装、扭力、发动机大修、发动机正时、保养、电路图、针脚定义、模块传感器、保险丝盒图解对照表…

使用Java 将字节数组转成16进制的形式

概述 在很多场景下&#xff0c;需要进行分析字节数据&#xff0c;但是我们存起来的字节数据一般都是二进制的&#xff0c;这时候就需要我们将其转成16进制的方式方便分析。比如在做音视频的时候&#xff0c;需要看下我们传输的视频h264数据中是否有对应的I帧或者B帧等数据&…

【java程序设计期末复习】chapter2 基本数据类型与数组

基本数据类型与数组 一&#xff0c;标识符和关键字 标识符 定义 用来标识类名、变量名、方法名、类型名、数组名、文件名的有效字符序列称为标识符&#xff0c;简单地说&#xff0c;标识符就是一个名字 。 性质 &#xff08;1&#xff09;标识符由字母、下划线、美元符号和…

集合竞价选股策略实战测试

2.3.2版本发布的集合竞价选股策略是网友吴PSYP提供的&#xff0c;团队按照策略实现的选股算法&#xff0c;最近半个月对策略进行的实战测试&#xff0c;从集合竞价选股开始&#xff0c;到股票收盘&#xff0c;收盘价格大于集合竞价价格&#xff0c;算作盈利&#xff0c;测试结果…

贪心-ACW803区间合并-XMUOJ力量碎片合并

题目 思路 附上几个参考链接 for(auto i : v)遍历容器元素_for auto 遍历-CSDN博客 C pair的基本用法总结&#xff08;整理&#xff09;_c pair用法-CSDN博客 使用 sort 实现自定义排序 - AcWing 话不多说&#xff0c;直接上代码 代码 /* ACW803区间合并-XMUOJ力量碎片合…

Redis-事务

简介 说到事务&#xff0c;一般都会第一时间的想到MySQL的事务。 在MySQL中事务的提出是为了解决解决原子性操作的&#xff0c;一组执行命令要么全部执行成功&#xff0c;要么执行失败进行回滚&#xff0c;一条也不执行。 在Redis中也有事务这个概念&#xff0c;但与MySQL相…

基于Pytorch框架的深度学习EfficientNet神经网络香蕉水果成熟度识别分类系统源码

第一步&#xff1a;准备数据 4种香蕉水果成熟度数据&#xff1a;overripe&#xff0c;ripe&#xff0c;rotten&#xff0c;unripe&#xff08;过熟、熟、烂、未成熟&#xff09;&#xff0c;总共有13474张图片&#xff0c;每个文件夹单独放一种成熟度数据 第二步&#xff1a;搭…

零基础小白可以做抖音电商吗?小白做电商难度大吗?一篇全解!

大家好&#xff0c;我是电商花花 在直播电商的热度越来越多&#xff0c;更多普通的创业者都对抖音小店电商有了想法&#xff0c;因为很多普通 人都通过抖音小店开店卖货赚到了钱&#xff0c;让更多人对抖店电商产生了兴趣。 于是做抖音小店无货源&#xff0c;开店卖货赚钱成为…

【软件推荐】obsidian设置

【软件推荐】obsidian设置 初始化 附件相对路径设置 打开obsidian 设置-文件与链接&#xff0c;找到下图的这几个设置。设置为如图所示。 插件推荐 实时渲染 你可能会想&#xff0c;obsidian的使用体验没有typora好呀&#xff01; typora可以实时渲染&#xff0c;obsid…

用c++用4个凸函数(觉得啥好用用啥)去测试adam,rmsprop,adagrad算法的性能(谁先找到最优点)

为了测试 Adam、RMSProp 和 Adagrad 算法的性能&#xff0c;你可以使用四个凸函数进行实验。以下是一些常用的凸函数示例&#xff1a; Rosenbrock 函数&#xff1a; Booth 函数&#xff1a; Himmelblau 函数&#xff1a; Beale 函数&#xff1a; 你可以选择其中一个或多…

光线追踪技术在AI去衣中的革命性角色

引言&#xff1a; 随着人工智能和计算机图形学的飞速发展&#xff0c;AI去衣技术已经从理论走向实践&#xff0c;为影视制作、虚拟现实、在线试衣等领域提供了强大的技术支持。在这一过程中&#xff0c;光线追踪技术以其卓越的渲染能力和逼真的光影效果&#xff0c;成为AI去衣领…

C++开发面试常问总结

一些面试总结 TCP粘包了解吗&#xff1f;解决办法&#xff1f;讲一下乐观锁悲观锁git中 git pull和git fetch的区别1.虚函数实现机制&#xff1a;2.进程和线程的区别&#xff1a;3.TCP三次握手、四次挥手&#xff1a;4.HTTP状态码&#xff0c;报头&#xff1a;5.智能指针&#…

MySql基础(一)--最详细基础入门,看完就懂啦(辛苦整理,想要宝宝的赞和关注嘻嘻)

前言 希望你向太阳一样&#xff0c;有起有落&#xff0c;不失光彩~ 一、数据库概述 1. 什么是数据库 数据库就是存储数据的仓库&#xff0c;其本质是一个文件系统&#xff0c;数据按照特定的格式将数据存储起来&#xff0c;用户可以对数据库中的数据进行增加&#xff0c;修改&…

【Django项目】 音乐网站spotify复刻

代码&#xff1a;https://github.com/tomitokko/spotify-clone 注&#xff1a;该项目不是自己提供mp3文件&#xff0c;而是使用spotify 的api接口获取。

奇舞周刊第529期:万字长文入门前端全球化

周五快乐&#xff08;图片由midjourney生成&#xff09; 奇舞推荐 ■ ■ ■ 万字长文入门前端全球化 目前国内企业正积极开拓国际市场&#xff0c;国际化已成为重要的发展方向&#xff0c;因此产品设计和开发更需考虑国际化。本文介绍了语言标识、文字阅读顺序等诸多知识。然后…

【编译原理复习笔记】中间语言

中间语言 中间语言的特点和作用 &#xff08;1&#xff09;独立于机器 &#xff08;2&#xff09;复杂性介于源语言和目标语言之间 中间语言可以使编译程序的结构在逻辑上更为简单明确 常用的中间语言 后缀式 图表示&#xff1a;抽象语法树&#xff0c;有向无环图 三地址代…

淘宝x5sec

声明 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01;wx a15018601872 本文章未…

LeetCode 264 —— 丑数 II

阅读目录 1. 题目2. 解题思路3. 代码实现 1. 题目 2. 解题思路 第一个丑数是 1 1 1&#xff0c;由于丑数的质因子只包含 2 、 3 、 5 2、3、5 2、3、5&#xff0c;所以后面的丑数肯定是前面的丑数分别乘以 2 、 3 、 5 2、3、5 2、3、5 后得到的数字。 这样&#xff0c;我…