STM32项目分享:基于stm32的宠物饲养远程控制系统设计

发布于:2025-08-16 ⋅ 阅读:(25) ⋅ 点赞:(0)

“我们不做一锤子买卖,只做技术成长的长期伙伴!”

目录

一、视频展示

二、项目简介

三、原理图设计

四、PCB硬件设计

五、程序设计

六、资料分享


一、视频展示

基于stm32的宠物饲养远程控制系统设计 -视频分享

二、项目简介

题目:基于stm32的宠物饲养远程控制系统设计
主控:STM32
显示:OLED显示屏
温湿度:dht11
红外光电检测余量
光敏电阻检测光照强度
控制模块:一个加水继电器  一个投喂步进电机
水位传感器检测水位
usb小灯
esp8266透传控制单片机并且接收数据
功能:
1、可分为手动和自动模式,可通过手机或者按键修改 自动模式下,检测水位是否过低,过低会打开加水继电器模拟加水,光电检测实物余量  过低自动打开步进电机进行加食物,根据换光照强度自动选择开灯或者关灯。
2、屏幕实时显示温湿度,水位,食物余量。投喂次数,当前模式。

三、原理图设计

四、PCB硬件设计

五、程序设计

#include "stm32f10x.h"                  // Device header
#include "delay.h"
#include "lcd.h"
#include "IOput.h"
#include "usart.h"
#include "adc.h"
#include "pwm.h"
#include "STEPMOTOR.h"
#include "dht11.h"


extern u8 res;
u8 show_flag,mode_flag=12,dec_yw=20,gz,yw,open,count,count1,count2,open1=0,moto_flag=0,moto_stop=0,moto_open=0;
int main (void)
{
	delay_init();
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	
	OLED_Init();
	delay_ms(1);
	OLED_Clear();
	output_init();
	input_init();
	Adc_Init();
	Usart1_Init(9600);
	
	TIM_PWM_Init(100,10);
	stepmotor_init();
	DHT11_Init();
	while(1)
	{
		while(mode_flag==12)
		{
			key_scan(1,0,0);
			OLED_ShowCH(0,4,"  宠物投喂系统  ");
			if(set_flag==1 || res=='s')
			{
				res=0;
				OLED_Clear();
				set_flag=0;
				mode_flag++;
				if(mode_flag>=2)
					mode_flag=0;
			}
		}
		DHT11_Read_Data(&temp,&humi);
		count++;
		gz=100-Get_Adc_Average(0,10)*100/4096; 
		yw=100-Get_Adc_Average(4,10)*100/4096; 
		open=gz;
		key_scan(1,0,0);
		if(gz>=50)
			TIM_SetCompare2(TIM2,close);
		else if(open>=30 && open<50)
			TIM_SetCompare2(TIM2,one_step);
		else if(open>=20 && open<30)
			TIM_SetCompare2(TIM2,two_step);
		else if(open>=0 && open<20)
			
			TIM_SetCompare2(TIM2,three_step);
//		OLED_ShowCH(0,0,"  宠物投喂系统  ");
		OLED_ShowCH(0,0,"温度:");
		OLED_ShowNum(40,0,temp,2,16);
		OLED_ShowCH(64,0,"湿度:");
		OLED_ShowNum(104,0,humi,2,16);
		OLED_ShowCH(0,2,"光照:");
		OLED_ShowNum(40,2,gz,2,16);
		OLED_ShowCH(0,4,"液位:");
		OLED_ShowNum(40,4,yw,2,16);
		OLED_ShowNum(104,2,count1,2,16);
		if(set_flag==1 || res=='s')
		{
			res=0;
			OLED_Clear();
			set_flag=0;
			mode_flag++;
			if(mode_flag>=2)
				mode_flag=0;
		}
		
		if(mode_flag==0)
		{
			OLED_ShowCH(64,2,"手动");
			
			if(add_flag==1 || res == 'a')
			{
				res=0;
				add_flag=0;
				JDQ1=~JDQ1;
			}
			if(dec_flag==1 || res=='d')
			{
				res=0;
				dec_flag=0;
				moto_flag++;
				if(moto_flag>=2)
					moto_flag=0;
			}
			if(JDQ1==0)
			{
				OLED_ShowCH(0,6,"加水开");
			}
			else
				{
				OLED_ShowCH(0,6,"加水关");
			}
				
			if(moto_flag==1)
			{
				OLED_ShowCH(64,6,"投喂开");
			}
			else
			{
				OLED_ShowCH(64,6,"投喂关");
			}
		}
		
		if(mode_flag==1)
		{
			OLED_ShowCH(64,2,"自动");
			OLED_ShowCH(64,4,"阈值:");
			OLED_ShowNum(104,4,dec_yw,2,16);
			if(add_flag==1 || res=='a')
			{
				res=0;
				add_flag=0;
				dec_yw++;
			}
			if(dec_flag==1 || res=='d')
			{
				res=0;
				dec_flag=0;
				dec_yw--;
			}
			if(dec_yw>=100 || dec_yw<=0)
				dec_yw=0;
			
			if(yw<=dec_yw)
				JDQ1=0;
			else
				JDQ1=1;
			
			if(gd==1)
				moto_flag=1;
			else
				moto_flag=0;
			if(JDQ1==0)
			{
				OLED_ShowCH(0,6,"加水开");
			}
			else
			{
				OLED_ShowCH(0,6,"加水关");
			}
				
			if(moto_flag==1)
			{
				OLED_ShowCH(64,6,"投喂开");
			}
			else
			{
				OLED_ShowCH(64,6,"投喂关");
			}
			
		}
		
		if(moto_flag==1)
			open1=1;
		else
		{
			open1=0;
			count2=0;
		}
			
		
		if(open1==1)
		{
			count2++;
			if(count2==1)
				count1++;
			if(count2>=2)
				count2=2;
				
		}
		if(count>=20)
		{
			count=0;
			UsartPrintf(USART1,"light:%d\r\n",gz);
			UsartPrintf(USART1,"water:%d\r\n",yw);
			UsartPrintf(USART1,"count:%d\r\n",count1);
			if(mode_flag==1)
				UsartPrintf(USART1,"Automatic mode\r\n");
			else
				UsartPrintf(USART1,"Manual mode\r\n");
			if(JDQ1==0)
				UsartPrintf(USART1,"Turn on with water\r\n");
			else
				UsartPrintf(USART1,"Add water and turn off\r\n");
			if(moto_flag==1)
				UsartPrintf(USART1,"Feeding begins\r\n");
			else
				UsartPrintf(USART1,"Feeding off\r\n");
			UsartPrintf(USART1,"\r\n\r\n");
		}
		if(moto_flag==1)
		{
			moto_stop=0;
			moto_open++;
			if(moto_open==1)
			{
				MotorCCW(1200,128);
				MotorStop();
			}
			if(moto_open>=2)
				moto_open=2;
		}
		else
		{
			moto_open=0;
			moto_stop++;
			if(moto_stop==1)
			{
				MotorCW(1200,128);
				MotorStop();
			}
			if(moto_stop>=2)
				moto_stop=2;
		}
	}
}

六、资料分享

点击即可查看当前资料分享。


网站公告

今日签到

点亮在社区的每一天
去签到