日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

毕业设计 树莓派指纹识别打卡系统设计与实现

發布時間:2023/12/29 windows 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 毕业设计 树莓派指纹识别打卡系统设计与实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 1 簡介
  • 2 主要器件
  • 3 實現效果
  • 5 部分實現代碼
  • 6 最后


1 簡介

Hi,大家好,今天向大家介紹一個學長做的單片機項目

基于樹莓派的指紋打卡器

大家可用于 課程設計 或 畢業設計

2 主要器件

  • 樹莓派一臺
  • 指紋模塊(AS608光學指紋識別模塊)
  • OLED液晶屏
  • usb轉TTL
  • 杜邦線

3 實現效果

5 部分實現代碼

樹莓派驅動gpio接收指紋模塊數據:

1 # -*-coding=utf8-*-2 3 import serial4 import serial.tools.list_ports5 6 import os, sys7 PATH=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))8 sys.path.append(PATH)9 10 SureCore = {11 0x00: True, # 表示指令執行完畢或OK;12 0x01: 101, # 表示數據包接收錯誤;13 0x02: 102, # 表示傳感器上沒有手指;14 0x03: 103, # 表示錄入指紋圖像失敗;15 0x06: 202, # 表示指紋圖像太亂而生不成特征;16 0x07: 203, # 表示指紋圖像正常,但特征點太少而生不成特征;17 0x15: 204, # 表示圖像緩沖區內沒有有效原始圖而生不成圖像;18 0x08: 302, # 表示指紋不匹配;19 0x09: 402, # 表示沒搜索到;此時頁碼與得分為 020 0x0a: 502, # 表示合并失敗(兩枚指紋不屬于同一手指);21 0x0d: 802, # 表示指令執行失敗;22 0x0f: 1002, # 表示不能發送后續數據包;23 }24 '''返回= 999 校驗和錯誤'''25 26 27 class DealBuff:28 """切割收到的數據"""29 HEAD = [0xEF, 0x01, 0xFF, 0xFF, 0xFF, 0xFF]30 31 def __init__(self, buff):32 self.buff = buff33 """處理讀出的指紋數據用到"""34 self.tag = list() # 包標識35 self.data = list()36 self.check = list()37 pass38 39 def read(self):40 buff = [x for x in bytes(self.buff)]41 check = self.slit(buff)42 return self.tag, self.data, check43 44 def listCut(self, buff, num):45 """切割數組"""46 rec = list()47 for i in range(num):48 bytes_buf = (buff.pop(0))49 # rec.append(buff.pop(0))50 rec.append(bytes_buf)51 return rec, buff52 pass53 54 def slit(self, buff):55 """"選擇數據"""56 # 初始化中間變量57 popList = list()58 check_Num = 059 check = list()60 head = list()61 62 if len(buff) < 6: # 判斷是否有效數據63 return True64 65 head, buff = self.listCut(buff, 6) # 選擇出頭及判斷66 for i in range(6):67 if head[i] != self.HEAD[i]:68 return False69 70 popList, buff = self.listCut(buff, 1) # 取出包標識71 self.tag.append(popList)72 check_Num += popList[0] # 計算校驗和73 74 popList, buff = self.listCut(buff, 2) # 取出包長度75 check_Num += popList[0] + popList[1] # 計算校驗和76 77 popList, buff = self.listCut(buff, popList[0] * 16 + popList[1]) # 取出包數據78 check.append(popList.pop()) # 取出校驗數據79 check.append(popList.pop())80 for i in popList: # 計算校驗和81 check_Num += i82 83 self.data.extend(popList) # 導入有用數據84 if check_Num % 65535 != check[0] + check[1]*256: # 檢驗校驗和85 return False86 87 rec = self.slit(buff) # 得到是否正確分析完數據88 return rec89 pass90 91 def write(self):92 """要寫的數據打包"""93 pack = self.dataSeparate(self.buff, 128) # 將數據分成每組128個元素94 return pack95 pass96 97 def dataSeparate(self, buff, numPart):98 """把數據分組打包"""99 num = int(len(buff) / numPart) 100 newData = list() 101 for i in range(num): 102 newData.append(buff[i * numPart:(i+1) * numPart]) 103 104 packData = list() 105 for i in range(num-1): 106 data = self.packData(newData[i], 0x02) # 數據包沒結束 107 packData.extend(data) 108 109 packData.extend(self.packData(newData[num-1], 0x08)) # 數據包結束 110 return packData 111 pass 112 113 def packData(self, buff, flage): 114 num = len(buff) + 2 115 senddata = [flage, int(num / 256), int(num % 256)] + buff 116 sum = 0 117 for i in senddata: 118 sum += i 119 senddata = self.HEAD + senddata 120 senddata.append(int(sum / 256)) 121 senddata.append(int(sum % 256)) 122 return senddata 123 pass 124 125 pass 126 127 128 class DealFingeer: 129 """和指紋模塊交互""" 130 HEAD = [0xEF, 0x01, 0xFF, 0xFF, 0xFF, 0xFF] 131 tag = list() # 包標識 132 cmd = list() # 133 data = list() 134 ser = serial.Serial() 135 def __init__(self, cmd, data=None, server=None): 136 """初始化函數""" 137 self.cmd = cmd 138 self.data = data 139 self.server = server 140 pass 141 142 def run(self): 143 if hasattr(self, self.cmd): 144 func = getattr(self, self.cmd) 145 return func(self.data) 146 pass 147 148 def link(self): 149 """連接串口""" 150 self.ser.port = "COM5" 151 self.ser.baudrate = 57600 152 self.ser.bytesize = 8 153 self.ser.parity = 'N' 154 self.ser.xonxoff = 0 155 self.ser.rtscts = 0 156 self.ser.close() 157 self.ser.open() 158 pass 159 160 def finger(self, data): 161 self.link() 162 check = self.getImage() # 檢測獲取圖像 163 if check is not True: 164 return check, [] 165 166 self.link() 167 check = self.genChar(data) # 檢測生成特征值 168 if check is not True: 169 return check, [] 170 # ================= 生成特征值時圖像會清除,所以要重新采集 ========================== # 171 self.link() 172 check = self.getImage() # 檢測獲取圖像 173 if check is not True: 174 return check, [] 175 176 if self.server is not None: 177 self.server.send("True".encode("utf8")) # 發送數據說明準備好了 178 179 self.link() 180 check = self.upImage() # 上傳圖像 181 if check is not True: # 校驗和錯誤 182 return check, [] 183 self.tag, self.data = self.getUpImage() 184 185 if len(self.tag) is 0 and len(self.data) is 0: # 得到數據錯誤 186 return False, [] 187 return True, [] 188 189 def save(self, data=None): 190 self.link() 191 check = self.regModel() 192 if check is not True: # 校驗和錯誤 193 return check, [] 194 195 self.link() 196 check = self.upChar(data) # 上傳特征值 197 if check is not True: # 校驗和錯誤 198 return check, [] 199 self.tag, self.data = self.getUpChar() 200 201 if len(self.tag) is 0 and len(self.data) is 0: # 得到數據錯誤 202 return False, [] 203 return True, [] 204 pass 205 206 def check(self, data=None): 207 """檢驗指紋, 生成特征值""" 208 self.link() 209 check = self.match() # 比較指紋特征 210 if check is not True: 211 return check, [] 212 score = self.data[1]*255 + self.data[2] # 返回的分數值 213 214 self.link() 215 check = self.regModel() # 合成指紋特征值 216 if check is not True: 217 return check, [] 218 return True, score 219 pass 220 221 def isFinger(self, data=None): 222 """判斷現在的指紋和下載的指紋是否相同""" 223 self.link() 224 check = self.downCharCheck() 225 if check is not True: # 判斷是否可以發送數據 226 return check, [] 227 """下載指紋""" 228 self.link() 229 self.downCharData(data) 230 """檢驗指紋""" 231 self.link() 232 check = self.match() 233 if check is not True: 234 return check, [] 235 score = self.data[1] * 255 + self.data[2] # 返回的分數值 236 return True, score 237 pass 238 239 def getImage(self, data=None): 240 """獲取圖像""" 241 cmd = self.HEAD + [0x01, 0x00, 0x03, 0x01, 0x00, 0x05] # 發送命令獲取內容 242 return self.isOk(cmd, 12) 243 pass 244 245 def genChar(self, data=None): 246 """生成特征文件""" 247 if data == "1": 248 cmd = self.HEAD + [0x01, 0x00, 0x04, 0x02, 0x01, 0x00, 0x08] # 發送命令 249 return self.isOk(cmd, 12) # 圖像接收數據 12 大小 250 elif data == "2": 251 cmd = self.HEAD + [0x01, 0x00, 0x04, 0x02, 0x02, 0x00, 0x09] # 發送命令 252 return self.isOk(cmd, 12) # 圖像接收數據 12 大小 253 pass 254 255 def match(self, data=None): 256 """比較指紋特征""" 257 cmd = self.HEAD + [0x01, 0x00, 0x03, 0x03, 0x00, 0x07] # 發送命令獲取內容 258 return self.isOk(cmd, 14) 259 pass 260 261 def regModel(self, data=None): 262 """合成指紋特征值""" 263 cmd = self.HEAD + [0x01, 0x00, 0x03, 0x05, 0x00, 0x09] # 發送命令獲取內容 264 return self.isOk(cmd, 12) 265 pass 266 267 def upChar(self, data=None): 268 """上傳特征模塊檢測""" 269 buff = bytes() 270 if data == "1": 271 cmd = self.HEAD + [0x01, 0x00, 0x04, 0x08, 0x01, 0x00, 0x0e] # 發送命令 272 return self.isOk(cmd, 12, False) 273 elif data == "2": 274 cmd = self.HEAD + [0x01, 0x00, 0x04, 0x08, 0x02, 0x00, 0x0F] # 發送命令 275 return self.isOk(cmd, 12, False) 276 pass 277 278 def getUpChar(self, data=None): 279 """上傳特征模塊數據""" 280 buff = self.ser.read(834) 281 self.ser.close() 282 subpackage = DealBuff(buff) # 分割內容 283 self.tag, self.data, check = subpackage.read() 284 if check is not True: # 校驗和錯誤 285 return 999 286 return self.tag, self.data 287 288 def downCharCheck(self, data=None): 289 """ 290 下載特征值檢測 291 先要初始化,發送獲取圖像命令 292 """ 293 self.getImage() 294 self.link() 295 cmd = self.HEAD + [0x01, 0x00, 0x04, 0x09, 0x02, 0x00, 0x10] # 發送命令 下載的數據放在buff2中 296 return self.isOk(cmd, 12) 297 pass 298 299 def downCharData(self, data): 300 """下載特征值的數據""" 301 self.writeRead(data, 0) # 發送數據 接收為0 302 pass 303 304 305 def upImage(self, data=None): 306 """上傳圖像檢測""" 307 cmd = self.HEAD + [0x01, 0x00, 0x03, 0x0a, 0x00, 0x0e] # 發送命令 308 return self.isOk(cmd, 12, False) 309 pass 310 311 def getUpImage(self, data=None): 312 """獲取后續的圖像數據""" 313 buff = self.ser.read(40032) 314 self.ser.close() 315 subpackage = DealBuff(buff) # 分割內容 316 self.tag, self.data, check = subpackage.read() 317 if check is not True: # 校驗和錯誤 318 return [], [] 319 return self.tag, self.data 320 321 def writeRead(self, cmd, length, close=True): 322 """發送命令讀取原始字節""" 323 cmd = bytes(cmd) 324 self.ser.write(cmd) 325 buff = self.ser.read(length) # 圖像接收數據 326 if close: 327 self.ser.close() # 接受完數據斷開com 328 return buff 329 pass 330 331 def isOk(self, cmd, length, close=True): 332 """判斷數據是否合格""" 333 buff = self.writeRead(cmd, length, close) # 圖像接收數據 12 大小 334 subpackage = DealBuff(buff) # 分割內容 335 self.tag, self.data, check = subpackage.read() 336 # 檢驗數據是否可靠 337 if check is not True: # 校驗和錯誤 338 return 999 339 return self.check_code(self.data) 340 pass 341 342 def check_code(self, data): 343 """檢驗指令碼""" 344 return SureCore[data[0]] 345 pass 346 347 pass 348 349 350 if __name__ == "__main__": 351 # HEAD = [0xEF, 0x01, 0xFF, 0xFF, 0xFF, 0xFF] 352 # data = [0xEF, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x03, 0x0A, 0x00, 0x0E] 353 # data = HEAD + [0x01, 0x00, 0x03, 0x01, 0x00, 0x05] 354 # data = HEAD + [0x01, 0x00, 0x03, 0x05, 0x00, 0x09] 355 # data = HEAD + [0x01, 0x00, 0x04, 0x08, 0x02, 0x00, 0x0f]

6 最后

總結

以上是生活随笔為你收集整理的毕业设计 树莓派指纹识别打卡系统设计与实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。