fingerprint_simpletest_rpi.py
1 import time 2 import serial 3 import board 4 5 # import busio 6 from digitalio import DigitalInOut, Direction 7 import adafruit_fingerprint 8 9 led = DigitalInOut(board.D13) 10 led.direction = Direction.OUTPUT 11 12 # uart = busio.UART(board.TX, board.RX, baudrate=57600) 13 14 # If using with a computer such as Linux/RaspberryPi, Mac, Windows with USB/serial converter: 15 # import serial 16 # uart = serial.Serial("/dev/ttyUSB0", baudrate=57600, timeout=1) 17 18 # If using with Linux/Raspberry Pi and hardware UART: 19 # import serial 20 # uart = serial.Serial("/dev/ttyS0", baudrate=57600, timeout=1) 21 22 # If using with Linux/Raspberry Pi 3 with pi3-disable-bt 23 # import serial 24 uart = serial.Serial("/dev/ttyAMA0", baudrate=57600, timeout=1) 25 26 finger = adafruit_fingerprint.Adafruit_Fingerprint(uart) 27 28 ################################################## 29 30 31 def get_fingerprint(): 32 """Get a finger print image, template it, and see if it matches!""" 33 print("Waiting for image...") 34 while finger.get_image() != adafruit_fingerprint.OK: 35 pass 36 print("Templating...") 37 if finger.image_2_tz(1) != adafruit_fingerprint.OK: 38 return False 39 print("Searching...") 40 if finger.finger_search() != adafruit_fingerprint.OK: 41 return False 42 return True 43 44 45 # pylint: disable=too-many-branches 46 def get_fingerprint_detail(): 47 """Get a finger print image, template it, and see if it matches! 48 This time, print out each error instead of just returning on failure""" 49 print("Getting image...", end="", flush=True) 50 i = finger.get_image() 51 if i == adafruit_fingerprint.OK: 52 print("Image taken") 53 else: 54 if i == adafruit_fingerprint.NOFINGER: 55 print("No finger detected") 56 elif i == adafruit_fingerprint.IMAGEFAIL: 57 print("Imaging error") 58 else: 59 print("Other error") 60 return False 61 62 print("Templating...", end="", flush=True) 63 i = finger.image_2_tz(1) 64 if i == adafruit_fingerprint.OK: 65 print("Templated") 66 else: 67 if i == adafruit_fingerprint.IMAGEMESS: 68 print("Image too messy") 69 elif i == adafruit_fingerprint.FEATUREFAIL: 70 print("Could not identify features") 71 elif i == adafruit_fingerprint.INVALIDIMAGE: 72 print("Image invalid") 73 else: 74 print("Other error") 75 return False 76 77 print("Searching...", end="", flush=True) 78 i = finger.finger_fast_search() 79 # pylint: disable=no-else-return 80 # This block needs to be refactored when it can be tested. 81 if i == adafruit_fingerprint.OK: 82 print("Found fingerprint!") 83 return True 84 else: 85 if i == adafruit_fingerprint.NOTFOUND: 86 print("No match found") 87 else: 88 print("Other error") 89 return False 90 91 92 # pylint: disable=too-many-statements 93 def enroll_finger(location): 94 """Take a 2 finger images and template it, then store in 'location'""" 95 for fingerimg in range(1, 3): 96 if fingerimg == 1: 97 print("Place finger on sensor...", end="", flush=True) 98 else: 99 print("Place same finger again...", end="", flush=True) 100 101 while True: 102 i = finger.get_image() 103 if i == adafruit_fingerprint.OK: 104 print("Image taken") 105 break 106 if i == adafruit_fingerprint.NOFINGER: 107 print(".", end="", flush=True) 108 elif i == adafruit_fingerprint.IMAGEFAIL: 109 print("Imaging error") 110 return False 111 else: 112 print("Other error") 113 return False 114 115 print("Templating...", end="", flush=True) 116 i = finger.image_2_tz(fingerimg) 117 if i == adafruit_fingerprint.OK: 118 print("Templated") 119 else: 120 if i == adafruit_fingerprint.IMAGEMESS: 121 print("Image too messy") 122 elif i == adafruit_fingerprint.FEATUREFAIL: 123 print("Could not identify features") 124 elif i == adafruit_fingerprint.INVALIDIMAGE: 125 print("Image invalid") 126 else: 127 print("Other error") 128 return False 129 130 if fingerimg == 1: 131 print("Remove finger") 132 time.sleep(1) 133 while i != adafruit_fingerprint.NOFINGER: 134 i = finger.get_image() 135 136 print("Creating model...", end="", flush=True) 137 i = finger.create_model() 138 if i == adafruit_fingerprint.OK: 139 print("Created") 140 else: 141 if i == adafruit_fingerprint.ENROLLMISMATCH: 142 print("Prints did not match") 143 else: 144 print("Other error") 145 return False 146 147 print("Storing model #%d..." % location, end="", flush=True) 148 i = finger.store_model(location) 149 if i == adafruit_fingerprint.OK: 150 print("Stored") 151 else: 152 if i == adafruit_fingerprint.BADLOCATION: 153 print("Bad storage location") 154 elif i == adafruit_fingerprint.FLASHERR: 155 print("Flash storage error") 156 else: 157 print("Other error") 158 return False 159 160 return True 161 162 163 def save_fingerprint_image(filename): 164 """Scan fingerprint then save image to filename.""" 165 while finger.get_image(): 166 pass 167 168 # let PIL take care of the image headers and file structure 169 from PIL import Image # pylint: disable=import-outside-toplevel 170 171 img = Image.new("L", (256, 288), "white") 172 pixeldata = img.load() 173 mask = 0b00001111 174 result = finger.get_fpdata(sensorbuffer="image") 175 176 # this block "unpacks" the data received from the fingerprint 177 # module then copies the image data to the image placeholder "img" 178 # pixel by pixel. please refer to section 4.2.1 of the manual for 179 # more details. thanks to Bastian Raschke and Danylo Esterman. 180 # pylint: disable=invalid-name 181 x = 0 182 # pylint: disable=invalid-name 183 y = 0 184 # pylint: disable=consider-using-enumerate 185 for i in range(len(result)): 186 pixeldata[x, y] = (int(result[i]) >> 4) * 17 187 x += 1 188 pixeldata[x, y] = (int(result[i]) & mask) * 17 189 if x == 255: 190 x = 0 191 y += 1 192 else: 193 x += 1 194 195 if not img.save(filename): 196 return True 197 return False 198 199 200 ################################################## 201 202 203 def get_num(max_number): 204 """Use input() to get a valid number from 0 to the maximum size 205 of the library. Retry till success!""" 206 i = -1 207 while (i > max_number - 1) or (i < 0): 208 try: 209 i = int(input("Enter ID # from 0-{}: ".format(max_number - 1))) 210 except ValueError: 211 pass 212 return i 213 214 215 while True: 216 print("----------------") 217 if finger.read_templates() != adafruit_fingerprint.OK: 218 raise RuntimeError("Failed to read templates") 219 print("Fingerprint templates: ", finger.templates) 220 if finger.count_templates() != adafruit_fingerprint.OK: 221 raise RuntimeError("Failed to read templates") 222 print("Number of templates found: ", finger.template_count) 223 if finger.read_sysparam() != adafruit_fingerprint.OK: 224 raise RuntimeError("Failed to get system parameters") 225 print("Size of template library: ", finger.library_size) 226 print("e) enroll print") 227 print("f) find print") 228 print("d) delete print") 229 print("s) save fingerprint image") 230 print("r) reset library") 231 print("q) quit") 232 print("----------------") 233 c = input("> ") 234 235 if c == "e": 236 enroll_finger(get_num(finger.library_size)) 237 if c == "f": 238 if get_fingerprint(): 239 print("Detected #", finger.finger_id, "with confidence", finger.confidence) 240 else: 241 print("Finger not found") 242 if c == "d": 243 if finger.delete_model(get_num(finger.library_size)) == adafruit_fingerprint.OK: 244 print("Deleted!") 245 else: 246 print("Failed to delete") 247 if c == "s": 248 if save_fingerprint_image("fingerprint.png"): 249 print("Fingerprint image saved") 250 else: 251 print("Failed to save fingerprint image") 252 if c == "r": 253 if finger.empty_library() == adafruit_fingerprint.OK: 254 print("Library empty!") 255 else: 256 print("Failed to empty library") 257 if c == "q": 258 print("Exiting fingerprint example program") 259 raise SystemExit