        <style>
            #donation_buttons td{
                border:medium none;
                background: inherit !important;
            }
            #donation_buttons table{               
                border:medium none;
                margin: auto;
                width: auto;
            }
        </style>
        {"id":6889,"date":"2022-06-16T00:05:38","date_gmt":"2022-06-16T00:05:38","guid":{"rendered":"https:\/\/rogerbit.com\/wprb\/?p=6889"},"modified":"2022-06-16T00:05:38","modified_gmt":"2022-06-16T00:05:38","slug":"apertura-puerta-huellas","status":"publish","type":"post","link":"https:\/\/rogerbit.com\/wprb\/2022\/06\/apertura-puerta-huellas\/","title":{"rendered":"Apertura de puerta con m\u00f3dulo de huellas digitales"},"content":{"rendered":"<p><iframe loading=\"lazy\" title=\"Apertura de puerta con m\u00f3dulo de huellas digitales  -  PCBWay.es\" width=\"1160\" height=\"653\" src=\"https:\/\/www.youtube.com\/embed\/m0DV6fJXK1E?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen><\/iframe><\/p>\n<hr \/>\n<p>PCB barato y r\u00e1pido, impresi\u00f3n 3D, mecanizado CNC y servicios de fabricaci\u00f3n de PCBWay: <a href=\"https:\/\/www.pcbway.com\/setinvite.aspx?inviteid=318610\">https:\/\/www.pcbway.com\/setinvite.aspx?inviteid=318610<\/a><\/p>\n<p>En este tutorial veremos como armar un dispositivo que nos va a permitir abrir una puerta, con nuestras huellas digitales registradas en un m\u00f3dulo fingerprint. Adem\u00e1s vamos a implementar un arduino nano, un display oled y m\u00f3dulo relay.<\/p>\n<hr \/>\n<p style=\"text-align: left;\">Tal vez pueda interesarte proyectos en arduino, pic, rob\u00f3tica, telecomunicaciones, suscribete en\u00a0<a href=\"http:\/\/www.youtube.com\/user\/carlosvolt?sub_confirmation=1\">http:\/\/www.youtube.com\/user\/carlosvolt?sub_confirmation=1<\/a>\u00a0mucho videos con c\u00f3digo fuentes completos y diagramas<\/p>\n<p style=\"text-align: left;\"><div id=\"ubm-banners-rotation-n1\" data-interval=\"4000\" class=\"ubm_banners_rotation\" style=\"overflow: hidden; width: 200px; height: 150px;\"><div id=\"3_ubm_banner\" class=\"ubm_rotating_banner\"><a href=\"https:\/\/bit.ly\/3aXRDAu\" target=\"_blank\" rel=\"dofollow\"><img src=\"https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/useful_banner_manager_banners\/3-2-logo youtube.png\" width=\"100%\" height=\"100%\" alt=\"SUSCRIBETE A NUESTRO CANAL DE YOUTUBE, TUTORIALES GRATIS\" \/><\/a><\/div><\/div><\/p>\n<hr \/>\n<p><strong>Componentes electr\u00f3nicos<\/strong><\/p>\n<p><strong>Arduino Nano<\/strong><\/p>\n<p><a href=\"http:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2020\/11\/Arduino_nano_V3.0_atmega328_compatible-2.jpg\"><img loading=\"lazy\" class=\"alignnone wp-image-6034\" src=\"http:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2020\/11\/Arduino_nano_V3.0_atmega328_compatible-2.jpg\" sizes=\"(max-width: 321px) 100vw, 321px\" srcset=\"https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2020\/11\/Arduino_nano_V3.0_atmega328_compatible-2.jpg 650w, https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2020\/11\/Arduino_nano_V3.0_atmega328_compatible-2-150x150.jpg 150w, https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2020\/11\/Arduino_nano_V3.0_atmega328_compatible-2-300x300.jpg 300w, https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2020\/11\/Arduino_nano_V3.0_atmega328_compatible-2-600x600.jpg 600w\" alt=\"\" width=\"321\" height=\"321\" \/><\/a><\/p>\n<p>El Arduino Nano es una placa peque\u00f1a, completa y compatible con la placa de pruebas basada en el ATmega328 (Arduino Nano 3.x).\u00a0Tiene m\u00e1s o menos la misma funcionalidad del Arduino Duemilanove, pero en un paquete diferente.\u00a0Solo carece de un conector de alimentaci\u00f3n de CC y funciona con un cable USB Mini-B en lugar de uno est\u00e1ndar.<\/p>\n<table>\n<tbody>\n<tr>\n<td>Microcontrolador<\/td>\n<td>ATmega328<\/td>\n<\/tr>\n<tr>\n<td>Arquitectura<\/td>\n<td>AVR<\/td>\n<\/tr>\n<tr>\n<td>Tensi\u00f3n de funcionamiento<\/td>\n<td>5 V<\/td>\n<\/tr>\n<tr>\n<td>Memoria flash<\/td>\n<td>32 KB de los cuales 2 KB utiliza el gestor de arranque<\/td>\n<\/tr>\n<tr>\n<td>SRAM<\/td>\n<td>2 KB<\/td>\n<\/tr>\n<tr>\n<td>Velocidad de reloj<\/td>\n<td>16 MHz<\/td>\n<\/tr>\n<tr>\n<td>Pines anal\u00f3gicos IN<\/td>\n<td>8<\/td>\n<\/tr>\n<tr>\n<td>EEPROM<\/td>\n<td>1 KB<\/td>\n<\/tr>\n<tr>\n<td>Corriente CC por pines de E \/ S<\/td>\n<td>40 mA (pines de E \/ S)<\/td>\n<\/tr>\n<tr>\n<td>Voltaje de entrada<\/td>\n<td>7-12 V<\/td>\n<\/tr>\n<tr>\n<td>Pines de E \/ S digitales<\/td>\n<td>22 (6 de los cuales son PWM)<\/td>\n<\/tr>\n<tr>\n<td>Salida PWM<\/td>\n<td>6<\/td>\n<\/tr>\n<tr>\n<td>El consumo de energ\u00eda<\/td>\n<td>19 mA<\/td>\n<\/tr>\n<tr>\n<td>Tama\u00f1o de PCB<\/td>\n<td>18 x 45 mm<\/td>\n<\/tr>\n<tr>\n<td>Peso<\/td>\n<td>7 g<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>Diagrama de pines<\/h3>\n<p><a href=\"http:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2020\/11\/Pinout-NANO.png\"><img loading=\"lazy\" class=\"alignnone size-large wp-image-6033\" src=\"http:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2020\/11\/Pinout-NANO-1024x1024.png\" sizes=\"(max-width: 1024px) 100vw, 1024px\" srcset=\"https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2020\/11\/Pinout-NANO-1024x1024.png 1024w, https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2020\/11\/Pinout-NANO-150x150.png 150w, https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2020\/11\/Pinout-NANO-300x300.png 300w, https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2020\/11\/Pinout-NANO-768x768.png 768w, https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2020\/11\/Pinout-NANO-600x600.png 600w, https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2020\/11\/Pinout-NANO-820x820.png 820w, https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2020\/11\/Pinout-NANO-1320x1321.png 1320w\" alt=\"\" width=\"1024\" height=\"1024\" \/><\/a><\/p>\n<hr \/>\n<p><strong>Buzzer<\/strong><\/p>\n<p><strong><img loading=\"lazy\" class=\"alignnone wp-image-6891\" src=\"https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2022\/06\/buzzer.jpg\" alt=\"\" width=\"188\" height=\"214\" srcset=\"https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2022\/06\/buzzer.jpg 368w, https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2022\/06\/buzzer-263x300.jpg 263w\" sizes=\"(max-width: 188px) 100vw, 188px\" \/><\/strong><\/p>\n<hr \/>\n<h4>Display oled con driver SSD1306<\/h4>\n<p><img loading=\"lazy\" class=\"alignnone wp-image-6692\" src=\"https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2021\/12\/oled.jpg\" sizes=\"(max-width: 260px) 100vw, 260px\" srcset=\"https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2021\/12\/oled.jpg 470w, https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2021\/12\/oled-300x271.jpg 300w\" alt=\"\" width=\"260\" height=\"235\" \/><\/p>\n<p>El rendimiento de la pantalla es mejor que la pantalla LCD tradicional, tambi\u00e9n un menor consumo.<br \/>\nEspecificaciones:<br \/>\nIC del controlador: SSD1306<br \/>\nTama\u00f1o: OLED de 0,91 pulgadas<br \/>\nResoluci\u00f3n: 128 x 32<br \/>\nTama\u00f1o: 38 * 12 mm<br \/>\nN\u00famero de pines: 4 pines<br \/>\nTipo de interfaz:<br \/>\ninterfaz IIC<br \/>\nColor de la pantalla: Blanco \/ azul<br \/>\nDescripci\u00f3n de los pines:<br \/>\nGND: Power Ground<br \/>\nVCC: Power + (DC 3.3 ~ 5v)<br \/>\nTemperatura de funcionamiento: -40 ~ 85 \u2103<br \/>\nSCL: L\u00ednea de reloj<br \/>\nSDA: L\u00ednea de datos<\/p>\n<p>Pantalla OLED, sin necesidad de retroiluminaci\u00f3n, autoiluminaci\u00f3n, Color de la pantalla: azul.<br \/>\nEl rendimiento de la pantalla es mejor que la pantalla LCD tradicional, tambi\u00e9n menor consumo;\u00a0IIC (comunicaciones I2C) simplifica las conexiones.<br \/>\n\u00daselo con Arduino, ESP8266, ESP32, STM32, etc.\u00a03.3 a 5v de voltaje<\/p>\n<hr \/>\n<h4>Pines hembra<\/h4>\n<p><img loading=\"lazy\" class=\"alignnone size-large wp-image-6689\" src=\"https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2021\/12\/hembrapin.jpg\" sizes=\"(max-width: 225px) 100vw, 225px\" srcset=\"https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2021\/12\/hembrapin.jpg 225w, https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2021\/12\/hembrapin-150x150.jpg 150w\" alt=\"\" width=\"225\" height=\"225\" \/><\/p>\n<hr \/>\n<p><strong>Cables dupont<\/strong><\/p>\n<p><img loading=\"lazy\" class=\"alignnone wp-image-6892\" src=\"https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2022\/06\/duponthh.jpg\" alt=\"\" width=\"231\" height=\"231\" srcset=\"https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2022\/06\/duponthh.jpg 800w, https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2022\/06\/duponthh-300x300.jpg 300w, https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2022\/06\/duponthh-150x150.jpg 150w, https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2022\/06\/duponthh-768x768.jpg 768w\" sizes=\"(max-width: 231px) 100vw, 231px\" \/><\/p>\n<hr \/>\n<p><strong>M\u00f3dulo fingerprint Open Smart<\/strong><\/p>\n<p><img loading=\"lazy\" class=\"alignnone wp-image-6893\" src=\"https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2022\/06\/fingerprint.jpg\" alt=\"\" width=\"251\" height=\"251\" srcset=\"https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2022\/06\/fingerprint.jpg 700w, https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2022\/06\/fingerprint-300x300.jpg 300w, https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2022\/06\/fingerprint-150x150.jpg 150w\" sizes=\"(max-width: 251px) 100vw, 251px\" \/><\/p>\n<p>Descargar Manual &#8211;&gt; <a href=\"https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2022\/06\/R308-fingerprint-module-user-manual_English.pdf\">R308-fingerprint-module-user-manual_English<\/a><\/p>\n<hr \/>\n<p><strong>Pines macho<\/strong><\/p>\n<p><img loading=\"lazy\" class=\"alignnone wp-image-6894 size-medium\" src=\"https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2022\/06\/pinesmacho-300x300.jpg\" alt=\"\" width=\"300\" height=\"300\" srcset=\"https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2022\/06\/pinesmacho-300x300.jpg 300w, https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2022\/06\/pinesmacho-1024x1024.jpg 1024w, https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2022\/06\/pinesmacho-150x150.jpg 150w, https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2022\/06\/pinesmacho-768x768.jpg 768w, https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2022\/06\/pinesmacho-820x820.jpg 820w, https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2022\/06\/pinesmacho.jpg 1200w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/p>\n<hr \/>\n<h4>M\u00f3dulo Relay<\/h4>\n<div><a href=\"http:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2021\/01\/realay.jpg\"><img loading=\"lazy\" class=\"alignnone wp-image-6203\" src=\"http:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2021\/01\/realay-1024x875.jpg\" sizes=\"(max-width: 343px) 100vw, 343px\" srcset=\"https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2021\/01\/realay-1024x875.jpg 1024w, https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2021\/01\/realay-300x256.jpg 300w, https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2021\/01\/realay-768x656.jpg 768w, https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2021\/01\/realay-600x513.jpg 600w, https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2021\/01\/realay-820x701.jpg 820w, https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2021\/01\/realay-1320x1128.jpg 1320w, https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2021\/01\/realay.jpg 2048w\" alt=\"\" width=\"343\" height=\"293\" \/><\/a><\/div>\n<div>\n<h4>ESPECIFICACIONES T\u00c9CNICAS<\/h4>\n<ul>\n<li>Voltaje de Operaci\u00f3n: 5V DC<\/li>\n<li>Se\u00f1al de Control: TTL (3.3V o 5V)<\/li>\n<li>N\u00ba de Relays (canales):\u00a01\u00a0CH<\/li>\n<li>Capacidad m\u00e1x: 10A\/250VAC, 10A\/30VDC<\/li>\n<li>Corriente m\u00e1x: 10A (NO), 5A (NC)<\/li>\n<li>Tiempo de acci\u00f3n: 10 ms \/ 5 ms<\/li>\n<li>Para activar salida NO: 0 Voltios<\/li>\n<\/ul>\n<hr \/>\n<p><strong>Z\u00f3calo para arduino nano<\/strong><\/p>\n<p><img loading=\"lazy\" class=\"alignnone size-full wp-image-6895\" src=\"https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2022\/06\/zocalo.jpg\" alt=\"\" width=\"320\" height=\"240\" srcset=\"https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2022\/06\/zocalo.jpg 320w, https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2022\/06\/zocalo-300x225.jpg 300w\" sizes=\"(max-width: 320px) 100vw, 320px\" \/><\/p>\n<hr \/>\n<p><strong>Un PCB<\/strong><\/p>\n<p><img loading=\"lazy\" class=\"alignnone size-full wp-image-6896\" src=\"https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2022\/06\/pcb.jpg\" alt=\"\" width=\"255\" height=\"395\" srcset=\"https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2022\/06\/pcb.jpg 255w, https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2022\/06\/pcb-194x300.jpg 194w\" sizes=\"(max-width: 255px) 100vw, 255px\" \/><\/p>\n<p><img loading=\"lazy\" class=\"alignnone size-full wp-image-6904\" src=\"https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2022\/06\/pcb_c.png\" alt=\"\" width=\"260\" height=\"396\" srcset=\"https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2022\/06\/pcb_c.png 260w, https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2022\/06\/pcb_c-197x300.png 197w\" sizes=\"(max-width: 260px) 100vw, 260px\" \/><\/p>\n<p>Descargar archivo gerber &#8212;&gt; <a href=\"https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2022\/06\/fingerprint.zip\">fingerprint<\/a><\/p>\n<\/div>\n<hr \/>\n<p><strong>Circuito<\/strong><\/p>\n<p><img loading=\"lazy\" class=\"alignnone size-large wp-image-6905\" src=\"https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2022\/06\/circuito-1024x295.png\" alt=\"\" width=\"1024\" height=\"295\" srcset=\"https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2022\/06\/circuito-1024x295.png 1024w, https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2022\/06\/circuito-300x86.png 300w, https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2022\/06\/circuito-768x221.png 768w, https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2022\/06\/circuito-820x236.png 820w, https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2022\/06\/circuito.png 1058w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/p>\n<div>\n<hr \/>\n<p><strong>C\u00f3digo Fuente del proyecto<\/strong><\/p>\n<pre class=\"lang:arduino decode:true \" title=\"C\u00f3digo Fuente\">#include &lt;Adafruit_Fingerprint.h&gt;\r\n#include &lt;SoftwareSerial.h&gt;\r\n#include &lt;Arduino.h&gt;\r\n#include &lt;U8g2lib.h&gt;\r\n#ifdef U8X8_HAVE_HW_SPI\r\n#include &lt;SPI.h&gt;\r\n#endif\r\n#ifdef U8X8_HAVE_HW_I2C\r\n#include &lt;Wire.h&gt;\r\n#endif\r\nU8G2_SSD1306_128X32_UNIVISION_1_SW_I2C u8g2(U8G2_R0, \/* clock=*\/ SCL, \/* data=*\/ SDA, \/* reset=*\/ U8X8_PIN_NONE);\r\nSoftwareSerial mySerial(2, 3);\r\nAdafruit_Fingerprint finger = Adafruit_Fingerprint(&amp;mySerial);\r\nint pin8 = 8;\r\nint pin12 = 12;\r\nint estado = 0;\r\nString numID;\r\n\r\nvoid setup()  \r\n{\r\n  while (!Serial);  \/\/ Para Yun\/Leo\/Micro\/Zero\/...\r\n  u8g2.begin();\/\/Inicializamos el display\r\n  Serial.begin(9600);\/\/Velocidad del puerto serie arduino\r\n  pinMode(pin8, OUTPUT);\r\n  pinMode(pin12, OUTPUT);\r\n  Serial.println(\"Inicio detecci\u00f3n del m\u00f3dulo fingerprint\");\r\n  \/\/ Velocidad de transmisi\u00f3n de datos entre el arduino y el m\u00f3dulo fingerprint\r\n  finger.begin(57600);\r\n  \r\n  if (finger.verifyPassword()) {\r\n    Serial.println(\"\u00a1Sensor de huellas dactilares conectado ok!\");\r\n  } else {\r\n    Serial.println(\"Revisa la conexi\u00f3n del sensor de huellas :(\");\r\n    while (1);\r\n  }\r\n  Serial.println(\"Esperando un huella v\u00e1lida...\");\r\n  displayOled();\/\/Llamado de la funci\u00f3n displayOled(), para arrancar el display con la leyenda \"Ingrese huella\"\r\n}\r\n\r\nvoid loop()     \r\n{\r\n  datosFingerprint();\r\n  delay(50); \/\/Peque\u00f1o delay\r\n}\r\n\/\/ Devuelve -1 si falla, de lo contrario devuelve ID #\r\nint datosFingerprint() {\r\n  uint8_t p = finger.getImage();\r\n  if (p != FINGERPRINT_OK)  return -1;\r\n\r\n  p = finger.image2Tz();\r\n  if (p != FINGERPRINT_OK)  return -1;\r\n\r\n  p = finger.fingerFastSearch();\r\n  if (p != FINGERPRINT_OK)  return -1;\r\n\r\n\/\/Encontrado una coincidencia!\r\n  Serial.print(\"Huella ID #\"); Serial.print(finger.fingerID); \r\n  Serial.print(\" con una confianza de \"); Serial.println(finger.confidence);\r\n\/\/Activar el buzzer durante 100 mili segundos\r\ndigitalWrite(pin12, HIGH);\r\ndelay(100);\r\ndigitalWrite(pin12, LOW);\r\nnumID = String(finger.fingerID); \/\/Convierte el id en cadena para ser compatible con el display\r\n\/\/Enciennde el m\u00f3dulo relay durante 3 segundos\r\ndigitalWrite(pin8, HIGH);\r\ndisplayOled2();\/\/ LLama a esta funci\u00f3n para mostrar el n\u00famero de huella leido\r\ndelay(3000);\r\ndigitalWrite(pin8, LOW);\r\ndisplayOled();\/\/Pasado el tiempo vuelve a mostrar la leyenda \"ingrese huella\"\r\n  return finger.fingerID; \r\n}\r\n\/\/Nos muestra en el display Ingrese huella\r\n void displayOled(){\r\n  u8g2.firstPage();\r\n  do {\r\n    u8g2.setFont(u8g2_font_ncenB10_tr);\r\n \/\/   u8g2.drawStr(0,24,\"Huella #\"+ numID);\r\n    u8g2.drawStr(0,24,\"Ingrese huella\");\r\n  \r\n    } while ( u8g2.nextPage() );\r\n}\r\n\/\/Nos muestra en el display el n\u00famero de la huella obtenida \"Huella #\"\r\n void displayOled2(){\r\n  u8g2.firstPage();\r\n  do {\r\n    u8g2.setFont(u8g2_font_ncenB10_tr);\r\n   \r\n   u8g2.drawStr(0,24,\"Huella #\");\r\n   u8g2.drawStr(65, 24, numID.c_str()); \r\n    } while ( u8g2.nextPage() );\r\n}<\/pre>\n<hr \/>\n<p><strong>Librer\u00eda<\/strong><\/p>\n<p>Descargar librer\u00eda &#8212;&gt; <a href=\"https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2022\/06\/AdaFingerprint.zip\">AdaFingerprint<\/a><\/p>\n<p><strong>C\u00f3digo Fuente enroll<\/strong><\/p>\n<pre class=\"lang:default decode:true \" title=\"C\u00f3digo Fuente enroll\">\/*************************************************** \r\n  This is an example sketch for our optical Fingerprint sensor\r\n\r\n  Designed specifically to work with the Adafruit BMP085 Breakout \r\n  ----&gt; http:\/\/www.adafruit.com\/products\/751\r\n\r\n  These displays use TTL Serial to communicate, 2 pins are required to \r\n  interface\r\n  Adafruit invests time and resources providing this open source code, \r\n  please support Adafruit and open-source hardware by purchasing \r\n  products from Adafruit!\r\n\r\n  Written by Limor Fried\/Ladyada for Adafruit Industries.  \r\n  BSD license, all text above must be included in any redistribution\r\n ****************************************************\/\r\n\r\n#include &lt;Adafruit_Fingerprint.h&gt;\r\n#include &lt;SoftwareSerial.h&gt;\r\n\r\nuint8_t id;\r\n\r\nuint8_t getFingerprintEnroll();\r\n\r\n\/\/ Software serial for when you dont have a hardware serial port\r\n\/\/ pin #2 is IN from sensor (GREEN wire)\r\n\/\/ pin #3 is OUT from arduino  (WHITE wire)\r\n\/\/ On Leonardo\/Micro\/Yun, use pins 8 &amp; 9. On Mega, just grab a hardware serialport \r\nSoftwareSerial mySerial(2, 3);\r\nAdafruit_Fingerprint finger = Adafruit_Fingerprint(&amp;mySerial);\r\n\r\n\/\/ On Leonardo\/Micro or others with hardware serial, use those! #0 is green wire, #1 is white\r\n\/\/Adafruit_Fingerprint finger = Adafruit_Fingerprint(&amp;Serial1);\r\n\r\n\r\nvoid setup()  \r\n{\r\n  while (!Serial);  \/\/ For Yun\/Leo\/Micro\/Zero\/...\r\n  delay(500);\r\n  \r\n  Serial.begin(9600);\r\n  Serial.println(\"Adafruit Fingerprint sensor enrollment\");\r\n\r\n  \/\/ set the data rate for the sensor serial port\r\n  finger.begin(57600);\r\n  \r\n  if (finger.verifyPassword()) {\r\n    Serial.println(\"Found fingerprint sensor!\");\r\n  } else {\r\n    Serial.println(\"Did not find fingerprint sensor :(\");\r\n    while (1);\r\n  }\r\n}\r\n\r\nuint8_t readnumber(void) {\r\n  uint8_t num = 0;\r\n  boolean validnum = false; \r\n  while (1) {\r\n    while (! Serial.available());\r\n    char c = Serial.read();\r\n    if (isdigit(c)) {\r\n       num *= 10;\r\n       num += c - '0';\r\n       validnum = true;\r\n    } else if (validnum) {\r\n      return num;\r\n    }\r\n  }\r\n}\r\n\r\nvoid loop()                     \/\/ run over and over again\r\n{\r\n  Serial.println(\"Ready to enroll a fingerprint! Please Type in the ID # you want to save this finger as...\");\r\n  id = readnumber();\r\n  Serial.print(\"Enrolling ID #\");\r\n  Serial.println(id);\r\n  \r\n  while (!  getFingerprintEnroll() );\r\n}\r\n\r\nuint8_t getFingerprintEnroll() {\r\n\r\n  int p = -1;\r\n  Serial.print(\"Waiting for valid finger to enroll as #\"); Serial.println(id);\r\n  while (p != FINGERPRINT_OK) {\r\n    p = finger.getImage();\r\n    switch (p) {\r\n    case FINGERPRINT_OK:\r\n      Serial.println(\"Image taken\");\r\n      break;\r\n    case FINGERPRINT_NOFINGER:\r\n      Serial.println(\".\");\r\n      break;\r\n    case FINGERPRINT_PACKETRECIEVEERR:\r\n      Serial.println(\"Communication error\");\r\n      break;\r\n    case FINGERPRINT_IMAGEFAIL:\r\n      Serial.println(\"Imaging error\");\r\n      break;\r\n    default:\r\n      Serial.println(\"Unknown error\");\r\n      break;\r\n    }\r\n  }\r\n\r\n  \/\/ OK success!\r\n\r\n  p = finger.image2Tz(1);\r\n  switch (p) {\r\n    case FINGERPRINT_OK:\r\n      Serial.println(\"Image converted\");\r\n      break;\r\n    case FINGERPRINT_IMAGEMESS:\r\n      Serial.println(\"Image too messy\");\r\n      return p;\r\n    case FINGERPRINT_PACKETRECIEVEERR:\r\n      Serial.println(\"Communication error\");\r\n      return p;\r\n    case FINGERPRINT_FEATUREFAIL:\r\n      Serial.println(\"Could not find fingerprint features\");\r\n      return p;\r\n    case FINGERPRINT_INVALIDIMAGE:\r\n      Serial.println(\"Could not find fingerprint features\");\r\n      return p;\r\n    default:\r\n      Serial.println(\"Unknown error\");\r\n      return p;\r\n  }\r\n  \r\n  Serial.println(\"Remove finger\");\r\n  delay(2000);\r\n  p = 0;\r\n  while (p != FINGERPRINT_NOFINGER) {\r\n    p = finger.getImage();\r\n  }\r\n  Serial.print(\"ID \"); Serial.println(id);\r\n  p = -1;\r\n  Serial.println(\"Place same finger again\");\r\n  while (p != FINGERPRINT_OK) {\r\n    p = finger.getImage();\r\n    switch (p) {\r\n    case FINGERPRINT_OK:\r\n      Serial.println(\"Image taken\");\r\n      break;\r\n    case FINGERPRINT_NOFINGER:\r\n      Serial.print(\".\");\r\n      break;\r\n    case FINGERPRINT_PACKETRECIEVEERR:\r\n      Serial.println(\"Communication error\");\r\n      break;\r\n    case FINGERPRINT_IMAGEFAIL:\r\n      Serial.println(\"Imaging error\");\r\n      break;\r\n    default:\r\n      Serial.println(\"Unknown error\");\r\n      break;\r\n    }\r\n  }\r\n\r\n  \/\/ OK success!\r\n\r\n  p = finger.image2Tz(2);\r\n  switch (p) {\r\n    case FINGERPRINT_OK:\r\n      Serial.println(\"Image converted\");\r\n      break;\r\n    case FINGERPRINT_IMAGEMESS:\r\n      Serial.println(\"Image too messy\");\r\n      return p;\r\n    case FINGERPRINT_PACKETRECIEVEERR:\r\n      Serial.println(\"Communication error\");\r\n      return p;\r\n    case FINGERPRINT_FEATUREFAIL:\r\n      Serial.println(\"Could not find fingerprint features\");\r\n      return p;\r\n    case FINGERPRINT_INVALIDIMAGE:\r\n      Serial.println(\"Could not find fingerprint features\");\r\n      return p;\r\n    default:\r\n      Serial.println(\"Unknown error\");\r\n      return p;\r\n  }\r\n  \r\n  \/\/ OK converted!\r\n  Serial.print(\"Creating model for #\");  Serial.println(id);\r\n  \r\n  p = finger.createModel();\r\n  if (p == FINGERPRINT_OK) {\r\n    Serial.println(\"Prints matched!\");\r\n  } else if (p == FINGERPRINT_PACKETRECIEVEERR) {\r\n    Serial.println(\"Communication error\");\r\n    return p;\r\n  } else if (p == FINGERPRINT_ENROLLMISMATCH) {\r\n    Serial.println(\"Fingerprints did not match\");\r\n    return p;\r\n  } else {\r\n    Serial.println(\"Unknown error\");\r\n    return p;\r\n  }   \r\n  \r\n  Serial.print(\"ID \"); Serial.println(id);\r\n  p = finger.storeModel(id);\r\n  if (p == FINGERPRINT_OK) {\r\n    Serial.println(\"Stored!\");\r\n  } else if (p == FINGERPRINT_PACKETRECIEVEERR) {\r\n    Serial.println(\"Communication error\");\r\n    return p;\r\n  } else if (p == FINGERPRINT_BADLOCATION) {\r\n    Serial.println(\"Could not store in that location\");\r\n    return p;\r\n  } else if (p == FINGERPRINT_FLASHERR) {\r\n    Serial.println(\"Error writing to flash\");\r\n    return p;\r\n  } else {\r\n    Serial.println(\"Unknown error\");\r\n    return p;\r\n  }   \r\n}<\/pre>\n<hr \/>\n<p><strong>C\u00f3digo Fuente delete<\/strong><\/p>\n<pre class=\"lang:default decode:true \" title=\"C\u00f3digo Fuente delete\">\/*************************************************** \r\n  This is an example sketch for our optical Fingerprint sensor\r\n\r\n  Designed specifically to work with the Adafruit Fingerprint sensor\r\n  ----&gt; http:\/\/www.adafruit.com\/products\/751\r\n\r\n  These displays use TTL Serial to communicate, 2 pins are required to \r\n  interface\r\n  Adafruit invests time and resources providing this open source code, \r\n  please support Adafruit and open-source hardware by purchasing \r\n  products from Adafruit!\r\n\r\n  Written by Limor Fried\/Ladyada for Adafruit Industries.  \r\n  BSD license, all text above must be included in any redistribution\r\n ****************************************************\/\r\n\r\n#include &lt;Adafruit_Fingerprint.h&gt;\r\n#include &lt;SoftwareSerial.h&gt;\r\n\r\nuint8_t getFingerprintEnroll(uint8_t id);\r\n\r\n\/\/ Software serial for when you dont have a hardware serial port\r\n\/\/ pin #2 is IN from sensor (GREEN wire)\r\n\/\/ pin #3 is OUT from arduino  (WHITE wire)\r\n\/\/ On Leonardo\/Micro\/Yun, use pins 8 &amp; 9. On Mega, just grab a hardware serialport \r\nSoftwareSerial mySerial(2, 3);\r\nAdafruit_Fingerprint finger = Adafruit_Fingerprint(&amp;mySerial);\r\n\r\n\/\/ On Leonardo\/Micro or others with hardware serial, use those! #0 is green wire, #1 is white\r\n\/\/Adafruit_Fingerprint finger = Adafruit_Fingerprint(&amp;Serial1);\r\n\r\nvoid setup()  \r\n{\r\n  Serial.begin(9600);\r\n  Serial.println(\"Delete Finger\");\r\n\r\n  \/\/ set the data rate for the sensor serial port\r\n  finger.begin(57600);\r\n  \r\n  if (finger.verifyPassword()) {\r\n    Serial.println(\"Found fingerprint sensor!\");\r\n  } else {\r\n    Serial.println(\"Did not find fingerprint sensor :(\");\r\n    while (1);\r\n  }\r\n}\r\n\r\nvoid loop()                     \/\/ run over and over again\r\n{\r\n  while (!Serial);  \/\/ For Yun\/Leo\/Micro\/Zero\/...\r\n  delay(500);\r\n\r\n  Serial.println(\"Type in the ID # you want delete...\");\r\n  uint8_t id = 0;\r\n  while (true) {\r\n    while (! Serial.available());\r\n    char c = Serial.read();\r\n    if (! isdigit(c)) break;\r\n    id *= 10;\r\n    id += c - '0';\r\n  }\r\n  Serial.print(\"deleting ID #\");\r\n  Serial.println(id);\r\n  \r\n  deleteFingerprint(id);\r\n}\r\n\r\nuint8_t deleteFingerprint(uint8_t id) {\r\n  uint8_t p = -1;\r\n  \r\n  p = finger.deleteModel(id);\r\n\r\n  if (p == FINGERPRINT_OK) {\r\n    Serial.println(\"Deleted!\");\r\n  } else if (p == FINGERPRINT_PACKETRECIEVEERR) {\r\n    Serial.println(\"Communication error\");\r\n    return p;\r\n  } else if (p == FINGERPRINT_BADLOCATION) {\r\n    Serial.println(\"Could not delete in that location\");\r\n    return p;\r\n  } else if (p == FINGERPRINT_FLASHERR) {\r\n    Serial.println(\"Error writing to flash\");\r\n    return p;\r\n  } else {\r\n    Serial.print(\"Unknown error: 0x\"); Serial.println(p, HEX);\r\n    return p;\r\n  }   \r\n}<\/pre>\n<hr \/>\n<p><strong>C\u00f3digo Fuente Fingerprint<\/strong><\/p>\n<pre class=\"lang:default decode:true \" title=\"C\u00f3digo Fuente FingerPrint\">\/*************************************************** \r\n  This is an example sketch for our optical Fingerprint sensor\r\n\r\n  Designed specifically to work with the Adafruit BMP085 Breakout \r\n  ----&gt; http:\/\/www.adafruit.com\/products\/751\r\n\r\n  These displays use TTL Serial to communicate, 2 pins are required to \r\n  interface\r\n  Adafruit invests time and resources providing this open source code, \r\n  please support Adafruit and open-source hardware by purchasing \r\n  products from Adafruit!\r\n\r\n  Written by Limor Fried\/Ladyada for Adafruit Industries.  \r\n  BSD license, all text above must be included in any redistribution\r\n ****************************************************\/\r\n\r\n\r\n#include &lt;Adafruit_Fingerprint.h&gt;\r\n#include &lt;SoftwareSerial.h&gt;\r\n\r\nint getFingerprintIDez();\r\n\r\n\/\/ pin #2 is IN from sensor (GREEN wire)\r\n\/\/ pin #3 is OUT from arduino  (WHITE wire)\r\nSoftwareSerial mySerial(2, 3);\r\nAdafruit_Fingerprint finger = Adafruit_Fingerprint(&amp;mySerial);\r\n\r\n\/\/ On Leonardo\/Micro or others with hardware serial, use those! #0 is green wire, #1 is white\r\n\/\/Adafruit_Fingerprint finger = Adafruit_Fingerprint(&amp;Serial1);\r\n\r\nvoid setup()  \r\n{\r\n  while (!Serial);  \/\/ For Yun\/Leo\/Micro\/Zero\/...\r\n  \r\n  Serial.begin(9600);\r\n  Serial.println(\"Adafruit finger detect test\");\r\n\r\n  \/\/ set the data rate for the sensor serial port\r\n  finger.begin(57600);\r\n  \r\n  if (finger.verifyPassword()) {\r\n    Serial.println(\"Found fingerprint sensor!\");\r\n  } else {\r\n    Serial.println(\"Did not find fingerprint sensor :(\");\r\n    while (1);\r\n  }\r\n  Serial.println(\"Waiting for valid finger...\");\r\n}\r\n\r\nvoid loop()                     \/\/ run over and over again\r\n{\r\n  getFingerprintIDez();\r\n  delay(50);            \/\/don't ned to run this at full speed.\r\n}\r\n\r\nuint8_t getFingerprintID() {\r\n  uint8_t p = finger.getImage();\r\n  switch (p) {\r\n    case FINGERPRINT_OK:\r\n      Serial.println(\"Image taken\");\r\n      break;\r\n    case FINGERPRINT_NOFINGER:\r\n      Serial.println(\"No finger detected\");\r\n      return p;\r\n    case FINGERPRINT_PACKETRECIEVEERR:\r\n      Serial.println(\"Communication error\");\r\n      return p;\r\n    case FINGERPRINT_IMAGEFAIL:\r\n      Serial.println(\"Imaging error\");\r\n      return p;\r\n    default:\r\n      Serial.println(\"Unknown error\");\r\n      return p;\r\n  }\r\n\r\n  \/\/ OK success!\r\n\r\n  p = finger.image2Tz();\r\n  switch (p) {\r\n    case FINGERPRINT_OK:\r\n      Serial.println(\"Image converted\");\r\n      break;\r\n    case FINGERPRINT_IMAGEMESS:\r\n      Serial.println(\"Image too messy\");\r\n      return p;\r\n    case FINGERPRINT_PACKETRECIEVEERR:\r\n      Serial.println(\"Communication error\");\r\n      return p;\r\n    case FINGERPRINT_FEATUREFAIL:\r\n      Serial.println(\"Could not find fingerprint features\");\r\n      return p;\r\n    case FINGERPRINT_INVALIDIMAGE:\r\n      Serial.println(\"Could not find fingerprint features\");\r\n      return p;\r\n    default:\r\n      Serial.println(\"Unknown error\");\r\n      return p;\r\n  }\r\n  \r\n  \/\/ OK converted!\r\n  p = finger.fingerFastSearch();\r\n  if (p == FINGERPRINT_OK) {\r\n    Serial.println(\"Found a print match!\");\r\n  } else if (p == FINGERPRINT_PACKETRECIEVEERR) {\r\n    Serial.println(\"Communication error\");\r\n    return p;\r\n  } else if (p == FINGERPRINT_NOTFOUND) {\r\n    Serial.println(\"Did not find a match\");\r\n    return p;\r\n  } else {\r\n    Serial.println(\"Unknown error\");\r\n    return p;\r\n  }   \r\n  \r\n  \/\/ found a match!\r\n  Serial.print(\"Found ID #\"); Serial.print(finger.fingerID); \r\n  Serial.print(\" with confidence of \"); Serial.println(finger.confidence); \r\n}\r\n\r\n\/\/ returns -1 if failed, otherwise returns ID #\r\nint getFingerprintIDez() {\r\n  uint8_t p = finger.getImage();\r\n  if (p != FINGERPRINT_OK)  return -1;\r\n\r\n  p = finger.image2Tz();\r\n  if (p != FINGERPRINT_OK)  return -1;\r\n\r\n  p = finger.fingerFastSearch();\r\n  if (p != FINGERPRINT_OK)  return -1;\r\n  \r\n  \/\/ found a match!\r\n  Serial.print(\"Found ID #\"); Serial.print(finger.fingerID); \r\n  Serial.print(\" with confidence of \"); Serial.println(finger.confidence);\r\n  return finger.fingerID; \r\n}<\/pre>\n<hr \/>\n<p style=\"text-align: left;\"><div class=\"page-sidebar widget\" id=\"donation_buttons\"><form action=\"https:\/\/www.paypal.com\/cgi-bin\/webscr\" method=\"post\" target=\"_blank\" ><input type=\"hidden\" name=\"business\" value=\"donacion@rogerbit.com\"><input type=\"hidden\" name=\"bn\" value=\"mbjtechnolabs_SP\"><input type=\"hidden\" name=\"cmd\" value=\"_donations\"><input type=\"hidden\" name=\"item_name\" value=\"Ayuda a RogerBit.com\"><input type=\"hidden\" name=\"item_number\" value=\"www.rogerbit.com\"><input type=\"hidden\" class=\"set_donation_button_amount\" name=\"amount\" value=\"1\"><table ><tbody><tr><td><label for=\"rogerBit necesita de tu ayuda para seguir existiendo :-)\">rogerBit necesita de tu ayuda para seguir existiendo :-)<\/label><\/td><\/tr><\/tbody><\/table><table ><tbody><tr><td><input style=\"margin-top:10px;\" type=\"image\" name=\"submit\" border=\"0\" src=\"https:\/\/www.paypal.com\/en_US\/i\/btn\/btn_donateCC_LG.gif\" alt=\"PayPal - The safer, easier way to pay online\"><\/td><\/tr><\/tbody><\/table><input type=\"hidden\" name=\"currency_code\" value=\"USD\"><input type=\"hidden\" name=\"notify_url\" value=\"https:\/\/rogerbit.com\/wprb\/?Donation_Button&#038;action=ipn_handler\"><\/form><\/div><\/p>\n<hr \/>\n<p style=\"text-align: left;\"><strong>PROYECTO RECOMENDADO<\/strong><\/p>\n<\/div>\n<p><iframe loading=\"lazy\" title=\"\ud83d\udd54 Reloj de control de personal RFID IoT con esp32  - PCBWay.es\" width=\"1160\" height=\"653\" src=\"https:\/\/www.youtube.com\/embed\/rf18vW25yT8?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen><\/iframe><\/p>\n<!-- AddThis Advanced Settings generic via filter on the_content --><!-- AddThis Share Buttons generic via filter on the_content -->","protected":false},"excerpt":{"rendered":"<p>PCB barato y r\u00e1pido, impresi\u00f3n 3D, mecanizado CNC y servicios de fabricaci\u00f3n de PCBWay: https:\/\/www.pcbway.com\/setinvite.aspx?inviteid=318610 En este tutorial veremos como armar un dispositivo que nos va a permitir abrir una puerta, con nuestras huellas digitales registradas en un m\u00f3dulo fingerprint. Adem\u00e1s vamos a implementar un arduino nano, un display oled y m\u00f3dulo relay. Tal vez [&hellip;]<!-- AddThis Advanced Settings generic via filter on get_the_excerpt --><!-- AddThis Share Buttons generic via filter on get_the_excerpt --><\/p>\n","protected":false},"author":1,"featured_media":6899,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[11],"tags":[1418,767,351,181,486,906,1415,595,1071,1069,624,1400,1413,1417,1419,1414,1416,1068,1066,917,246,165,31,1401,687],"_links":{"self":[{"href":"https:\/\/rogerbit.com\/wprb\/wp-json\/wp\/v2\/posts\/6889"}],"collection":[{"href":"https:\/\/rogerbit.com\/wprb\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/rogerbit.com\/wprb\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/rogerbit.com\/wprb\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/rogerbit.com\/wprb\/wp-json\/wp\/v2\/comments?post=6889"}],"version-history":[{"count":6,"href":"https:\/\/rogerbit.com\/wprb\/wp-json\/wp\/v2\/posts\/6889\/revisions"}],"predecessor-version":[{"id":6909,"href":"https:\/\/rogerbit.com\/wprb\/wp-json\/wp\/v2\/posts\/6889\/revisions\/6909"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/rogerbit.com\/wprb\/wp-json\/wp\/v2\/media\/6899"}],"wp:attachment":[{"href":"https:\/\/rogerbit.com\/wprb\/wp-json\/wp\/v2\/media?parent=6889"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/rogerbit.com\/wprb\/wp-json\/wp\/v2\/categories?post=6889"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/rogerbit.com\/wprb\/wp-json\/wp\/v2\/tags?post=6889"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}