STM32项目设计:基于stm32f1的智能门锁(附项目视频全套教程) | 您所在的位置:网站首页 › 各种门锁拆卸视频教程全集 › STM32项目设计:基于stm32f1的智能门锁(附项目视频全套教程) |
最近假期比较闲,拿着之前剩下的模块做了一个小玩具, 先制定一下此次玩具的规划,也可以理解为简易项目书。 开发软件:keil 硬件选型:STM32F103C8T6、RFID读卡器、oled屏幕、按键模块、蓝牙通信模块、蜂鸣器、舵机; 上位机: 1.上位机可以对密码进行设置、重置 2.上位机可以接收密码输入错误的报警弹窗提示。 3.添加或删除ic卡用户信息。 下位机: 密码模式: 1.输入密码,密码正确即开锁,oled屏显示开锁成功 2.若输入错误,OLED显示开锁失败 3.连续三次输错密码,蜂鸣器则发出警报 4.保存密码至FLASH, 调电后不丢失 IC卡模式: 1.读取IC卡身份信息,若系统中有身份信息则开锁成功 2.IC身份错误,系统无身份识别信息,则蜂鸣器报警 话不多说,先演示一下成品 密码模式: 1.输入密码,密码正确即开锁,oled屏显示开锁成功 2.若输入错误,OLED显示开锁失败 3.连续三次输错密码,蜂鸣器则发出警报 4.保存密码至FLASH, 调电后不丢失 IMG_1281 上面视频演示的是密码模式, 前三次密码错误, 蜂鸣器发出警报 ,不过好像视频拍的糊一些, 抱歉不知道能不能听得到蜂鸣器三声警报, 此时的正确密码为123456 输入密码,密码正确即开锁,oled屏显示开锁成功。按0键返回关锁。 这是我程序中的初始密码, 因为密码是存储到flash的, 所以修改来修改去会忘记之前的密码,如果你忘记了之前的密码可以通过蓝牙修改, 或者注释掉下句代码。 上位机: 1.上位机可以对密码进行设置、重置 2.上位机可以接收密码输入错误的报警弹窗提示。 上位机密码修改 先是输入先前密码123456, 通过HC05蓝牙助手发送以FF为开头的FE结尾的。 例子点击HEX发送 然后输入 FF 06 05 04 03 02 01 FE然后回车空一行 点击发送, 更改密码 再次尝试使用123456解锁失效, 同时上位机接收提示密码错误 。 输入新密码654321成功, 同时会将新密码存储到FLASH中 密码不会随着关机开机而变化。 一定要记得修改密码功能是要用HEX发送以FF开头FE结尾换行后发送! ! ! ! ! ! ! IC卡模式: 1.读取IC卡身份信息,若系统中有身份信息则开锁成功 2.IC身份错误,系统无身份识别信息,则蜂鸣器报警 RC522解锁门锁 放入白色卡片和蓝色卡片均可以解锁, 因为我已经提前写入在代码中, 后续你们想修改你们自己的只需要在RC522中这个地方按照我定义的方式修改即可 继续说, 卡片放到RC522模块上, 会在蓝牙上面显示此卡片 卡号, 同时和自己库里的卡片进行比对, 比对成功则开锁, 比对不成功, 则开锁失败, 在蓝牙助手上取消HEX发送模式, 发送ID 会显示当前存储的卡片数据, 显示剩余可用ID数, 目前可用ID数为3,用户可以选择a+卡号就是我上面的那个3c34一大串, 加回车换行发送,就可以添加新的卡解锁喽, 我知道有人会想我不知道我买的这个模块送的卡片的卡号啊? 所以我设置好识别卡号, 无论是任何卡片 放到上面,都会显示当前卡号, 再显示解锁成功与否。 对了有一点如果你想删除或者添加卡号, 一定要选择先输入ID弹出我上面这一大块, 然后按照我写的指令执行,这样比较规范。 上位机: 1. 添加或删除ic卡用户信息。 添加或删除ic卡用户信息 我自己尝试了一下用校园卡去测试RFID, 校园卡放到RC522模块上时由于系统中没有此身份信息, 所以开锁失败, 同时检测出校园卡卡号为9E902580。 添加此ic卡用户信息至信息库中, 输入a9E902580换行点击发送, 如果修改成功, 系统会通过蓝牙返回添加成功和添加至第几个ic卡位。添加后, 再次用校园卡放到RC522模块上, 就可以解锁, 如果想从系统中删除掉第几个ic卡可以输入d+数字(也就是序列号)。 例如我的视频中是第一个卡位录入的卡片是那张白色的卡, 第二个卡位录入的是蓝色的卡片, 所以系统会自动按照顺序录入到空白卡位, 所以如果我想录入校园卡也就是录入到第三号卡位, 所以删除则需输入d3换行发送, 系统就会返回某某卡位删除成功。 之后再次将校园卡放到RC522模块上时候, 就无法解锁, 卡号错误。 我为大家准备了5个卡位可以存储, 至于卡位我就没有没选择存储至flash中, 因为我测试过, 选择存储flash中, 莫名输入ID后返回的卡位数据会变的非常的慢, 所以我删除掉了这个部分。 下面列数一下连接情况 RFID读卡器 SDA----------------------------->接PA1 SCK----------------------------->接PA2 MOSI----------------------------->接PA3 MISO----------------------------->接PA6 RST----------------------------->接PA4 oled屏幕 GND----------------------------->电源地 VCC----------------------------->接5V或3.3v电源 SCL----------------------------->接PA5(SCL) SDA----------------------------->接PA7(SDA) 按键模块 排针在左侧的情况下从上到下 PB4, PB5, PB6, PB7, PB11, PB10, PB9, PB8 蓝牙通信模块(HC-05) RXD----------------------------->接PA9 TXD----------------------------->接PA10 VCC----------------------------->接3.3v电源 GND----------------------------->电源地 蜂鸣器 I/O----------------------------->接PA8 VCC----------------------------->接3.3v电源 GND----------------------------->电源地 舵机 信号线-----------------------------> 接PA0 VCC----------------------------->接5v电源 GND----------------------------->电源地 上面的所有模块都需要接VCC和GND, 可能你的最小系统板上面3v3和GND不够, 我是采用的是插在stlink上面的3v3和5v还有GND, 对了我在做测试时舵机接5v时插在stm32上面发现无法供电驱动, 所以我舵机信号线插在PA0 5v和GND是插在stlink上面的5v5还有GND的。下面就是烧录stlink图片。 main函数代码 #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; // 数组位数 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; } // 蓝牙通信 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("当前可用Card_ID如下,总共可存储5个Card_ID\r\n"); if(ID1 == 0) { printf("\r\nCard_ID1 = "); for(wei = 0;wei |
CopyRight 2018-2019 实验室设备网 版权所有 |