STM32项目分享:基于单片机的智能宠物笼舍设计及实现

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

目录

一、视频展示

二、项目简介

三、原理图设计

四、PCB硬件设计

五、程序设计

六、资料分享


一、视频展示

基于单片机的智能宠物笼舍设计及实现 -视频分享

二、项目简介

题目:基于单片机的智能宠物笼舍设计及实现

主控:STM32

显示:OLED显示屏

水位传感器

光电传感器

DHT11温湿度传感器

usb小灯

步进电机

光照传感器

蓝牙模块

水泵继电器+除湿继电器+加温继电器

通信:esp8266wifi模块上传阿里云

蜂鸣器

气体检测传感器(一氧化碳)

功能:

1、屏幕实时显示当前温湿度,水位,实物是否充足,光照强度。

2、按键可设置阈值,包括最低光照,最低水位,最低光照,最大湿度,最低温度。

3、当水位低于阈值时,打开水泵继电器,当光照低于阈值时,打开usb小灯进行补光,

当湿度大于湿度阈值时,打开除湿继电器,蜂鸣器报警,当温度低于最低温度阈值时,

打开加热继电器,蜂鸣器报警,当实物余量不足时,打开步进电机投喂。当气体检测达到阈值,声光报警,打开除湿继电器。

4、数据上传阿里云。

5、手机连接蓝牙,手机可以进行控制各个继电器和小灯,以及查看数据。

三、原理图设计

四、PCB硬件设计

五、程序设计

复制代码
#include "stm32f10x.h"                  // Device header
#include "delay.h"
#include "lcd.h"
#include "dht11.h"
#include "IOput.h"
#include "usart.h"
#include "timer.h"
#include "adc.h"
#include "STEPMOTOR.h"
extern u8 res;


extern u8 res;

#define d 2.7
/* 改p值这个偏差就行  */
#define p 168  
float water;
int voltage;
u8 error_flag=0;
float Water_read(void)
{
	  u16 adcx;
	  float voltage;
		adcx=Get_Adc_Average(4,10);
		voltage = adcx*(float)d/(float)p;
	  Delay_1ms(50);
    return voltage;
}

float Water_out(int o)
{
	int i;
	float num = 0;
	float out;
	for(i=0;i<o;i++){ num += Water_read(); }  
  out = num/o;  
	return out;
}
void wifi()
 {
		if(res=='a')
		{
			OLED_Clear();
			res=0;
			set_flag=1;
		}
		else if(res=='b')
		{
			res=0;
			add_flag=1;
		}
		else if(res=='c')
		{
			res=0;
			dec_flag=1;
		}
 }
 
 
u8 light,tushi,count;
u8 show_flag,show1_flag,min_lig = 30,min_lev = 10,max_sd = 50,min_wd = 10,max_co1 = 90;
u16 lev = 0;
 u16 co1 = 0;
