基于STM32智能安全门禁
1.引言
學了這么久的知識了,現在大二了。想著總不能老是吸取別人的經驗嘛!于是就突發奇想地想寫一次博客,跟大家分享一下我的學習經驗。第一次寫博客,如果有什么問題,還請大家見諒見諒,歡迎大家指出問題來。
這是我在大一下學期跟著師兄做的物聯網智能家居項目里面的模塊,當時師兄讓我負責門禁這一方面。沒辦法當時的我就是菜鳥一個,對于人臉識別等高技術根本就不懂。于是就在網上搜索了一天,確定了方案后,斷斷續續地花了一個星期,最終完成任務。那么廢話少說了,開始進入正題了。
2.概述
在該項目的門禁系統中我主要采用了以stm32F103系列單片機作為MCU,以ATK-AS608指紋識別模塊作為指紋識別模塊,和4X4矩陣按鍵為密碼按鍵模塊。該門禁系統可以通過指紋識別確認成功或者通過按鍵輸入正確密碼則開鎖后,MCU發送指令控制繼電器驅動模塊進行開鎖。當指紋識別失敗或者輸入密碼錯誤時則會通過蜂鳴器報警。
在以上實現的基礎上,對指紋模塊和按鍵模塊加以優化功能。當家里沒有人的時候,門禁系統需要同時通過指紋和按鍵密碼才能開鎖。當家里有人是可以任選一種方式。假若刷指紋失敗超過六次,則需要通過兩次刷指紋和一次按鍵密碼才能開鎖。
下面是正確操作步驟
3.元器件部分清單
| 按鍵 | 4X4矩陣按鍵 |
| 繼電器驅動模塊 | 1路繼電器模塊 5V DC-5V |
| 指紋 | 光學指紋識別模塊 |
4.硬件部分說明
繼電器模塊的接口說明:
1、DC+:接電源正極(電壓按繼電器要求,有5V.9V.12V和24V選擇) 2、DC-:接電源負極 3、IN:可以高或低電平控制繼電器吸合 繼電器輸出端: 1、NO: 繼電器常開接口,繼電器吸合前懸空,吸合后與COM短接 2、COM:繼電器公用接口 3、NC: 繼電器常閉接口,繼電器吸合前與COM短接,吸合后懸空。下面時示意圖:
)
)
矩陣按鍵
在本系統中,我采用了4X4的矩陣按鍵來作為實現密碼按鍵功能,
)).
目前一般使用的方法有兩種,分別是:
方法一:先通過高四位全部輸出低電平,然后逐行掃描,如果低四位不為1(非門)則,該行的按鍵被按下
方法二(常用):先給高四位全部輸出低電平,低四位輸出高電平,接受數據,當低四位不全為高電平時,判斷所在列,然后,低四位輸出低電平,高四位輸出高電平,判斷行,行列都判斷了;
對于哪種方法比較好,那就個人而異了。下面的代碼是采用了第二種方法
5.部分代碼
key.c//按鍵返回值
int key(void) //返回int類型按鍵值 { //已經定義PB8~11為上拉輸入,PB12~15為下拉輸入int KeyVal=0; GPIO_Write(GPIOB,(GPIOB->ODR & 0xf0ff | 0x0f00)); if((GPIOB->IDR & 0xf000)==0x0000) return -1; else{ delay_ms(5); if((GPIOB->IDR & 0xf000)==0x0000) return -1;}GPIO_Write(GPIOB,(GPIOB->ODR & 0xf0ff | 0x0100)); switch(GPIOB->IDR & 0xf000) {case 0x1000: KeyVal=1;Key_Scan[1]=1;break;//1case 0x2000: KeyVal=2;Key_Scan[2]=2; break;//2case 0x4000: KeyVal=3;Key_Scan[3]=3; break;//3case 0x8000: KeyVal=11;break;//A}GPIO_Write(GPIOB,(GPIOB->ODR & 0xf0ff | 0x0200)); switch(GPIOB->IDR & 0xf000) {case 0x1000: KeyVal=4;Key_Scan[4]=4; break;case 0x2000: KeyVal=5;Key_Scan[5]=5; break;case 0x4000: KeyVal=6;Key_Scan[6]=6; break;case 0x8000: KeyVal=12;Key_Scan[1]=0; break;}GPIO_Write(GPIOB,(GPIOB->ODR & 0xf0ff | 0x0400)); switch(GPIOB->IDR & 0xf000) {case 0x1000: KeyVal=7;Key_Scan[7]=7; break;case 0x2000: KeyVal=8;Key_Scan[1]=1; break;case 0x4000: KeyVal=9;Key_Scan[1]=1; break;case 0x8000: KeyVal=13;Key_Scan[1]=0; break;} GPIO_Write(GPIOB,(GPIOB->ODR & 0xf0ff | 0x0800)); switch(GPIOB->IDR & 0xf000) {case 0x1000: KeyVal=15;Key_Scan[1]=0; break;case 0x2000: KeyVal=0;Key_Scan[0]=0; break;case 0x4000: KeyVal=16; Key_Scan[1]=0;break;case 0x8000: KeyVal=14;Key_Scan[1]=0; break;}return KeyVal; }刷指紋
void press_FR(void) {SearchResult seach;u8 ensure;char *str;ensure=PS_GetImage();//SUO_Init();LED_Init();if(ensure==0x00)//獲取圖像成功{ ensure=PS_GenChar(CharBuffer1);if(ensure==0x00) //生成特征成功{ ensure=PS_HighSpeedSearch(CharBuffer1,0,300,&seach);if(ensure==0x00)//搜索成功{ LED0=1;LED1=0;BEEP=1;delay_ms(2500);BEEP=0;SUO=0;//開鎖LCD_Fill(0,100,lcddev.width,160,WHITE);Show_Str_Mid(0,100,"Search fingerprint success",16,240);// str=mymalloc(50);sprintf(str,"Match ID:%d Match score:%d",seach.pageID,seach.mathscore);//Show_Str_Mid(0,140,(u8*)str,16,240);myfree(str);}else {ShowErrMessage(ensure);BEEP=1; LED0=0;SUO=1;delay_ms(3000);BEEP=0;} }else{ShowErrMessage(ensure);}delay_ms(1000);LCD_Fill(0,100,lcddev.width,160,WHITE);}}密碼判斷執行操作函數
//由于項目結題中,省略了部分代碼,詳細步驟過程如下
6.結論
如有問題,歡迎大家提出來,第一次寫,難免寫得很差,hhhh~。
轉載請保留鏈接
總結
以上是生活随笔為你收集整理的基于STM32智能安全门禁的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 北京大学计算机科学实验班,北京大学信息科
- 下一篇: 花生地铁WiFi运营商称“上亿用户资料泄