項目成品圖片:
—
項目簡介
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
—
實驗效果
-
單片機
+關注
關注
6061文章
44910瀏覽量
646477 -
pcb
+關注
關注
4350文章
23403瀏覽量
406482 -
STM32
+關注
關注
2289文章
11010瀏覽量
362167
發布評論請先 登錄
stm32項目搭建基礎
STM32項目開發中超級實用技巧分享
基于HAL庫的STM32項目問題描述
STM32項目設計:基于STM32F4的mp3、wav音樂播放器 (UCOSIII操作系統、GUI控件)

STM32項目實戰:基于STM32U5的智能燈光控制系統(LVGL),附項目教程/源碼

STM32項目實戰:基于STM32U5的火災報警系統(LVGL),附項目教程/源碼

STM32項目實戰:基于STM32U5的智能大棚溫控系統(LVGL),附項目教程/源碼

評論