        <style>
            #donation_buttons td{
                border:medium none;
                background: inherit !important;
            }
            #donation_buttons table{               
                border:medium none;
                margin: auto;
                width: auto;
            }
        </style>
        {"id":6973,"date":"2022-07-20T13:44:58","date_gmt":"2022-07-20T13:44:58","guid":{"rendered":"https:\/\/rogerbit.com\/wprb\/?p=6973"},"modified":"2022-07-20T13:44:58","modified_gmt":"2022-07-20T13:44:58","slug":"reloj-de-control-fingerprint","status":"publish","type":"post","link":"https:\/\/rogerbit.com\/wprb\/2022\/07\/reloj-de-control-fingerprint\/","title":{"rendered":"Reloj de control de personal con m\u00f3dulo fingerprint  IoT, subiendo datos a thingspeak"},"content":{"rendered":"<p><iframe loading=\"lazy\" title=\"Reloj de control de personal con m\u00f3dulo fingerprint  IoT, subiendo datos a thingspeak - PCBWay.es\" width=\"1160\" height=\"653\" src=\"https:\/\/www.youtube.com\/embed\/2aoc2DNUf2I?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen><\/iframe><\/p>\n<hr \/>\n<p>En este tutorial veremos como crear un lector\/reloj de control de personal con esp32, un sensor lector de huellas digitales o fingerprint. Todos los datos se van a subir a la nube, a traves de los servicios de thingspeak.com Se va incluir el armado del circuito electr\u00f3nico, la explicaci\u00f3n detallada del c\u00f3digo fuente y finalmente, se va a probar el dispositivo.<\/p>\n<p>No te pierdas ning\u00fan video m\u00e1s suscr\u00edbete a nuestro canal de telegram <a href=\"https:\/\/t.me\/carlosvolt_electronica_robotica\">https:\/\/t.me\/carlosvolt_electronica_robotica<\/a><\/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<h4>Un Esp32<\/h4>\n<p><a href=\"https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2021\/03\/esp32.jpg\"><img loading=\"lazy\" class=\"alignnone wp-image-6331\" src=\"https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2021\/03\/esp32.jpg\" sizes=\"(max-width: 407px) 100vw, 407px\" srcset=\"https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2021\/03\/esp32.jpg 500w, https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2021\/03\/esp32-300x300.jpg 300w, https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2021\/03\/esp32-150x150.jpg 150w\" alt=\"\" width=\"407\" height=\"407\" \/><\/a><\/p>\n<h4>Caracter\u00edsticas del m\u00f3dulo ESP32-T<\/h4>\n<p><img src=\"http:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2017\/08\/esp32pinout-227x300.jpg\" \/><\/p>\n<h3>Conectividad<\/h3>\n<hr \/>\n<p>El m\u00f3dulo ESP32 dispone de todas las variantes del\u00a0<strong>WiFi<\/strong>:<\/p>\n<ul>\n<li>802.11 b\/g\/n\/e\/i\/n<\/li>\n<li>Wi-Fi Direct (P2P), P2P Discovery, P2P Group Owner mode and P2P Power Management<\/li>\n<\/ul>\n<p>Esta versi\u00f3n nueva incluye la conectividad mediante<strong>\u00a0Bluethoot<\/strong>\u00a0de bajo consumo<\/p>\n<ul>\n<li>Bluetooth v4.2 BR\/EDR and BLE<\/li>\n<li>BLE Beacon<\/li>\n<\/ul>\n<p>Adem\u00e1s, puede comunicarse mediante los protocoles<strong>\u00a0SPI, I2C, UART, MAC Ethernet, Host SD<\/strong><\/p>\n<h3>Prestaciones\u00a0del microcontrolador<\/h3>\n<hr \/>\n<p>La\u00a0<strong>CPU<\/strong>\u00a0est\u00e1 formado por un\u00a0<strong>SoC modelo Tensilica LX6<\/strong>\u00a0con las siguientes caracter\u00edsticas\u00a0y memoria<\/p>\n<ul>\n<li>Doble n\u00facleo de 32 bits con velocidad de 160MHz<\/li>\n<li>Memoria ROM de 448 kBytes<\/li>\n<li>Memoria SRAM de 520kBytes<\/li>\n<\/ul>\n<p>Dispne de<strong>\u00a048 Pines<\/strong><\/p>\n<ul>\n<li>18 ADC de 12 bits<\/li>\n<li>2 DAC de 8 bits<\/li>\n<li>10 pines sensores de contacto<\/li>\n<li>16 PWM<\/li>\n<li>20 Entradas\/salidas digitales<\/li>\n<\/ul>\n<h3>Alimentaci\u00f3n y modos de consumo<\/h3>\n<p>Para un correcto funcionamiento del ESP32 es necesario subministrar un voltaje de entre 2,8V y 3,6V. La energ\u00eda que consume depende del modo de funcionamiento. Contiene un modo, el\u00a0<strong>Ultra Low Power Solution (ULP)<\/strong>, en que se contin\u00faan realizando tareas b\u00e1sicas (ADC, RTC\u2026) en el modo Sleep.<\/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\" sizes=\"(max-width: 251px) 100vw, 251px\" 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\" alt=\"\" width=\"251\" height=\"251\" \/><\/p>\n<p>Descargar Manual \u2013&gt;\u00a0<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>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\" sizes=\"(max-width: 188px) 100vw, 188px\" 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\" alt=\"\" width=\"188\" height=\"214\" \/><\/strong><\/p>\n<hr \/>\n<h4>Pines hembra<\/h4>\n<p><img loading=\"lazy\" class=\"alignnone wp-image-6977\" src=\"https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2022\/07\/pines-hembra.jpg\" alt=\"\" width=\"364\" height=\"271\" srcset=\"https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2022\/07\/pines-hembra.jpg 500w, https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2022\/07\/pines-hembra-300x223.jpg 300w\" sizes=\"(max-width: 364px) 100vw, 364px\" \/><\/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\" sizes=\"(max-width: 300px) 100vw, 300px\" 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\" alt=\"\" width=\"300\" height=\"300\" \/><\/p>\n<hr \/>\n<p><strong>PCB<\/strong><\/p>\n<p><img loading=\"lazy\" class=\"alignnone wp-image-6975\" src=\"https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2022\/07\/pcb-1024x822.png\" alt=\"\" width=\"431\" height=\"346\" srcset=\"https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2022\/07\/pcb-1024x822.png 1024w, https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2022\/07\/pcb-300x241.png 300w, https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2022\/07\/pcb-768x616.png 768w, https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2022\/07\/pcb-1536x1232.png 1536w, https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2022\/07\/pcb-2048x1643.png 2048w, https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2022\/07\/pcb-820x658.png 820w\" sizes=\"(max-width: 431px) 100vw, 431px\" \/><\/p>\n<p>Descargar archivo gerber &#8211;&gt; <a href=\"https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2022\/07\/Esp32_fingerprint_PCB.zip\">Esp32_fingerprint_PCB<\/a><\/p>\n<hr \/>\n<p>C\u00f3digo Fuente<\/p>\n<pre class=\"lang:arduino decode:true \" title=\"C\u00f3digo Fuente\">\/\/ Importar bibliotecas necesarias\r\n#include &lt;WiFi.h&gt;\r\n#include &lt;HTTPClient.h&gt;\r\n#include &lt;Adafruit_Fingerprint.h&gt;\r\nAdafruit_Fingerprint finger = Adafruit_Fingerprint(&amp;Serial2);\r\nuint8_t id;\r\nint pin27 = 27;\r\nconst int led = 2;\/\/Led onboard del esp32\r\nString numID;\r\nint codigo;\r\n\/\/ Establezca su nombre y contrase\u00f1a de wifi\r\nconst char* ssid = \"Tu_red_wifi\";\r\nconst char* password = \"Tu_clave_wifi\";\r\n\/\/ La URL de tu canal de thingspeak con el n\u00famero de api_key\r\nString nombreServidor = \"https:\/\/api.thingspeak.com\/update?api_key=Tu_Api_Key\";\r\nvoid setup()  \r\n{\r\n  while (!Serial);  \/\/ Para Yun\/Leo\/Micro\/Zero\/...\r\n  Serial.begin(9600);\/\/Velocidad del puerto serie arduino\r\n  pinMode(pin27, OUTPUT);\/\/Buzzer\r\n  pinMode(led, OUTPUT);\/\/Led onboard del esp32\r\n  WiFi.begin(ssid, password); \/\/ Intenta conectarte a wifi con nuestra contrase\u00f1a\r\n  Serial.println(\"Conectando\"); \/\/ Imprime nuestro estado en el monitor de serie\r\n  \/\/ Espera a que se conecte el wifi\r\n  while(WiFi.status() != WL_CONNECTED) {\r\n    delay(500);\r\n    Serial.print(\".\");\r\n  }\r\n  Serial.println(\"\");\r\n  Serial.print(\"Conectado a la red WiFi con la direcci\u00f3n IP: \");\r\n  Serial.println(WiFi.localIP());\r\n \/\/Dos bip indican que se conect\u00f3 el dispositivo a la red wifi\r\n  bip(100);\r\n  delay(400);\r\n  bip(100);\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 una huella v\u00e1lida...\");\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\nbip(100);\r\ndelay(100);\r\nnumID = String(finger.fingerID); \/\/Convierte el id en cadena para ser compatible con el display\r\n\r\nSerial.print(\"Huella Correcta # \");\r\nSerial.println(numID);\r\ndigitalWrite(led, HIGH);\r\n\/\/\/\/---------------------\r\nif(WiFi.status()== WL_CONNECTED){ \/\/ Comprueba que la wifi todav\u00eda est\u00e9 conectada\r\nHTTPClient http; \/\/ Inicializar nuestro cliente HTTP\r\n  String url = nombreServidor + \"&amp;field1=\" + numID ; \/\/ Definir nuestra URL completa    \r\n  http.begin(url.c_str()); \/\/ Inicializa nuestra solicitud HTTP     \r\n  int codigoRespuestaHTTP = http.GET(); \/\/ Enviar solicitud HTTP   \r\n  if (codigoRespuestaHTTP &gt; 0){ \/\/ Verifica que haya c\u00f3digo de estado HTTP correcto\r\n    Serial.print(\"Codigo de respuesta HTTP: \");\r\n    Serial.println(codigoRespuestaHTTP);\r\n    codigo = codigoRespuestaHTTP;\r\n  }else{\r\n    Serial.print(\"Codigo de error: \");\r\n    Serial.println(codigoRespuestaHTTP);\r\n\/\/Reintentamos una vez m\u00e1s por si hubo un error en la comunicaci\u00f3n\r\n    http.begin(url.c_str()); \/\/ Inicializa nuestra solicitud HTTP      \r\n  int codigoRespuestaHTTP = http.GET(); \/\/ Enviar solicitud HTTP     \r\n  if (codigoRespuestaHTTP &gt; 0){ \/\/ Verifica que haya c\u00f3digo de estado HTTP correcto\r\n    Serial.print(\"Codigo de respuesta HTTP: \");\r\n    Serial.println(codigoRespuestaHTTP);\r\n  }\r\n  }\r\n  http.end();   \r\n    }\r\n    else {\r\n      Serial.println(\"WiFi desconectado\");\r\n    }\r\nnumID=\"\";\r\ndelay(10000);\r\n\/\/Bip largo sibi\u00f3 datos a thingspeak\r\nif(codigo == 200){\r\ndigitalWrite(led, LOW);\r\nbip(750);\r\n}\r\n\/\/Tres bip hubo un problema al subir los datos a thingpeag\r\nif(codigo != 200){\r\nbip(150);\r\ndelay(150);\r\ndigitalWrite(led, LOW);\r\nbip(150);\r\ndelay(150);\r\ndigitalWrite(led, HIGH);\r\nbip(150);\r\ndelay(150);\r\ndigitalWrite(led, LOW);\r\n}\r\n}\r\n\/\/Sonido del buzzer\r\nvoid bip(int demora){\r\ndigitalWrite(pin27, HIGH);\r\ndelay(demora);\r\ndigitalWrite(pin27, LOW);  \r\n  }<\/pre>\n<hr \/>\n<p>C\u00f3digo Enroll para esp32<\/p>\n<pre class=\"lang:default decode:true \" title=\"C\u00f3digo Fuente enroll\">#include &lt;Adafruit_Fingerprint.h&gt;\r\nAdafruit_Fingerprint finger = Adafruit_Fingerprint(&amp;Serial2);\r\n\r\nuint8_t id;\r\n\r\nuint8_t getFingerprintEnroll();\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>C\u00f3digo delete para esp32<\/p>\n<pre class=\"lang:default decode:true \" title=\"C\u00f3digo Fuente delete\">#include &lt;Adafruit_Fingerprint.h&gt;\r\nAdafruit_Fingerprint finger = Adafruit_Fingerprint(&amp;Serial2);\r\nuint8_t getFingerprintEnroll(uint8_t id);\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<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>\n<hr \/>\n<p><strong>VIDEO RECOMENDADO<\/strong><\/p>\n<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<!-- AddThis Advanced Settings generic via filter on the_content --><!-- AddThis Share Buttons generic via filter on the_content -->","protected":false},"excerpt":{"rendered":"<p>En este tutorial veremos como crear un lector\/reloj de control de personal con esp32, un sensor lector de huellas digitales o fingerprint. Todos los datos se van a subir a la nube, a traves de los servicios de thingspeak.com Se va incluir el armado del circuito electr\u00f3nico, la explicaci\u00f3n detallada del c\u00f3digo fuente y finalmente, [&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":6974,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[11],"tags":[351,181,486,906,595,1071,1069,624,1447,1448,1449,1450,1400,1413,1414,1446,101,145,1068,1066,917,246,31,1401,1135,687],"_links":{"self":[{"href":"https:\/\/rogerbit.com\/wprb\/wp-json\/wp\/v2\/posts\/6973"}],"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=6973"}],"version-history":[{"count":3,"href":"https:\/\/rogerbit.com\/wprb\/wp-json\/wp\/v2\/posts\/6973\/revisions"}],"predecessor-version":[{"id":6980,"href":"https:\/\/rogerbit.com\/wprb\/wp-json\/wp\/v2\/posts\/6973\/revisions\/6980"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/rogerbit.com\/wprb\/wp-json\/wp\/v2\/media\/6974"}],"wp:attachment":[{"href":"https:\/\/rogerbit.com\/wprb\/wp-json\/wp\/v2\/media?parent=6973"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/rogerbit.com\/wprb\/wp-json\/wp\/v2\/categories?post=6973"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/rogerbit.com\/wprb\/wp-json\/wp\/v2\/tags?post=6973"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}