        <style>
            #donation_buttons td{
                border:medium none;
                background: inherit !important;
            }
            #donation_buttons table{               
                border:medium none;
                margin: auto;
                width: auto;
            }
        </style>
        {"id":7946,"date":"2025-03-21T15:01:23","date_gmt":"2025-03-21T15:01:23","guid":{"rendered":"https:\/\/rogerbit.com\/wprb\/?p=7946"},"modified":"2025-03-21T15:02:11","modified_gmt":"2025-03-21T15:02:11","slug":"firgerprint-telegram","status":"publish","type":"post","link":"https:\/\/rogerbit.com\/wprb\/2025\/03\/firgerprint-telegram\/","title":{"rendered":"Control de acceso con m\u00f3dulo firgerprint y notificaciones por telegram"},"content":{"rendered":"<p><iframe loading=\"lazy\" title=\"Control de acceso con m\u00f3dulo firgerprint y notificaciones por telegram - PCBWay.es\" width=\"1160\" height=\"653\" src=\"https:\/\/www.youtube.com\/embed\/D2hrRqBQ9NE?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe><\/p>\n<hr \/>\n<p>El sistema que presentamos es una soluci\u00f3n completa de control de acceso basada en tecnolog\u00eda de reconocimiento de huellas dactilares, implementada en una plataforma ESP32. Este proyecto combina hardware y software para crear un sistema de seguridad fiable y vers\u00e1til que puede ser utilizado en hogares, oficinas, laboratorios o cualquier espacio que requiera un control de acceso seguro.<\/p>\n<p>Componentes principales del sistema:<\/p>\n<p>1. <strong>Reconocimiento biom\u00e9trico<\/strong>: Utiliza un sensor de huellas dactilares para identificar a los usuarios autorizados de manera r\u00e1pida y precisa.<\/p>\n<p>2. <strong>Notificaciones remotas<\/strong>: Implementa comunicaci\u00f3n con Telegram para enviar alertas y registros de acceso en tiempo real.<\/p>\n<p>3. <strong>Control f\u00edsico<\/strong>: Mediante un servomotor que puede activar mecanismos de apertura como cerraduras el\u00e9ctricas o pestillos.<\/p>\n<p>4. <strong>Interfaz de usuario<\/strong>: A trav\u00e9s del puerto serie, permite gestionar usuarios, registrar nuevas huellas y configurar el sistema.<\/p>\n<p>5. <strong>Registro de actividad<\/strong>: Captura y almacena la informaci\u00f3n de cada acceso con marca de tiempo precisa gracias a la sincronizaci\u00f3n NTP.<\/p>\n<p>Este sistema proporciona una alternativa segura a los m\u00e9todos tradicionales de control de acceso como llaves o tarjetas, que pueden ser perdidas, robadas o duplicadas. La autenticaci\u00f3n biom\u00e9trica garantiza que solo las personas registradas puedan obtener acceso, mientras que las notificaciones instant\u00e1neas mantienen informados a los administradores sobre la actividad del sistema.<\/p>\n<p>El c\u00f3digo est\u00e1 dise\u00f1ado para ser flexible y f\u00e1cilmente adaptable a diferentes necesidades y configuraciones de hardware, permitiendo expandir sus funcionalidades seg\u00fan los requerimientos espec\u00edficos de cada implementaci\u00f3n.<\/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<div class=\"google-auto-placed ap_container\">\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\" sizes=\"(max-width: 364px) 100vw, 364px\" 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\" alt=\"\" width=\"364\" height=\"271\" \/><\/p>\n<hr \/>\n<p><strong>Pines macho<\/strong><\/p>\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\" sizes=\"(max-width: 431px) 100vw, 431px\" 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\" alt=\"\" width=\"431\" height=\"346\" \/><\/p>\n<p>Descargar archivo gerber \u2013&gt;\u00a0<a href=\"https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2022\/07\/Esp32_fingerprint_PCB.zip\">Esp32_fingerprint_PCB<\/a><\/p>\n<hr \/>\n<div id=\"specification-detailinfo\" class=\"infoContainer\">\n<p><strong>Crear Bot en Telegram<\/strong><\/p>\n<p><a href=\"http:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2021\/01\/Imagen1.png\"><img loading=\"lazy\" class=\"alignnone size-large wp-image-6218\" src=\"http:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2021\/01\/Imagen1-1024x576.png\" sizes=\"(max-width: 1024px) 100vw, 1024px\" srcset=\"https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2021\/01\/Imagen1-1024x576.png 1024w, https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2021\/01\/Imagen1-300x169.png 300w, https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2021\/01\/Imagen1-768x432.png 768w, https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2021\/01\/Imagen1-600x338.png 600w, https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2021\/01\/Imagen1-820x461.png 820w, https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2021\/01\/Imagen1-1320x743.png 1320w, https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2021\/01\/Imagen1.png 1920w\" alt=\"\" width=\"1024\" height=\"576\" \/><\/a><\/p>\n<p>En telegram buscamos BotFather<\/p>\n<hr \/>\n<p><a href=\"http:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2021\/01\/Imagen2.png\"><img loading=\"lazy\" class=\"alignnone size-large wp-image-6219\" src=\"http:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2021\/01\/Imagen2-1024x576.png\" sizes=\"(max-width: 1024px) 100vw, 1024px\" srcset=\"https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2021\/01\/Imagen2-1024x576.png 1024w, https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2021\/01\/Imagen2-300x169.png 300w, https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2021\/01\/Imagen2-768x432.png 768w, https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2021\/01\/Imagen2-600x338.png 600w, https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2021\/01\/Imagen2-820x461.png 820w, https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2021\/01\/Imagen2-1320x743.png 1320w, https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2021\/01\/Imagen2.png 1920w\" alt=\"\" width=\"1024\" height=\"576\" \/><\/a><\/p>\n<p>Escribimos \/start y nos aparecer\u00e1 algo similar a esto<\/p>\n<hr \/>\n<p><a href=\"http:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2021\/01\/Imagen3.png\"><img loading=\"lazy\" class=\"alignnone size-large wp-image-6220\" src=\"http:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2021\/01\/Imagen3-1024x576.png\" sizes=\"(max-width: 1024px) 100vw, 1024px\" srcset=\"https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2021\/01\/Imagen3-1024x576.png 1024w, https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2021\/01\/Imagen3-300x169.png 300w, https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2021\/01\/Imagen3-768x432.png 768w, https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2021\/01\/Imagen3-600x338.png 600w, https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2021\/01\/Imagen3-820x461.png 820w, https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2021\/01\/Imagen3-1320x743.png 1320w, https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2021\/01\/Imagen3.png 1920w\" alt=\"\" width=\"1024\" height=\"576\" \/><\/a><\/p>\n<p>Escribimos \/newbot<\/p>\n<hr \/>\n<p><a href=\"http:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2021\/01\/Imagen4_fix.png\"><img loading=\"lazy\" class=\"alignnone size-large wp-image-6221\" src=\"http:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2021\/01\/Imagen4_fix-576x1024.png\" sizes=\"(max-width: 576px) 100vw, 576px\" srcset=\"https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2021\/01\/Imagen4_fix-576x1024.png 576w, https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2021\/01\/Imagen4_fix-169x300.png 169w, https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2021\/01\/Imagen4_fix-768x1364.png 768w, https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2021\/01\/Imagen4_fix-600x1066.png 600w, https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2021\/01\/Imagen4_fix-820x1457.png 820w, https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2021\/01\/Imagen4_fix-1320x2345.png 1320w\" alt=\"\" width=\"576\" height=\"1024\" \/><\/a><\/p>\n<p>Nos aparecer\u00e9 el nombre del bot, y inventamos un nombre para nuestro bot, debe tener el formato \u00abusuario_bot\u00bb<\/p>\n<hr \/>\n<p><a href=\"http:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2021\/01\/Imagen5_fix.png\"><img loading=\"lazy\" class=\"alignnone size-large wp-image-6222\" src=\"http:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2021\/01\/Imagen5_fix-577x1024.png\" sizes=\"(max-width: 577px) 100vw, 577px\" srcset=\"https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2021\/01\/Imagen5_fix-577x1024.png 577w, https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2021\/01\/Imagen5_fix-169x300.png 169w, https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2021\/01\/Imagen5_fix-768x1364.png 768w, https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2021\/01\/Imagen5_fix-600x1066.png 600w, https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2021\/01\/Imagen5_fix-820x1456.png 820w, https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2021\/01\/Imagen5_fix-1320x2344.png 1320w\" alt=\"\" width=\"577\" height=\"1024\" \/><\/a><\/p>\n<p>Obtendremos un token que vamos a usar en el c\u00f3digo fuente<\/p>\n<hr \/>\n<p><a href=\"http:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2021\/01\/Imagen6.png\"><img loading=\"lazy\" class=\"alignnone size-large wp-image-6223\" src=\"http:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2021\/01\/Imagen6-1024x576.png\" sizes=\"(max-width: 1024px) 100vw, 1024px\" srcset=\"https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2021\/01\/Imagen6-1024x576.png 1024w, https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2021\/01\/Imagen6-300x169.png 300w, https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2021\/01\/Imagen6-768x432.png 768w, https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2021\/01\/Imagen6-600x338.png 600w, https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2021\/01\/Imagen6-820x461.png 820w, https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2021\/01\/Imagen6-1320x743.png 1320w, https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2021\/01\/Imagen6.png 1920w\" alt=\"\" width=\"1024\" height=\"576\" \/><\/a><\/p>\n<p>Ahora buscaremos IDBot, y lo iniciamos<\/p>\n<\/div>\n<hr \/>\n<p><a href=\"http:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2021\/01\/Imagen8_fix.png\"><img loading=\"lazy\" class=\"alignnone size-large wp-image-6225\" src=\"http:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2021\/01\/Imagen8_fix-576x1024.png\" sizes=\"(max-width: 576px) 100vw, 576px\" srcset=\"https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2021\/01\/Imagen8_fix-576x1024.png 576w, https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2021\/01\/Imagen8_fix-169x300.png 169w, https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2021\/01\/Imagen8_fix-768x1364.png 768w, https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2021\/01\/Imagen8_fix-600x1066.png 600w, https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2021\/01\/Imagen8_fix-820x1457.png 820w, https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2021\/01\/Imagen8_fix-1320x2345.png 1320w\" alt=\"\" width=\"576\" height=\"1024\" \/><\/a><\/p>\n<p>Escribimos \/getid y nos entregar\u00e1 el user_id que debemos colocar en el c\u00f3digo fuente<\/p>\n<hr \/>\n<p><strong>C\u00f3digo Fuente<\/strong><\/p>\n<pre class=\"lang:default decode:true \" title=\"C\u00f3digo Fuente\">#include &lt;Arduino.h&gt;\r\n#include &lt;WiFi.h&gt;\r\n#include &lt;WiFiClientSecure.h&gt;\r\n#include &lt;UniversalTelegramBot.h&gt;\r\n#include &lt;ArduinoJson.h&gt;\r\n#include &lt;Adafruit_Fingerprint.h&gt;\r\n#include &lt;ESP32Servo.h&gt;\r\n#include \"time.h\"\r\n\r\n\/\/ Configuraci\u00f3n WiFi\r\nconst char* redWifi = \"Tu_red_wifi\";\r\nconst char* contrasenaWifi = \"Tu_clave_wifi\";\r\n\r\n\/\/ Configuraci\u00f3n Telegram\r\n#define TOKEN_BOT \"Tu_token\"  \/\/ Obtener de BotFather\r\n#define ID_CHAT \"Tu_id_chat\"              \/\/ ID del chat o grupo donde enviar notificaciones\r\n\r\n\/\/ Configuraci\u00f3n del sensor de huellas (usando hardware UART2)\r\n#define HUELLA_RX 16  \/\/ Conectar al TX del sensor\r\n#define HUELLA_TX 17  \/\/ Conectar al RX del sensor\r\nAdafruit_Fingerprint sensorHuella = Adafruit_Fingerprint(&amp;Serial2);\r\n\r\n\/\/ Definici\u00f3n de pines\r\n#define PIN_BUZZER 23\r\n#define PIN_SERVO 15  \/\/ Pin para el servo SG90\r\n\r\n\/\/ Cliente seguro y bot de Telegram\r\nWiFiClientSecure cliente_seguro;\r\nUniversalTelegramBot bot(TOKEN_BOT, cliente_seguro);\r\n\r\n\/\/ Configuraci\u00f3n del servo\r\nServo servoPuerta;\r\nint posicionServoCerrado = 0;    \/\/ Posici\u00f3n inicial (cerrado)\r\nint posicionServoAbierto = 90;   \/\/ Posici\u00f3n abierta (90 grados)\r\n\r\n\/\/ Configuraci\u00f3n NTP para obtener la hora\r\nconst char* servidorNTP = \"pool.ntp.org\";\r\nconst long compensacionGMT_seg = -10800;  \/\/ UTC-3\r\nconst int compensacionVerano_seg = 0;     \/\/ Sin horario de verano\r\n\r\n\/\/ Estructura para almacenar los usuarios\r\nstruct Usuario {\r\n  uint8_t id;\r\n  String nombre;\r\n};\r\n\r\n\/\/ Array con los usuarios registrados (hasta 5)\r\nUsuario usuarios[] = {\r\n  {1, \"Usuario 1\"},\r\n  {2, \"Usuario 2\"},\r\n  {3, \"Usuario 3\"},\r\n  {4, \"Usuario 4\"},\r\n  {5, \"Usuario 5\"}\r\n};\r\nconst int numUsuarios = 5;\r\n\r\n\/\/ Variables para el sistema de registro de huellas\r\nString comandoSerial = \"\";\r\nboolean modoRegistro = false;\r\nint nuevoID = 0;\r\n\r\nvoid setup() {\r\n  Serial.begin(115200);\r\n  delay(1000);\r\n  Serial.println(\"Iniciando sistema de huellas dactilares con notificaci\u00f3n por Telegram y control de servo\");\r\n\r\n  \/\/ Configurar pin del buzzer como salida\r\n  pinMode(PIN_BUZZER, OUTPUT);\r\n  digitalWrite(PIN_BUZZER, LOW); \/\/ Asegurar que el buzzer est\u00e1 apagado al inicio\r\n  \r\n  \/\/ Configurar servo\r\n  ESP32PWM::allocateTimer(0);\r\n  servoPuerta.setPeriodHertz(50);    \/\/ Frecuencia est\u00e1ndar para servos\r\n  servoPuerta.attach(PIN_SERVO, 500, 2400);  \/\/ Valores min\/max para SG90\r\n  \r\n  \/\/ Mover el servo a la posici\u00f3n inicial\r\n  servoPuerta.write(posicionServoCerrado);\r\n  \r\n  \/\/ Notificar inicio del sistema con un breve sonido del buzzer\r\n  sonarBuzzer(100); \/\/ Beep corto de 100ms al iniciar\r\n  delay(100);\r\n  sonarBuzzer(100);\r\n\r\n  \/\/ Inicializar sensor de huellas\r\n  Serial2.begin(57600, SERIAL_8N1, HUELLA_RX, HUELLA_TX);\r\n  if (!sensorHuella.verifyPassword()) {\r\n    Serial.println(\"No se encontr\u00f3 el sensor de huellas dactilares\");\r\n    while (1) { delay(1); }\r\n  }\r\n  Serial.println(\"Sensor de huellas dactilares encontrado!\");\r\n  Serial.print(\"Capacidad del sensor: \"); Serial.println(sensorHuella.capacity);\r\n\r\n  \/\/ Conectar a WiFi\r\n  WiFi.begin(redWifi, contrasenaWifi);\r\n  Serial.print(\"Conectando a 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.println(\"Conectado a WiFi\");\r\n  Serial.print(\"Direcci\u00f3n IP: \");\r\n  Serial.println(WiFi.localIP());\r\n\r\n  \/\/ Configurar certificados para Telegram (necesario desde 2023)\r\n  cliente_seguro.setCACert(TELEGRAM_CERTIFICATE_ROOT);\r\n\r\n  \/\/ Configurar servidor NTP\r\n  configTime(compensacionGMT_seg, compensacionVerano_seg, servidorNTP);\r\n  \r\n  \/\/ Notificar inicio del sistema\r\n  String mensajeInicio = \"Sistema de huellas iniciado!!!\";\r\n  bot.sendMessage(ID_CHAT, mensajeInicio, \"Markdown\");\r\n  \r\n  \/\/ Mostrar comandos disponibles\r\n  Serial.println(\"\\nComandos disponibles:\");\r\n  Serial.println(\"- enroll ID : Registra una nueva huella con el ID especificado\");\r\n  Serial.println(\"- list : Muestra los usuarios registrados\");\r\n  Serial.println(\"- delete ID : Elimina la huella con el ID especificado\");\r\n  Serial.println(\"- help : Muestra esta ayuda\");\r\n}\r\n\r\nvoid loop() {\r\n  \/\/ Leer comandos seriales para registro de huellas\r\n  if (Serial.available()) {\r\n    char c = Serial.read();\r\n    if (c == '\\n') {\r\n      procesarComandoSerial(comandoSerial);\r\n      comandoSerial = \"\";\r\n    } else {\r\n      comandoSerial += c;\r\n    }\r\n  }\r\n\r\n  \/\/ Si estamos en modo de registro, no verificamos huellas existentes\r\n  if (modoRegistro) {\r\n    if (nuevoID &gt; 0) {\r\n      int resultado = registrarHuella(nuevoID);\r\n      if (resultado == 0) {\r\n        \/\/ Registro exitoso\r\n        sonarBuzzer(100);\r\n        delay(100);\r\n        sonarBuzzer(100);\r\n        delay(100);\r\n        sonarBuzzer(100);\r\n        \r\n        String mensaje = \"\u2705 Nueva huella registrada\\n\";\r\n        mensaje += \"\ud83d\udc64 ID #\" + String(nuevoID) + \"\\n\";\r\n        mensaje += \"\ud83d\udd52 \" + obtenerHoraFormateada();\r\n        bot.sendMessage(ID_CHAT, mensaje, \"Markdown\");\r\n      }\r\n      modoRegistro = false;\r\n      nuevoID = 0;\r\n    }\r\n    return;\r\n  }\r\n\r\n  \/\/ Verificar si hay una huella en el sensor\r\n  int idHuella = obtenerIDHuella();\r\n  \r\n  if (idHuella != -1) {\r\n    Serial.print(\"Huella detectada con ID #\"); Serial.println(idHuella);\r\n    servoPuerta.write(posicionServoAbierto);\r\n    \/\/ Hacer sonar el buzzer al detectar una huella v\u00e1lida\r\n    sonarBuzzer(200); \/\/ Beep de 200ms\r\n    \r\n    \/\/ Buscar el usuario correspondiente a la huella\r\n    String nombreUsuario = \"Usuario desconocido\";\r\n    for (int i = 0; i &lt; numUsuarios; i++) {\r\n      if (usuarios[i].id == idHuella) {\r\n        nombreUsuario = usuarios[i].nombre;\r\n        break;\r\n      }\r\n    }\r\n    \r\n    \/\/ Obtener la hora actual\r\n    String horaActual = obtenerHoraFormateada();\r\n    \r\n    \/\/ Enviar notificaci\u00f3n de Telegram\r\n    String mensaje = \"\u2705 Acceso autorizado\\n\";\r\n    mensaje += \"\ud83d\udc64 *\" + nombreUsuario + \"*\\n\";\r\n    mensaje += \"\ud83d\udd52 \" + horaActual;\r\n    \r\n    bot.sendMessage(ID_CHAT, mensaje, \"Markdown\");\r\n    Serial.println(\"Notificaci\u00f3n enviada a Telegram: \" + mensaje);\r\n    \r\n    \/\/ Abrir el mecanismo (mover el servo)\r\n    Serial.println(\"Abriendo mecanismo...\");\r\n    \/\/servoPuerta.write(posicionServoAbierto);\r\n    \r\n    \/\/ Esperar 5 segundos\r\n    delay(5000);\r\n    \r\n    \/\/ Cerrar el mecanismo (volver el servo a posici\u00f3n inicial)\r\n    Serial.println(\"Cerrando mecanismo...\");\r\n    servoPuerta.write(posicionServoCerrado);\r\n    \r\n    \/\/ Esperar un tiempo para evitar m\u00faltiples detecciones del mismo dedo\r\n    delay(1000);\r\n  }\r\n  \r\n  delay(50);  \/\/ Peque\u00f1a pausa entre escaneos\r\n}\r\n\r\n\/\/ Funci\u00f3n para hacer sonar el buzzer\r\nvoid sonarBuzzer(int duracion) {\r\n  digitalWrite(PIN_BUZZER, HIGH);\r\n  delay(duracion);\r\n  digitalWrite(PIN_BUZZER, LOW);\r\n}\r\n\r\n\/\/ Funci\u00f3n para procesar comandos del puerto serial\r\nvoid procesarComandoSerial(String comando) {\r\n  comando.trim();\r\n  \r\n  if (comando.startsWith(\"enroll \")) {\r\n    \/\/ Comando formato: \"enroll 6\" para registrar huella con ID 6\r\n    nuevoID = comando.substring(7).toInt();\r\n    \r\n    if (nuevoID &gt; 0 &amp;&amp; nuevoID &lt;= 127) {  \/\/ La mayor\u00eda de sensores soportan hasta 127 huellas\r\n      modoRegistro = true;\r\n      Serial.println(\"Iniciando registro de nueva huella con ID #\" + String(nuevoID));\r\n      Serial.println(\"Siga las instrucciones...\");\r\n    } else {\r\n      Serial.println(\"ID inv\u00e1lido. Use un n\u00famero entre 1 y 127.\");\r\n    }\r\n  } \r\n  else if (comando == \"list\") {\r\n    \/\/ Listar usuarios registrados\r\n    Serial.println(\"Usuarios registrados:\");\r\n    for (int i = 0; i &lt; numUsuarios; i++) {\r\n      Serial.println(\"ID #\" + String(usuarios[i].id) + \": \" + usuarios[i].nombre);\r\n    }\r\n    \r\n    \/\/ Tambi\u00e9n podemos verificar cu\u00e1les IDs est\u00e1n ocupados en el sensor\r\n    Serial.println(\"\\nComprobando huellas almacenadas en el sensor...\");\r\n    for (int i = 1; i &lt;= 10; i++) { \/\/ Comprobar primeros 10 IDs (ajusta seg\u00fan necesidad)\r\n      uint8_t p = sensorHuella.loadModel(i);\r\n      if (p == FINGERPRINT_OK) {\r\n        Serial.println(\"ID #\" + String(i) + \": Huella encontrada\");\r\n      }\r\n    }\r\n  }\r\n  else if (comando == \"delete\") {\r\n    Serial.println(\"Para eliminar una huella, use: delete ID\");\r\n    Serial.println(\"Ejemplo: delete 5\");\r\n  }\r\n  else if (comando.startsWith(\"delete \")) {\r\n    int id = comando.substring(7).toInt();\r\n    if (id &gt; 0) {\r\n      if (sensorHuella.deleteModel(id) == FINGERPRINT_OK) {\r\n        Serial.println(\"Huella con ID #\" + String(id) + \" eliminada correctamente\");\r\n      } else {\r\n        Serial.println(\"Error al eliminar huella\");\r\n      }\r\n    }\r\n  }\r\n  else if (comando.startsWith(\"servo \")) {\r\n    \/\/ Comando para probar el servo: \"servo 45\" para mover a 45 grados\r\n    int pos = comando.substring(6).toInt();\r\n    if (pos &gt;= 0 &amp;&amp; pos &lt;= 180) {\r\n      Serial.println(\"Moviendo servo a posici\u00f3n: \" + String(pos));\r\n      servoPuerta.write(pos);\r\n    } else {\r\n      Serial.println(\"Posici\u00f3n inv\u00e1lida. Use un valor entre 0 y 180.\");\r\n    }\r\n  }\r\n  else if (comando == \"help\") {\r\n    Serial.println(\"Comandos disponibles:\");\r\n    Serial.println(\"- enroll ID : Registra una nueva huella con el ID especificado\");\r\n    Serial.println(\"- list : Muestra los usuarios registrados\");\r\n    Serial.println(\"- delete ID : Elimina la huella con el ID especificado\");\r\n    Serial.println(\"- servo POS : Mueve el servo a la posici\u00f3n especificada (0-180)\");\r\n    Serial.println(\"- help : Muestra esta ayuda\");\r\n  }\r\n  else {\r\n    Serial.println(\"Comando no reconocido. Escriba 'help' para ver los comandos disponibles.\");\r\n  }\r\n}\r\n\r\n\/\/ Funci\u00f3n para obtener la ID de la huella detectada\r\nint obtenerIDHuella() {\r\n  uint8_t p = sensorHuella.getImage();\r\n  if (p != FINGERPRINT_OK) return -1;\r\n\r\n  p = sensorHuella.image2Tz();\r\n  if (p != FINGERPRINT_OK) return -1;\r\n\r\n  p = sensorHuella.fingerFastSearch();\r\n  if (p != FINGERPRINT_OK) return -1;\r\n  \r\n  return sensorHuella.fingerID;\r\n}\r\n\r\n\/\/ Funci\u00f3n para obtener la hora formateada\r\nString obtenerHoraFormateada() {\r\n  struct tm timeinfo;\r\n  if (!getLocalTime(&amp;timeinfo)) {\r\n    Serial.println(\"Error al obtener la hora\");\r\n    return \"Hora no disponible\";\r\n  }\r\n  \r\n  char cadenaHora[30];\r\n  strftime(cadenaHora, sizeof(cadenaHora), \"%d\/%m\/%Y %H:%M:%S\", &amp;timeinfo);\r\n  return String(cadenaHora);\r\n}\r\n\r\n\/\/ Funci\u00f3n para el registro de nuevas huellas\r\nint registrarHuella(uint8_t id) {\r\n  int p = -1;\r\n  Serial.println(\"Esperando dedo para registrar con ID #\" + String(id));\r\n  \r\n  while (p != FINGERPRINT_OK) {\r\n    p = sensorHuella.getImage();\r\n    switch (p) {\r\n    case FINGERPRINT_OK:\r\n      Serial.println(\"Imagen tomada\");\r\n      break;\r\n    case FINGERPRINT_NOFINGER:\r\n      Serial.print(\".\");\r\n      delay(100);\r\n      break;\r\n    default:\r\n      Serial.println(\"Error en la captura de imagen\");\r\n      return p;\r\n    }\r\n  }\r\n\r\n  p = sensorHuella.image2Tz(1);\r\n  if (p != FINGERPRINT_OK) {\r\n    Serial.println(\"Error al convertir la imagen\");\r\n    return p;\r\n  }\r\n  \r\n  Serial.println(\"Retire el dedo\");\r\n  delay(2000);\r\n  p = 0;\r\n  while (p != FINGERPRINT_NOFINGER) {\r\n    p = sensorHuella.getImage();\r\n  }\r\n  \r\n  Serial.println(\"Coloque el mismo dedo nuevamente\");\r\n  p = -1;\r\n  while (p != FINGERPRINT_OK) {\r\n    p = sensorHuella.getImage();\r\n    delay(100);\r\n  }\r\n  \r\n  p = sensorHuella.image2Tz(2);\r\n  if (p != FINGERPRINT_OK) {\r\n    Serial.println(\"Error al convertir la segunda imagen\");\r\n    return p;\r\n  }\r\n  \r\n  Serial.println(\"Creando modelo para ID #\" + String(id));\r\n  p = sensorHuella.createModel();\r\n  if (p != FINGERPRINT_OK) {\r\n    Serial.println(\"Error al crear el modelo\");\r\n    return p;\r\n  }\r\n  \r\n  p = sensorHuella.storeModel(id);\r\n  if (p != FINGERPRINT_OK) {\r\n    Serial.println(\"Error al guardar el modelo\");\r\n    return p;\r\n  }\r\n  \r\n  Serial.println(\"\u00a1Huella guardada con \u00e9xito!\");\r\n  return 0;\r\n}<\/pre>\n<p>Descargar Librer\u00eda \u2013&gt;\u00a0<a href=\"https:\/\/rogerbit.com\/wprb\/wp-content\/uploads\/2021\/01\/Universal-Arduino-Telegram-Bot-master.zip\">Universal-Arduino-Telegram-Bot-master<\/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-n2\" 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<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=\"\ud83d\udc1f\ud83d\udc20 Como hacer un alimentador autom\u00e1tico de peces \ud83d\udc20\ud83d\udc1f - PCBWay.es\" width=\"1160\" height=\"653\" src=\"https:\/\/www.youtube.com\/embed\/PzxpNWPKFEM?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe><\/p>\n<\/div>\n<!-- AddThis Advanced Settings generic via filter on the_content --><!-- AddThis Share Buttons generic via filter on the_content -->","protected":false},"excerpt":{"rendered":"<p>El sistema que presentamos es una soluci\u00f3n completa de control de acceso basada en tecnolog\u00eda de reconocimiento de huellas dactilares, implementada en una plataforma ESP32. Este proyecto combina hardware y software para crear un sistema de seguridad fiable y vers\u00e1til que puede ser utilizado en hogares, oficinas, laboratorios o cualquier espacio que requiera un control [&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":7947,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[11],"tags":[45,2251,2245,1680,2242,2250,2253,2238,1217,2244,331,465,2239,1835,2252,145,1816,154,2241,1923,2240,2243,2248,574,2246,2249,1090,2247],"_links":{"self":[{"href":"https:\/\/rogerbit.com\/wprb\/wp-json\/wp\/v2\/posts\/7946"}],"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=7946"}],"version-history":[{"count":1,"href":"https:\/\/rogerbit.com\/wprb\/wp-json\/wp\/v2\/posts\/7946\/revisions"}],"predecessor-version":[{"id":7948,"href":"https:\/\/rogerbit.com\/wprb\/wp-json\/wp\/v2\/posts\/7946\/revisions\/7948"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/rogerbit.com\/wprb\/wp-json\/wp\/v2\/media\/7947"}],"wp:attachment":[{"href":"https:\/\/rogerbit.com\/wprb\/wp-json\/wp\/v2\/media?parent=7946"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/rogerbit.com\/wprb\/wp-json\/wp\/v2\/categories?post=7946"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/rogerbit.com\/wprb\/wp-json\/wp\/v2\/tags?post=7946"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}