基于嵌入式系統(tǒng)的辦公室安保系統(tǒng)設(shè)計(jì)
簡(jiǎn)介
設(shè)計(jì)一套基于STM32的辦公室安防系統(tǒng),系統(tǒng)內(nèi)部包括門(mén)禁系統(tǒng)、災(zāi)害報(bào)警系統(tǒng)、人臉識(shí)別系統(tǒng)和交互中心四個(gè)子系統(tǒng)。
門(mén)禁系統(tǒng):主要實(shí)現(xiàn)對(duì)門(mén)禁卡的存儲(chǔ)和讀取并識(shí)別已存儲(chǔ)卡片的信息并控制開(kāi)門(mén),如讀取卡片為未存儲(chǔ)卡片則報(bào)警。
災(zāi)害探測(cè):系統(tǒng)本項(xiàng)目簡(jiǎn)單化使用了溫濕度傳感器和煙霧濃度傳感器來(lái)采集外界的溫濕度和煙霧濃度并傳輸告警信號(hào)。
人臉識(shí)別:可存儲(chǔ)人臉信息并識(shí)別,如檢測(cè)為以存儲(chǔ)的面部則打開(kāi)門(mén)鎖。
交互中心:將STM32單片采集的數(shù)據(jù)通過(guò)WiFi模塊上傳到onenet平臺(tái),通過(guò)編寫(xiě)一個(gè)簡(jiǎn)單的小程序來(lái)獲取溫濕度和煙霧傳感器的數(shù)值和門(mén)鎖狀態(tài)。
硬件準(zhǔn)備
STM32單片機(jī)采用的STM32F103ZET6,人臉識(shí)別模塊采用的K210作為主控芯片,溫濕度傳感器使用的DHT11模塊,煙霧濃度使用的MQ2傳感器,門(mén)禁卡使用的RC522射頻模塊,WiFi采用的ESP8266模塊。
溫濕度煙霧濃度數(shù)據(jù)采集
模塊初始化和數(shù)據(jù)讀取
DHT11模塊的數(shù)據(jù)格式:8bit濕度整數(shù)數(shù)據(jù)、8bit濕度小數(shù)數(shù)據(jù)、8bit溫度整數(shù)數(shù)據(jù)、8bit溫度小數(shù)數(shù)據(jù)+8bit校驗(yàn)位,詳細(xì)原理請(qǐng)查詢(xún)DHT11時(shí)序圖。
u8 DHT11_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOG, &GPIO_InitStructure);
GPIO_SetBits(GPIOG,GPIO_Pin_11);
DHT11_Rst();
return DHT11_Check();
}
//DHT11讀取數(shù)據(jù)
u8 DHT11_Read_Data(u8 *temp,u8 *humi)
{
u8 buf[5];
u8 i;
DHT11_Rst();
if(DHT11_Check()==0)
{
for(i=0;i<5;i++)//
{
buf[i]=DHT11_Read_Byte();
}
if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])//進(jìn)行校驗(yàn)
{
*humi=buf[0];
*temp=buf[2];
}
}else return 1;
return 0;
}
//MQ2傳感器
void MQ2_Adc_Init(void)
{
ADC_InitTypeDef ADC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1, ENABLE ); //使能ADC1通道
RCC_ADCCLKConfig(RCC_PCLK2_Div6); //設(shè)置ADC分頻因子,ADC最大時(shí)間不超過(guò)14M
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;//選用PA1作為模擬通道輸入引腳
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;//
GPIO_Init(GPIOA, &GPIO_InitStructure);
ADC_DeInit(ADC1); //復(fù)位ADC1
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;//ADC工作模式:ADC1和ADC2工作在獨(dú)立模式
ADC_InitStructure.ADC_ScanConvMode = ENABLE; //模數(shù)轉(zhuǎn)換在單通道模式
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; //模數(shù)轉(zhuǎn)換工作在單次轉(zhuǎn)換模式
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //轉(zhuǎn)換由軟件出發(fā)而不是外部觸發(fā)啟動(dòng)
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //ADC數(shù)據(jù)右對(duì)齊(12位逐次逼近型)
ADC_InitStructure.ADC_NbrOfChannel = 1; //順序進(jìn)行規(guī)則轉(zhuǎn)換的ADC通道數(shù)目
ADC_Init(ADC1, &ADC_InitStructure);
ADC_Cmd(ADC1, ENABLE);
ADC_ResetCalibration(ADC1); //復(fù)位校準(zhǔn)
while(ADC_GetResetCalibrationStatus(ADC1));
ADC_StartCalibration(ADC1);
while(ADC_GetCalibrationStatus(ADC1));
}
//讀取ADC值
u16 Get_Adc(u8 ch)
{
//設(shè)置指定ADC規(guī)則組通道,一個(gè)序列,采樣時(shí)間
ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 ); //ADC1,ADC通道,采樣時(shí)間為239.5周期
ADC_SoftwareStartConvCmd(ADC1, ENABLE);//使能指定的ADC1的軟件轉(zhuǎn)換啟動(dòng)功能
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待轉(zhuǎn)換結(jié)束
return ADC_GetConversionValue(ADC1); //返回最近一次ADC1規(guī)則組的轉(zhuǎn)換結(jié)果
}
獲取到溫濕度和煙霧的值之后進(jìn)行處理并設(shè)置閾值,超過(guò)閾值時(shí)則報(bào)警,溫度超過(guò)閾值之后紅燈亮,煙霧濃度超過(guò)閾值之后綠燈亮。
門(mén)禁卡系統(tǒng)
采用RC522射頻模塊,工作的過(guò)程:尋卡->防沖突->選卡->操作卡片,
對(duì)模塊進(jìn)行初始化,STM32通過(guò)SPI協(xié)議和RC522模塊進(jìn)行數(shù)據(jù)讀取,在使用RC522之前應(yīng)先初始化SPI,然后對(duì)RC522模塊進(jìn)行復(fù)位和設(shè)置工作模式。
void SPI1_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE );
// CS
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// SCK
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// MISO
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// MOSI
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// RST
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
將卡片放到模塊上,按下KEY0讀取卡片信息并存儲(chǔ)。
按下KEY1鍵,讀取卡片信息,若讀取到已存卡片則開(kāi)門(mén),若為未知卡片,則關(guān)門(mén)蜂鳴器報(bào)警。并將門(mén)鎖信息上傳到onenet平臺(tái)和小程序。
人臉識(shí)別功能
采用K210模塊進(jìn)行人臉識(shí)別,外部鏈接攝像頭和LCD。K210集成了機(jī)器視覺(jué)(卷積神經(jīng)網(wǎng)絡(luò)加速處理器KPU),可以實(shí)現(xiàn)人臉識(shí)別功能。攝像頭采集數(shù)據(jù)后傳輸?shù)終210進(jìn)行圖像處理,如果圖像中有人臉,K210能識(shí)別人臉在圖像中的位置并在LCD顯示中用方框框住人臉?biāo)诘膮^(qū)域。
k210采用MaixPy IDE開(kāi)發(fā),模型使用MaixHub提供的人臉識(shí)別模型,具體如何燒錄固件和獲取機(jī)器碼不再贅述,網(wǎng)上有很多講解。
MaixPy 資料站
獲取與燒錄固件
機(jī)器碼獲取模型
人臉識(shí)別模型
STM32 和 K210通信
使用串口進(jìn)行通信
import sensor
import image
import lcd
import KPU as kpu
import time
from Maix import FPIOA, GPIO
import gc
from fpioa_manager import fm
from board import board_info
import utime
from machine import UART
#communication with STM32
fm.register(10, fm.fpioa.UART1_TX, force=True)
fm.register(9, fm.fpioa.UART1_RX, force=True)
uart = UART(UART.UART1, 115200, 8, 1, 0, timeout=1000, read_buf_len=4096)
Message1 = 'Hello\r\n'
Message2 = 'World\r\n'
while (1)
img = sensor.snapshot()
uart.write(Message1);
utime.sleep_ms(1000);
uart.write(Message2);
utime.sleep_ms(1000);
lcd.display(img);
人臉識(shí)別代碼太長(zhǎng)了就不放在這里了,如有需要可以私信或上網(wǎng)搜索。
按下K210板子上的BOOT鍵進(jìn)行人臉識(shí)別的存儲(chǔ)。將面部特征存儲(chǔ)下來(lái),并在下一次識(shí)別時(shí)如果匹配上的話(huà)將結(jié)果信息返回給STM32改變門(mén)鎖狀態(tài),并將結(jié)果上傳到云端。若未識(shí)別到存儲(chǔ)的人臉信息則關(guān)閉門(mén)鎖。
WIFI模塊上傳ONENET 平臺(tái)
WIFI模塊初始化
WIFI模塊通過(guò)USART2串口與單片機(jī)進(jìn)行通信,ESP8266通過(guò)AT指令來(lái)連接云平臺(tái)。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-754160.html
void ESP8266_Init(void)
{
GPIO_InitTypeDef GPIO_Initure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_Initure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Initure.GPIO_Pin = GPIO_Pin_13;
GPIO_Initure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_Initure);
GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_RESET);
delay_ms(250);
GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_SET);
delay_ms(500);
ESP8266_Clear();
printf("1. AT\r\n");
while(ESP8266_SendCmd("AT\r\n", "OK"))
delay_ms(500);
printf("2. CWMODE\r\n");
while(ESP8266_SendCmd("AT+CWMODE=1\r\n", "OK"))
delay_ms(500);
printf( "3. AT+CWDHCP\r\n");
while(ESP8266_SendCmd("AT+CWDHCP=1,1\r\n", "OK"))
delay_ms(500);
printf("4. CWJAP\r\n");
while(ESP8266_SendCmd(ESP8266_WIFI_INFO, "GOT IP"))
delay_ms(500);
printf( "5. CIPSTART\r\n");
while(ESP8266_SendCmd(ESP8266_ONENET_INFO, "CONNECT"))
delay_ms(500);
printf("6. ESP8266 Init OK\r\n");
}
void USART2_IRQHandler(void)
{
if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
{
if(esp8266_cnt >= sizeof(esp8266_buf)) esp8266_cnt = 0;
esp8266_buf[esp8266_cnt++] = USART2->DR;
USART_ClearFlag(USART2, USART_FLAG_RXNE);
}
}
如何創(chuàng)建ONENET平臺(tái)賬號(hào)和創(chuàng)建項(xiàng)目可自行上網(wǎng)查詢(xún)。將自己設(shè)備接入ONENET平臺(tái)后,即可接收到通過(guò)ESP8266模塊上傳的數(shù)據(jù)。然后通過(guò)小程序獲取云平臺(tái)的數(shù)據(jù),實(shí)現(xiàn)在遠(yuǎn)端實(shí)時(shí)監(jiān)控辦公室的情況。
初步實(shí)現(xiàn)了基本功能,后續(xù)可以進(jìn)行優(yōu)化添加電機(jī)來(lái)模擬門(mén)鎖開(kāi)關(guān),對(duì)K210進(jìn)行掉電存儲(chǔ)功能,增加一些外設(shè)來(lái)優(yōu)化辦公室監(jiān)控的環(huán)境狀態(tài),優(yōu)化小程序的界面,并實(shí)現(xiàn)人機(jī)交互功能。
剛學(xué)習(xí)單片機(jī)不久,學(xué)習(xí)做一個(gè)小項(xiàng)目,希望各位大佬多多指導(dǎo)!文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-754160.html
到了這里,關(guān)于STM32項(xiàng)目--基于STM32的辦公室安保(智能家居)系統(tǒng)設(shè)計(jì)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!