項(xiàng)目成品圖片:
01
—
項(xiàng)目簡(jiǎn)介
1.功能詳解
STM32礦井環(huán)境監(jiān)測(cè)系統(tǒng)
功能如下:
STM32F103C8T6單片機(jī)作為主控制器
DS18B20測(cè)量環(huán)境溫度,當(dāng)溫度不在設(shè)置的上下限,則聲光報(bào)警
PM2.5傳感器測(cè)量粉塵濃度,當(dāng)濃度大于設(shè)定最大值,則聲光報(bào)警,并自動(dòng)噴霧
可通過(guò)按鍵設(shè)置各閾值
通過(guò)OLED顯示屏顯示測(cè)量值
通過(guò)藍(lán)牙可手機(jī)端接收數(shù)據(jù),保存數(shù)據(jù),手機(jī)端可遠(yuǎn)程開(kāi)關(guān)噴霧
2.材料清單
STM32F103C8T6單片機(jī)
OLED 屏幕
DS18B20溫度傳感器
粉塵傳感器
BT04A藍(lán)牙模塊
繼電器
有源蜂鳴器
加濕器
02
—
原理圖設(shè)計(jì)
03
—
PCB硬件設(shè)計(jì)
PCB圖
04
—
程序設(shè)計(jì)
#include"sys.h"#include"stdio.h"#include"string.h"#include"stdlib.h"#include"math.h"#include"delay.h"#include"gpio.h"#include"key.h"#include"oled.h"#include"usart.h"#include"adc.h"#include"pm25.h"#include"ds18b20.h"
/**********************************變量定義**********************************/uint8_tkey_num =0;//按鍵掃描標(biāo)志位uint8_tflag_display =0;//顯示界面標(biāo)志位uint32_ttime_num =0;//10ms計(jì)時(shí)short temp_value =0;//溫度值u16 temp_max =40; //溫度最大值u16 temp_min =10;//溫度最小值u16 pm25_value =0; //粉塵值u16 pm25_max =200; //粉塵最大值_Bool flag_mode =0;//模式標(biāo)志位externuint8_tusart1_buf[256];//串口1接收數(shù)組chardisplay_buf[32];//顯示緩存區(qū)/**********************************函數(shù)聲明**********************************/voidKey_function(void);//按鍵函數(shù)voidMonitor_function(void);//監(jiān)測(cè)函數(shù)voidDisplay_function(void);//顯示函數(shù)voidManage_function(void);//處理函數(shù)
/***********主函數(shù)*****/intmain(void){ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//配置中斷優(yōu)先分組Delay_Init(); //延時(shí)初始化 Gpio_Init(); //IO初始化Key_Init(); //按鍵初始化Oled_Init(); //OLED初始化Oled_Clear_All();//清屏Usart1_Init(9600); //串口1初始化
PM25_Init();//PM2.5初始化Adc_Init();//ADC初始化DS18B20_Init();//w溫度初始化while(1){Key_function();//按鍵函數(shù)Monitor_function();//監(jiān)測(cè)函數(shù)Display_function();//顯示函數(shù)Manage_function();//處理函數(shù)
time_num++;//計(jì)時(shí)變量+1Delay_ms(10);if(time_num %10==0)LED_SYS = ~LED_SYS;if(time_num >=5000){time_num =0;}}}
/***********按鍵函數(shù)*****/voidKey_function(void){key_num =Chiclet_Keyboard_Scan(0);//按鍵掃描if(key_num !=0)//有按鍵按下{switch(key_num){case1: //按鍵1,切換設(shè)置界面flag_display++;if(flag_display >=4)flag_display =0;
Oled_Clear_All(); //清屏break;
case2: //按鍵2switch(flag_display){case0: //界面0:
break;
case1://界面1:溫度最大值+1if(temp_max 99)temp_max++;break;
case2://界面2:溫度最小值+1if(temp_min < temp_max-1)temp_min++;break;
case3://界面3:if(pm25_max 650)pm25_max++;break;
default:break;}break;
case3://按鍵3switch(flag_display){case0: //界面0:
break;
case1://界面1:溫度最大值-1if(temp_max > temp_min+1)temp_max--;break;
case2://界面2:溫度最小值-1if(temp_min >0)temp_min--;break;
case3://界面3:if(pm25_max >0)pm25_max--;break;
default:break;}break;
default:
break;}}}
/***********監(jiān)測(cè)函數(shù)*****/voidMonitor_function(void){if(flag_display ==0)//測(cè)量界面{
pm25_value =Pm25_Get_Value(3);//獲取PM2.5temp_value =DS18B20_Get_Temp();
if(time_num %30==0)//發(fā)送數(shù)據(jù){UsartPrintf(USART1,"溫度:%d.%dC\r\n",temp_value/10,temp_value%10);UsartPrintf(USART1,"粉塵:%dppm\r\n",pm25_value);}
if(USART1_WaitRecive() ==0)//如果接收到藍(lán)牙數(shù)據(jù){switch(usart1_buf[0]){case('A')://A:切換自動(dòng)模式flag_mode =0;break;
case('B')://B:RELAY_JS = ~RELAY_JS;flag_mode =1;break;
default:
break;}USART1_Clear();}}}
/***********顯示函數(shù)*****/voidDisplay_function(void){switch(flag_display)//根據(jù)不同的顯示模式標(biāo)志位,顯示不同的界面{case0: //界面0:Oled_ShowCHinese(1,0,"溫度:");sprintf(display_buf,"%d.%dC ",temp_value/10,temp_value%10);Oled_ShowString(1,6, display_buf);Oled_ShowCHinese(2,0,"粉塵:");sprintf(display_buf,"%dppm ",pm25_value);Oled_ShowString(2,6, display_buf);if(flag_mode ==0)//顯示模式Oled_ShowCHinese(3,0,"模式:自動(dòng)");elseOled_ShowCHinese(3,0,"模式:手動(dòng)");break;
case1://界面1:顯示設(shè)置溫度最大值Oled_ShowCHinese(1,0,"設(shè)置溫度最大值");if(time_num %5==0){sprintf(display_buf,"%d ",temp_max);Oled_ShowString(2,6, display_buf);}if(time_num %10==0){Oled_ShowString(2,6," ");}break;
case2://界面2:顯示設(shè)置溫度最小值Oled_ShowCHinese(1,0,"設(shè)置溫度最小值");if(time_num %5==0){sprintf(display_buf,"%d ",temp_min);Oled_ShowString(2,6, display_buf);}if(time_num %10==0){Oled_ShowString(2,6," ");}break;
case3://界面3:Oled_ShowCHinese(1,0,"設(shè)置粉塵最大值");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;
default:
break;}}
/***********處理函數(shù)*****/voidManage_function(void){if(flag_display ==0) //測(cè)量界面{if(flag_mode ==0){if(pm25_value > pm25_max || temp_value > temp_max*10|| temp_value < temp_min*10)?//聲光報(bào)警{if(time_num %?3?==?0){BEEP =~BEEP;LED =~ LED;}}else{BEEP =?0;LED =?1;}
if(pm25_value > pm25_max){RELAY_JS =1;}else{RELAY_JS =0;}}}else //設(shè)置界面{RELAY_JS =0;BEEP =0;LED =1;}}
05
—
實(shí)驗(yàn)效果
-
控制器
+關(guān)注
關(guān)注
114文章
17497瀏覽量
188458 -
礦井
+關(guān)注
關(guān)注
0文章
16瀏覽量
11516 -
STM32
+關(guān)注
關(guān)注
2301文章
11073瀏覽量
369360 -
監(jiān)測(cè)系統(tǒng)
+關(guān)注
關(guān)注
8文章
2982瀏覽量
83754
發(fā)布評(píng)論請(qǐng)先 登錄
如何在米爾-STM32MP257開(kāi)發(fā)板上實(shí)現(xiàn)環(huán)境監(jiān)測(cè)系統(tǒng)

