STM32項目設計:STM32基於stm32f4的智能門鎖系統

智能門鎖

資料鏈接 :stm32智能門鎖.rar

嗶哩嗶哩項目展示視頻:https://b23.tv/bxfxvd

一、項目背景

在消費升級滲透在各個領域的今天,國民消費發生着巨大的變化,與每個人息息相關的家居行業也是如此。現今,越來越多的智能家居產品出現在普通老百姓的生活中,智能照明、智能窗簾、智能掃地機器人等各種智能產品都給人們的生活帶來了極大的便利。智能門鎖作爲智能家居中重要的一環,也成爲消費者家居智能化的重要選擇。智能相比市面的機械門鎖更加安全、更智能、更人性化而得到市場的認可,在智能門鎖行業裏,不少世界500強企業也在智能門鎖上進行產品佈局,像中國小米公司就生產智能門鎖,致力打造智慧家庭,市場智能門鎖能夠支持五種解鎖方式,支持指紋、手機、門禁門、按鍵密碼、鑰匙解鎖功能。可以說是智能家庭必不可少的成員。
在這裏插入圖片描述

二、項目功能要求

1、可通過指紋模塊增刪查改家庭成員的指紋信息,增刪查改是否成功的相關信息顯示在OLED屏幕上
2、在指紋匹配過程中,如果採集的指紋與指紋模塊庫相匹配,OLED顯示匹配成功,並轉動步進電機一圈
3、可通過按鍵設定智能門鎖密碼,密碼可設置爲兩個(密碼六位),如果匹配兩個中的一個成功,即可開鎖,也可通過按鍵修改密碼,所有的操作過程顯示於OLED中
4、實現RFID與手機解鎖(藍牙解鎖)
5、擴展:虛位密碼解鎖(虛位密碼:自己百度)

三、元件準備

1、步進電機

在這裏插入圖片描述

2、4X4按鍵
在這裏插入圖片描述
3、指紋模塊AS608在這裏插入圖片描述

4、0.96寸OLED顯示屏(IIC)

在這裏插入圖片描述

5、藍牙模塊HC-05
在這裏插入圖片描述

6、主控芯片STM32F407ZGT6
在這裏插入圖片描述
7、RFID RC522 射頻模塊在這裏插入圖片描述
再準備一些杜邦線就OK

四、項目設計

(一)原理圖設計

在這裏插入圖片描述
在這裏插入圖片描述在這裏插入圖片描述

(二)硬件設計

根據原理圖連接好硬件電路
在這裏插入圖片描述

(三)程序設計

由於代碼過長只展示部分代碼:

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "sram.h"   
#include "malloc.h" 
#include "sdio_sdcard.h"    
#include "malloc.h" 
#include "w25qxx.h"    
#include "ff.h"  
#include "exfuns.h"    
#include "fontupd.h"
#include "text.h"	
#include "oled.h"
#include "beep.h"
#include "button4_4.h"
#include "AS608.h"
#include "walkmotor.h"
#include "usart2.h"
#include "rtc.h"
#include "MFRC522.h"
#include "usart3.h"	
#include "stmflash.h"

#define usart2_baund  57600//串口2波特率,根據指紋模塊波特率更改

//要寫入到STM32 FLASH的字符串數組
const u8 TEXT_Buffer[]={0x17,0x23,0x6f,0x60,0,0};
#define TEXT_LENTH sizeof(TEXT_Buffer)	 		  	//數組長度	
#define SIZE TEXT_LENTH/4+((TEXT_LENTH%4)?1:0)
#define FLASH_SAVE_ADDR  0X0802C124 	//設置FLASH 保存地址(必須爲偶數,且所在扇區,要大於本代碼所佔用到的扇區.
										//否則,寫操作的時候,可能會導致擦除整個扇區,從而引起部分程序丟失.引起死機.

SysPara AS608Para;//指紋模塊AS608參數
u16 ValidN;//模塊內有效指紋個數
u8** kbd_tbl;

void Display_Data(void);//顯示時間
void Add_FR(void);	//錄指紋
void Del_FR(void);	//刪除指紋
int press_FR(void);//刷指紋
void ShowErrMessage(u8 ensure);//顯示確認碼錯誤信息
int password(void);//密碼鎖
void SetPassworld(void);//修改密碼
void starting(void);//開機界面信息
u8 MFRC522_lock(void);//刷卡解鎖
u8 Add_Rfid(void);		//錄入
void Set_Time(void);
void Massige(void);
u8 Pwd[7]="      ";  //解鎖密碼1
u8 Pwd2[7]="      ";  //解鎖密碼2
u8 cardid[6]={0,0,0,0,0,0};  //卡號1
int Error;  //密碼驗證信息


