基于步进电机驱动的智能宠物投喂

前述:
QQ:961209458
V X:F9986858
承接毕业设计。

功能

设计内容:

1)温度控制、步进电机控制、定时控制三个控制部分;
2)时间、温度、步进电机转速显示;
3)录音模块。

设计要求:

1)定时喂食。能够根据不同宠物种类以及主人喂养宠物的方式习惯,自己定义时间为宠物提供食物;
2)定量喂食。通过步进电机的定时转速实现控制定量宠物粮食;
3)实时显示。OLED将检测的参数数据实时显示到屏幕上,显示时间、温度、步进电机转速转速;
4)语音提示。自定义录音,实现当到达定时喂食的时间时自动播放提示音宠物前来进食;
5)设置投喂量。设置控制步进电机转动时间,从而控制食物量多少。

本设计达到的目的:

能够自定义时间为宠物提供食物;
通过步进电机的定时转速实现控制定量宠物粮食;
OLED将检测的参数数据实时显示到屏幕上;
自定义录音提示音宠物前来进食;
设置步进电机控制食物量。
通过语音模块录制语音信息,再按键设定喂食时间,屏幕显示数据信息。
到达所设置的时间,语音模块自动播放语音吸引宠物前来进食,同时单片机控制电机驱动工作,控制定量食物。

演示视频

演示视频

硬件电路

在这里插入图片描述

单片机代码

#include "REG51.h"
#include "oled.h"
#include "bmp.h"
#include "Ds18b20.h"
#include "DS1302.h"
#include "JQ8900.h"
#include "delay.h"

//按键位定义
sbit K1 = P3^2;
sbit K2 = P3^3;
sbit K3 = P3^4;
sbit K4 = P3^5;

//步进电机位定义
sbit IN1 = P1^3;
sbit IN2 = P1^4;
sbit IN3 = P1^5;
sbit IN4 = P1^6;

//喂食时分
char FeedHour = 12;
char FeedMinter = 1;

char speed = 7;//电机转速
int count50ms=200;//电机转动时间  默认不修改

char MP3 = 1;//播放音频编号 范围:1-7

bit FeedOnOff=1;//喂食开关  0:关   1:开  默认开
char FeedTimeChange = 0;//修改顺序  0:时  1:分  2:电机速度  3:音频播放

//ms延时函数
void Delay_xms(u16 x)
{
 u16 i,j;
 for(i=0;i<x;i++)
  for(j=0;j<112;j++);
}

//顺时针转动
void MotorCW(void)
{
	IN1 = 1;IN2 = 0;IN3 = 0;IN4 = 1;Delay_xms(speed);//转速调节
	IN1 = 0;IN2 = 0;IN3 = 0;IN4 = 1;Delay_xms(speed);//转速调节
	IN1 = 0;IN2 = 0;IN3 = 1;IN4 = 1;Delay_xms(speed);//转速调节
	IN1 = 0;IN2 = 0;IN3 = 1;IN4 = 0;Delay_xms(speed);//转速调节
	IN1 = 0;IN2 = 1;IN3 = 1;IN4 = 0;Delay_xms(speed);//转速调节
	IN1 = 0;IN2 = 1;IN3 = 0;IN4 = 0;Delay_xms(speed);//转速调节
	IN1 = 1;IN2 = 1;IN3 = 0;IN4 = 0;Delay_xms(speed);//转速调节
	IN1 = 1;IN2 = 0;IN3 = 0;IN4 = 0;Delay_xms(speed);//转速调节
}

//设置定时器状态  state:0  定时器关   1:定时器开
void SetTimer0(unsigned char state)
{
			TR0 = state;
		ET0 = state;
		EA = state;

}

//定时器初始化
void Timer0Init()
{
	TMOD = 0X01;
	TH0 = (65536-50000)/256;
	TL0 = (65536-50000)%256;
	SetTimer0(0);
}