基于 ARM 的環(huán)境監(jiān)測(cè)系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)
無(wú)線傳感器網(wǎng)絡(luò)怎么助力礦井環(huán)境監(jiān)測(cè)?
無(wú)線環(huán)境監(jiān)測(cè)系統(tǒng)怎么實(shí)現(xiàn)?
14個(gè)環(huán)境監(jiān)測(cè)系統(tǒng)設(shè)計(jì)案例
智能環(huán)境監(jiān)測(cè)系統(tǒng)設(shè)計(jì)
如何去實(shí)現(xiàn)一種基于WiFi和STM32的家居環(huán)境監(jiān)測(cè)系統(tǒng)設(shè)計(jì)
基于單片機(jī)的稻田環(huán)境監(jiān)測(cè)系統(tǒng)具有哪些功能
關(guān)于環(huán)境監(jiān)測(cè)設(shè)備中AD7091R的時(shí)序問(wèn)題
基于STM32單片機(jī)礦井礦工作業(yè)安全監(jiān)測(cè)設(shè)計(jì)
基于STM32設(shè)計(jì)的倉(cāng)庫(kù)環(huán)境監(jiān)測(cè)與預(yù)警系統(tǒng)

STM32項(xiàng)目分享:室內(nèi)無(wú)線控制系統(tǒng)

評(píng)論