基于嵌入式系统的办公室安保系统设计

简介

设计一套基于STM32的办公室安防系统,系统内部包括门禁系统、灾害报警系统、人脸识别系统和交互中心四个子系统。 门禁系统:主要实现对门禁卡的存储和读取并识别已存储卡片的信息并控制开门,如读取卡片为未存储卡片则报警。 灾害探测:系统本项目简单化使用了温湿度传感器和烟雾浓度传感器来采集外界的温湿度和烟雾浓度并传输告警信号。 人脸识别:可存储人脸信息并识别,如检测为以存储的面部则打开门锁。 交互中心:将STM32单片采集的数据通过WiFi模块上传到onenet平台,通过编写一个简单的小程序来获取温湿度和烟雾传感器的数值和门锁状态。

硬件准备

STM32单片机采用的STM32F103ZET6,人脸识别模块采用的K210作为主控芯片,温湿度传感器使用的DHT11模块,烟雾浓度使用的MQ2传感器,门禁卡使用的RC522射频模块,WiFi采用的ESP8266模块。

温湿度烟雾浓度数据采集

模块初始化和数据读取

DHT11模块的数据格式:8bit湿度整数数据、8bit湿度小数数据、8bit温度整数数据、8bit温度小数数据+8bit校验位,详细原理请查询DHT11时序图。

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读取数据

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])//进行校验

{

*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); //设置ADC分频因子,ADC最大时间不超过14M

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;//选用PA1作为模拟通道输入引脚

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;//

GPIO_Init(GPIOA, &GPIO_InitStructure);

ADC_DeInit(ADC1); //复位ADC1

ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;//ADC工作模式:ADC1和ADC2工作在独立模式

ADC_InitStructure.ADC_ScanConvMode = ENABLE; //模数转换在单通道模式

ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; //模数转换工作在单次转换模式

ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //转换由软件出发而不是外部触发启动

ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //ADC数据右对齐(12位逐次逼近型)

ADC_InitStructure.ADC_NbrOfChannel = 1; //顺序进行规则转换的ADC通道数目

ADC_Init(ADC1, &ADC_InitStructure);

ADC_Cmd(ADC1, ENABLE);

ADC_ResetCalibration(ADC1); //复位校准

while(ADC_GetResetCalibrationStatus(ADC1));

ADC_StartCalibration(ADC1);

while(ADC_GetCalibrationStatus(ADC1));

}

//读取ADC值

u16 Get_Adc(u8 ch)

{

//设置指定ADC规则组通道,一个序列,采样时间

ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 ); //ADC1,ADC通道,采样时间为239.5周期

ADC_SoftwareStartConvCmd(ADC1, ENABLE);//使能指定的ADC1的软件转换启动功能

while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束

return ADC_GetConversionValue(ADC1); //返回最近一次ADC1规则组的转换结果

}

获取到温湿度和烟雾的值之后进行处理并设置阈值,超过阈值时则报警,温度超过阈值之后红灯亮,烟雾浓度超过阈值之后绿灯亮。

门禁卡系统

采用RC522射频模块,工作的过程:寻卡->防冲突->选卡->操作卡片, 对模块进行初始化,STM32通过SPI协议和RC522模块进行数据读取,在使用RC522之前应先初始化SPI,然后对RC522模块进行复位和设置工作模式。

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读取卡片信息并存储。 按下KEY1键,读取卡片信息,若读取到已存卡片则开门,若为未知卡片,则关门蜂鸣器报警。并将门锁信息上传到onenet平台和小程序。

人脸识别功能

采用K210模块进行人脸识别,外部链接摄像头和LCD。K210集成了机器视觉(卷积神经网络加速处理器KPU),可以实现人脸识别功能。摄像头采集数据后传输到K210进行图像处理,如果图像中有人脸,K210能识别人脸在图像中的位置并在LCD显示中用方框框住人脸所在的区域。 k210采用MaixPy IDE开发,模型使用MaixHub提供的人脸识别模型,具体如何烧录固件和获取机器码不再赘述,网上有很多讲解。 MaixPy 资料站 获取与烧录固件 机器码获取模型 人脸识别模型

STM32 和 K210通信

使用串口进行通信

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);

人脸识别代码太长了就不放在这里了,如有需要可以私信或上网搜索。 按下K210板子上的BOOT键进行人脸识别的存储。将面部特征存储下来,并在下一次识别时如果匹配上的话将结果信息返回给STM32改变门锁状态,并将结果上传到云端。若未识别到存储的人脸信息则关闭门锁。

WIFI模块上传ONENET 平台

WIFI模块初始化

WIFI模块通过USART2串口与单片机进行通信,ESP8266通过AT指令来连接云平台。

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);

}

}

如何创建ONENET平台账号和创建项目可自行上网查询。将自己设备接入ONENET平台后,即可接收到通过ESP8266模块上传的数据。然后通过小程序获取云平台的数据,实现在远端实时监控办公室的情况。 初步实现了基本功能,后续可以进行优化添加电机来模拟门锁开关,对K210进行掉电存储功能,增加一些外设来优化办公室监控的环境状态,优化小程序的界面,并实现人机交互功能。 刚学习单片机不久,学习做一个小项目,希望各位大佬多多指导!

推荐文章

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: