人脸识别的安全门禁系统设计

news/2025/2/19 17:23:45/

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、硬件设计
  • 二、软件开发
  • 三、程序设计
  • 成果展示


前言

最近看到HLK出了个人脸识别,准备画个板子做个小项目。


一、硬件设计

这里使用AD进行原理图以及电路的绘制。

原理图
在这里插入图片描述
在这里插入图片描述
使用stm32F103C8T6作为主控,语音选择的是ASRPRO,屏幕选择的是OLED 0.96寸屏幕。

二、软件开发

利用cubemx进行配置,使用freertos操作系统进行开发,配置了三个任务,按键任务,串口任务,显示任务
在这里插入图片描述
在这里插入图片描述
屏幕使用的是模拟IIC进行控制,人脸识别模块是串口以及语音模块都是使用串口通讯。ASRPRO是使用天问软件开发,比较简单,都不能用开发来形容,只能说使用天问的图形化编程,上手比较快在这里插入图片描述

三、程序设计

写了一天的BUG,完成的差不多了。
首先是变量

struct 
{u8 key_falg;u8 module_result;u8 module_command0[20];//识别指令u8 module_command1[20];//注册指令u8 module_command2[20];//. 删除用户指令u8 module_command3[20];//删除全部指令u8 module_command4[20];//打开背光控制指令u8 module_command5[20];//打开显示控制指令u8 module_command6[20];//打开白光灯控制指令u8 module_command7[20];//重启指令u8 module_command8[20];//读取已注册用户数量指令u8 module_command9[20];//关闭背光控制指令u8 module_command10[20];//关闭显示控制指令u8 module_command11[20];//关闭白光灯控制指令u8 asr_command[10];//语音模块控制指令u8 key_ud_num;//标记按键上下位置u8 key_lr_num;//标记按键左右位置u8 function_falg;//功能标记u8 lim_key_flag;//按键限时标志位u8 module_control_falg[3];//模块控制标志位u8 sg90_falg;//舵机转动标志位u8 sg90_turn_time;//舵机转动时间
}door_guard_data;
u8 Usart1_Rx[50];
u8 Usart2_Rx[50];

宏定义

#define KEY_OK HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_15)
#define KEY_UP HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_12)
#define KEY_DOWN HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_8)
#define KEY_LEFT HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_13)
#define KEY_RIGHT HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_14)
#define KEY_ALL_NUM 5 //按键总数
#define MODULE_FH1 0xEF//人脸识别模块帧头
#define MODULE_FH2 0xAA
#define ASR_USART_FH 0xAA//语音识别通讯帧头
#define ASR_USART_FE 0xEE//语音识别通讯帧尾
#define OLED_UD_NUM 3
#define OLED_RL_NUM 2
#define KEY_DESHAKE_TIME 100//按键消抖时间 ms
#define SG90_TURN_1 500//舵机转动角度控制
#define SG90_TURN_2 1500
#define SG90_TIME 100 //舵机转动时间

自定义函数

u8 KEY_GetStatus(u8 keynum)
{u8 temp;switch(keynum){case 0x01:temp = KEY_OK;break;case 0x02:temp = KEY_UP;break;case 0x03:temp = KEY_DOWN;break;case 0x04:temp = KEY_LEFT;break;case 0x05:temp = KEY_RIGHT;break;default: break;}return temp;
}
u8 key_scan_t(void)
{u8 k_num;for(k_num=1;k_num<KEY_ALL_NUM+1;k_num++){if(KEY_GetStatus(k_num)){break;}}if(k_num == KEY_ALL_NUM+1){k_num = 0;}return k_num;
}
void lim_key_num()
{if(door_guard_data.key_lr_num<= 0){door_guard_data.key_lr_num = 0;}if(door_guard_data.key_ud_num<= 0){door_guard_data.key_ud_num = OLED_RL_NUM;}if(door_guard_data.key_lr_num>= OLED_RL_NUM){door_guard_data.key_lr_num = OLED_RL_NUM;}if(door_guard_data.key_ud_num>= OLED_UD_NUM+1){door_guard_data.key_ud_num = 1;}
}
void lim_key_num1()
{if(door_guard_data.key_ud_num<= 2){door_guard_data.key_ud_num = 2;}if(door_guard_data.key_ud_num>= 3){door_guard_data.key_ud_num = 3;}}
u8 Negation_Var(u8 variable)
{if(variable == 0) variable = 1;else  variable = 0;return variable;
}
void MY_OLED_Clear()
{OLED_ShowString(0,2,(u8*)"                    ",16);OLED_ShowString(0,4,(u8*)"                  ",16);OLED_ShowString(0,6,(u8*)"                 ",16);
}
void OLED_Detect()
{OLED_ShowCHinese(15,2,6);OLED_ShowCHinese(30,2,7);OLED_ShowCHinese(15,4,2);OLED_ShowCHinese(30,4,3);OLED_ShowCHinese(15,6,4);OLED_ShowCHinese(30,6,5);
}
void OLED_Input()
{OLED_ShowCHinese(15,2,0);OLED_ShowCHinese(30,2,1);OLED_ShowCHinese(15,4,8);OLED_ShowCHinese(30,4,9);OLED_ShowCHinese(15,6,4);OLED_ShowCHinese(30,6,5);
}
void OLED_Delete()
{OLED_ShowCHinese(15,2,0);OLED_ShowCHinese(30,2,1);OLED_ShowCHinese(15,4,2);OLED_ShowCHinese(30,4,3);OLED_ShowCHinese(15,6,10);OLED_ShowCHinese(30,6,11);
}
void OLED_Delete_All()
{OLED_ShowCHinese(15,2,14);OLED_ShowCHinese(30,2,15);OLED_ShowCHinese(15,4,16);OLED_ShowCHinese(30,4,17);
}
void OLED_Delete_One()
{OLED_ShowCHinese(15,2,18);OLED_ShowCHinese(30,2,19);OLED_ShowCHinese(15,4,12);OLED_ShowCHinese(30,4,13);
}
void OLED_Display()
{OLED_ShowCHinese(15,2,26);OLED_ShowCHinese(30,2,27);OLED_ShowCHinese(45,2,34);OLED_ShowCHinese(60,2,35);OLED_ShowCHinese(15,4,22);OLED_ShowCHinese(30,4,23);OLED_ShowCHinese(45,4,32);OLED_ShowCHinese(60,4,33);OLED_ShowCHinese(15,6,24);OLED_ShowCHinese(30,6,25);OLED_ShowCHinese(45,6,32);OLED_ShowCHinese(60,6,33);
}
void OLED_Backlight()
{OLED_ShowCHinese(15,2,20);OLED_ShowCHinese(30,2,21);OLED_ShowCHinese(45,2,32);OLED_ShowCHinese(60,2,33);OLED_ShowCHinese(15,4,28);OLED_ShowCHinese(30,4,29);OLED_ShowCHinese(45,4,34);OLED_ShowCHinese(60,4,35);OLED_ShowCHinese(15,6,24);OLED_ShowCHinese(30,6,25);OLED_ShowCHinese(45,6,32);OLED_ShowCHinese(60,6,33);
}
void OLED_Whitelight()
{OLED_ShowCHinese(15,2,20);OLED_ShowCHinese(30,2,21);OLED_ShowCHinese(45,2,32);OLED_ShowCHinese(60,2,33);OLED_ShowCHinese(15,4,22);OLED_ShowCHinese(30,4,23);OLED_ShowCHinese(45,4,32);OLED_ShowCHinese(60,4,33);OLED_ShowCHinese(15,6,30);OLED_ShowCHinese(30,6,31);OLED_ShowCHinese(45,6,34);OLED_ShowCHinese(60,6,35);
}

按键任务

		door_guard_data.key_falg = key_scan_t();osDelay(KEY_DESHAKE_TIME);switch(door_guard_data.key_falg){case 1://KEY_OKdoor_guard_data.key_falg = 0;door_guard_data.lim_key_flag = 0;if(door_guard_data.key_lr_num == 1){door_guard_data.function_falg = door_guard_data.key_ud_num ;}if(door_guard_data.key_lr_num == 0){door_guard_data.function_falg = door_guard_data.key_ud_num + 3;}break;case 2://KEY_DOWNdoor_guard_data.key_falg = 0;door_guard_data.key_ud_num--;osDelay(KEY_DESHAKE_TIME);break;case 3://KEY_UPdoor_guard_data.key_falg = 0;door_guard_data.key_ud_num++;osDelay(KEY_DESHAKE_TIME);break;case 4://KEY_LEFTdoor_guard_data.key_falg = 0;door_guard_data.key_lr_num--;osDelay(KEY_DESHAKE_TIME);break;case 5://KEY_RIGHTdoor_guard_data.key_falg = 0;door_guard_data.key_lr_num++;osDelay(KEY_DESHAKE_TIME);break;}if(door_guard_data.function_falg == 3){door_guard_data.function_falg = 0;door_guard_data.key_lr_num = 0;}if(door_guard_data.lim_key_flag == 0){lim_key_num();}if(door_guard_data.sg90_falg){__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_4,SG90_TURN_1);door_guard_data.sg90_turn_time++;if(door_guard_data.sg90_turn_time >= SG90_TIME){__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_4,SG90_TURN_2);door_guard_data.sg90_falg = 0;}}osDelay(KEY_DESHAKE_TIME);

串口任务

	switch(door_guard_data.function_falg){case 1://检测door_guard_data.function_falg = 0;memset(Usart2_Rx,0,sizeof(Usart2_Rx));HAL_UART_Transmit(&huart2,door_guard_data.module_command0,10,100);osDelay(1000);if(Usart2_Rx[0]==MODULE_FH1&&Usart2_Rx[1] == MODULE_FH2 && Usart2_Rx[7] == 0x12){door_guard_data.module_result = Usart2_Rx[8];if(door_guard_data.module_result == 0) door_guard_data.sg90_falg = 1;door_guard_data.asr_command[1] = door_guard_data.module_result;HAL_UART_Transmit(&huart1,door_guard_data.asr_command,3,100);osDelay(500);}break;case 2://录入door_guard_data.function_falg = 0;memset(Usart2_Rx,0,sizeof(Usart2_Rx));HAL_UART_Transmit(&huart2,door_guard_data.module_command1,10,100);osDelay(1500);if(Usart2_Rx[0]==MODULE_FH1&&Usart2_Rx[1] == MODULE_FH2 && Usart2_Rx[7] == 0x13){door_guard_data.module_result = Usart2_Rx[8];if(door_guard_data.module_result == 0){door_guard_data.asr_command[1] = 0x02;}else if(door_guard_data.module_result == 1){door_guard_data.asr_command[1] = 0x04;}else{door_guard_data.asr_command[1] = door_guard_data.module_result;}HAL_UART_Transmit(&huart1,door_guard_data.asr_command,3,100);}break;case 7://删除单个door_guard_data.function_falg = 0;memset(Usart2_Rx,0,sizeof(Usart2_Rx));door_guard_data.module_command2[8] = door_guard_data.key_ud_num;HAL_UART_Transmit(&huart2,door_guard_data.module_command2,10,100);osDelay(1000);if(Usart2_Rx[0]==MODULE_FH1&&Usart2_Rx[1] == MODULE_FH2 && Usart2_Rx[7] == 0x20){door_guard_data.module_result = Usart2_Rx[8];if(door_guard_data.module_result == 0){door_guard_data.asr_command[1] = 0x05;}if(door_guard_data.module_result == 1){door_guard_data.asr_command[1] = 0x0B;}HAL_UART_Transmit(&huart1,door_guard_data.asr_command,3,100);}break;case 5://删除全部door_guard_data.function_falg = 0;memset(Usart2_Rx,0,sizeof(Usart2_Rx));HAL_UART_Transmit(&huart2,door_guard_data.module_command3,10,100);osDelay(1000);if(Usart2_Rx[0]==MODULE_FH1&&Usart2_Rx[1] == MODULE_FH2 && Usart2_Rx[7] == 0x21){door_guard_data.module_result = Usart2_Rx[8];if(door_guard_data.module_result == 0){door_guard_data.asr_command[1] = 0x05;}if(door_guard_data.module_result == 1){door_guard_data.asr_command[1] = 0x10;}HAL_UART_Transmit(&huart1,door_guard_data.asr_command,3,100);}break;case 8://关闭显示door_guard_data.function_falg = 0;memset(Usart2_Rx,0,sizeof(Usart2_Rx));HAL_UART_Transmit(&huart2,door_guard_data.module_command10,10,100);osDelay(1000);if(Usart2_Rx[0]==MODULE_FH1&&Usart2_Rx[1] == MODULE_FH2 && Usart2_Rx[7] == 0xC1){door_guard_data.module_result = Usart2_Rx[8];if(door_guard_data.module_result == 0){door_guard_data.asr_command[1] = 0x11;OLED_ShowString(90,2,(u8*)"OFF   ",12);}if(door_guard_data.module_result == 1){door_guard_data.asr_command[1] = 0x12;}HAL_UART_Transmit(&huart1,door_guard_data.asr_command,3,100);}break;case 9://关闭背光door_guard_data.function_falg = 0;memset(Usart2_Rx,0,sizeof(Usart2_Rx));HAL_UART_Transmit(&huart2,door_guard_data.module_command9,10,100);osDelay(1000);if(Usart2_Rx[0]==MODULE_FH1&&Usart2_Rx[1] == MODULE_FH2 && Usart2_Rx[7] == 0xC0){door_guard_data.module_result = Usart2_Rx[8];if(door_guard_data.module_result == 0){door_guard_data.asr_command[1] = 0x11;OLED_ShowString(90,4,(u8*)"OFF  ",12);}if(door_guard_data.module_result == 1){door_guard_data.asr_command[1] = 0x12;}HAL_UART_Transmit(&huart1,door_guard_data.asr_command,3,100);}break;case 10://开启白光door_guard_data.function_falg = 0;memset(Usart2_Rx,0,sizeof(Usart2_Rx));HAL_UART_Transmit(&huart2,door_guard_data.module_command6,10,100);osDelay(1000);if(Usart2_Rx[0]==MODULE_FH1&&Usart2_Rx[1] == MODULE_FH2 && Usart2_Rx[7] == 0xC2){door_guard_data.module_result = Usart2_Rx[8];if(door_guard_data.module_result == 0){door_guard_data.asr_command[1] = 0x11;OLED_ShowString(90,6,(u8*)"ON ",12);}if(door_guard_data.module_result == 1){door_guard_data.asr_command[1] = 0x12;}HAL_UART_Transmit(&huart1,door_guard_data.asr_command,3,100);}break;case 11://开启显示door_guard_data.function_falg = 0;memset(Usart2_Rx,0,sizeof(Usart2_Rx));HAL_UART_Transmit(&huart2,door_guard_data.module_command5,10,100);osDelay(1000);if(Usart2_Rx[0]==MODULE_FH1&&Usart2_Rx[1] == MODULE_FH2 && Usart2_Rx[7] == 0xC1){door_guard_data.module_result = Usart2_Rx[8];if(door_guard_data.module_result == 0){door_guard_data.asr_command[1] = 0x11;OLED_ShowString(90,2,(u8*)"ON ",12);}if(door_guard_data.module_result == 1){door_guard_data.asr_command[1] = 0x12;}HAL_UART_Transmit(&huart1,door_guard_data.asr_command,3,100);}break;case 12://打开背光door_guard_data.function_falg = 0;memset(Usart2_Rx,0,sizeof(Usart2_Rx));HAL_UART_Transmit(&huart2,door_guard_data.module_command4,10,100);osDelay(1000);if(Usart2_Rx[0]==MODULE_FH1&&Usart2_Rx[1] == MODULE_FH2 && Usart2_Rx[7] == 0xC0){door_guard_data.module_result = Usart2_Rx[8];if(door_guard_data.module_result == 0){door_guard_data.asr_command[1] = 0x11;OLED_ShowString(90,4,(u8*)"ON ",12);}if(door_guard_data.module_result == 1){door_guard_data.asr_command[1] = 0x12;}HAL_UART_Transmit(&huart1,door_guard_data.asr_command,3,100);}break;case 13://关闭白光door_guard_data.function_falg = 0;memset(Usart2_Rx,0,sizeof(Usart2_Rx));HAL_UART_Transmit(&huart2,door_guard_data.module_command11,10,100);osDelay(1000);if(Usart2_Rx[0]==MODULE_FH1&&Usart2_Rx[1] == MODULE_FH2 && Usart2_Rx[7] == 0xC2){door_guard_data.module_result = Usart2_Rx[8];if(door_guard_data.module_result == 0){door_guard_data.asr_command[1] = 0x11;OLED_ShowString(90,6,(u8*)"OFF  ",12);}if(door_guard_data.module_result == 1){door_guard_data.asr_command[1] = 0x12;}HAL_UART_Transmit(&huart1,door_guard_data.asr_command,3,100);}break;}osDelay(100);

OLED显示任务

if(door_guard_data.key_lr_num == 1 )//处于第一界面{oled_flag = 0;if(oled_flag1){oled_flag1 = 0;MY_OLED_Clear();OLED_ShowString(30,6,(u8*)"     ",16);}switch(door_guard_data.key_ud_num){case 1:OLED_Detect();break;case 2:OLED_Input();break;case 3:OLED_Delete();break;}}if(door_guard_data.key_lr_num  == 0)//处于第0界面{oled_flag1 = 1;if(oled_flag == 0){oled_flag = 1;MY_OLED_Clear();}if(door_guard_data.lim_key_flag == 0){lim_key_num1();switch(door_guard_data.key_ud_num){case 0x02:OLED_Delete_All();break;case 0x03:OLED_Delete_One();break;}}if(door_guard_data.function_falg == 5){door_guard_data.key_lr_num  = 1;}if(door_guard_data.function_falg == 6){door_guard_data.lim_key_flag = 1;
//				door_guard_data.key_ud_num = 1;OLED_ShowString(15,6,(u8*)"ID:",16);OLED_ShowNumber(50,6,door_guard_data.key_ud_num,2,16);if(door_guard_data.key_falg == 1){door_guard_data.function_falg = 7;door_guard_data.key_lr_num  = 1;door_guard_data.key_falg = 0;}}}if(door_guard_data.key_lr_num  == 2)//处于第2界面{oled_flag1 = 1;if(oled_flag == 0){OLED_ShowString(90,2,(u8*)"ON",12);OLED_ShowString(90,4,(u8*)"ON",12);OLED_ShowString(90,6,(u8*)"OFF",12);oled_flag = 1;}switch(door_guard_data.key_ud_num){case 1:OLED_Display();if(door_guard_data.key_falg == 1){door_guard_data.key_falg = 0;door_guard_data.module_control_falg[0] =	Negation_Var(door_guard_data.module_control_falg[0]);if(door_guard_data.module_control_falg[0]){door_guard_data.function_falg = 8;}else{door_guard_data.function_falg = 11;}}break;case 2:OLED_Backlight();if(door_guard_data.key_falg == 1){door_guard_data.key_falg = 0;door_guard_data.module_control_falg[1] = Negation_Var(door_guard_data.module_control_falg[1]);if(door_guard_data.module_control_falg[1]){door_guard_data.function_falg = 9;}else{door_guard_data.function_falg = 12;}}break;case 3:OLED_Whitelight();if(door_guard_data.key_falg == 1){door_guard_data.key_falg = 0;door_guard_data.module_control_falg[2] = Negation_Var(door_guard_data.module_control_falg[2]);if(door_guard_data.module_control_falg[2]){door_guard_data.function_falg = 10;}else{door_guard_data.function_falg = 13;}}break;}}osDelay(10);

成果展示

在这里插入图片描述
在这里插入图片描述


http://www.ppmy.cn/news/246126.html

相关文章

ID门禁卡的防火墙

ID门禁卡&#xff0c;广义上指125KHz的rfid芯片&#xff0c;狭义上就是EM4100系列的芯片&#xff08;TK系列&#xff09; 在很长的一段时间内&#xff0c;市面上的ID门禁卡都是EM4100兼容系列。这种芯片ID卡号固化在芯片内的&#xff0c;成本低廉&#xff0c;使用方便。缺点&a…

门禁是什么

门禁&#xff08;Access Control&#xff09;&#xff0c;指门的禁止权限&#xff0c;是对门的戒备防范。这里的“门”&#xff0c;广义来说&#xff0c;包括能够通行的各种通道&#xff0c;包括人通行的门&#xff0c;车辆通行的门等。因此&#xff0c;门禁就包括了车辆门禁。…

RFID智能门禁系统设计

博主福利&#xff1a;100G电子设计学习资源包&#xff01; http://mp.weixin.qq.com/mp/homepage?__bizMzU3OTczMzk5Mg&hid7&snad5d5d0f15df84f4a92ebf72f88d4ee8&scene18#wechat_redirect -------------------------------------------------------------------…

STM32门禁系统

系列文章目录 1.STM32门禁系统&#xff1a;整体及简易模块的简介 2.STM32门禁系统&#xff1a;0.96寸显示模块的简介 3.STM32门禁系统&#xff1a;舵机模块的简介 4.等待开发中~~~~ 文章目录 目录 系列文章目录 1.STM32门禁系统&#xff1a;整体及简易模块的介绍 前言 …

基于RFID技术的智能门禁系统设计(控制部分)

目 录 摘要 I Abstract II 第1章 绪论 1 1.1 课题研究的背景及意义 1 1.2 课题研究现状 1 1.2.1国内研究现状 1 1.2.2国外研究现状 2 1.3 门禁系统发展趋势 3 1.4 课题设计任务 3 1.5 论文结构 3 第2章 基于RFID技术的门禁系统理论基础 4 2.1射频识别技术概述 4 2.1.1射频识别技…

简易全双工物联网远程控制门禁设计方案

远程控制物联网方案 (此方案成本250元~300元优点是远低于产家报价400&#xff5e;500,使用自家服务器扩展成本低) 组装后连线效果实物图 网关配置 工具见下面产品说明 通讯是TCP/IP协议,一定要配置好服务器地址与网关 通讯是TCP/IP协议,一定要配置好服务器地址与网关 通讯是TCP…

门禁管理

门禁管理系统 目录 1.前言... 1 2.系统设计特点... 1 3.系统实现... 3 4.门禁系统结构图... 5 5.门禁系统设备... 6 6.门禁管理系统特点... 10 7.管理软件简介... 11 8.系统配置及报价... 14 1.前言 门禁系统已成为安全防范系统中极其重要的一部分&#xff0c;在一些发…

基于射频技术的门禁管理系统

引言 随着科学水平的不断提高,基于 RFID 技术的门禁管理系统日渐成熟,现如今已被各大高校&#xff0c;公司&#xff0c;政府机关等敏感区域使用&#xff0c;其强大的功能已为人们深刻认识,它已进入人类社会的各大安全防范领域并发挥着至关重要的作用。越来越多的管理人员意识到…