/ examples / fingerprint_simpletest_rpi.py
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