当前位置:   article > 正文

STM32项目设计:基于stm32f1的智能门锁(附项目视频全套教程)_基于stm32的智能门锁设计

基于stm32的智能门锁设计

  最近假期比较闲,拿着之前剩下的模块做了一个小玩具, 先制定一下此次玩具的规划,也可以理解为简易项目书。

开发软件: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函数代码

  1. #include "stm32f10x.h" // Device header
  2. #include "oled.h"
  3. #include "Delay.h"
  4. #include "Keybord.h"
  5. #include "Timer.h"
  6. #include "Servo.h"
  7. #include "PWM.h"
  8. #include "string.h"
  9. #include "USART1.h"
  10. #include "RC522.h"
  11. #include "stmflash.h"
  12. #include "Buzzer.h"
  13. #define SYS_SAVEADDR 0x0800f000 //
  14. uint16_t PassWord;
  15. uint8_t pwd[6];
  16. uint8_t j=0; // 数组位数
  17. uint16_t Keybord_Num;
  18. uint8_t OK[6] = {9,8,7,6,5,4}; // 初始密码
  19. uint8_t Password_OK_Flag;
  20. uint8_t ID1,ID2,ID3,ID4,ID5;
  21. uint8_t Buzzer_Err;
  22. extern uint8_t Card_OK;
  23. extern uint8_t cnt; //待机
  24. extern uint8_t Card_Acquisition;
  25. extern unsigned char Card_ID1[8];
  26. extern unsigned char Card_ID2[8];
  27. extern unsigned char Card_ID3[8];
  28. extern unsigned char Card_ID4[8];
  29. extern unsigned char Card_ID5[8];
  30. void Starting(void);
  31. void Judgment_Button(void);
  32. void Bluetooth_Password(void);
  33. void Add_Card_ID(void);
  34. void Delete_Card_ID(void);
  35. unsigned char Card_ID_TEST[8] = {1,2,3,4,5,6,7,8};
  36. unsigned char Card_ID_READ[8] = {0};
  37. int main(void)
  38. {
  39. OLED_Init();
  40. OLED_Clear();
  41. Keybord_Init();
  42. Servo_Init();
  43. Timer_Init();
  44. Serial_Init();
  45. RC522_Init();
  46. Starting();
  47. Servo_SetAngle(20);
  48. Buzzer_Init();
  49. STMFLASH_Read(SYS_SAVEADDR,(uint16_t*)&OK,3); //如果忘记密码, 注释掉这句密码回归初始密码
  50. while (1)
  51. {
  52. // 按键
  53. Judgment_Button();
  54. if(Keybord_Num!=0)
  55. {
  56. cnt = 0;
  57. }
  58. if(cnt>5)
  59. {
  60. OLED_Clear();
  61. Starting();
  62. memset(pwd, 0, sizeof(pwd));
  63. j = 0;
  64. cnt =0;
  65. Servo_SetAngle(20);
  66. Password_OK_Flag = 0;
  67. }
  68. //蜂鸣器
  69. if(Buzzer_Err == 3)
  70. {
  71. Buzzer_ON();
  72. Delay_ms(200);
  73. Buzzer_OFF();
  74. Delay_ms(200);
  75. Buzzer_ON();
  76. Delay_ms(200);
  77. Buzzer_OFF();
  78. Delay_ms(200);
  79. Buzzer_ON();
  80. Delay_ms(200);
  81. Buzzer_OFF();
  82. Delay_ms(200);
  83. Buzzer_Err = 0;
  84. }
  85. // 蓝牙通信
  86. Bluetooth_Password();
  87. //射频RC522
  88. RC522_Handle();
  89. if(Card_OK == 0)
  90. {
  91. Card_OK = 2;
  92. OLED_Clear();
  93. OLED_ShowCHinese(0,0,0);
  94. OLED_ShowCHinese(20,0,1);
  95. OLED_ShowCHinese(40,0,2);
  96. OLED_ShowCHinese(60,0,3);
  97. OLED_ShowString(1,3,"IDCard ERR",12);
  98. Delay_ms(500);
  99. OLED_Clear();
  100. Starting();
  101. memset(pwd, 0, sizeof(pwd));
  102. j = 0;
  103. Servo_SetAngle(20);
  104. cnt = 0;
  105. }
  106. if(Card_OK == 1)
  107. {
  108. Card_OK = 2;
  109. OLED_Clear();
  110. OLED_ShowCHinese(0,0,0);
  111. OLED_ShowCHinese(20,0,1);
  112. OLED_ShowCHinese(40,0,4);
  113. OLED_ShowCHinese(60,0,5);
  114. OLED_ShowString(1,3,"IDCard OK",12);
  115. Servo_SetAngle(180);
  116. Password_OK_Flag = 1;
  117. cnt = 0;
  118. }
  119. if(Card_Acquisition == 1)
  120. {
  121. uint8_t wei;
  122. if(Card_ID1[0] == '0'&&Card_ID1[1] == '0')
  123. {
  124. ID1 = 1;
  125. }
  126. else
  127. ID1 = 0;
  128. if(Card_ID2[0] == '0'&&Card_ID2[1] == '0')
  129. {
  130. ID2 = 1;
  131. }
  132. else
  133. ID2 = 0;
  134. if(Card_ID3[0] == '0'&&Card_ID3[1] == '0')
  135. {
  136. ID3 = 1;
  137. }
  138. else
  139. ID3 = 0;
  140. if(Card_ID4[0] == '0'&&Card_ID4[1] == '0')
  141. {
  142. ID4 = 1;
  143. }
  144. else
  145. ID4 = 0;
  146. if(Card_ID5[0] == '0'&&Card_ID5[1] == '0')
  147. {
  148. ID5 = 1;
  149. }
  150. else
  151. ID5 = 0;
  152. printf("当前可用Card_ID如下,总共可存储5个Card_ID\r\n");
  153. if(ID1 == 0)
  154. {
  155. printf("\r\nCard_ID1 = ");
  156. for(wei = 0;wei<8;wei++)
  157. {
  158. printf("%c",Card_ID1[wei]);
  159. }
  160. printf("\r\n");
  161. printf("\r\n");
  162. }
  163. if(ID2 == 0)
  164. {
  165. printf("Card_ID2 = ");
  166. for(wei = 0;wei<8;wei++)
  167. {
  168. printf("%c",Card_ID2[wei]);
  169. }
  170. printf("\r\n");
  171. printf("\r\n");
  172. }
  173. if(ID3 == 0)
  174. {
  175. printf("Card_ID3 = ");
  176. for(wei = 0;wei<8;wei++)
  177. {
  178. printf("%c",Card_ID3[wei]);
  179. }
  180. printf("\r\n");
  181. printf("\r\n");
  182. }
  183. if(ID4 == 0)
  184. {
  185. printf("Card_ID4 = ");
  186. for(wei = 0;wei<8;wei++)
  187. {
  188. printf("%c",Card_ID4[wei]);
  189. }
  190. printf("\r\n");
  191. printf("\r\n");
  192. }
  193. if(ID5 == 0)
  194. {
  195. printf("Card_ID5 = ");
  196. for(wei = 0;wei<8;wei++)
  197. {
  198. printf("%c",Card_ID5[wei]);
  199. }
  200. printf("\r\n");
  201. printf("\r\n");
  202. }
  203. printf("剩余可用Card_ID为%d\r\n\r\n",ID1+ID2+ID3+ID4+ID5);
  204. Card_Acquisition = 0;
  205. printf("请用户选择\r\n\r\n添加卡号 -> a + 数列号以回车结尾\r\n\r\n删除卡号 -> d + 数列号\r\n\r\n取消操作 -> 无需输入\r\n\r\n");
  206. }
  207. // 添加卡片
  208. Add_Card_ID();
  209. // 删除卡片
  210. Delete_Card_ID();
  211. }

---------------------------------------------------------------------------------------------------

全部代码上传至(2条消息) 【免费】STM32项目设计:基于stm32f1的智能门锁(附项目视频全套教程)资源-CSDN文库

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号