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

2024-05-26 16:44

本文主要是介绍基于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仿真。

感谢你的观看!

在这里插入图片描述

这篇关于基于STM32的自动宠物喂食器的Proteus仿真的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1005025

相关文章

Java中实现订单超时自动取消功能(最新推荐)

《Java中实现订单超时自动取消功能(最新推荐)》本文介绍了Java中实现订单超时自动取消功能的几种方法,包括定时任务、JDK延迟队列、Redis过期监听、Redisson分布式延迟队列、Rocket... 目录1、定时任务2、JDK延迟队列 DelayQueue(1)定义实现Delayed接口的实体类 (

shell脚本自动删除30天以前的文件(最新推荐)

《shell脚本自动删除30天以前的文件(最新推荐)》该文章介绍了如何使用Shell脚本自动删除指定目录下30天以前的文件,并通过crontab设置定时任务,此外,还提供了如何使用Shell脚本删除E... 目录shell脚本自动删除30天以前的文件linux按照日期定时删除elasticsearch索引s

Go Mongox轻松实现MongoDB的时间字段自动填充

《GoMongox轻松实现MongoDB的时间字段自动填充》这篇文章主要为大家详细介绍了Go语言如何使用mongox库,在插入和更新数据时自动填充时间字段,从而提升开发效率并减少重复代码,需要的可以... 目录前言时间字段填充规则Mongox 的安装使用 Mongox 进行插入操作使用 Mongox 进行更

C语言中自动与强制转换全解析

《C语言中自动与强制转换全解析》在编写C程序时,类型转换是确保数据正确性和一致性的关键环节,无论是隐式转换还是显式转换,都各有特点和应用场景,本文将详细探讨C语言中的类型转换机制,帮助您更好地理解并在... 目录类型转换的重要性自动类型转换(隐式转换)强制类型转换(显式转换)常见错误与注意事项总结与建议类型

IDEA如何让控制台自动换行

《IDEA如何让控制台自动换行》本文介绍了如何在IDEA中设置控制台自动换行,具体步骤为:File-Settings-Editor-General-Console,然后勾选Usesoftwrapsin... 目录IDEA如何让控制台自http://www.chinasem.cn动换行操作流http://www

vscode保存代码时自动eslint格式化图文教程

《vscode保存代码时自动eslint格式化图文教程》:本文主要介绍vscode保存代码时自动eslint格式化的相关资料,包括打开设置文件并复制特定内容,文中通过代码介绍的非常详细,需要的朋友... 目录1、点击设置2、选择远程--->点击右上角打开设置3、会弹出settings.json文件,将以下内

Python脚本实现自动删除C盘临时文件夹

《Python脚本实现自动删除C盘临时文件夹》在日常使用电脑的过程中,临时文件夹往往会积累大量的无用数据,占用宝贵的磁盘空间,下面我们就来看看Python如何通过脚本实现自动删除C盘临时文件夹吧... 目录一、准备工作二、python脚本编写三、脚本解析四、运行脚本五、案例演示六、注意事项七、总结在日常使用

SpringBoot项目启动后自动加载系统配置的多种实现方式

《SpringBoot项目启动后自动加载系统配置的多种实现方式》:本文主要介绍SpringBoot项目启动后自动加载系统配置的多种实现方式,并通过代码示例讲解的非常详细,对大家的学习或工作有一定的... 目录1. 使用 CommandLineRunner实现方式:2. 使用 ApplicationRunne

Springboot的ThreadPoolTaskScheduler线程池轻松搞定15分钟不操作自动取消订单

《Springboot的ThreadPoolTaskScheduler线程池轻松搞定15分钟不操作自动取消订单》:本文主要介绍Springboot的ThreadPoolTaskScheduler线... 目录ThreadPoolTaskScheduler线程池实现15分钟不操作自动取消订单概要1,创建订单后

python实现自动登录12306自动抢票功能

《python实现自动登录12306自动抢票功能》随着互联网技术的发展,越来越多的人选择通过网络平台购票,特别是在中国,12306作为官方火车票预订平台,承担了巨大的访问量,对于热门线路或者节假日出行... 目录一、遇到的问题?二、改进三、进阶–展望总结一、遇到的问题?1.url-正确的表头:就是首先ur