STM32项目--基于STM32的办公室安保(智能家居)系统设计

2023-11-20

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

简介

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

硬件准备

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

温湿度烟雾浓度数据采集

模块初始化和数据读取

DHT11模块的数据格式:8bit湿度整数数据、8bit湿度小数数据、8bit温度整数数据、8bit温度小数数据+8bit校验位,详细原理请查询DHT11时序图。
https://blog.csdn.net/weixin_49698162/article/details/107901867?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168317025916800222881235%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=168317025916800222881235&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduend~default-1-107901867-null-null.142v86insert_down1,239v2insert_chatgpt&utm_term=DHT11%E5%B7%A5%E4%BD%9C%E5%8E%9F%E7%90%86&spm=1018.2226.3001.4187

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射频模块,工作的过程:寻卡->防冲突->选卡->操作卡片,
https://blog.csdn.net/qq_40574123/article/details/116722010?ops_request_misc=&request_id=&biz_id=102&utm_term=rc522%E6%A8%A1%E5%9D%97&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-3-116722010.142v86insert_down1,239v2insert_chatgpt&spm=1018.2226.3001.4187
对模块进行初始化,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进行掉电存储功能,增加一些外设来优化办公室监控的环境状态,优化小程序的界面,并实现人机交互功能。
刚学习单片机不久,学习做一个小项目,希望各位大佬多多指导!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32项目--基于STM32的办公室安保(智能家居)系统设计 的相关文章

  • 区域生长算法及其实现

    区域生长算法及其实现 背景 前面我们已经介绍了 最大熵分割法 OTSU算法 他们都有各自的优缺点 通常都不是单独使用这些算法 需要和其它算法来结合使用 前面两类算法都是单独对图像的灰度信息进行处理 不包含图像的空间信息 而区域生长算法则包含
  • 云计算与大数据概论第十一周

    分布式计算 分布式计算是一种计算方法 和集中式计算是相对的 随着计算技术的发展 有些应用需要非常巨大的计算能力才能完成 如果采用集中式计算 需要耗费相当长的时间来完成 分布式计算将该应用分解成许多小的部分 分配给多台计算机进行处理 这样可以
  • 如何快速开发一个简单实用的MES系统?

    01 如何快速开发一个简单实用的MES系统 MES生产管理系统 又称制造执行系统 是一种集成了计划 生产 质量控制 库存管理和材料申请等生产流程的管理系统 是企业中实现高效生产的重要一环 根据题主描述 通过产品条形码实现对生产计划下的产品追
  • 小程序的基础(三)

    文章目录 前言 一 navigator 二 rich text 作用 1 nodes属性 注意 三 button open type 的 contact的实现流程 代码示例 1 contact 直接打开 客服对话功能 需要在微信小程序的后台

