• 【毕业设计】基于树莓派的指纹识别与RFID考勤系统 - 嵌入式 单片机 物联网



    0 前言

    🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。

    为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的是

    🚩 基于树莓派的指纹识别与RFID考勤系统

    🥇学长这里给一个题目综合评分(每项满分5分)

    • 难度系数:4分
    • 工作量:4分
    • 创新点:3分

    🧿 选题指导, 项目分享:

    https://gitee.com/dancheng-senior/project-sharing-1/blob/master/%E6%AF%95%E8%AE%BE%E6%8C%87%E5%AF%BC/README.md


    1 简介

    2 主要器件

    • R305指纹模块
    • PL2303 USB转TTL
    • RC522 RFID 模块
    • 20x4 液晶显示器
    • 树莓派
    • 以太网电缆
    • 按钮 (8)
    • 蜂鸣器
    • 跳线
    • SD 卡 (16 GB)
    • 电位器 (10k)

    3 实现效果

    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    4 设计原理

    4.1 Adafruit 指纹传感器库

    在这里插入图片描述

    具体配置见 Adafruit 指纹传感器库

    在这里插入图片描述

    4.2 树莓派读取 RC522 RFID 标签**

    简介
    RC522 RFID 模块是一个简单的附加组件,我们可以连接到 Raspberry Pi 以读取 MIFARE 标签和卡片。这是一个很棒的功能,可以包含在安全系统或任何需要识别物体或人而无需按下按钮、操作开关或其他传感器的应用程序中。非接触式标签可以放在钥匙圈上,卡片可以很好地放在钱包里。

    支持的协议
    使用 RC522 芯片的模块应该支持所有使用以下标准的标签:

    • MIFARE 迷你
    • MIFARE 1K
    • MIFARE 4K,
    • MIFARE 超轻
    • MIFARE DESFire EV1
    • MIFARE Plus 射频

    可以购买额外的卡片和标签,但您应该确保它们支持其中一种标准。

    这些 RFID 模块无法读取非接触式银行卡。他们可以从智能手机读取 ID,但 ID 每次都不同,因此在大多数情况下不是很有用。

    硬件设置
    在这里插入图片描述
    使用 7 路母母跨接电缆将模块连接到 Pi。
    在这里插入图片描述
    接线细节如下表所示:
    在这里插入图片描述

    下载 RC522 Python 库

    示例 Python 脚本

    import time
    import RPi.GPIO as GPIO
    import MFRC522
     
    # Create an object of the class MFRC522
    MIFAREReader = MFRC522.MFRC522()
     
    # Welcome message
    print("Looking for cards")
    print("Press Ctrl-C to stop.")
     
    # This loop checks for chips. If one is near it will get the UID
    try:
       
      while True:
     
        # Scan for cards
        (status,TagType) = MIFAREReader.MFRC522_Request(MIFAREReader.PICC_REQIDL)
     
        # Get the UID of the card
        (status,uid) = MIFAREReader.MFRC522_Anticoll()
     
        # If we have the UID, continue
        if status == MIFAREReader.MI_OK:
     
          # Print UID
          print("UID: "+str(uid[0])+","+str(uid[1])+","+str(uid[2])+","+str(uid[3]))
     
          time.sleep(2)
     
    except KeyboardInterrupt:
      GPIO.cleanup()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    4.3 20×4 LCD 模块

    液晶模组硬件

    通常设备需要 8 条数据线来向位 0-7 提供数据。但是,此 LCD 可以配置为使用“4 位”模式,该模式允许您以 4 位的两个块(或半字节)发送数据。这减少了与 Pi 连接时所需的 GPIO 连接数量。

    连接方法如下:
    在这里插入图片描述
    注: RW 引脚允许将设备置于读取或写入模式。我将此引脚接地以防止模块尝试向 Pi 发送数据,因为 Pi 不能容忍其 GPIO 接头上的 5V 输入。

    Pin 3:为了控制对比度,您可以调整提供给 Pin 3 的电压。我使用 10K 欧姆微调器为 Pin 3 提供 0-5V 的可变电压,从而可以调整对比度。

    引脚 15:这为背光 LED 供电。为了打开和关闭背光,我使用了一个晶体管(BC547、BC548 或同等产品)来切换此引脚。这需要一个额外的 GPIO 引脚来切换晶体管,但允许我的 Python 脚本控制背光。

    LCD软件配置

    使用 RPi.GPIO 库来提供对 Python 中 GPIO 的访问。
    此设置的功能包括:

    • 10k可变电阻调节对比度
    • 2k可变电阻调节背光亮度
    • 一个晶体管,可以打开和关闭背光
    • 左对齐、居中和右对齐的文本

    面包板电路如下所示:
    在这里插入图片描述

    5 部分核心代码

    LCD部分代码

    import RPi.GPIO as GPIO
    import time
     
    # Define GPIO to LCD mapping
    LCD_RS = 7
    LCD_E  = 8
    LCD_D4 = 25
    LCD_D5 = 24
    LCD_D6 = 23
    LCD_D7 = 18
    LED_ON = 15
     
    # Define some device constants
    LCD_WIDTH = 20    # Maximum characters per line
    LCD_CHR = True
    LCD_CMD = False
     
    LCD_LINE_1 = 0x80 # LCD RAM address for the 1st line
    LCD_LINE_2 = 0xC0 # LCD RAM address for the 2nd line
    LCD_LINE_3 = 0x94 # LCD RAM address for the 3rd line
    LCD_LINE_4 = 0xD4 # LCD RAM address for the 4th line
     
    # Timing constants
    E_PULSE = 0.0005
    E_DELAY = 0.0005
     
    def main():
      # Main program block
     
      GPIO.setmode(GPIO.BCM)       # Use BCM GPIO numbers
      GPIO.setup(LCD_E, GPIO.OUT)  # E
      GPIO.setup(LCD_RS, GPIO.OUT) # RS
      GPIO.setup(LCD_D4, GPIO.OUT) # DB4
      GPIO.setup(LCD_D5, GPIO.OUT) # DB5
      GPIO.setup(LCD_D6, GPIO.OUT) # DB6
      GPIO.setup(LCD_D7, GPIO.OUT) # DB7
      GPIO.setup(LED_ON, GPIO.OUT) # Backlight enable
     
      # Initialise display
      lcd_init()
     
      # Toggle backlight on-off-on
      lcd_backlight(True)
      time.sleep(0.5)
      lcd_backlight(False)
      time.sleep(0.5)
      lcd_backlight(True)
      time.sleep(0.5)
     
      while True:
     
        # Send some centred test
        lcd_string("--------------------",LCD_LINE_1,2)
        lcd_string("Rasbperry Pi",LCD_LINE_2,2)
        lcd_string("Model B",LCD_LINE_3,2)
        lcd_string("--------------------",LCD_LINE_4,2)
     
        time.sleep(3) # 3 second delay
     
        lcd_string("Raspberrypi-spy",LCD_LINE_1,3)
        lcd_string(".co.uk",LCD_LINE_2,3)
        lcd_string("",LCD_LINE_3,2)
        lcd_string("20x4 LCD Module Test",LCD_LINE_4,2)
     
        time.sleep(3) # 20 second delay
     
        # Blank display
        lcd_byte(0x01, LCD_CMD)
     
        time.sleep(3) # 3 second delay
     
    def lcd_init():
      # Initialise display
      lcd_byte(0x33,LCD_CMD) # 110011 Initialise
      lcd_byte(0x32,LCD_CMD) # 110010 Initialise
      lcd_byte(0x06,LCD_CMD) # 000110 Cursor move direction
      lcd_byte(0x0C,LCD_CMD) # 001100 Display On,Cursor Off, Blink Off
      lcd_byte(0x28,LCD_CMD) # 101000 Data length, number of lines, font size
      lcd_byte(0x01,LCD_CMD) # 000001 Clear display
      time.sleep(E_DELAY)
     
    def lcd_byte(bits, mode):
      # Send byte to data pins
      # bits = data
      # mode = True  for character
      #        False for command
     
      GPIO.output(LCD_RS, mode) # RS
     
      # High bits
      GPIO.output(LCD_D4, False)
      GPIO.output(LCD_D5, False)
      GPIO.output(LCD_D6, False)
      GPIO.output(LCD_D7, False)
      if bits&0x10==0x10:
        GPIO.output(LCD_D4, True)
      if bits&0x20==0x20:
        GPIO.output(LCD_D5, True)
      if bits&0x40==0x40:
        GPIO.output(LCD_D6, True)
      if bits&0x80==0x80:
        GPIO.output(LCD_D7, True)
     
      # Toggle 'Enable' pin
      lcd_toggle_enable()
     
      # Low bits
      GPIO.output(LCD_D4, False)
      GPIO.output(LCD_D5, False)
      GPIO.output(LCD_D6, False)
      GPIO.output(LCD_D7, False)
      if bits&0x01==0x01:
        GPIO.output(LCD_D4, True)
      if bits&0x02==0x02:
        GPIO.output(LCD_D5, True)
      if bits&0x04==0x04:
        GPIO.output(LCD_D6, True)
      if bits&0x08==0x08:
        GPIO.output(LCD_D7, True)
     
      # Toggle 'Enable' pin
      lcd_toggle_enable()
     
    def lcd_toggle_enable():
      # Toggle enable
      time.sleep(E_DELAY)
      GPIO.output(LCD_E, True)
      time.sleep(E_PULSE)
      GPIO.output(LCD_E, False)
      time.sleep(E_DELAY)
     
    def lcd_string(message,line,style):
      # Send string to display
      # style=1 Left justified
      # style=2 Centred
      # style=3 Right justified
     
      if style==1:
        message = message.ljust(LCD_WIDTH," ")
      elif style==2:
        message = message.center(LCD_WIDTH," ")
      elif style==3:
        message = message.rjust(LCD_WIDTH," ")
     
      lcd_byte(line, LCD_CMD)
     
      for i in range(LCD_WIDTH):
        lcd_byte(ord(message[i]),LCD_CHR)
     
    def lcd_backlight(flag):
      # Toggle backlight on-off-on
      GPIO.output(LED_ON, flag)
     
    if __name__ == '__main__':
     
      try:
        main()
      except KeyboardInterrupt:
        pass
      finally:
        lcd_byte(0x01, LCD_CMD)
        lcd_string("Goodbye!",LCD_LINE_1,2)
        GPIO.cleanup()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163

    5 最后

  • 相关阅读:
    Linux常用命令
    [经验] 天猫盒子怎么投屏手机照片 #经验分享#其他#经验分享
    【Java基础】List集合概述、特点、特有方法、案例及List集合子类的特点
    【C语言】·算法学习·哈希算法全解
    Redis数据库
    cmake简洁教程 - 第三篇
    mysql中的str_to_date 函数
    文本文件的读取+操作
    web前端-html-css-字体(字体的样式,字体的分类,字体其他样式,字体简写样式,文本样式)
    鼎盛合:国内“遥遥领先”的芯片技术
  • 原文地址:https://blog.csdn.net/m0_71572576/article/details/126386150