当前位置:   article > 正文

项目设计:基于STM32的指纹/刷卡的门禁/考勤/智能小区管理系统_指纹门禁开发

指纹门禁开发

本项目将利用STM32单片机来实现指纹识别或RFID刷卡的门禁或考勤系统。

功能可选组合:1、指纹识别;2、RDIF刷卡识别;3、指纹+刷卡;(智能小区可加蓝牙wifi)

实现功能:指纹识别、射频RFID刷卡、LCD显示、用户交互

硬件平台:STM32单片机

所需工具:STM32开发板、指纹模块、刷卡模块、蓝牙wifi

编程语言:C语言

功能概述:利用指纹识别的签到考勤系统、利用RFID技术的刷卡门禁或考勤,利用RFID刷卡+蓝牙开门等功能的智能小区管理,带管理员登陆平台,支持添加/删除/查询等功能。

毕业设计题目汇总推荐参考:毕业设计:电子/通信/物联网/计算机专业选题目推荐参考(嵌入式linux/单片机STM32/图像)https://blog.csdn.net/qq_30155503/article/details/120339296https://blog.csdn.net/qq_30155503/article/details/120339296

 获取资料及联系博主,请点如下链接:

stm32.txt · zengzr/share_contact - Gitee.com

系统设计框图:

 

以下以指纹识别为例进行详细讲解:(刷卡只是模块不同,其他功能差不多)

指纹模块硬件说明:

选用微雪的UART Fingerprint Reader,亦可选其他款指纹模块。

微雪的UART Fingerprint Reader是一款专用于二次开发集成应用的新型指纹开发模块,高速度、快识别、高稳定性。

产品特性:

指纹感应灵敏,识别速度快:

指纹模块采用高精度光路和成像元件,使用时,只需要手指轻轻一点,就能快速识别;

稳定性强:

采用ST的STM32F205高级数字处理芯片作处理器,低功耗,快速稳定;

开发方便:

串口用UART操作(直接接任何带串口单片机),操作简单,并配有PC机的演示学习等工具;

开放:

可以自由输入输出指纹图片、指纹特征文件及各种指纹操作,协议更全,开放更好。

STM32单片机

选用正点原子的STM32F103RCT6开发板,亦可选用其他款STM32开发板。

 开发板的要求:

1、有UART串口:用来接指纹模块(视指纹模块而定,有些指纹模块可能为IIC或SPI等接口);

 2、LCD屏:用以图形显示(若无图形显示需求亦可不要);

3、EEPROM存储芯片:用来存储用户数据;

4、其他,如按键、GPIO、LED等,视需求而定。

指纹模块程序驱动

指纹模块的驱动,要参考其配套的资料手册。

在用户手册中,会详细说明如何编程使用,截取部分章节如下:

如上,说明串口UART的波特率、数据位、停止位等;

以及通信协议的数据格式、指令定义等。 

