项目成品图片:
—
项目简介
1.功能详解
功能如下:
DHT11检测鞋柜温湿度,温度低于阈值开启加热,湿度高于阈值开启加热和通风;
PM2.5传感器检测粉尘浓度,当粉尘浓度值大于设置最大值,进行通风
MQ-135检测鞋柜空气质量,过高时启动紫外线杀菌
光电红外传感器检测柜门状态,关闭时,自动打开消毒灯,打开时,消毒灯关闭
光敏传感器检测光照值,光照值低于阈值且鞋柜门打开时,开启灯光
按键可调节阈值
显示屏显示当前测量值
蓝牙模块将测量数据发送到手机端,并可以控制加热、除湿、通风、消毒、照明以及模式切换
2.材料清单
STM32F103C8T6单片机
OLED 屏幕
DHT11温湿度传感器
PM2.5粉尘传感器
MQ-135空气质量传感器
光电红外传感器
光敏传感器
BT04A蓝牙模块
加热片
风扇模块
UV消毒灯
照明灯
有源蜂鸣器
02
—
原理图设计
03
—
PCB硬件设计
PCB图
04
—
程序设计
#include"sys.h"#include"stdio.h"#include"usart.h"#include"stdlib.h"#include"math.h"#include"delay.h"#include"gpio.h"#include"key.h"#include"oled.h"#include"usart.h"#include"dht11.h"#include"adc.h"#include"pm25.h"
/**********************************变量定义**********************************/uint8_tkey_num =0;//按键扫描标志位uint8_tflag_display =0;//显示界面标志位uint32_ttime_num =0;//10ms计时chardisplay_buf[32];//显示缓存区
_Bool flag_mode =0; //模式标志位intjr_flag =0;intxd_flag =0;inttf_flag =0;intzm_flag =0;
u16 humi_value =0;//鞋柜湿度值u16 humi_max =70;//鞋柜湿度最大值u16 temp_value =0;//鞋柜温度值u16 temp_min =10; //最小温度变量
u16 light_value =0;//光照值u16 light_min =50; //光照最小值
u16 pm25_value =0; //粉尘值u16 pm25_max =250; //粉尘最大值
u16 nh_value =0; //氨气值u16 nh_max =80; //氨气最大值
externuint8_tusart1_buf[256];//串口1接收数组
/**********************************函数声明**********************************/voidKey_function(void);//按键函数voidMonitor_function(void);//监测函数voidDisplay_function(void);//显示函数voidManage_function(void);//处理函数
/***********主函数*****/intmain(void){Delay_Init(); //延时初始化 Gpio_Init(); //IO初始化Key_Init(); //按键初始化Oled_Init(); //OLED初始化Oled_Clear_All();//清屏Usart1_Init(9600); //串口1初始化Adc_Init();//ADC初始化PM25_Init();//PM2.5初始化 while(DHT11_Init());//DHT11初始化Delay_ms(1000);Delay_ms(1000);
while(1){Key_function();//按键函数Monitor_function();//监测函数Display_function();//显示函数Manage_function();//处理函数
time_num++;//计时变量+1Delay_ms(10); if(time_num %10==0) LED_SYS = ~LED_SYS;if(time_num >=5000){time_num =0;}}}
/***********按键函数*****/voidKey_function(void){key_num =Chiclet_Keyboard_Scan(0);//按键扫描if(key_num !=0)//有按键按下{switch(key_num){case1://按键1:切换界面flag_display++; if(flag_display >=6) flag_display =0;Oled_Clear_All();//清屏break;
case2://按键2:加键switch(flag_display){case0://界面0:
break;
case1://界面1:温度最小值+1if(temp_min 99)temp_min++;break;
case2://界面2:湿度最大值+1if(humi_max 99)humi_max++;break;
case3://界面3:粉尘最大值+1if(pm25_max 650)pm25_max++;break;
case4://界面4:氨气最大值+1if(nh_max 300)nh_max++;break;
case5://界面5:光照最小值+1if(light_min 99)light_min++;break;
default:break;}break;
case3://按键3:减键switch(flag_display){case0://界面0:自动模式flag_mode =0;break;
case1://界面1:温度最小值-1if(temp_min >0)temp_min--;break;
case2://界面2:湿度最大值-1if(humi_max >0)humi_max--;break;
case3://界面3:粉尘最大值-1if(pm25_max >0)pm25_max--;break;
case4://界面4:氨气最大值-1if(nh_max >0)nh_max--;break;
case5://界面5:光照最小值-1if(light_min >0)light_min--;break;
default:break;}break;
default:break;}}}
/***********监测函数*****/voidMonitor_function(void){if(flag_display ==0)//测量界面{if(time_num %10==0){Dht11_Get_Temp_Humi_Value(&temp_value,&humi_value);//获取温湿度值light_value =100-30*(Get_Adc_Average(0,3)*3.3/4096.0);//获取光照强度
pm25_value =Pm25_Get_Value(3);//获取PM2.5
if(NH ==0)nh_value =90*(Get_Adc_Average(4,3)*3.3/4096.0);//获取氨气值elsenh_value =0;
if(time_num %30==0)//发送测量数据{UsartPrintf(USART1,"\r\n温度:%d.%dC 湿度:%d.%d%%",temp_value/10,temp_value%10,humi_value/10,humi_value%10);UsartPrintf(USART1,"\r\n粉尘:%d 空气质量:%d",pm25_value,nh_value);UsartPrintf(USART1,"\r\n光照:%d ",light_value);
if(DOOR ==1)UsartPrintf(USART1," 柜门:关");elseUsartPrintf(USART1," 柜门:开");
if(flag_mode ==0)UsartPrintf(USART1,"\r\n模式:自动");elseUsartPrintf(USART1,"\r\n模式:手动");}}
if(USART1_WaitRecive() ==0){if(usart1_buf[0] =='A')flag_mode =0; //切换自动模式elseif(usart1_buf[0] =='B'){flag_mode =1; //切换手动模式jr_flag++;if(jr_flag%2==1){RELAY_JR=1; //开加热}elseRELAY_JR =0;}
elseif(usart1_buf[0] =='C'){flag_mode =1; //切换手动模式tf_flag++;if(tf_flag%2==1){RELAY_TF=1; //开通风}elseRELAY_TF =0;}
elseif(usart1_buf[0] =='D'){flag_mode =1; //切换手动模式xd_flag++;if(xd_flag%2==1){RELAY_XD =1; //开消毒}elseRELAY_XD =0;}
elseif(usart1_buf[0] =='E'){flag_mode =1; //切换手动模式zm_flag++;if(zm_flag%2==1){RELAY_ZM =1; //开照明}elseRELAY_ZM =0;
}
USART1_Clear();}}}
/***********显示函数*****/voidDisplay_function(void){switch(flag_display)//根据不同的显示模式标志位,显示不同的界面{case0://界面0:测量界面,显示测量值及模式Oled_ShowCHinese(1,0,"温");sprintf(display_buf,":%d.%dC ",temp_value/10,temp_value%10);Oled_ShowString(1,2, display_buf);
Oled_ShowCHinese(1,4,"湿");sprintf(display_buf,":%d.%d%% ",humi_value/10,humi_value%10);Oled_ShowString(1,10, display_buf);
Oled_ShowCHinese(2,0,"粉");sprintf(display_buf,":%d ",pm25_value);Oled_ShowString(2,2, display_buf);
Oled_ShowCHinese(2,4,"气");sprintf(display_buf,":%d ",nh_value);Oled_ShowString(2,10, display_buf);
Oled_ShowCHinese(3,0,"光");sprintf(display_buf,":%d ",light_value);Oled_ShowString(3,2, display_buf);
Oled_ShowCHinese(3,4,"柜门");Oled_ShowString(3,12,":");
if(DOOR ==1)Oled_ShowCHinese(3,7,"关");elseOled_ShowCHinese(3,7,"开");
if(flag_mode ==1)Oled_ShowCHinese(4,2,"手动模式");elseOled_ShowCHinese(4,2,"自动模式");
break;
case1://界面1:显示设置温度最小值Oled_ShowCHinese(1,0,"设置温度最小值");if(time_num %5==0){sprintf(display_buf,"%d ",temp_min);Oled_ShowString(2,7, display_buf);}if(time_num %10==0){Oled_ShowString(2,7," ");}break;
case2://界面2:显示设置湿度最大值Oled_ShowCHinese(1,0,"设置湿度最大值");if(time_num %5==0){sprintf(display_buf,"%d ",humi_max);Oled_ShowString(2,7, display_buf);}if(time_num %10==0){Oled_ShowString(2,7," ");}break;
case3://界面3:显示设置粉尘最大值Oled_ShowCHinese(1,0,"设置粉尘最大值");if(time_num %5==0){sprintf(display_buf,"%d ",pm25_max);Oled_ShowString(2,7, display_buf);}if(time_num %10==0){Oled_ShowString(2,7," ");}break;
case4://界面4:显示设置氨气最大值Oled_ShowCHinese(1,0,"空气质量最大值");if(time_num %5==0){sprintf(display_buf,"%d ",nh_max);Oled_ShowString(2,7, display_buf);}if(time_num %10==0){Oled_ShowString(2,7," ");}break;
case5://界面5:显示设置光照最小值Oled_ShowCHinese(1,0,"设置光照最小值");if(time_num %5==0){sprintf(display_buf,"%d ",light_min);Oled_ShowString(2,7, display_buf);}if(time_num %10==0){Oled_ShowString(2,7," ");}break;
default:break;}}
/***********处理函数*****/voidManage_function(void){if(flag_display ==0)//测量界面{if(flag_mode ==0){if(DOOR ==1) //如果鞋柜门是关闭的,关照明灯,如果氨气超高,开消毒灯 { RELAY_ZM =0;if(nh_max < nh_value){RELAY_XD =?1;
} else{RELAY_XD =0;} } else //如果鞋柜门是打开的,关消毒,如果光照低于最小值开照明灯 { RELAY_XD =0; if(light_value < light_min)? ? ? ? {? ? ? ? ? RELAY_ZM =?1;? ? ? ? }? ? ? ? else? ? ? ? {? ? ? ? ? RELAY_ZM =?0;? ? ? ? }? ? ? }
if(temp_value < temp_min*10?|| humi_value > humi_max*10) { //如果温度低于最小值或湿度大于最大值,那么打开加热 RELAY_JR =1; } else { RELAY_JR =0; }
if(humi_value > humi_max*10||pm25_value > pm25_max){//如果是湿度大于最大值或粉尘大于最大值开通风RELAY_TF =1;}else{RELAY_TF =0;}
if(nh_max < nh_value||pm25_value > pm25_max){BEEP=1;}elseBEEP=0;
}}else//设置界面,关闭所有继电器{RELAY_ZM =0; RELAY_TF =0; RELAY_JR =0; RELAY_XD =0;}}
05
—
实验效果
-
单片机
+关注
关注
6069文章
45071浏览量
653602 -
pcb
+关注
关注
4372文章
23545浏览量
411652 -
STM32
+关注
关注
2296文章
11038浏览量
366545
发布评论请先 登录
stm32项目搭建基础
STM32项目开发中超级实用技巧分享
基于HAL库的STM32项目问题描述
STM32项目设计:基于STM32F4的mp3、wav音乐播放器 (UCOSIII操作系统、GUI控件)

STM32项目实战:基于STM32U5的智能灯光控制系统(LVGL),附项目教程/源码

STM32项目实战:基于STM32U5的火灾报警系统(LVGL),附项目教程/源码

STM32项目实战:基于STM32U5的智能大棚温控系统(LVGL),附项目教程/源码

评论