? 最近假期比較閑,拿著之前剩下的模塊做了一個小玩具, 先制定一下此次玩具的規(guī)劃,也可以理解為簡易項目書。
開發(fā)軟件:keil
硬件選型:STM32F103C8T6、RFID讀卡器、oled屏幕、按鍵模塊、藍(lán)牙通信模塊、蜂鳴器、舵機;
上位機:
1.上位機可以對密碼進行設(shè)置、重置
2.上位機可以接收密碼輸入錯誤的報警彈窗提示。
3.添加或刪除ic卡用戶信息。
下位機:
密碼模式:
1.輸入密碼,密碼正確即開鎖,oled屏顯示開鎖成功
2.若輸入錯誤,OLED顯示開鎖失敗
3.連續(xù)三次輸錯密碼,蜂鳴器則發(fā)出警報
4.保存密碼至FLASH, 調(diào)電后不丟失
IC卡模式:
1.讀取IC卡身份信息,若系統(tǒng)中有身份信息則開鎖成功
2.IC身份錯誤,系統(tǒng)無身份識別信息,則蜂鳴器報警
話不多說,先演示一下成品
密碼模式:
1.輸入密碼,密碼正確即開鎖,oled屏顯示開鎖成功
2.若輸入錯誤,OLED顯示開鎖失敗
3.連續(xù)三次輸錯密碼,蜂鳴器則發(fā)出警報
4.保存密碼至FLASH, 調(diào)電后不丟失
IMG_1281
? ? ?上面視頻演示的是密碼模式,? 前三次密碼錯誤, 蜂鳴器發(fā)出警報 ,不過好像視頻拍的糊一些, 抱歉不知道能不能聽得到蜂鳴器三聲警報,? 此時的正確密碼為123456?輸入密碼,密碼正確即開鎖,oled屏顯示開鎖成功。按0鍵返回關(guān)鎖。
這是我程序中的初始密碼,? 因為密碼是存儲到flash的, 所以修改來修改去會忘記之前的密碼,如果你忘記了之前的密碼可以通過藍(lán)牙修改, 或者注釋掉下句代碼。
?
上位機:
1.上位機可以對密碼進行設(shè)置、重置
2.上位機可以接收密碼輸入錯誤的報警彈窗提示。
上位機密碼修改
先是輸入先前密碼123456, 通過HC05藍(lán)牙助手發(fā)送以FF為開頭的FE結(jié)尾的。
例子點擊HEX發(fā)送? ?然后輸入? FF 06 05 04 03 02 01 FE然后回車空一行 點擊發(fā)送, 更改密碼 再次嘗試使用123456解鎖失效,? 同時上位機接收提示密碼錯誤?。 輸入新密碼654321成功,? 同時會將新密碼存儲到FLASH中 密碼不會隨著關(guān)機開機而變化。
?一定要記得修改密碼功能是要用HEX發(fā)送以FF開頭FE結(jié)尾換行后發(fā)送! ! ! ! ! ! !
IC卡模式:
1.讀取IC卡身份信息,若系統(tǒng)中有身份信息則開鎖成功
2.IC身份錯誤,系統(tǒng)無身份識別信息,則蜂鳴器報警
RC522解鎖門鎖
放入白色卡片和藍(lán)色卡片均可以解鎖, 因為我已經(jīng)提前寫入在代碼中, 后續(xù)你們想修改你們自己的只需要在RC522中這個地方按照我定義的方式修改即可
繼續(xù)說,? 卡片放到RC522模塊上, 會在藍(lán)牙上面顯示此卡片 卡號, 同時和自己庫里的卡片進行比對,? 比對成功則開鎖, 比對不成功, 則開鎖失敗, 在藍(lán)牙助手上取消HEX發(fā)送模式, 發(fā)送ID
會顯示當(dāng)前存儲的卡片數(shù)據(jù), 顯示剩余可用ID數(shù), 目前可用ID數(shù)為3,用戶可以選擇a+卡號就是我上面的那個3c34一大串, 加回車換行發(fā)送,就可以添加新的卡解鎖嘍,? 我知道有人會想我不知道我買的這個模塊送的卡片的卡號啊?? 所以我設(shè)置好識別卡號,? 無論是任何卡片 放到上面,都會顯示當(dāng)前卡號, 再顯示解鎖成功與否。
對了有一點如果你想刪除或者添加卡號, 一定要選擇先輸入ID彈出我上面這一大塊, 然后按照我寫的指令執(zhí)行,這樣比較規(guī)范。
上位機:
1. 添加或刪除ic卡用戶信息。
添加或刪除ic卡用戶信息
我自己嘗試了一下用校園卡去測試RFID, 校園卡放到RC522模塊上時由于系統(tǒng)中沒有此身份信息,? 所以開鎖失敗, 同時檢測出校園卡卡號為9E902580。
添加此ic卡用戶信息至信息庫中, 輸入a9E902580換行點擊發(fā)送, 如果修改成功, 系統(tǒng)會通過藍(lán)牙返回添加成功和添加至第幾個ic卡位。添加后, 再次用校園卡放到RC522模塊上, 就可以解鎖,?
?
?
如果想從系統(tǒng)中刪除掉第幾個ic卡可以輸入d+數(shù)字(也就是序列號)。
例如我的視頻中是第一個卡位錄入的卡片是那張白色的卡,? 第二個卡位錄入的是藍(lán)色的卡片, 所以系統(tǒng)會自動按照順序錄入到空白卡位,? 所以如果我想錄入校園卡也就是錄入到第三號卡位,? 所以刪除則需輸入d3換行發(fā)送, 系統(tǒng)就會返回某某卡位刪除成功。
?之后再次將校園卡放到RC522模塊上時候, 就無法解鎖, 卡號錯誤。
我為大家準(zhǔn)備了5個卡位可以存儲, 至于卡位我就沒有沒選擇存儲至flash中,? 因為我測試過, 選擇存儲flash中,? 莫名輸入ID后返回的卡位數(shù)據(jù)會變的非常的慢, 所以我刪除掉了這個部分。
下面列數(shù)一下連接情況
RFID讀卡器
SDA----------------------------->接PA1
SCK----------------------------->接PA2
MOSI----------------------------->接PA3
MISO----------------------------->接PA6
RST----------------------------->接PA4
oled屏幕
GND----------------------------->電源地
VCC----------------------------->接5V或3.3v電源
SCL----------------------------->接PA5(SCL)
SDA----------------------------->接PA7(SDA)
按鍵模塊
排針在左側(cè)的情況下從上到下 PB4,? PB5,? PB6,? PB7,? PB11,? PB10,? PB9,? PB8
藍(lán)牙通信模塊(HC-05)
RXD----------------------------->接PA9
TXD----------------------------->接PA10
VCC----------------------------->接3.3v電源
GND----------------------------->電源地
蜂鳴器
?I/O----------------------------->接PA8
VCC----------------------------->接3.3v電源
GND----------------------------->電源地
舵機
信號線-----------------------------> 接PA0
VCC----------------------------->接5v電源
GND----------------------------->電源地
上面的所有模塊都需要接VCC和GND,? 可能你的最小系統(tǒng)板上面3v3和GND不夠, 我是采用的是插在stlink上面的3v3和5v還有GND, 對了我在做測試時舵機接5v時插在stm32上面發(fā)現(xiàn)無法供電驅(qū)動, 所以我舵機信號線插在PA0? 5v和GND是插在stlink上面的5v5還有GND的。下面就是燒錄stlink圖片。
?main函數(shù)代碼
#include "stm32f10x.h" // Device header
#include "oled.h"
#include "Delay.h"
#include "Keybord.h"
#include "Timer.h"
#include "Servo.h"
#include "PWM.h"
#include "string.h"
#include "USART1.h"
#include "RC522.h"
#include "stmflash.h"
#include "Buzzer.h"
#define SYS_SAVEADDR 0x0800f000 //
uint16_t PassWord;
uint8_t pwd[6];
uint8_t j=0; // 數(shù)組位數(shù)
uint16_t Keybord_Num;
uint8_t OK[6] = {9,8,7,6,5,4}; // 初始密碼
uint8_t Password_OK_Flag;
uint8_t ID1,ID2,ID3,ID4,ID5;
uint8_t Buzzer_Err;
extern uint8_t Card_OK;
extern uint8_t cnt; //待機
extern uint8_t Card_Acquisition;
extern unsigned char Card_ID1[8];
extern unsigned char Card_ID2[8];
extern unsigned char Card_ID3[8];
extern unsigned char Card_ID4[8];
extern unsigned char Card_ID5[8];
void Starting(void);
void Judgment_Button(void);
void Bluetooth_Password(void);
void Add_Card_ID(void);
void Delete_Card_ID(void);
unsigned char Card_ID_TEST[8] = {1,2,3,4,5,6,7,8};
unsigned char Card_ID_READ[8] = {0};
int main(void)
{
OLED_Init();
OLED_Clear();
Keybord_Init();
Servo_Init();
Timer_Init();
Serial_Init();
RC522_Init();
Starting();
Servo_SetAngle(20);
Buzzer_Init();
STMFLASH_Read(SYS_SAVEADDR,(uint16_t*)&OK,3); //如果忘記密碼, 注釋掉這句密碼回歸初始密碼
while (1)
{
// 按鍵
Judgment_Button();
if(Keybord_Num!=0)
{
cnt = 0;
}
if(cnt>5)
{
OLED_Clear();
Starting();
memset(pwd, 0, sizeof(pwd));
j = 0;
cnt =0;
Servo_SetAngle(20);
Password_OK_Flag = 0;
}
//蜂鳴器
if(Buzzer_Err == 3)
{
Buzzer_ON();
Delay_ms(200);
Buzzer_OFF();
Delay_ms(200);
Buzzer_ON();
Delay_ms(200);
Buzzer_OFF();
Delay_ms(200);
Buzzer_ON();
Delay_ms(200);
Buzzer_OFF();
Delay_ms(200);
Buzzer_Err = 0;
}
// 藍(lán)牙通信
Bluetooth_Password();
//射頻RC522
RC522_Handle();
if(Card_OK == 0)
{
Card_OK = 2;
OLED_Clear();
OLED_ShowCHinese(0,0,0);
OLED_ShowCHinese(20,0,1);
OLED_ShowCHinese(40,0,2);
OLED_ShowCHinese(60,0,3);
OLED_ShowString(1,3,"IDCard ERR",12);
Delay_ms(500);
OLED_Clear();
Starting();
memset(pwd, 0, sizeof(pwd));
j = 0;
Servo_SetAngle(20);
cnt = 0;
}
if(Card_OK == 1)
{
Card_OK = 2;
OLED_Clear();
OLED_ShowCHinese(0,0,0);
OLED_ShowCHinese(20,0,1);
OLED_ShowCHinese(40,0,4);
OLED_ShowCHinese(60,0,5);
OLED_ShowString(1,3,"IDCard OK",12);
Servo_SetAngle(180);
Password_OK_Flag = 1;
cnt = 0;
}
if(Card_Acquisition == 1)
{
uint8_t wei;
if(Card_ID1[0] == '0'&&Card_ID1[1] == '0')
{
ID1 = 1;
}
else
ID1 = 0;
if(Card_ID2[0] == '0'&&Card_ID2[1] == '0')
{
ID2 = 1;
}
else
ID2 = 0;
if(Card_ID3[0] == '0'&&Card_ID3[1] == '0')
{
ID3 = 1;
}
else
ID3 = 0;
if(Card_ID4[0] == '0'&&Card_ID4[1] == '0')
{
ID4 = 1;
}
else
ID4 = 0;
if(Card_ID5[0] == '0'&&Card_ID5[1] == '0')
{
ID5 = 1;
}
else
ID5 = 0;
printf("當(dāng)前可用Card_ID如下,總共可存儲5個Card_ID\r\n");
if(ID1 == 0)
{
printf("\r\nCard_ID1 = ");
for(wei = 0;wei<8;wei++)
{
printf("%c",Card_ID1[wei]);
}
printf("\r\n");
printf("\r\n");
}
if(ID2 == 0)
{
printf("Card_ID2 = ");
for(wei = 0;wei<8;wei++)
{
printf("%c",Card_ID2[wei]);
}
printf("\r\n");
printf("\r\n");
}
if(ID3 == 0)
{
printf("Card_ID3 = ");
for(wei = 0;wei<8;wei++)
{
printf("%c",Card_ID3[wei]);
}
printf("\r\n");
printf("\r\n");
}
if(ID4 == 0)
{
printf("Card_ID4 = ");
for(wei = 0;wei<8;wei++)
{
printf("%c",Card_ID4[wei]);
}
printf("\r\n");
printf("\r\n");
}
if(ID5 == 0)
{
printf("Card_ID5 = ");
for(wei = 0;wei<8;wei++)
{
printf("%c",Card_ID5[wei]);
}
printf("\r\n");
printf("\r\n");
}
printf("剩余可用Card_ID為%d\r\n\r\n",ID1+ID2+ID3+ID4+ID5);
Card_Acquisition = 0;
printf("請用戶選擇\r\n\r\n添加卡號 -> a + 數(shù)列號以回車結(jié)尾\r\n\r\n刪除卡號 -> d + 數(shù)列號\r\n\r\n取消操作 -> 無需輸入\r\n\r\n");
}
// 添加卡片
Add_Card_ID();
// 刪除卡片
Delete_Card_ID();
}
---------------------------------------------------------------------------------------------------文章來源:http://www.zghlxwxcb.cn/news/detail-689617.html
全部代碼上傳至(2條消息) 【免費】STM32項目設(shè)計:基于stm32f1的智能門鎖(附項目視頻全套教程)資源-CSDN文庫文章來源地址http://www.zghlxwxcb.cn/news/detail-689617.html
到了這里,關(guān)于STM32項目設(shè)計:基于stm32f1的智能門鎖(附項目視頻全套教程)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!