部分驱动程序如下:

  1. #include "stm32f1xx_hal.h"
  2. #include "usart.h"
  3. #include "fingerprint.h"
  4. #include <string.h>
  5. uint8_t finger_TxBuf[9];
  6. uint8_t Finger_SleepFlag;
  7. /***************************************************************************
  8. * @brief Query the number of existing fingerprints
  9. * @return 0xFF: error
  10. other: success, the value is the number of existing fingerprints
  11. ****************************************************************************/
  12. uint8_t GetUserCount(void)
  13. {
  14. uint8_t m;
  15. finger_TxBuf[0] = CMD_USER_CNT;
  16. finger_TxBuf[1] = 0;
  17. finger_TxBuf[2] = 0;
  18. finger_TxBuf[3] = 0;
  19. finger_TxBuf[4] = 0;
  20. m = TxAndRxCmd(5, 8, 100);
  21. if (m == ACK_SUCCESS && Usart1_ReceiveStruct.RX_pData[4] == ACK_SUCCESS)
  22. {
  23. return Usart1_ReceiveStruct.RX_pData[3];
  24. }
  25. else
  26. {
  27. return 0xFF;
  28. }
  29. }
  30. /***************************************************************************
  31. * @brief Get Compare Level
  32. * @return 0xFF: error
  33. other: success, the value is compare level
  34. ****************************************************************************/
  35. uint8_t GetcompareLevel(void)
  36. {
  37. uint8_t m;
  38. finger_TxBuf[0] = CMD_COM_LEV;
  39. finger_TxBuf[1] = 0;
  40. finger_TxBuf[2] = 0;
  41. finger_TxBuf[3] = 1;
  42. finger_TxBuf[4] = 0;
  43. m = TxAndRxCmd(5, 8, 100);
  44. if (m == ACK_SUCCESS && Usart1_ReceiveStruct.RX_pData[4] == ACK_SUCCESS)
  45. {
  46. return Usart1_ReceiveStruct.RX_pData[3];
  47. }
  48. else
  49. {
  50. return 0xFF;
  51. }
  52. }
  53. /***************************************************************************
  54. * @brief Set Compare Level
  55. * @param temp: Compare Level,the default value is 5, can be set to 0-9, the bigger, the stricter
  56. * @return 0xFF: error
  57. other: success, the value is compare level
  58. ****************************************************************************/
  59. uint8_t SetcompareLevel(uint8_t temp)
  60. {
  61. uint8_t m;
  62. finger_TxBuf[0] = CMD_COM_LEV;
  63. finger_TxBuf[1] = 0;
  64. finger_TxBuf[2] = temp;
  65. finger_TxBuf[3] = 0;
  66. finger_TxBuf[4] = 0;
  67. m = TxAndRxCmd(5, 8, 100);
  68. if (m == ACK_SUCCESS && Usart1_ReceiveStruct.RX_pData[4] == ACK_SUCCESS)
  69. {
  70. return Usart1_ReceiveStruct.RX_pData[3];
  71. }
  72. else
  73. {
  74. return 0xFF;
  75. }
  76. }
  77. /***************************************************************************
  78. * @brief Register fingerprint
  79. * @return ACK_SUCCESS: success
  80. other: see the macro definition
  81. ****************************************************************************/
  82. uint8_t AddUser(void)
  83. {
  84. uint8_t m;
  85. m = GetUserCount();
  86. if (m >= USER_MAX_CNT)
  87. return ACK_FULL;
  88. finger_TxBuf[0] = CMD_ADD_1;
  89. finger_TxBuf[1] = 0;
  90. finger_TxBuf[2] = m +1;
  91. finger_TxBuf[3] = 3;
  92. finger_TxBuf[4] = 0;
  93. m = TxAndRxCmd(5, 8, 5000);
  94. if (m == ACK_SUCCESS && Usart1_ReceiveStruct.RX_pData[4] == ACK_SUCCESS)
  95. {
  96. finger_TxBuf[0] = CMD_ADD_3;
  97. m = TxAndRxCmd(5, 8, 5000);
  98. if (m == ACK_SUCCESS && Usart1_ReceiveStruct.RX_pData[4] == ACK_SUCCESS)
  99. {
  100. return ACK_SUCCESS;
  101. }
  102. else
  103. return ACK_FAIL;
  104. }
  105. else
  106. return ACK_GO_OUT;
  107. }
  108. /***************************************************************************
  109. * @brief Clear fingerprints
  110. * @return ACK_SUCCESS: success
  111. ACK_FAIL: error
  112. ****************************************************************************/
  113. uint8_t ClearAllUser(void)
  114. {
  115. uint8_t m;
  116. finger_TxBuf[0] = CMD_DEL_ALL;
  117. finger_TxBuf[1] = 0;
  118. finger_TxBuf[2] = 0;
  119. finger_TxBuf[3] = 0;
  120. finger_TxBuf[4] = 0;
  121. m = TxAndRxCmd(5, 8, 500);
  122. if (m == ACK_SUCCESS && Usart1_ReceiveStruct.RX_pData[4] == ACK_SUCCESS)
  123. {
  124. return ACK_SUCCESS;
  125. }
  126. else
  127. {
  128. return ACK_FAIL;
  129. }
  130. }
  131. /***************************************************************************
  132. * @brief Check if user ID is between 1 and 3
  133. * @return TRUE
  134. FALSE
  135. ****************************************************************************/
  136. uint8_t IsMasterUser(uint8_t UserID)
  137. {
  138. if ((UserID == 1) || (UserID == 2) || (UserID == 3)) return TRUE;
  139. else return FALSE;
  140. }
  141. /***************************************************************************
  142. * @brief Fingerprint matching
  143. * @return ACK_SUCCESS: success
  144. other: see the macro definition
  145. ****************************************************************************/
  146. uint8_t VerifyUser(void)
  147. {
  148. uint8_t m;
  149. finger_TxBuf[0] = CMD_MATCH;
  150. finger_TxBuf[1] = 0;
  151. finger_TxBuf[2] = 0;
  152. finger_TxBuf[3] = 0;
  153. finger_TxBuf[4] = 0;
  154. m = TxAndRxCmd(5, 8, 5000);
  155. if ((m == ACK_SUCCESS) && (IsMasterUser(Usart1_ReceiveStruct.RX_pData[4]) == TRUE))
  156. {
  157. return ACK_SUCCESS;
  158. }
  159. else if(Usart1_ReceiveStruct.RX_pData[4] == ACK_NO_USER)
  160. {
  161. return ACK_NO_USER;
  162. }
  163. else if(Usart1_ReceiveStruct.RX_pData[4] == ACK_TIMEOUT)
  164. {
  165. return ACK_TIMEOUT;
  166. }
  167. else{
  168. return ACK_FAIL;
  169. }
  170. }
  171. /***************************************************************************
  172. * @brief
  173. If you enter the sleep mode, then open the Automatic wake-up function of the finger,
  174. begin to check if the finger is pressed, and then start the module and match
  175. ****************************************************************************/
  176. void Auto_Verify_Finger(void)
  177. {
  178. if(Read_Finger_WAKE_Pin == GPIO_PIN_SET) // If you press your finger
  179. {
  180. while(Read_Finger_WAKE_Pin != GPIO_PIN_RESET){
  181. Finger_RST_Pin_HIGH; // Pull up the RST to start the module and start matching the fingers
  182. LED1_Pin_HIGH;
  183. HAL_Delay(300); // Wait for module to start
  184. printf("Waiting Finger......Please try to place the center of the fingerprint flat to sensor !\r\n");
  185. switch(VerifyUser())
  186. {
  187. case ACK_SUCCESS:
  188. printf("Matching successful !\r\n");
  189. break;
  190. case ACK_NO_USER:
  191. printf("Failed: This fingerprint was not found in the library !\r\n");
  192. break;
  193. case ACK_TIMEOUT:
  194. printf("Failed: Time out !\r\n");
  195. break;
  196. case ACK_GO_OUT:
  197. printf("Failed: Please try to place the center of the fingerprint flat to sensor !\r\n");
  198. break;
  199. default:
  200. break;
  201. }
  202. //After the matching action is completed, drag RST down to sleep
  203. //and continue to wait for your fingers to press
  204. }
  205. Finger_RST_Pin_LOW;
  206. LED1_Pin_LOW;
  207. return;
  208. }
  209. }

  获取资料及联系博主,请点如下链接:

stm32.txt · zengzr/share_contact - Gitee.com

更多内容,期待补充!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/233368
推荐阅读
相关标签
  

闽ICP备14008679号