//喂食控制
void FeedControl()
{
	//计算当前时分
	char NowHour,NowMinter;
	NowHour=TIME[2]/16*10+TIME[2]&0x0f;
	NowMinter=TIME[1]/16*10+TIME[1]&0x0f;

	//显示时分
	OLED_ShowNum(40,6,FeedHour,2,16);
	OLED_ShowNum(64,6,FeedMinter,2,16);
	//显示电机速度
	OLED_ShowNum(100,6,8-speed,1,16);
	//显示播放音频顺序
	OLED_ShowNum(116,6,MP3,1,16);
	
	if((NowHour==FeedHour)&&(NowMinter==FeedMinter)&&(count50ms==200)&&(FeedOnOff==1))
	{
		ONE_LINE_PLAY_SONG(MP3);//播放指定编号音频
		SetTimer0(1);//开启定时器  电机转动时间计时
		while(1)//步进电机转动
		{
			MotorCW();
			if(count50ms<=0) //时间结束
			{
				SetTimer0(0);//关闭定时器,退出电机转动
				break;
			}
		}
	}

	while((K2==0)||(K1==0))//喂食时间加减
	{
		if(K1==0)
		{
			if(FeedTimeChange==0)
			{
				if(++FeedHour>=23) FeedHour=23;//时最高到23
			}
			if(FeedTimeChange==1)
			{
				if(++FeedMinter>=59) FeedMinter=59;//分最高到59
			}
			if(FeedTimeChange==2)
			{
				if((speed--)<=1) speed=1;//速度最大为7
			}
			if(FeedTimeChange==3)
			{
				if(++MP3>=7) MP3=7;//音频编号最大为7
			}
		}
		if(K2==0)
		{
			if(FeedTimeChange==0)
			{
				if((FeedHour--)<=0) FeedHour=0;//时最小为0
			}
			if(FeedTimeChange==1)
			{
				if((FeedMinter--)<=0) FeedMinter=0;//分最小为0
			}
			if(FeedTimeChange==2)
			{
				if(++speed>=7) speed=7;//速度最小为1
			}
			if(FeedTimeChange==3)
			{
				if((MP3--)<=1) MP3=1;//音频编号最小为1
			}
		}
		delay_ms1(200);
	}

	if(K3==0)//修改喂食时间修改顺序
	{
		delay_ms1(10);
		if(K3==0)
		{
			if(++FeedTimeChange>=4) FeedTimeChange=0;
		}
		while(K3==0);
	}
	if(K4==0)//修改喂食开关
	{
		delay_ms1(10);
		if(K4==0)
		{
			FeedOnOff=~FeedOnOff;
		}
		delay_ms1(200);
	}
	//显示喂食开关状态
	if(FeedOnOff==1)
	{
		OLED_ShowString(104,0,"ON ",16);
	}
	if(FeedOnOff==0)
	{
		OLED_ShowString(104,0,"OFF",16);
	}
}


void Timer0Isr() interrupt 1
{
	TH0 = (65536-50000)/256;
	TL0 = (65536-50000)%256;
	count50ms--;
}

int main(void)
{	
	OLED_Init();	//初始化OLED  
	OLED_Clear();
	Timer0Init();
	ONE_LINE_VOL(25);//设置音量25
	OLED_ShowString(0,0,"Temp:  . ",16);
	OLED_ShowString(0,2,"Time:  :  :",16);
	OLED_ShowString(0,4,"20  -  -   Wee:",16);
	OLED_ShowString(0,6,"Feed:  :  ",16);
	while(1) 
	{
		FeedControl();//喂食控制
		Ds1302ReadTime();//读取时间
		GetTemp(Ds18b20ReadTemp());//读取温度
		//显示温度
		OLED_ShowNum(40,0,shi,1,16);
		OLED_ShowNum(48,0,ge,1,16);
		OLED_ShowNum(64,0,xs,1,16);
		//显示时分秒
		OLED_ShowNum(40,2,TIME[2]/16,1,16);
		OLED_ShowNum(48,2,TIME[2]&0x0f,1,16);
		OLED_ShowNum(64,2,TIME[1]/16,1,16);
		OLED_ShowNum(72,2,TIME[1]&0x0f,1,16);
		OLED_ShowNum(88,2,TIME[0]/16,1,16);
		OLED_ShowNum(96,2,TIME[0]&0x0f,1,16);
		//显示年月日周
		OLED_ShowNum(16,4,TIME[6]/16,1,16);
		OLED_ShowNum(24,4,TIME[6]&0x0f,1,16);
		OLED_ShowNum(40,4,TIME[4]/16,1,16);
		OLED_ShowNum(48,4,TIME[4]&0x0f,1,16);
		OLED_ShowNum(64,4,TIME[3]/16,1,16);
		OLED_ShowNum(72,4,TIME[3]&0x0f,1,16);
		OLED_ShowNum(120,4,TIME[5]&0x0f,1,16);
	}	  
}
	
  • 4
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
为了设计基于STM32智能宠物喂系统,需要首先确定系统的需求和功能。该系统应该能够自动识别宠物并按照特定时间间隔进行喂,还应该可以根据宠物的体重和饮食需求进行智能化调整,同时还需要具备防止食物过度溢出和堵塞的保护机制。 在设计时,需要选用合适的传感器和模块来实现这些功能。首先,可以使用重量传感器来检测宠物食物容器的重量和宠物体重的变化,以便进行喂时间的调整和喂量的控制。然后,可以将输出信号传输到STM32单片机中进行处理,并控制步进电机或其他驱动装置实现食物的喂。 为了实现智能化调整,系统还应该使用传感器来检测宠物的饮食习惯和健康状况,并在必要时向宠物主人发出警报或提醒。此外,系统还应该配备显示屏和输入设备,方便宠物主人进行配置和监控。 在编写代码时,需要注意保证系统的稳定性和可靠性,保证食物的准确喂,并能够及时检测和处理异常情况。特别是在食物喂时,需要进行严格的控制和保护,避免过度溢出和堵塞。同时,还需要配置适当的保护电路来防止电流过大,保证系统的安全性。 总之,基于STM32智能宠物喂系统需要综合运用传感器、单片机步进电机等多种技术手段,实现自动识别、智能喂、健康监测等多个功能,为宠物主人提供方便、高效、安全的服务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值