基于嵌入式系统的办公室安保系统设计
简介
设计一套基于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指令来连接云平台。文章来源:https://www.toymoban.com/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);
}
}
如何创建ONENET平台账号和创建项目可自行上网查询。将自己设备接入ONENET平台后,即可接收到通过ESP8266模块上传的数据。然后通过小程序获取云平台的数据,实现在远端实时监控办公室的情况。
初步实现了基本功能,后续可以进行优化添加电机来模拟门锁开关,对K210进行掉电存储功能,增加一些外设来优化办公室监控的环境状态,优化小程序的界面,并实现人机交互功能。
刚学习单片机不久,学习做一个小项目,希望各位大佬多多指导!文章来源地址https://www.toymoban.com/news/detail-754160.html
到了这里,关于STM32项目--基于STM32的办公室安保(智能家居)系统设计的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!