毕业设计 树莓派指纹识别打卡系统设计与实现
生活随笔
收集整理的這篇文章主要介紹了
毕业设计 树莓派指纹识别打卡系统设计与实现
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
文章目錄
- 1 簡介
- 2 主要器件
- 3 實現(xiàn)效果
- 5 部分實現(xiàn)代碼
- 6 最后
1 簡介
Hi,大家好,今天向大家介紹一個學(xué)長做的單片機(jī)項目
基于樹莓派的指紋打卡器
大家可用于 課程設(shè)計 或 畢業(yè)設(shè)計
2 主要器件
- 樹莓派一臺
- 指紋模塊(AS608光學(xué)指紋識別模塊)
- OLED液晶屏
- usb轉(zhuǎn)TTL
- 杜邦線
3 實現(xiàn)效果
5 部分實現(xiàn)代碼
樹莓派驅(qū)動gpio接收指紋模塊數(shù)據(jù):
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, # 表示指令執(zhí)行完畢或OK;12 0x01: 101, # 表示數(shù)據(jù)包接收錯誤;13 0x02: 102, # 表示傳感器上沒有手指;14 0x03: 103, # 表示錄入指紋圖像失敗;15 0x06: 202, # 表示指紋圖像太亂而生不成特征;16 0x07: 203, # 表示指紋圖像正常,但特征點太少而生不成特征;17 0x15: 204, # 表示圖像緩沖區(qū)內(nèi)沒有有效原始圖而生不成圖像;18 0x08: 302, # 表示指紋不匹配;19 0x09: 402, # 表示沒搜索到;此時頁碼與得分為 020 0x0a: 502, # 表示合并失敗(兩枚指紋不屬于同一手指);21 0x0d: 802, # 表示指令執(zhí)行失敗;22 0x0f: 1002, # 表示不能發(fā)送后續(xù)數(shù)據(jù)包;23 }24 '''返回= 999 校驗和錯誤'''25 26 27 class DealBuff:28 """切割收到的數(shù)據(jù)"""29 HEAD = [0xEF, 0x01, 0xFF, 0xFF, 0xFF, 0xFF]30 31 def __init__(self, buff):32 self.buff = buff33 """處理讀出的指紋數(shù)據(jù)用到"""34 self.tag = list() # 包標(biāo)識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 """切割數(shù)組"""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 """"選擇數(shù)據(jù)"""56 # 初始化中間變量57 popList = list()58 check_Num = 059 check = list()60 head = list()61 62 if len(buff) < 6: # 判斷是否有效數(shù)據(jù)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) # 取出包標(biāo)識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]) # 取出包數(shù)據(jù)78 check.append(popList.pop()) # 取出校驗數(shù)據(jù)79 check.append(popList.pop())80 for i in popList: # 計算校驗和81 check_Num += i82 83 self.data.extend(popList) # 導(dǎo)入有用數(shù)據(jù)84 if check_Num % 65535 != check[0] + check[1]*256: # 檢驗校驗和85 return False86 87 rec = self.slit(buff) # 得到是否正確分析完數(shù)據(jù)88 return rec89 pass90 91 def write(self):92 """要寫的數(shù)據(jù)打包"""93 pack = self.dataSeparate(self.buff, 128) # 將數(shù)據(jù)分成每組128個元素94 return pack95 pass96 97 def dataSeparate(self, buff, numPart):98 """把數(shù)據(jù)分組打包"""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) # 數(shù)據(jù)包沒結(jié)束 107 packData.extend(data) 108 109 packData.extend(self.packData(newData[num-1], 0x08)) # 數(shù)據(jù)包結(jié)束 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() # 包標(biāo)識 132 cmd = list() # 133 data = list() 134 ser = serial.Serial() 135 def __init__(self, cmd, data=None, server=None): 136 """初始化函數(shù)""" 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")) # 發(fā)送數(shù)據(jù)說明準(zhǔn)備好了 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: # 得到數(shù)據(jù)錯誤 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: # 得到數(shù)據(jù)錯誤 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] # 返回的分?jǐn)?shù)值 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 """判斷現(xiàn)在的指紋和下載的指紋是否相同""" 223 self.link() 224 check = self.downCharCheck() 225 if check is not True: # 判斷是否可以發(fā)送數(shù)據(jù) 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] # 返回的分?jǐn)?shù)值 236 return True, score 237 pass 238 239 def getImage(self, data=None): 240 """獲取圖像""" 241 cmd = self.HEAD + [0x01, 0x00, 0x03, 0x01, 0x00, 0x05] # 發(fā)送命令獲取內(nèi)容 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] # 發(fā)送命令 249 return self.isOk(cmd, 12) # 圖像接收數(shù)據(jù) 12 大小 250 elif data == "2": 251 cmd = self.HEAD + [0x01, 0x00, 0x04, 0x02, 0x02, 0x00, 0x09] # 發(fā)送命令 252 return self.isOk(cmd, 12) # 圖像接收數(shù)據(jù) 12 大小 253 pass 254 255 def match(self, data=None): 256 """比較指紋特征""" 257 cmd = self.HEAD + [0x01, 0x00, 0x03, 0x03, 0x00, 0x07] # 發(fā)送命令獲取內(nèi)容 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] # 發(fā)送命令獲取內(nèi)容 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] # 發(fā)送命令 272 return self.isOk(cmd, 12, False) 273 elif data == "2": 274 cmd = self.HEAD + [0x01, 0x00, 0x04, 0x08, 0x02, 0x00, 0x0F] # 發(fā)送命令 275 return self.isOk(cmd, 12, False) 276 pass 277 278 def getUpChar(self, data=None): 279 """上傳特征模塊數(shù)據(jù)""" 280 buff = self.ser.read(834) 281 self.ser.close() 282 subpackage = DealBuff(buff) # 分割內(nèi)容 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 先要初始化,發(fā)送獲取圖像命令 292 """ 293 self.getImage() 294 self.link() 295 cmd = self.HEAD + [0x01, 0x00, 0x04, 0x09, 0x02, 0x00, 0x10] # 發(fā)送命令 下載的數(shù)據(jù)放在buff2中 296 return self.isOk(cmd, 12) 297 pass 298 299 def downCharData(self, data): 300 """下載特征值的數(shù)據(jù)""" 301 self.writeRead(data, 0) # 發(fā)送數(shù)據(jù) 接收為0 302 pass 303 304 305 def upImage(self, data=None): 306 """上傳圖像檢測""" 307 cmd = self.HEAD + [0x01, 0x00, 0x03, 0x0a, 0x00, 0x0e] # 發(fā)送命令 308 return self.isOk(cmd, 12, False) 309 pass 310 311 def getUpImage(self, data=None): 312 """獲取后續(xù)的圖像數(shù)據(jù)""" 313 buff = self.ser.read(40032) 314 self.ser.close() 315 subpackage = DealBuff(buff) # 分割內(nèi)容 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 """發(fā)送命令讀取原始字節(jié)""" 323 cmd = bytes(cmd) 324 self.ser.write(cmd) 325 buff = self.ser.read(length) # 圖像接收數(shù)據(jù) 326 if close: 327 self.ser.close() # 接受完數(shù)據(jù)斷開com 328 return buff 329 pass 330 331 def isOk(self, cmd, length, close=True): 332 """判斷數(shù)據(jù)是否合格""" 333 buff = self.writeRead(cmd, length, close) # 圖像接收數(shù)據(jù) 12 大小 334 subpackage = DealBuff(buff) # 分割內(nèi)容 335 self.tag, self.data, check = subpackage.read() 336 # 檢驗數(shù)據(jù)是否可靠 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 最后
總結(jié)
以上是生活随笔為你收集整理的毕业设计 树莓派指纹识别打卡系统设计与实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 多边形碰撞检测(判断点在多边形内)
- 下一篇: Swing中滚动面板JScrollPan