int main (void)
{
	delay_init();
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	
	DHT11_Init();
	OLED_Init();
	delay_ms(1);
	OLED_Clear();
	output_init();
	input_init();
	Adc_Init();
	stepmotor_init();
	Usart1_Init(9600);
	Usart2_Init(9600);
	while(1)
	{
		wifi();
		count++;
		co1=Get_Adc_Average(8,10)*100/4096;
		light=100-Get_Adc_Average(0,10)*100/4096;
		DHT11_Read_Data(&temp,&humi);
		lev = Water_out(10)-20;
		key_scan(1,0,0);
		if(set_flag==1 && show_flag!=1)
		{
			show1_flag=0;
			set_flag=0;
			show_flag++;
			if(show_flag>=3)
			{
				show_flag=0;
			}
		}
		if(show_flag==0)
		{
			OLED_ShowCH(0,0,"智能宠物笼舍");
			OLED_ShowCH(0,2,"温度:");
			OLED_ShowNum(40,2,temp,2,16);
			OLED_ShowCH(64,2,"水位:");
			OLED_ShowNum(104,2,lev,2,16);
			OLED_ShowCH(0,4,"湿度:");
			OLED_ShowNum(40,4,humi,2,16);
			OLED_ShowCH(64,4,"光照:");
			OLED_ShowNum(104,4,light,2,16);
			OLED_ShowCH(0,6,"食物:");
			if(GD == 0)
			{
				OLED_ShowCH(40,6,"有");
				
				MotorStop();
				USART_SendData(USART2,'B');
				delay_ms(1);
				USART_SendData(USART2,'g');
				delay_ms(1);
				USART_SendData(USART2,1);
				delay_ms(1);
				USART_SendData(USART2,'E');
				delay_ms(1);
			}
			else
			{
				OLED_ShowCH(40,6,"无");
				MotorCW(1200,168);
				MotorStop();
				USART_SendData(USART2,'B');
				delay_ms(1);
				USART_SendData(USART2,'g');
				delay_ms(1);
				USART_SendData(USART2,0);			
				delay_ms(1);
				USART_SendData(USART2,'E');
				delay_ms(1);
			}
			OLED_ShowCH(64,6,"Co1:");
			OLED_ShowNum(104,6,co1,2,16);
//			OLED_ShowNum(0,6,GD,2,16);
		}
		if(show_flag==1)
		{
			OLED_ShowCH(0,0,"最低光照:");
			OLED_ShowCH(0,2,"最低水位:");
			OLED_ShowCH(0,4,"最高湿度:");
			OLED_ShowCH(0,6,"最低温度:");
			OLED_ShowNum(72,0,min_lig,2,16);
			OLED_ShowNum(72,2,min_lev,2,16);
			OLED_ShowNum(72,4,max_sd,2,16);
			OLED_ShowNum(72,6,min_wd,2,16);
			if(set_flag==1&&show_flag==1)
			{
				set_flag=0;
				show1_flag++;
				if(show1_flag>=4)
				{
					show_flag=2;
					show1_flag = 0;					
					OLED_Clear();
				}
			}
			if(show1_flag==0)
			{
				OLED_ShowCH(112,0,"←");
				if(add_flag==1)
				{
					add_flag=0;
					min_lig++;
				}
				if(dec_flag==1)
				{
					dec_flag=0;
					min_lig--;
				}
				if(min_lig>=100 || min_lig<=0){min_lig=0;}
			}
			if(show1_flag==1)
			{
				OLED_ShowCH(112,2,"←");
				if(add_flag==1)
				{
					add_flag=0;
					min_lev++;
				}
				if(dec_flag==1)
				{
					dec_flag=0;
					min_lev--;
				}
				if(min_lev>=40 || min_lev<=0){min_lev=0;}
			}
			if(show1_flag==2)
			{
				OLED_ShowCH(112,4,"←");
				if(add_flag==1)
				{
					add_flag=0;
					max_sd++;
				}
				if(dec_flag==1)
				{
					dec_flag=0;
					max_sd--;
				}
				if(max_sd>=100 || max_sd<=0){max_sd=0;}
			}
			if(show1_flag==3)
			{
				OLED_ShowCH(112,6,"←");
				if(add_flag==1)
				{
					add_flag=0;
					min_wd++;
				}
				if(dec_flag==1)
				{
					dec_flag=0;
					min_wd--;
				}
				if(min_wd>=100 || min_wd<=0){min_wd=0;}
			}
		
		}
		if(show_flag == 2)
		{
			key_scan(1,0,0);
			OLED_ShowCH(0,0,"最高CO1:");
			OLED_ShowNum(72,0,max_co1,2,16);
			if(set_flag==1&&show_flag==2)
			{
				set_flag=0;
				show1_flag++;
				if(show1_flag>=1)
				{
					show1_flag=0;
					show_flag=0;	
					OLED_Clear();
				}
			}
			if(show1_flag == 0)
			{
				OLED_ShowCH(112,0,"←");
				if(add_flag==1)
				{
					add_flag=0;
					max_co1++;
				}
				if(dec_flag==1)
				{
					dec_flag=0;
					max_co1--;
				}
				if(max_co1>=100 || max_co1<=0){max_co1=0;}
			}
		}
		if(temp<=min_wd || humi>=max_sd || lev<=min_lev || light<=min_lig)
		{
			error_flag=1;
		}
		else
		{
			error_flag=0;
		}
		if(temp<=min_wd)
			jdq3=0;
		else
			jdq3=1;
		
		if(humi>=max_sd || co1 >= max_co1)
			jdq2=0;
		else
			jdq2=1;
		
		if(lev<=min_lev)
			jdq1=0;
		else
			jdq1=1;
		
		if(light<=min_lig)
			deng=1;
		else
			deng=0;
		
		if(temp<=min_wd || humi>=max_sd || co1 >= max_co1)
			BEEP=0;
		else
			BEEP=1;
		if(count>=20)
		{
			count=0;
			USART_SendData(USART2,'B');
			delay_ms(1);
			USART_SendData(USART2,'a');
			delay_ms(1);
			USART_SendData(USART2,temp);
			delay_ms(1);
			USART_SendData(USART2,'b');
			delay_ms(1);
			USART_SendData(USART2,humi);
			delay_ms(1);
			USART_SendData(USART2,'c');
			delay_ms(1);
			USART_SendData(USART2,light);
			delay_ms(1);
			USART_SendData(USART2,'d');
			delay_ms(1);
			USART_SendData(USART2,lev);
			delay_ms(1);
			USART_SendData(USART2,'f');
			delay_ms(1);
			USART_SendData(USART2,error_flag);
			delay_ms(1);
			USART_SendData(USART2,'s');
			delay_ms(1);
			USART_SendData(USART2,co1);
			delay_ms(1);
			USART_SendData(USART2,'g');
			delay_ms(1);
			if(GD == 0)
			{
				USART_SendData(USART2,1);
			}else
			{
				USART_SendData(USART2,0);
			}
			
			delay_ms(1);
			USART_SendData(USART2,'E');
			delay_ms(1);

		}
	}
}

六、资料分享

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

相关推荐
ElfBoard14 小时前
ElfBoard技术贴|如何在【RK3588】ELF 2开发板实现GPIO功能复用
linux·人工智能·单片机·嵌入式硬件·物联网·机器人
西城微科方案开发14 小时前
体重电子秤MCU芯片方案
单片机·嵌入式硬件
技术吧1 天前
2025年AI不是宠物,是会思考的幽灵!
人工智能·宠物
Rousson1 天前
硬件学习笔记--93 静电防护方案(电阻、磁珠、电感、TVS等)
笔记·单片机·学习
happyhappy没有句号1 天前
嵌入式单片机一套通关学习笔记
笔记·单片机·嵌入式硬件·学习
悠哉悠哉愿意1 天前
【嵌入式学习笔记】工程模板建立
笔记·嵌入式硬件·学习
d111111111d1 天前
STM32外设基地址与寄存器偏移地址的深度解析
笔记·stm32·单片机·嵌入式硬件·学习
快乐的划水a1 天前
nanoMODBUS 库
stm32
无聊到发博客的菜鸟1 天前
使用STM32对SD卡进行性能测试
stm32·单片机·rtos·sd卡·fatfs