基于STM32智能安全门禁
1.引言
學(xué)了這么久的知識(shí)了,現(xiàn)在大二了。想著總不能老是吸取別人的經(jīng)驗(yàn)嘛!于是就突發(fā)奇想地想寫一次博客,跟大家分享一下我的學(xué)習(xí)經(jīng)驗(yàn)。第一次寫博客,如果有什么問(wèn)題,還請(qǐng)大家見諒見諒,歡迎大家指出問(wèn)題來(lái)。
這是我在大一下學(xué)期跟著師兄做的物聯(lián)網(wǎng)智能家居項(xiàng)目里面的模塊,當(dāng)時(shí)師兄讓我負(fù)責(zé)門禁這一方面。沒辦法當(dāng)時(shí)的我就是菜鳥一個(gè),對(duì)于人臉識(shí)別等高技術(shù)根本就不懂。于是就在網(wǎng)上搜索了一天,確定了方案后,斷斷續(xù)續(xù)地花了一個(gè)星期,最終完成任務(wù)。那么廢話少說(shuō)了,開始進(jìn)入正題了。
2.概述
在該項(xiàng)目的門禁系統(tǒng)中我主要采用了以stm32F103系列單片機(jī)作為MCU,以ATK-AS608指紋識(shí)別模塊作為指紋識(shí)別模塊,和4X4矩陣按鍵為密碼按鍵模塊。該門禁系統(tǒng)可以通過(guò)指紋識(shí)別確認(rèn)成功或者通過(guò)按鍵輸入正確密碼則開鎖后,MCU發(fā)送指令控制繼電器驅(qū)動(dòng)模塊進(jìn)行開鎖。當(dāng)指紋識(shí)別失敗或者輸入密碼錯(cuò)誤時(shí)則會(huì)通過(guò)蜂鳴器報(bào)警。
在以上實(shí)現(xiàn)的基礎(chǔ)上,對(duì)指紋模塊和按鍵模塊加以優(yōu)化功能。當(dāng)家里沒有人的時(shí)候,門禁系統(tǒng)需要同時(shí)通過(guò)指紋和按鍵密碼才能開鎖。當(dāng)家里有人是可以任選一種方式。假若刷指紋失敗超過(guò)六次,則需要通過(guò)兩次刷指紋和一次按鍵密碼才能開鎖。
下面是正確操作步驟
3.元器件部分清單
| 按鍵 | 4X4矩陣按鍵 |
| 繼電器驅(qū)動(dòng)模塊 | 1路繼電器模塊 5V DC-5V |
| 指紋 | 光學(xué)指紋識(shí)別模塊 |
4.硬件部分說(shuō)明
繼電器模塊的接口說(shuō)明:
1、DC+:接電源正極(電壓按繼電器要求,有5V.9V.12V和24V選擇) 2、DC-:接電源負(fù)極 3、IN:可以高或低電平控制繼電器吸合 繼電器輸出端: 1、NO: 繼電器常開接口,繼電器吸合前懸空,吸合后與COM短接 2、COM:繼電器公用接口 3、NC: 繼電器常閉接口,繼電器吸合前與COM短接,吸合后懸空。下面時(shí)示意圖:
)
)
矩陣按鍵
在本系統(tǒng)中,我采用了4X4的矩陣按鍵來(lái)作為實(shí)現(xiàn)密碼按鍵功能,
)).
目前一般使用的方法有兩種,分別是:
方法一:先通過(guò)高四位全部輸出低電平,然后逐行掃描,如果低四位不為1(非門)則,該行的按鍵被按下
方法二(常用):先給高四位全部輸出低電平,低四位輸出高電平,接受數(shù)據(jù),當(dāng)?shù)退奈徊蝗珵楦唠娖綍r(shí),判斷所在列,然后,低四位輸出低電平,高四位輸出高電平,判斷行,行列都判斷了;
對(duì)于哪種方法比較好,那就個(gè)人而異了。下面的代碼是采用了第二種方法
5.部分代碼
key.c//按鍵返回值
int key(void) //返回int類型按鍵值 { //已經(jīng)定義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);}}密碼判斷執(zhí)行操作函數(shù)
//由于項(xiàng)目結(jié)題中,省略了部分代碼,詳細(xì)步驟過(guò)程如下
6.結(jié)論
如有問(wèn)題,歡迎大家提出來(lái),第一次寫,難免寫得很差,hhhh~。
轉(zhuǎn)載請(qǐng)保留鏈接
總結(jié)
以上是生活随笔為你收集整理的基于STM32智能安全门禁的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 北京大学计算机科学实验班,北京大学信息科
- 下一篇: 花生地铁WiFi运营商称“上亿用户资料泄