随机推荐

  • int argc,char*argv[ ]的简洁解释

    1 arguments argument counter 计数个数 和 argument vector 矢量 带有方向的变量参数 也就是指针 argc命令行输入参数的个数 int main int argc char argv int i
  • 【操作系统】王道考研 p42 段页式管理方式

    段页式管理方式 知识总览 分段 分页管理方式中最大的优缺点 关于段式管理会产生外部碎片 ps 分段管理中产生的外部碎片也可以用 紧凑 来解决 只是需要付出较大的时间代价 分段 分页 段页式管理 示意图 先分段 后分页 段页式管理的逻辑地址结
  • oracle 的路径不一致,DG环境搭建,在备库遇到问题,主备库的路径不一致

    现在在做oracle DG的环境搭建 因为实际生产的原因 主备库的路径是不一致的 我把主库的rman文件传到备库后 在备库进行恢复 无法恢复 求指导 oracle std bak rman target sys 123456 pri aux
  • java变量作用域和堆栈

    一 作用域决定了变量的可见性和生命周期 java中变量分为成员变量和局部变量 如下 1 成员变量 在类的所有方法外部声明的变量 即类所拥有的变量 可以被系统初始化 1 1静态成员变量 类被加载时被创建 其生命周期与该类的生命周期相同 1 2
  • 在自己的bash脚本中实现自动补全

    在90年代Linux和DOS共存的年代里 Linux的Shell们有一个最微不足道但也最实用的小功能 就是命令自动补全 而DOS那个笨蛋一直到死都没学会什么叫易用 Linux的这个微不足道的小传统一直延续至今 虽然看似微不足道 其实也极大的
  • stm32无法唤醒DTH11温湿度传感器解决

    关于DTH11的介绍和使用方法可以随便搜索一下别的文章 直接搜索DTH11即可 这里使用艾克姆科技的例程 却无法成功运行 上了示波器才发现拉低时间无法达到18ms 因此无法唤醒DTH11 总线由stm32拉低12ms左右之后就一直处于高电平
  • CString字符串查找和截取

    1 Find 该函数从左侧0索引开始 查找第一个出现的字符位置 CString str abc int postion str Find a 如果查到 返回以0索引起始的位置 未查到 返回 1 如果查到 返回以0索引起始的位置 未查到 返回
  • 卷积神经网络CNN小结(简单实现代码mnist数据集)

    由于全连接神经网络处理图像中的需要训练参数过多的问题 而卷积神经网络中 卷积层的神经元只与前一层的部分 神经元节点相连 既它的神经元的连接是非全连接的 且同一层某些神经元之间的连接的权重w和偏移b是共享的 这样大量减少了训练参数的数量 图1
  • 多线程事务怎么回滚?说用 @Transactional 可以回去等通知了!

    背景介绍 1 最近有一个大数据量插入的操作入库的业务场景 需要先做一些其他修改操作 然后在执行插入操作 由于插入数据可能会很多 用到多线程去拆分数据并行处理来提高响应时间 如果有一个线程执行失败 则全部回滚 2 在spring中可以使用 T
  • C++day4(关系运算符的重载)

    关系运算符重载的作用 可以让两个自定义类型对象进行对比操作 代码实现关系运算符的重载 include
  • unity工程崩溃资源找回

    1 Unity死机未保存场景 当你在Unity中编辑场景 突然死机时 可以在项目文件目录中找到Temp文件夹 双击文件夹 找到 Backupscenes文件夹 把后缀为 backup的文件后缀改为 unity 然后拖进Unity的Proje
  • 2021-05-03

    一 R中安装 phyloseq 的方法 很多网上的教程使用的都是 source https bioconductor org biocLite R biocLite phyloseq 但是我尝试了很多次 最后还是没有成功 下面能成功安装 p
  • 连接Mysql出现Connection unexpectedly closed

    Mysql 版本 5 7 问题 本地服务可以正常连接MySQL 在服务器部署后连接出错 服务器日志 dev miku r2dbc mysql client MySqlConnectionClosedException Connection
  • IDEA2021从零开始搭建SSM框架手把手详细教程 (一)

    开发环境 macos IDEA 2021 mysql8 0 toma9 0 源码 https download csdn net download a2267542848 19730797 1 基本环境搭建 1 新建工程 新建后整个目录如下
  • nodejs的安装与配置

    NodeJs安装与配置 之前一直在网上自己找教程装 但是经常出问题 索性自己总结一个 1 安装nodejs 去网址 https nodejs org zh cn download msi和 zip msi是Windows installer
  • 物联锁项目失败原因分析

    一 背景 2022年3月份接手IM024物联锁项目救火 此项目主要用于医院共享轮椅 共享病床 此项目是从2021年初开始立项开发 投入了大量的人力物力 但是在2022年3月份时产品工作仍然不稳定 此项目基本上可以判定为一个失败的典型 为了吸
  • 在linux下jdk安装和建立Hadoop集群的过程实验报告(搭建Hadoop集群)。

    1 模板虚拟机环境准备 相关视频 半小时快速搭建Hadoop集群 哔哩哔哩 bilibilihttps www bilibili com video BV1x5411177Y spm id from 333 880 my history p
  • (pinia-plugin-persistedstate)pinia 持久化存储

    背景 我们使用pinia的时候 会遇到页面刷新的时候数据丢失 我们自己解决的话 就是在页面刷新之前将数据存储到本地 然后在页面打开的时候将数据从本地读出来 实现数据持久化 所以我们可以通过插件来直接帮我们完成这个操作来实现自动化存储 学习p
  • Qt QTextEdit 自动滚动内容/移动光标到最后一行

    QTextEdit往文本后添加内容超出视图 并不会自动滚动到最后 需要添加以下代码 ui gt StatustextEdit gt insertPlainText text 光标后添加文本 ui gt StatustextEdit gt m
  • STM32项目--基于STM32的办公室安保(智能家居)系统设计

    基于嵌入式系统的办公室安保系统设计 简介 设计一套基于STM32的办公室安防系统 系统内部包括门禁系统 灾害报警系统 人脸识别系统和交互中心四个子系统 门禁系统 主要实现对门禁卡的存储和读取并识别已存储卡片的信息并控制开门 如读取卡片为未存