//數字的ASCII碼
uc8 numberascii[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
//顯示緩衝區
u8  dispnumber5buf[6];
u8  dispnumber3buf[4];
u8  dispnumber2buf[3];
//MFRC522數據區
u8  mfrc552pidbuf[18];
u8  card_pydebuf[2];
u8  card_numberbuf[5];
u8  card_key0Abuf[6]={0xff,0xff,0xff,0xff,0xff,0xff};
u8  card_writebuf[16]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
u8  card_readbuf[18];
//SM05-S數據區
u8  sm05cmdbuf[15]={14,128,0,22,5,0,0,0,4,1,157,16,0,0,21};
//extern聲明變量已在外部的C文件裏定義,可以在主文件中使用
extern u8  sm05receivebuf[16];	//在中斷C文件裏定義
extern u8  sm05_OK;							//在中斷C文件裏定義

u8 * week[7]={"Mon","Tue","Wed","Thu","Fri","Sat","Sun"};
u8 * setup[7]={"1、錄入指紋","2、刪除指紋","3、修改密碼","4、修改時間","5、錄入卡片","6、查看信息"};

int main(void)
{
	u16 set=0;
	int key_num;
	int time1;
	int time2;		//鎖屏時間
	char arrow=0;  //箭頭位子
	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設置系統中斷優先級分組2
	My_RTC_Init();		 		//初始化RTC
	RTC_Set_WakeUp(RTC_WakeUpClock_CK_SPRE_16bits,0);		//配置WAKE UP中斷,1秒鐘中斷一次
	delay_init(168);  //初始化延時函數
	uart_init(115200);	//初始化串口1波特率爲115200,用於支持USMART
	uart3_init(9600);// 藍牙初始化
	usart2_init(usart2_baund);//初始化串口2,用於與指紋模塊通訊
	PS_StaGPIO_Init();	//初始化FR讀狀態引腳
	LED_Init();					//初始化LED  
//	BEEP_Init();    		//beep初始化
	Button4_4_Init();//矩陣按鍵初始化
	OLED_Init(); 			//oled初始化
	W25QXX_Init();				//初始化W25Q128
	
	Walkmotor_Init(); //步進電機初始化
	my_mem_init(SRAMIN);		//初始化內部內存池 
	my_mem_init(SRAMCCM);		//初始化CCM內存池 
	exfuns_init();				//爲fatfs相關變量申請內存  
 	 f_mount(fs[0],"0:",1); 		//掛載SD卡 
 	f_mount(fs[1],"1:",1); 		//掛載FLASH.
	starting();//開機信息  logo

	STMFLASH_Read(0X08020004,(u32*)Pwd,2);	//讀取密碼1
	STMFLASH_Read(0X08090004,(u32*)Pwd2,2); //讀取密碼2
	STMFLASH_Read(0X080f0004,(u32*)cardid,1); //讀取卡號1
	 while(1)
	 {
//鎖屏界面
MAIN:
			OLED_Show_Font(56,48,0);//顯示鎖圖標
			while(1)
			{
				time1++;
				if((time1%200)==0)//時間顯示:每50ms更新一次顯示數據
				{
					Display_Data();
				}
				if((time1%1000)==0)//每200ms檢測一次卡片,藍牙數據
				{
					//MFRC522解鎖
					MFRC522_Initializtion();			
					Error=MFRC522_lock();
					if(Error==0)goto MENU;	
					else 
						OLED_Show_Font(56,48,0);//鎖
					//手機藍牙解鎖密碼1
					Error=usart3_cherk((char*)Pwd);         
					if(Error==0){
						OLED_Clear();
						Show_Str(20,10,128,24,"解鎖中...",24,0);	
						Walkmotor_ON();
						Show_Str(20,10,128,24,"已解鎖!",24,0);
						goto MENU;	
					}
					else 
						OLED_Show_Font(56,48,0);//鎖
					//手機藍牙解鎖密碼2
					Error=usart3_cherk((char*)Pwd2);
					if(Error==0){
						OLED_Clear();
						Show_Str(20,10,128,24,"解鎖中...",24,0);	
						Walkmotor_ON();
						Show_Str(20,10,128,24,"已解鎖!",24,0);
						goto MENU;	
					}
					else 
						OLED_Show_Font(56,48,0);//鎖
					
				} 
				//指紋解鎖
				if(PS_Sta)	 //檢測PS_Sta狀態,如果有手指按下
				{
						while(PS_Sta){
						Error=press_FR();//刷指紋
						if(Error==0)goto MENU;
						else 
							OLED_Show_Font(56,48,0);//鎖
					}
				}
				//密碼鎖
				key_num=Button4_4_Scan();	//按鍵掃描
				if(key_num!=-1)
				{
					Error=password();
					if(Error==0)goto MENU;	
					else 
						OLED_Show_Font(56,48,0);//鎖
				}
			}
/**********************主界面***********************************/
MENU:
			//主頁菜單顯示
			OLED_Clear();
			if(arrow<3){
				Show_Str(5,arrow*16,128,16,"->",16,0);
				set=0;}
			else {
				Show_Str(5,(arrow-3)*16,128,16,"->",16,0);
				set=3;}
			Show_Str(25,0,128,16,setup[set],16,0);
			Show_Str(25,16,128,16,setup[set+1],16,0);
			Show_Str(25,32,128,16,setup[set+2],16,0);
			Show_Str(0,52,128,12,"上   下   鎖定  確定",12,0);
			time2=0;
			while(1)
			{
				//超時鎖屏
				time2++;
				if(time2>10000 | key_num==15){  
					time2 =0;
					OLED_Clear();
						Show_Str(30,20,128,16,"已鎖定!",16,0);
						OLED_Show_Font(56,48,0);//鎖
						delay_ms(1000);
						OLED_Clear();
						goto MAIN;
				}
				//功能選項選擇
				key_num=Button4_4_Scan();	
				if(key_num)
				{
					if(key_num==13){
						if(arrow>0)arrow--;
						goto MENU;
					}
					if(key_num==14){
						if(arrow<5)arrow++;
						goto MENU;
					}
					if(key_num==16){
						switch(arrow)
						{
							case 0:Add_FR();		break;//錄指
							case 1:Del_FR();		break;//刪指紋
							case 2:SetPassworld();break;//修改密碼
							case 3:Set_Time(); break;  //設置時間
							case 4:Add_Rfid(); break;  //錄入卡片
							case 5:Massige(); break;  //顯示信息
						}
						goto MENU;
					}		
				}delay_ms(1);
			}		
	}//while
}//main

五、項目圖片展示

在這裏插入圖片描述
在這裏插入圖片描述在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章