{"id":9580,"date":"2025-12-18T19:35:40","date_gmt":"2025-12-18T18:35:40","guid":{"rendered":"https:\/\/blogs.etsii.urjc.es\/dseytr\/?p=9580"},"modified":"2025-12-19T16:54:35","modified_gmt":"2025-12-19T15:54:35","slug":"sistema-de-alarma-antirrobos","status":"publish","type":"post","link":"https:\/\/blogs.etsii.urjc.es\/dseytr\/sistema-de-alarma-antirrobos\/","title":{"rendered":"Sistema de alarma antirrobos"},"content":{"rendered":"\n<figure class=\"wp-block-image size-large is-style-default\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"679\" src=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2025\/12\/AlarmaMontada_SinFondo-1024x679.png\" alt=\"\" class=\"wp-image-9585\" srcset=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2025\/12\/AlarmaMontada_SinFondo-1024x679.png 1024w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2025\/12\/AlarmaMontada_SinFondo-300x199.png 300w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2025\/12\/AlarmaMontada_SinFondo-768x509.png 768w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2025\/12\/AlarmaMontada_SinFondo.png 1489w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Descripci\u00f3n del proyecto<\/h2>\n\n\n\n<p>Para este proyecto final, hemos decidido crear un sistema de alarma antirrobos. El objetivo es que una vez activado, el sistema monitorice continuamente el entorno mediante distintos sensores. Ante la detecci\u00f3n de una intrusi\u00f3n o de una condici\u00f3n peligrosa, el sistema responder\u00e1 activando se\u00f1ales ac\u00fasticas y visuales, mostrando informaci\u00f3n en una pantalla LCD y enviando una notificaci\u00f3n al m\u00f3vil del usuario para alertar de forma remota.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Funcionamiento<\/h2>\n\n\n\n<p>El sistema funciona de la siguiente manera:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Inicio y conexi\u00f3n a Internet<\/strong><br>Cuando se enciende lo primero que hace es conectarse a internet.<br>&#8211; Si la conexi\u00f3n tiene \u00e9xito el sistema se inicia y se establece en modo reposo.<br>&#8211; Si la conexi\u00f3n falla, te avisa por la pantalla LCD y te da la opci\u00f3n de usar el sistema de manera offline, si accedes para a modo reposo.<\/li>\n\n\n\n<li><strong>Modo reposo<\/strong><br>El sistema permanece en estado de reposo hasta que se escanea una tarjeta RFID o se pulsa la A en el teclado.<\/li>\n\n\n\n<li><strong>Activaci\u00f3n del sistema<\/strong><br>Si la tarjeta es v\u00e1lida, el sistema se activa y comienza la monitorizaci\u00f3n del entorno.<\/li>\n\n\n\n<li><strong>Sistema activo<\/strong><br>Con el sistema activo los sensores detectan movimiento, humo, gas o un aumento excesivo de la temperatura.<br>Si se detecta alguna condici\u00f3n peligrosa:<br>&#8211; Se activa el buzzer.<br>&#8211; Se enciende el LED rojo.<br>&#8211; Se muestra un mensaje en la pantalla LCD indicando el tipo de alerta.<br>&#8211; Se env\u00eda una notificaci\u00f3n al m\u00f3vil del usuario indicando el tipo de alerta.<\/li>\n\n\n\n<li><strong>Desactivaci\u00f3n del sistema<\/strong><br>El sistema puede desactivarse mediante una tarjeta RFID autorizada o introduciendo un c\u00f3digo en el teclado.<\/li>\n\n\n\n<li><strong>Informaci\u00f3n en tiempo real<\/strong><br>La pantalla LCD informa en todo momento del estado actual del sistema y de los eventos ocurridos.<\/li>\n<\/ol>\n\n\n\n<p>Tambi\u00e9n existe un modo administrador en el sistema al que se accede pulsando en el teclado <em>0000<\/em>, en este modo se pueden borrar las tarjetas autorizadas, autorizar nuevas tarjetas o cambiar la clave de desactivaci\u00f3n.<\/p>\n\n\n\n<p class=\"has-small-font-size\">* Hemos a\u00f1adido un video con el funcionamiento del proyecto en el apartado <strong><em>Enlace<\/em><\/strong>, al final de esta entrada.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Hardware<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Componentes utilizados<\/h3>\n\n\n\n<figure class=\"wp-block-table is-style-regular\"><table class=\"has-fixed-layout\"><tbody><tr><td class=\"has-text-align-center\" data-align=\"center\"><strong>Componente<\/strong><\/td><td class=\"has-text-align-center\" data-align=\"center\"><strong>Uso en el proyecto<\/strong><\/td><td class=\"has-text-align-center\" data-align=\"center\"><strong>Precio<\/strong><\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">Arduino MEGA 2560<\/td><td class=\"has-text-align-left\" data-align=\"left\">Microcontrolador principal<\/td><td>Kit Propio<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">M\u00f3dulo RFID RC522<\/td><td class=\"has-text-align-left\" data-align=\"left\">Lectura de tarjetas<\/td><td>Kit Propio<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">Teclado matricial 4&#215;4<\/td><td class=\"has-text-align-left\" data-align=\"left\">Desactivaci\u00f3n mediante c\u00f3digo<\/td><td>Kit Propio<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">Sensor ultras\u00f3nico<\/td><td class=\"has-text-align-left\" data-align=\"left\">Detecci\u00f3n de movimiento<\/td><td>Kit Universidad<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">Sensor DHT11<\/td><td class=\"has-text-align-left\" data-align=\"left\">Monitorizaci\u00f3n de temperatura<\/td><td>Kit Universidad<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">Sensor de humo y gas MQ-2<\/td><td class=\"has-text-align-left\" data-align=\"left\">Detecci\u00f3n de humo y gases<\/td><td>Comprado: 2\u20ac<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">Pasive&nbsp;buzzer<\/td><td class=\"has-text-align-left\" data-align=\"left\">Alarma sonora<\/td><td>Kit Propio<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">LED rojo<\/td><td class=\"has-text-align-left\" data-align=\"left\">Alarma visual<\/td><td>Kit Universidad<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">M\u00f3dulo de comunicaci\u00f3n (NodeMCU ESP)<\/td><td class=\"has-text-align-left\" data-align=\"left\">Env\u00edo de notificaciones al m\u00f3vil<\/td><td>Comprado: 3\u20ac<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">Pantalla LCD 1602<\/td><td class=\"has-text-align-left\" data-align=\"left\">Visualizaci\u00f3n del estado<\/td><td>Kit Universidad<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">Botones,&nbsp;protoboard, cables y resistencias<\/td><td class=\"has-text-align-left\" data-align=\"left\">Conexi\u00f3n de componentes<\/td><td>Kit Propio<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Esquema de conexiones<\/h3>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"851\" src=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2025\/12\/Empotrados-1024x851.png\" alt=\"\" class=\"wp-image-9583\" srcset=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2025\/12\/Empotrados-1024x851.png 1024w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2025\/12\/Empotrados-300x249.png 300w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2025\/12\/Empotrados-768x638.png 768w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2025\/12\/Empotrados-1536x1276.png 1536w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2025\/12\/Empotrados-2048x1702.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Sistema montado<\/h3>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"473\" src=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2025\/12\/AlarmaPorDentro-1024x473.jpeg\" alt=\"\" class=\"wp-image-9588\" srcset=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2025\/12\/AlarmaPorDentro-1024x473.jpeg 1024w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2025\/12\/AlarmaPorDentro-300x138.jpeg 300w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2025\/12\/AlarmaPorDentro-768x354.jpeg 768w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2025\/12\/AlarmaPorDentro-1536x709.jpeg 1536w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2025\/12\/AlarmaPorDentro.jpeg 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Software<\/h2>\n\n\n\n<p>El software del proyecto se divide en dos c\u00f3digos, uno principal para la placa Arduino MEGA 2560, y otro para el NodeMCU encargado de la conexi\u00f3n a Internet y el env\u00edo a Telegram.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">C\u00f3digo principal<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>\/*\n * ======================================================================================\n * PROYECTO GRUPO 11 - SISTEMA DE SEGURIDAD CON NOTIFICACI\u00d3N AL TEL\u00c9FONO.\n * ======================================================================================\n * DESCRIPCI\u00d3N:\n * - Sistema de alarma que utiliza m\u00faltiples sensores (Ultrasonido, Temperatura, Gas).\n * - Se activa\/desactiva mediante teclado o tarjetas RFID.\n * - Las tarjetas RFID se guardan en la memoria EEPROM (no se borran al apagar).\n * - Se comunica con un m\u00f3dulo WiFi (NodeMCU) v\u00eda Serial1 para alertas de Telegram.\n * ======================================================================================\n * FUNCIONAMIENTO:\n * - Tecla 'A': ARMA el sistema.\n * - C\u00f3digo \"0000\": Entra en MODO ADMIN para grabar nueva tarjeta.\n * - Hasta 5 tarjetas RFID guardadas en EEPROM (persistentes).\n * ======================================================================================\n*\/\n\n\/\/ --------------------------------------------------------------------------------------\n\/\/ 1. LIBRER\u00cdAS Y CONSTANTES\n\/\/ --------------------------------------------------------------------------------------\n\n#include &lt;SPI.h&gt;            \/\/ Protocolo de comunicaci\u00f3n para el lector RFID.\n#include &lt;MFRC522.h&gt;        \/\/ Biblioteca para manejar el lector RFID RC522.\n#include &lt;LiquidCrystal.h&gt;  \/\/ Biblioteca para manejar la pantalla LCD.\n#include &lt;Keypad.h&gt;         \/\/ Biblioteca para manejar el teclado matricial.\n#include &lt;DHT.h&gt;            \/\/ Biblioteca para el sensor de temperatura\/humedad.\n#include &lt;EEPROM.h&gt;         \/\/ Biblioteca para leer\/escribir en la memoria interna del Arduino.\n\n\/\/ --- PINES ---\n\n\/\/ LCD\nconst int rs = 31, en = 33, d4 = 35, d5 = 37, d6 = 39, d7 = 41; \/\/ Definimos qu\u00e9 pines del Arduino van a la pantalla.\n\/\/ ACTUADORES\n#define PIN_BUZZER 9    \/\/ Zumbador para sonido de alarma.\n#define PIN_LED 4       \/\/ LED indicador de estado\/alarma.\n\/\/ SENSORES\n#define PIN_TRIG 6      \/\/ Pin de disparo del sensor Ultras\u00f3nico.\n#define PIN_ECHO 7      \/\/ Pin de eco del sensor Ultras\u00f3nico.\n#define PIN_DHT 8       \/\/ Pin de datos del sensor de temperatura.\n#define PIN_GAS A0      \/\/ Pin anal\u00f3gico para el sensor de gas (MQ).\n\/\/ COMUNICACI\u00d3N RFID\n#define SS_PIN 53 \/\/ Pin Slave Select para SPI.\n#define RST_PIN 5 \/\/ Pin de Reset del m\u00f3dulo RFID.\n\/\/ NodeMCU\n#define RST_PIN_NODE 2 \/\/ Pin para resetear el NodeMCU\n\n\/\/ --- CONFIGURACI\u00d3N DE SENSORES ---\n\n#define DHTTYPE DHT11   \/\/ Modelo del sensor de temperatura (DHT11).\n\n\/\/ --- CONFIGURACI\u00d3N DE MEMORIA (EEPROM) ---\n\n\/\/ TARJETAS RFID\n#define MAX_TARJETAS 5  \/\/ M\u00e1ximo del n\u00famero de tarjetas que recordaremos.\n#define UID_SIZE 4      \/\/ Tama\u00f1o del identificador de la tarjeta (4 bytes est\u00e1ndar).\nbyte tarjetasValidas&#091;MAX_TARJETAS]&#091;UID_SIZE]; \/\/ Matriz en RAM para guardar las tarjetas le\u00eddas de EEPROM.\n\/\/ CLAVE CORRECTA\n#define EEPROM_ADDR_CLAVE 100   \/\/ Direcci\u00f3n inicial para la clave.\n#define CLAVE_SIZE 4            \/\/ Tama\u00f1o de la clave (4 d\u00edgitos).\n\n\/\/ --------------------------------------------------------------------------------------\n\/\/ 2. CREACI\u00d3N DE OBJETOS\n\/\/ --------------------------------------------------------------------------------------\n\nLiquidCrystal lcd(rs, en, d4, d5, d6, d7);  \/\/ Creamos el objeto pantalla LCD.\nMFRC522 rfid(SS_PIN, RST_PIN);  \/\/ Creamos el objeto RFID.\nDHT dht(PIN_DHT, DHTTYPE);  \/\/ Creamos el objeto sensor DHT.\n\n\/\/ --- CONFIGURACI\u00d3N TECLADO MATRICIAL (4x4) ---\n\nconst byte FILAS = 4;\nconst byte COLS = 4;\nchar keys&#091;FILAS]&#091;COLS] = { \/\/ Mapa de caracteres del teclado.\n  {'1','2','3','A'},\n  {'4','5','6','B'},\n  {'7','8','9','C'},\n  {'*','0','#','D'}\n};\nbyte rowPins&#091;FILAS] = {36, 34, 32, 30}; \/\/ Pines conectados a las filas.\nbyte colPins&#091;COLS] = {28, 26, 24, 22};  \/\/ Pines conectados a las columnas.\nKeypad teclado = Keypad(makeKeymap(keys), rowPins, colPins, FILAS, COLS); \/\/ Creamos el objeto teclado.\n\n\/\/ --------------------------------------------------------------------------------------\n\/\/ 3. VARIABLES GLOBALES\n\/\/ --------------------------------------------------------------------------------------\n\n\/\/ M\u00c1QUINA DE ESTADOS\nenum Estado { DESARMADO, ARMADO, ALARMA, ADMIN, ERROR }; \/\/ Enumeraci\u00f3n para la \"M\u00e1quina de Estados\": define en qu\u00e9 situaci\u00f3n est\u00e1 la alarma.\nEstado estadoActual;  \/\/ El estado actual.\n\n\/\/ VARIABLES DEL SISTEMA\nString claveCorrecta = \"1234\";    \/\/ Clave maestra para desarmar por teclado.\nString inputClave = \"\";           \/\/ Variable para ir guardando lo que teclea el usuario.\nString motivoAlarma = \"\";         \/\/ Guarda la raz\u00f3n de la alarma (Gas, Intruso, Fuego).\n\n\/\/ TIMERS y FLAGs\nunsigned long previousMillis = 0; \/\/ Para controlar tiempos sin usar delay() (multitarea).\nbool ledState = LOW;  \/\/ Estado del LED parpadeante en alarma.\n\n\/\/ --------------------------------------------------------------------------------------\n\/\/ 5. PROTOTIPOS DE FUNCIONES (SOLUCI\u00d3N AL ERROR DE COMPILACI\u00d3N)\n\/\/ --------------------------------------------------------------------------------------\n\/\/ Declaramos las funciones aqu\u00ed para que el compilador sepa que existen antes de usarlas.\n\nvoid loopDesarmado();\nvoid loopArmado();\nvoid loopAlarma();\nvoid loopAdmin();\nvoid loopError();\nvoid cargarTarjetas();\nvoid guardarTarjeta(byte nuevoUID&#091;UID_SIZE]);\nvoid borrarTarjetas();\nbool esTarjetaValida(byte uid&#091;UID_SIZE]);\nvoid guardarClave(String clave);\nvoid cargarClave();\nvoid cambiarClaveCorrecta();\nvoid cambiarEstado(Estado nuevo);\nvoid triggerAlarma(String motivo);\nvoid enviarMensajeTelegram(String mensaje);\nvoid textoArmando();\nbool gestionarPreAlarma();\nvoid mensajeLCD(String linea1, String linea2);\nvoid gestionarTecladoLCD();\nbool leerRFID();\nbool checkUltrasonico();\nbool checkTemp();\nbool checkGas();\n\n\/\/ --------------------------------------------------------------------------------------\n\/\/ 5. SETUP (CONFIGURACI\u00d3N INICIAL)\n\/\/ --------------------------------------------------------------------------------------\n\nvoid setup() {\n  Serial.begin(9600);   \/\/ Serial para el monitor del PC.\n  Serial1.begin(9600);  \/\/ Serial para hablar con el NodeMCU.\n\n  Serial.println(\"Iniciando MEGA\");\n  Serial.println(\"\\n\");\n  \n  SPI.begin();          \/\/ Inicia bus SPI.\n  rfid.PCD_Init();      \/\/ Inicia lector RFID.\n  lcd.begin(16, 2);     \/\/ Inicia LCD 16 columnas, 2 filas.\n  dht.begin();          \/\/ Inicia sensor temperatura.\n\n  \/\/ Configuraci\u00f3n de modos de pines.\n  pinMode(PIN_BUZZER, OUTPUT);\n  pinMode(PIN_LED, OUTPUT);\n  pinMode(PIN_TRIG, OUTPUT);\n  pinMode(PIN_ECHO, INPUT);\n\n  cargarTarjetas(); \/\/ Leer tarjetas guardadas.\n  cargarClave(); \/\/ Cargar la claveCorrecta.\n\n  mensajeLCD(\"SISTEMA LISTO\", \"GRUPO 11\");\n  delay(2000);\n\n  if(conectarWifi()) { \/\/ Si no ha habido un error.\n    mensajeLCD(\"CONEXION WIFI\", \"EXITO\");\n    delay(2500);\n    cambiarEstado(DESARMADO); \/\/ Estado inicial DESARMADO.\n  } else {  \/\/ Si ha habido un error.\n    mensajeLCD(\"CONEXION WIFI\", \"ERROR\");\n    delay(2500);\n    cambiarEstado(ERROR); \/\/ Cambiar estado a ERROR.\n  }\n}\n\n\/\/ --------------------------------------------------------------------------------------\n\/\/ 6. LOOP PRINCIPAL (M\u00c1QUINA DE ESTADOS)\n\/\/ --------------------------------------------------------------------------------------\n\nvoid loop() {\n  switch (estadoActual) { \/\/ M\u00e1quina de estados: Ejecuta una funci\u00f3n diferente seg\u00fan el estado actual.\n    case DESARMADO: loopDesarmado(); break;\n    case ARMADO: loopArmado(); break;\n    case ALARMA: loopAlarma(); break;\n    case ADMIN: loopAdmin(); break;\n    case ERROR: loopError(); break;\n  }\n}\n\n\/\/ ======================================================================================\n\/\/ 7: L\u00d3GICA DE ESTADOS (EL CEREBRO)\n\/\/ ======================================================================================\n\n\/\/ --- MODO: DESARMADO ---\n\nvoid loopDesarmado() {  \/\/ Alarma apagada.\n  char tecla = teclado.getKey();  \/\/ Lee el teclado.\n\n  if (tecla) {\n    if (tecla == '#') { \/\/ Si '#' borra la clave introducida.\n      inputClave = \"\";  \/\/ Limpia inputClave.\n      lcd.setCursor(0, 1);  \/\/ Coloca el cursor al inicio de la segunda l\u00ednea.\n      lcd.print(\"                \");  \/\/ Limpiar l\u00ednea de la pantalla.\n    } else if (tecla == 'A') {  \/\/ Si 'A' se arma el sistema.\n      textoArmando(); \/\/ Muestra en pantalla que se esta armando.\n      cambiarEstado(ARMADO);  \/\/ Cambia el estado a ARMADO.\n    } else {  \/\/ Si cualquier otra cosa se a\u00f1ade a la clave.\n      inputClave += tecla;\n      lcd.setCursor(0, 1);  \/\/ Coloca el cursor al inicio de la segunda l\u00ednea.\n      lcd.print(\"                \"); \/\/ Limpiar l\u00ednea de la pantalla.\n      lcd.setCursor(0, 1);  \/\/ Coloca el cursor al inicio de la segunda l\u00ednea.\n      lcd.print(inputClave);  \/\/ Muestra lo que escribes.\n    }\n  }\n\n  if (inputClave == \"0000\") { \/\/ C\u00f3digo secreto para entrar en modo admin.\n    inputClave = \"\";  \/\/ Limpia inputClave.\n    cambiarEstado(ADMIN); \/\/ Cambia el estado a ADMIN.\n  }\n\n  if (leerRFID()) { \/\/ Si pasas una tarjeta v\u00e1lida.\n    mensajeLCD(\"TARJETA OK\", \"\");\n    delay(1000);\n    textoArmando(); \/\/ Muestra en pantalla que se esta armando.\n    cambiarEstado(ARMADO);  \/\/ Cambia el estado a ARMADO.\n  }\n}\n\n\/\/ --- MODO: ARMADO ---\n\nvoid loopArmado() { \/\/ Alarma activa.\n  \/\/ Verifica los sensores constantemente.\n  bool intruso = checkUltrasonico();  \/\/ Comprueba sensor ultras\u00f3nico.\n  bool calor   = checkTemp();         \/\/ Comprueba sensor de temperatura.\n  bool gas     = checkGas();          \/\/ Comprueba sensor de gas.\n  String motivo;\n\n  if (calor || gas) {  \/\/ Si alg\u00fan sensor salta.\n    \/\/ Guardamos el motivo (Que sensor a saltado).\n    if (calor) {\n      motivo = \"FUEGO\/CALOR\";\n    } else {\n      motivo = \"FUGA DE GAS\";\n    }\n\n    triggerAlarma(motivo);  \/\/ Dispara la alarma.\n    return;\n  }\n\n  if(intruso) {\n    if(!gestionarPreAlarma()) { \/\/ Si no se ha identificado a tiempo.\n      triggerAlarma(\"INTRUSO\");\n    }\n    return;\n  }\n\n  \/\/ Permite desarmar con teclado o tarjeta.\n  gestionarTecladoLCD();\n  if (leerRFID()) {\n    cambiarEstado(DESARMADO); \/\/ Cambia el estado a DESARMADO.\n  }\n}\n\n\/\/ --- MODO: ALARMA DISPARADA ---\nvoid loopAlarma() { \/\/ Alarma sonando.\n  \/\/ Parpadeo de LED y sonido sin usar delay() para no bloquear el teclado.\n  unsigned long currentMillis = millis();\n  if (currentMillis - previousMillis &gt;= 200) {  \/\/ Cada 200ms cambia de estado.\n    previousMillis = currentMillis;\n    ledState = !ledState; \/\/ Invierte (Encendido -&gt; Apagado -&gt; Encendido...).\n    \/\/ Activamos el LED y el Buzzer.\n    digitalWrite(PIN_LED, ledState);\n    digitalWrite(PIN_BUZZER, ledState);\n  }\n\n  \/\/ Permite apagar la alarma con teclado o tarjeta.\n  gestionarTecladoLCD();\n  if (leerRFID()) {\n    cambiarEstado(DESARMADO); \/\/ Cambia el estado a DESARMADO.\n  }\n}\n\n\/\/ -- MODO: ADMIN (CONFIGURACI\u00d3N) ---\n\nvoid loopAdmin() {  \/\/ Modo Admin.\n  mensajeLCD(\"MODO ADMIN\",\"* = C, # = B\");\n\n  char tecla = teclado.getKey();  \/\/ Lee el teclado.\n\n  if(tecla) {\n    if (tecla == '#') { \/\/ Si pulsa '#' borra toda la memoria EEPROM.\n      borrarTarjetas(); \/\/ Borra todas las tarjetas\n      cambiarEstado(ADMIN);  \/\/ Vuelve a admin.\n      return;\n    } else if(tecla == '*') {  \/\/ Si pulsa '*' puede cambiar la clave correcta.\n      cambiarClaveCorrecta(); \/\/ Cambia la claveCorrecta.\n      delay(2000);\n      cambiarEstado(ADMIN); \/\/ Vuelve a admin.\n      return;\n    } else {  \/\/ Cualquier otra tecla\n      inputClave += tecla;\n      lcd.setCursor(0, 1);  \/\/ Coloca el cursor al inicio de la segunda l\u00ednea.\n      lcd.print(\"                \"); \/\/ Limpiar l\u00ednea de la pantalla.\n      lcd.setCursor(0, 1);  \/\/ Coloca el cursor al inicio de la segunda l\u00ednea.\n      lcd.print(inputClave);  \/\/ Muestra lo que escribes.\n    }\n  }\n\n  if (inputClave == \"0000\") { \/\/ C\u00f3digo para salir del modo admin.\n    mensajeLCD(\"SALIENDO...\", \"ADMIN CERRADO\");\n    delay(1000);\n    inputClave = \"\";  \/\/ Limpia inputClave.\n    cambiarEstado(DESARMADO); \/\/ Cambia el estado a DESARMADO.\n    return;\n  }\n  \n  \/\/ Si detecta una tarjeta nueva.\n  if (!rfid.PICC_IsNewCardPresent()) {  \/\/ Comprueba si hay una nueva tarjeta RFID cerca del lector.\n    return; \/\/ Si no hay tarjeta.\n  }\n  if (!rfid.PICC_ReadCardSerial()) {  \/\/ Intenta leer el n\u00famero de serie (UID) de la tarjeta detectada.\n    return; \/\/ Si no se puede leer el UID.\n  }\n\n  \/\/ Copia el UID de la tarjeta detectada.\n  byte nuevoUID&#091;UID_SIZE];  \/\/ Array de bytes para almacenar el UID de la tarjeta.\n  for (byte i = 0; i &lt; UID_SIZE; i++) {\n    nuevoUID&#091;i] = rfid.uid.uidByte&#091;i];  \/\/ Guarda cada byte del UID en el array.\n    Serial.print(nuevoUID&#091;i], HEX);\n    Serial.print(\" \");\n  }\n  Serial.println();\n\n  \/\/ Guarda la tarjeta en EEPROM.\n  guardarTarjeta(nuevoUID);\n\n  rfid.PICC_HaltA();  \/\/ Libera la tarjeta para que no quede bloqueada.\n  mensajeLCD(\"NUEVA TARJETA\", \"GUARDADA OK!\");\n  delay(2000);\n  cambiarEstado(ADMIN); \/\/ Vuelve a admin.\n  return;\n}\n\n\/\/ --- MODO: ERROR ---\n\nvoid loopError() {  \/\/ Error al conectar.\n  char tecla = teclado.getKey();  \/\/ Lee el teclado.\n\n  if(tecla == '*') {  \/\/ Si pulsa *.\n    cambiarEstado(DESARMADO); \/\/ Cambiar el estado a DESARMADO.\n    return; \/\/ Salir.\n  }\n}\n\n\/\/ ======================================================================================\n\/\/ 8: L\u00d3GICA DE HARDWARE Y SENSORES\n\/\/ ======================================================================================\n\nbool conectarWifi() { \/\/ Reinicia el NodeMCU y trata de sincronizar. Devuelve true si no ha habido un error.\n  \/\/ Reiniciar el NodeMCU\n  pinMode(RST_PIN_NODE, OUTPUT);\n  digitalWrite(RST_PIN_NODE,LOW); \/\/ Llevar a LOW para resetear.\n  delay(100);\n  pinMode(RST_PIN_NODE, INPUT);  \/\/ Cambiamos a INPUT para volver a HIGH (estado normal), pero sin mandar 5V, de esta forma enviara solo 3.3V.\n\n  \/\/ Sincronizaci\u00f3n: Espera a que el NodeMCU est\u00e9 listo antes de arrancar la l\u00f3gica.\n  mensajeLCD(\"CONECTANDO WIFI\",\"\");\n  int contador = 0; \/\/ Empieza el contador a 0.\n  String respuesta = \"\";  \/\/ Empieza la respuesta vac\u00eda.\n  bool error = true;  \/\/ Iniciamos como si hubiera habido un error.\n  \/\/ unsigned long tiempoInicio = millis(); \/\/ Guardamos el tiempo actual.\n\n  while(respuesta.indexOf(\"Fin Setup NodeMC\") == -1) { \/\/ Bucle mientras no haya terminado el NodeMCU.\n  \/\/ while(millis() - tiempoInicio &lt; 30000) { \/\/ Esperamos respuesta M\u00c1XIMO 30 s.\n    if (Serial1.available()) {  \/\/ Si NodeMCU env\u00eda algo.\n      respuesta = Serial1.readStringUntil('\\n');  \/\/ Lee la nueva l\u00ednea que env\u00eda NodeMCU.\n      respuesta.trim(); \/\/ Elimina espacios en blanco sobrantes.\n      Serial.println(\"Respuesta del NodeMCU: \" + respuesta);\n    }\n\n    if(respuesta.indexOf(\"Fin Setup NodeMC\") &gt;= 0) { \/\/ Salida de seguridad si ya conect\u00f3.\n      error = false; \/\/ No ha habido error.\n    }\n    if(respuesta.indexOf(\"Error de conexion\") &gt;= 0) { \/\/ Si ha habido un error en la conexi\u00f3n.\n      error = true;  \/\/ Ha habido error.\n      break; \/\/ Salir.\n    }\n\n    \/\/ Animaci\u00f3n de puntos en LCD.\n    String puntos = \"\";\n    for(int i=0; i&lt;contador; i++) {\n      puntos += \".\";\n    }\n    mensajeLCD(\"CONECTANDO WIFI\", puntos);\n\n\n    contador++; \/\/ Incrementamos el contador.\n    if(contador &gt; 5) { \/\/ Cuando llega a 5 puntos reinicia.\n      contador = 0; \/\/ Reiniciamos el contador.\n    }\n  }\n\n  if(error) { \/\/ Ha habido error.\n    return false;\n  } else {  \/\/ No ha habido error.\n    return true;\n  }\n}\n\nvoid gestionarTecladoLCD() {  \/\/ Gestiona la entrada de la clave por teclado.\n  char tecla = teclado.getKey();  \/\/ Leer teclado.\n\n  if (tecla) {\n    \/\/ Limpiar SIEMPRE la segunda l\u00ednea antes de mostrar lo que escribes.\n    lcd.setCursor(0, 1);  \/\/ Coloca el cursor al inicio de la segunda l\u00ednea.\n    lcd.print(\"                \"); \/\/ Limpia la l\u00ednea.\n\n    if (tecla == '#') { \/\/ Si pulsa '#'.\n      inputClave = \"\"; \/\/ Limpia inputClave.\n    } else {  \/\/ Si pulsa otra cosa.\n      inputClave += tecla; \/\/ A\u00f1adir tecla pulsada.\n    }\n\n    \/\/ Mostrar la clave actual en la segunda l\u00ednea.\n    lcd.setCursor(0, 1);  \/\/ Coloca el cursor al inicio de la segunda l\u00ednea.\n    lcd.print(inputClave);\n  }\n\n  \/\/ Verificar si la clave es correcta.\n  if (inputClave == claveCorrecta) { \/\/ Si es correcta.\n    inputClave = \"\";  \/\/ Limpiar inputClave.\n    cambiarEstado(DESARMADO); \/\/ Cambiar al estado DESARMADO.\n  }\n}\n\nbool leerRFID() { \/\/ Funci\u00f3n gen\u00e9rica para leer RFID y validar si la tarjeta es conocida.\n  \/\/ Si detecta una tarjeta nueva.\n  if (!rfid.PICC_IsNewCardPresent()) {  \/\/ Comprueba si hay una nueva tarjeta RFID cerca del lector.\n    return false; \/\/ Si no hay tarjeta.\n  }\n  if (!rfid.PICC_ReadCardSerial()) {  \/\/ Intenta leer el n\u00famero de serie (UID) de la tarjeta detectada.\n    return false; \/\/ Si no se puede leer el UID.\n  }\n\n  \/\/ Copia el UID de la tarjeta detectada.\n  byte uid&#091;UID_SIZE]; \/\/ Array de bytes para almacenar el UID de la tarjeta.\n  for (byte i = 0; i &lt; UID_SIZE; i++) {\n    uid&#091;i] = rfid.uid.uidByte&#091;i]; \/\/ Guarda cada byte del UID en el array.\n  }\n\n  rfid.PICC_HaltA();  \/\/ Libera la tarjeta para que no quede bloqueada.\n\n  if(esTarjetaValida(uid)) {  \/\/ Si la tarjeta es v\u00e1lida.\n    return true;\n  } else {  \/\/ Si la tarjeta NO es v\u00e1lida.\n    \/\/ Guardar el estado actual para restaurar despu\u00e9s.\n    String linea1, linea2;\n    if (estadoActual == DESARMADO) {\n      linea1 = \"DESARMADO\";\n      linea2 = \"PASE TARJETA\";\n    } else if (estadoActual == ARMADO) {\n      linea1 = \"SISTEMA ARMADO\";\n      linea2 = \"VIGILANDO...\";\n    } else if (estadoActual == ADMIN) {\n      linea1 = \"MODO ADMIN\";\n      linea2 = \"\";\n    } else if (estadoActual == ALARMA) {\n      linea1 = \"!!ALARMA!!\";\n      linea2 = motivoAlarma;\n    }\n\n    \/\/ Mostrar error temporal.\n    mensajeLCD(\"TARJETA\", \"ERRONEA\");\n    delay(2000);\n\n    \/\/ Restaurar lo que hab\u00eda antes.\n    mensajeLCD(linea1, linea2);\n\n    return false;\n  }\n}\n\nbool checkUltrasonico() { \/\/ L\u00f3gica del sensor ultras\u00f3nico.\n  long duration, distance;\n\n  \/\/ Secuencia de pulso para activar el sensor.\n  digitalWrite(PIN_TRIG, LOW);\n  delayMicroseconds(2);\n  digitalWrite(PIN_TRIG, HIGH);\n  delayMicroseconds(10);\n  digitalWrite(PIN_TRIG, LOW);\n\n  duration = pulseIn(PIN_ECHO, HIGH, 30000); \/\/ Lee el PIN_ECHO con un timeout 30ms.\n\n  if (duration == 0) {  \/\/ Si no detecta nada.\n    return false; \/\/ No activa la alarma.\n  }\n\n  distance = (duration \/ 2) \/ 29.1; \/\/ Convertir a cm.\n\n  return (distance &lt;= 20); \/\/ Alarma si hay algo a 20 cm o menos.\n}\n\nbool checkTemp() {  \/\/ L\u00f3gica del sensor de temperatura.\n  float t = dht.readTemperature();  \/\/ Lee los datos del sensor.\n\n  \/\/ Serial.print(\"Temperatura: \");\n  \/\/ Serial.println(t);\n\n  if (isnan(t)) { \/\/ Comprueba si es un n\u00famero valido.\n    return false; \/\/ Si hay un error de lectura lo ignora.\n  }\n\n  return (t &gt; 35.0); \/\/ Salta la alarma si supera 35\u00b0C.\n}\n\nbool checkGas() { \/\/ L\u00f3gica del sensor de gas.\n  long suma = 0;\n  \/\/ Hacemos 20 lecturas r\u00e1pidas para eliminar el ruido.\n  for(int i = 0; i &lt; 20; i++) {\n    suma += analogRead(PIN_GAS);  \/\/ Lee los datos del sensor.\n    delay(5); \/\/ Peque\u00f1a pausa entre lecturas.\n  }\n  int promedio = suma \/ 20; \/\/ Calcula el promedio.\n  \n  \/\/ Para comprobar y elegir el valor de calibraci\u00f3n.\n  Serial.print(\"Gas: \");\n  Serial.println(promedio);\n\n  return (promedio &gt; 400); \/\/ Valor de calibraci\u00f3n.\n}\n\n\/\/ ======================================================================================\n\/\/ 9: GESTI\u00d3N DE MEMORIA (EEPROM)\n\/\/ ======================================================================================\n\n\/\/ --- GESTI\u00d3N DE LAS TARJETAS RFID ---\n\nvoid cargarTarjetas() { \/\/ Carga las tarjetas desde la memoria permanente a la variable RAM al iniciar.\n  for (int t = 0; t &lt; MAX_TARJETAS; t++) {\n    for (int i = 0; i &lt; UID_SIZE; i++) {\n      tarjetasValidas&#091;t]&#091;i] = EEPROM.read(t * UID_SIZE + i);  \/\/ Lee cada byte de la EEPROM.\n    }\n  }\n}\n\nvoid guardarTarjeta(byte nuevoUID&#091;UID_SIZE]) {  \/\/ Guarda una nueva tarjeta en la primera posici\u00f3n libre de la EEPROM.\n  for (int t = 0; t &lt; MAX_TARJETAS; t++) {\n    bool libre = true;\n    for (int i = 0; i &lt; UID_SIZE; i++) {\n      if (tarjetasValidas&#091;t]&#091;i] != 0x00 &amp;&amp; tarjetasValidas&#091;t]&#091;i] != 0xFF) { \/\/ Verificamos si la posici\u00f3n 't' est\u00e1 vac\u00eda (0x00) o limpia (0xFF).\n        libre = false;  \/\/ Esta posici\u00f3n ya tiene una tarjeta guardada.\n        break;\n      }\n    }\n    if (libre) {  \/\/ Si encontramos un hueco libre, guardamos la tarjeta.\n      for (int i = 0; i &lt; UID_SIZE; i++) {\n        tarjetasValidas&#091;t]&#091;i] = nuevoUID&#091;i];  \/\/ Actualiza RAM.\n        EEPROM.write(t * UID_SIZE + i, nuevoUID&#091;i]);  \/\/ Actualiza EEPROM (persistente).\n      }\n      Serial.println(\"Tarjeta a\u00f1adida a EEPROM\");\n      return; \/\/ Salimos tras guardar.\n    }\n  }\n  Serial.println(\"No hay espacio para m\u00e1s tarjetas\");\n}\n\nvoid borrarTarjetas() { \/\/ Borra todas las tarjetas de la memoria (Escribe 0x00 en todo).\n  for (int t = 0; t &lt; MAX_TARJETAS; t++) {\n    for (int i = 0; i &lt; UID_SIZE; i++) {\n      tarjetasValidas&#091;t]&#091;i] = 0x00; \/\/ Limpiamos el array de tarjetasValidas.\n      EEPROM.write(t * UID_SIZE + i, 0x00); \/\/ Limpiamos la memoria EEPROM.\n    }\n  }\n  Serial.println(\"Todas las tarjetas borradas de EEPROM\");\n  mensajeLCD(\"EEPROM LIMPIA\", \"SIN TARJETAS\");\n  delay(2000);\n}\n\nbool esTarjetaValida(byte uid&#091;UID_SIZE]) {  \/\/ Comprueba si la tarjeta le\u00edda existe en nuestra lista de permitidas.\n  for (int t = 0; t &lt; MAX_TARJETAS; t++) {\n    bool coincide = true;\n    for (int i = 0; i &lt; UID_SIZE; i++) {\n      if (tarjetasValidas&#091;t]&#091;i] != uid&#091;i]) { \/\/ Si un byte no coincide, no es esta tarjeta.\n        coincide = false; \/\/ La tarjeta no vale.\n        break;\n      }\n    }\n    if (coincide) { \/\/ Si la tarjeta vale.\n      return true;  \/\/ Tarjeta encontrada en la lista.\n    }\n  }\n  return false; \/\/ Tarjeta NO encontrada en la lista.\n}\n\n\/\/ --- GESTI\u00d3N DE LA CLAVE ---\n\nvoid guardarClave(String clave) { \/\/ Funci\u00f3n para guardar la clave en la memoria EEPROM.\n  for (int i = 0; i &lt; CLAVE_SIZE; i++) {\n    EEPROM.write(EEPROM_ADDR_CLAVE + i, clave&#091;i]);  \/\/ Actualiza el EEPROM (persistente).\n  }\n  claveCorrecta = clave; \/\/ Actualizar en la RAM.\n}\n\nvoid cargarClave() { \/\/ Funci\u00f3n para cargar la clave de memoria a la RAM. \n  String clave = \"\";\n  for (int i = 0; i &lt; CLAVE_SIZE; i++) {\n    char c = EEPROM.read(EEPROM_ADDR_CLAVE + i);  \/\/ Lee la memoria EEPROM.\n    if (c &gt;= '0' &amp;&amp; c &lt;= '9') {\n      clave += c; \/\/ Validar que sea d\u00edgito.\n    }\n  }\n  if (clave.length() == CLAVE_SIZE) { \/\/ Si la clave tiene el tama\u00f1o adecuado.\n    claveCorrecta = clave; \/\/ Cargamos en la RAM.\n  } else { \/\/ Si no hay clave v\u00e1lida.\n    claveCorrecta = \"1234\"; \/\/ Cargamos en la RAM el valor por defecto.\n  }\n}\n\nvoid cambiarClaveCorrecta() { \/\/ Funci\u00f3n para cambiar la claveCorrecta.\n  mensajeLCD(\"NUEVA CLAVE:\", \"____\"); \/\/ Indicamos al usuario qu\u00e9 hacer.\n  inputClave = \"\"; \/\/ Limpia inputClave.\n\n  while(inputClave.length() &lt; CLAVE_SIZE) { \/\/ BUCLE DE BLOQUEO: No salimos de aqu\u00ed hasta tener 4 d\u00edgitos o cancelar.\n    char tecla = teclado.getKey();  \/\/ Lee el teclado.\n    \n    if (tecla) {\n      if (tecla == '#') { \/\/ Si '#' borra la clave introducida.\n        inputClave = \"\";  \/\/ Limpia inputClave.\n        lcd.setCursor(0, 1);  \/\/ Coloca el cursor al inicio de la segunda l\u00ednea.\n        lcd.print(\"                \");  \/\/ Limpiar l\u00ednea de la pantalla.\n      } else if(tecla == '*') { \/\/ Si '*' cancelar.\n        mensajeLCD(\"CANCELADO\", \"\");\n        delay(1000);\n        inputClave = \"\";  \/\/ Limpia inputClave.\n        mensajeLCD(\"MODO ADMIN\", \"\"); \/\/ Restaurar pantalla anterior.\n        return;\n      } else {  \/\/ Si cualquier otra cosa.\n        inputClave += tecla;  \/\/ Se a\u00f1ade a la clave.\n        lcd.setCursor(0, 1);  \/\/ Coloca el cursor al inicio de la segunda l\u00ednea.\n        lcd.print(\"                \"); \/\/ Limpiar l\u00ednea de la pantalla.\n        lcd.setCursor(0, 1);  \/\/ Coloca el cursor al inicio de la segunda l\u00ednea.\n        lcd.print(inputClave);  \/\/ Muestra lo que escribes.\n      }\n    }\n  }\n  \n  if (inputClave == \"0000\") { \/\/ Si la clave nueva es 0000, poner que no es v\u00e1lida.\n    mensajeLCD(\"CLAVE NO VALIDA\", \"\");\n  } else if(inputClave == claveCorrecta) { \/\/ Si la clave es la misma que estaba.\n    mensajeLCD(\"MISMA CLAVE\", \"\");\n  } else {  \/\/ Si es una nueva clave v\u00e1lida.\n    guardarClave(inputClave); \/\/ Guardar la nueva clave.\n    mensajeLCD(\"EXITO:\", \"CLAVE CAMBIADA\");\n  }\n\n  delay(2000);\n  inputClave = \"\"; \/\/ Limpia inputClave.\n  mensajeLCD(\"MODO ADMIN\", \"\"); \/\/ Volver a mostrar men\u00fa admin.\n}\n\n\/\/ ======================================================================================\n\/\/ 10: INTERFAZ DE USUARIO Y UTILIDADES\n\/\/ ======================================================================================\n\nvoid cambiarEstado(Estado nuevo) {  \/\/ Funci\u00f3n para cambiar de estado.\n  estadoActual = nuevo;\n  lcd.clear();  \/\/ Limpia la pantalla.\n  digitalWrite(PIN_BUZZER, LOW);  \/\/ Asegura silencio al cambiar.\n  digitalWrite(PIN_LED, LOW); \/\/ Apagamos el LED.\n  inputClave = \"\";  \/\/ Limpia inputClave.\n\n  \/\/ Pone el mensaje correspondiente al nuevo estado.\n  if (nuevo == DESARMADO) {\n    mensajeLCD(\"DESARMADO\", \"PASE TARJETA\");\n  } else if (nuevo == ARMADO) {\n    mensajeLCD(\"SISTEMA ARMADO\", \"VIGILANDO...\");\n  } else if (nuevo == ADMIN) {\n    mensajeLCD(\"MODO ADMIN\", \"\");\n  } else if (nuevo == ERROR) {\n    mensajeLCD(\"ERROR CONEXION\", \"OFFLINE? = *\");\n  }\n}\n\nvoid triggerAlarma(String motivo) { \/\/ Activa el estado de alarma y manda el aviso.\n  estadoActual = ALARMA;\n  motivoAlarma = motivo;\n  enviarMensajeTelegram(\"ALARMA:\" + motivo);  \/\/ Manda el mensaje al NodeMCU (Wifi).\n  mensajeLCD(\"!!ALARMA!!\", motivo); \/\/ Muestra el mensaje en la pantalla LCD.\n}\n\nvoid enviarMensajeTelegram(String mensaje) { \/\/ Env\u00eda un comando al NodeMCU para mandar mensaje por Telegram.\n  Serial1.println(mensaje); \/\/ Enviar aviso al NodeMCU.\n  Serial.println(\"Enviar: \" + mensaje); \/\/ Mostrar en Serial.\n\n  \/\/ Leer respuesta del NodeMCU.\n  if (Serial1.available()) {\n    String respuesta = Serial1.readStringUntil('\\n');\n    Serial.println(\"\\n\");\n    Serial.println(\"Respuesta del NodeMCU: \" + respuesta);\n  }\n}\n\nvoid textoArmando() { \/\/ Funci\u00f3n auxiliar que muestra en pantalla que se esta armando, con un contador de 5s.\n  mensajeLCD(\"ARMANDO...\", \"SALGA EN 5s\");\n  delay(1000);\n  for(int i=5; i&gt;0; i--){ \/\/ Cuenta atras de 5s.\n    lcd.setCursor(14,1);  \/\/ Coloca el cursor en la posici\u00f3n 14 de la segunda l\u00ednea.\n    lcd.print(i); \/\/ Escribe en esa posici\u00f3n.\n    delay(1000);\n  }\n}\n\nbool gestionarPreAlarma() { \/\/ Funci\u00f3n que gestiona un tiempo previo, para identificarse, antes de que suene la alarma.\n  mensajeLCD(\"INTRUSO DETECTADO\", \"IDENTIFICATE: 10\");\n  \n  unsigned long tiempoInicio = millis();\n  int segundosAnteriores = 10;\n\n  \/\/ Bucle que dura 10 segundos (10000 ms).\n  while (millis() - tiempoInicio &lt; 10000) {\n\n    \/\/ Cuenta atr\u00e1s de 5s en la pantalla LCD.    \n    int segundosRestantes = 10 - (millis() - tiempoInicio) \/ 1000;\n    if (segundosRestantes != segundosAnteriores) {\n      lcd.setCursor(14, 1);\n      lcd.print(\"   \"); \/\/ sobrescribe con espacios.\n      lcd.setCursor(14, 1);\n      lcd.print(segundosRestantes);\n      segundosAnteriores = segundosRestantes;\n    }\n\n    \/\/ --- LEER TECLADO ---\n    gestionarTecladoLCD();\n    if (estadoActual == DESARMADO) {\n      return true; \/\/ \u00a1Te has identificado a tiempo!\n    }\n\n    \/\/ --- LEER RFID ---\n    if (leerRFID()) {\n      cambiarEstado(DESARMADO);\n      return true; \/\/ \u00a1Te has identificado a tiempo!\n    }\n  }\n\n  return false; \/\/ Si salimos del while es que pasaron los 5s y nadie se identific\u00f3.\n}\n\nvoid mensajeLCD(String linea1, String linea2) { \/\/ Ayuda r\u00e1pida para escribir en las dos l\u00edneas del LCD.\n  lcd.clear();          \/\/ Limpia la pantalla LCD.\n  lcd.setCursor(0, 0);  \/\/ Coloca el cursor al inicio de la primera l\u00ednea.\n  lcd.print(linea1);    \/\/ Escribe el texto en la primera l\u00ednea.\n  lcd.setCursor(0, 1);  \/\/ Coloca el cursor al inicio de la segunda l\u00ednea.\n  lcd.print(linea2);    \/\/ Escribe el texto en la segunda l\u00ednea.\n}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">C\u00f3digo NodeMCU<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>\/*\n * ================================================================================================\n * PROYECTO GRUPO 11 - NODEMCU ESP8266 (M\u00d3DULO DE COMUNICACI\u00d3N).\n * ================================================================================================\n * DESCRIPCI\u00d3N:\n * 1. Se conecta a la red WiFi.\n * 2. Escucha mensajes provenientes del Arduino Mega a trav\u00e9s de SoftwareSerial (Pines D1 y D2).\n * 3. Si recibe un mensaje, lo env\u00eda a un Bot de Telegram.\n * ================================================================================================\n*\/\n\n\/\/ --------------------------------------------------------------------------------------\n\/\/ 1. LIBRER\u00cdAS\n\/\/ --------------------------------------------------------------------------------------\n\n#include &lt;ESP8266WiFi.h&gt;        \/\/ Biblioteca base para conexi\u00f3n WiFi.\n#include &lt;ESP8266HTTPClient.h&gt;  \/\/ Biblioteca para hacer peticiones web (GET\/POST).\n#include &lt;WiFiClientSecure.h&gt;   \/\/ Biblioteca para conexiones seguras (HTTPS para Telegram).\n#include &lt;Ticker.h&gt;             \/\/ Biblioteca para temporizadores (usada para parpadear el LED).\n\n\/\/ --------------------------------------------------------------------------------------\n\/\/ 2. CONFIGURACI\u00d3N DE USUARIO\n\/\/ --------------------------------------------------------------------------------------\n\n\/\/ --- DATOS WIFI ---\nconst char* ssid = \"wifi\";       \/\/ Nombre de tu WiFi (Usando la WiFi del m\u00f3vil).\nconst char* password = \"12345678\"; \/\/ Contrase\u00f1a de tu WiFi (Si no tiene pones \"\").\n\n\/\/ --- DATOS TELEGRAM ---\nconst String token = \"8349071268:AAEs5dE3DoI_XULVnBGZMyaBkCS4yPRdFXQ\"; \/\/ Token de tu bot (Obtenido de @BotFather).\nconst String chat_id = \"1477925874\"; \/\/ Tu chat_id (ID de usuario).\n\n\/\/ --- CONFIGURACI\u00d3N DE HARDWARE ---\n#define ledWifi D4 \/\/ El led integrado en el NodeMCU.\n#define PIN_RX_MEGA  D1 \/\/ Recibe datos DEL Mega (D1 del NodeMCU -&gt; TX del Mega).\n#define PIN_TX_MEGA  D2 \/\/ Env\u00eda datos AL Mega (D2 del NodeMCU -&gt; RX del Mega).\n\n\/\/ --------------------------------------------------------------------------------------\n\/\/ 3. VARIABLES Y OBJETOS GLOBALES\n\/\/ --------------------------------------------------------------------------------------\n\n\/\/ Objetos de Red.\nWiFiClientSecure client; \/\/ Cliente seguro para HTTPS.\nTicker tic_WifiLed; \/\/ Objeto para controlar el parpadeo del LED.\n\n\/\/ Variables de control.\nbyte cont = 0; \/\/ Contador de intentos.\nbyte max_intentos = 50; \/\/ Intentos de conexi\u00f3n a la Wifi.\n\n\/\/ --------------------------------------------------------------------------------------\n\/\/ 4. SETUP (INICIALIZACI\u00d3N)\n\/\/ --------------------------------------------------------------------------------------\n\nvoid setup() {\n  Serial.begin(9600);     \/\/ Canal USB (Para ver mensajes en el PC).\n\n  pinMode(ledWifi,OUTPUT); \/\/ Pin del Led.\n  digitalWrite(ledWifi, HIGH); \/\/ Apagado inicial.\n\n  client.setInsecure(); \/\/ Para HTTPS sin certificados (Telegram usa HTTPS. Esto evita tener que cargar certificados SSL complejos.).\n\n  tic_WifiLed.attach(0.2,parpadeoLedWifi); \/\/ Inicia parpadeo del led (Indica que esta intentando conectarse).\n\n  Serial.println(\"\\n\");\n  Serial.println(\"Iniciando NodeMCU\");\n\n  \/\/ --- INTENTO DE CONEXI\u00d3N WIFI ---\n  WiFi.begin(ssid, password);\n  while (WiFi.status() != WL_CONNECTED and cont &lt; max_intentos) { \/\/ Cuenta hasta 50 si no se puede conectar lo cancela.\n    cont++;\n    delay(500);\n    Serial.print(\".\");  \/\/ Imprime puntos en el PC mientras conecta.\n  }\n  \n  Serial.println(\"\");\n  \n  \/\/ --- RESULTADO DE LA CONEXI\u00d3N ---\n  if (cont &lt; max_intentos) {  \/\/ Si se conect\u00f3.  \n      Serial.println(\"********************************************\");\n      Serial.print(\"Conectado a la red WiFi: \");\n      Serial.println(WiFi.SSID());\n      Serial.print(\"IP: \");\n      Serial.println(WiFi.localIP());\n      Serial.print(\"macAdress: \");\n      Serial.println(WiFi.macAddress());\n      Serial.println(\"*********************************************\");\n  }\n  else { \/\/ No se conect\u00f3.\n      Serial.println(\"------------------------------------\");\n      Serial.println(\"Error de conexion\");\n      Serial.println(\"------------------------------------\");\n  }\n\n  tic_WifiLed.detach(); \/\/ Detiene el parpadeo.\n  digitalWrite(ledWifi,HIGH); \/\/ Se queda encendido el led.\n\n  delay(1000);  \/\/ Pausa de seguridad.\n\n  Serial.println(\"Fin Setup NodeMCU.\"); \/\/ Enviamos este mensaje al MEGA, para indicar que est\u00e1 listo.\n}\n\n\/\/ --------------------------------------------------------------------------------------\n\/\/ 5. LOOP PRINCIPAL\n\/\/ --------------------------------------------------------------------------------------\n\nvoid loop() {\n  if (Serial.available()) { \/\/ Escuchamos si hay datos llegando de MEGA.\n    String mensaje = Serial.readStringUntil('\\n'); \/\/ Recibe de MEGA.\n    mensaje.trim(); \/\/ Limpiar espacios sobrantes al final.\n\n    if(mensaje.length() &gt; 0) { \/\/ Si el mensaje tiene contenido.\n      Serial.println(\"Recibido: \" + mensaje); \/\/ Confirmar que lo hemos recibido.\n\n      \/\/ Intentamos enviar a Telegram.\n      if (mensaje.startsWith(\"ALARMA\")) { \/\/ Si el mensaje empieza por \"ALARMA\", enviamos a Telegram.\n        enviarTelegram(mensaje);\n      }\n    }\n  }\n}\n\n\/\/ --------------------------------------------------------------------------------------\n\/\/ 6. FUNCIONES\n\/\/ --------------------------------------------------------------------------------------\n\n\/\/ --- FUNCI\u00d3N PARA ENVIAR A TELEGRAM ---\n\nvoid enviarTelegram(String mensaje) {\n  if (WiFi.status() == WL_CONNECTED) {  \/\/ Verificar que seguimos conectados a internet.\n    \/\/ Necesario para evitar excepciones de memoria\n    std::unique_ptr&lt;BearSSL::WiFiClientSecure&gt;client(new BearSSL::WiFiClientSecure);\n    client-&gt;setInsecure(); \/\/ Ignorar certificados\n    \n    HTTPClient http;\n\n    \/\/ Codificar mensaje para URL (Espacios y caracteres raros b\u00e1sicos).\n    mensaje.replace(\" \", \"%20\");\n    mensaje.replace(\":\", \"%3A\");\n\n    \/\/ Construcci\u00f3n de la URL de la API de Telegram.\n    String url = \"https:\/\/api.telegram.org\/bot\" + token + \"\/sendMessage?chat_id=\" + chat_id + \"&amp;text=\" + mensaje;\n\n    \/\/ Iniciar conexi\u00f3n y enviar petici\u00f3n GET.\n    if(http.begin(*client, url)) {\n      int httpCode = http.GET();\n      http.end(); \/\/ Cerramos conexi\u00f3n.\n\n      \/\/ C\u00f3digo 200 significa \"OK\" en protocolo HTTP.\n      if (httpCode == 200) {\n        Serial.println(\"Telegram OK\");\n      } else {  \/\/ Devuelve el c\u00f3digo de error.\n        Serial.print(\"Error Telegram: \");\n        Serial.println(httpCode);\n      }\n    } else {\n      Serial.println(\"Error al conectar con API Telegram\");\n    }\n  } else { \/\/ Si no hay WiFi.\n   Serial.println(\"Error: Sin WiFi\");\n  }  \n}\n\n\/\/ --- AUXILIARES ---\n\nvoid parpadeoLedWifi(){ \/\/ Funci\u00f3n simple para cambiar el estado del LED (Encender\/Apagar)\n  byte estado = digitalRead(ledWifi);\n  digitalWrite(ledWifi,!estado);\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Enlace<\/h2>\n\n\n\n<p>En el siguiente enlace podr\u00e9is encontrar tanto los c\u00f3digos como un v\u00eddeo del funcionamiento del proyecto.<br><br><a href=\"https:\/\/drive.google.com\/drive\/folders\/1YT9nfN3aacLg8Y0ZRyPcDEtwKBk5PuBX?usp=sharing\" target=\"_blank\" rel=\"noreferrer noopener\">Enlace Google Drive<\/a><\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Descripci\u00f3n del proyecto Para este proyecto final, hemos decidido crear un sistema de alarma antirrobos. El objetivo es que una vez activado, el sistema monitorice continuamente el entorno mediante distintos sensores. Ante la detecci\u00f3n&#46;&#46;&#46;<\/p>\n","protected":false},"author":308,"featured_media":9589,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-9580","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-proyectos"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Sistema de alarma antirrobos - Proyectos con Arduino.<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/sistema-de-alarma-antirrobos\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Sistema de alarma antirrobos - Proyectos con Arduino.\" \/>\n<meta property=\"og:description\" content=\"Descripci\u00f3n del proyecto Para este proyecto final, hemos decidido crear un sistema de alarma antirrobos. El objetivo es que una vez activado, el sistema monitorice continuamente el entorno mediante distintos sensores. Ante la detecci\u00f3n&#046;&#046;&#046;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/sistema-de-alarma-antirrobos\/\" \/>\n<meta property=\"og:site_name\" content=\"Proyectos con Arduino.\" \/>\n<meta property=\"article:published_time\" content=\"2025-12-18T18:35:40+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-12-19T15:54:35+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2025\/12\/AlarmaMontada_SinFondo-1.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1489\" \/>\n\t<meta property=\"og:image:height\" content=\"987\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"dse2526g11\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"dse2526g11\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"23 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/sistema-de-alarma-antirrobos\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/sistema-de-alarma-antirrobos\\\/\"},\"author\":{\"name\":\"dse2526g11\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/#\\\/schema\\\/person\\\/975dafc857dcb6daac0576fb9a28d4aa\"},\"headline\":\"Sistema de alarma antirrobos\",\"datePublished\":\"2025-12-18T18:35:40+00:00\",\"dateModified\":\"2025-12-19T15:54:35+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/sistema-de-alarma-antirrobos\\\/\"},\"wordCount\":548,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/sistema-de-alarma-antirrobos\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2025\\\/12\\\/AlarmaMontada_SinFondo-1.png\",\"articleSection\":[\"Proyectos\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/sistema-de-alarma-antirrobos\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/sistema-de-alarma-antirrobos\\\/\",\"url\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/sistema-de-alarma-antirrobos\\\/\",\"name\":\"Sistema de alarma antirrobos - Proyectos con Arduino.\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/sistema-de-alarma-antirrobos\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/sistema-de-alarma-antirrobos\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2025\\\/12\\\/AlarmaMontada_SinFondo-1.png\",\"datePublished\":\"2025-12-18T18:35:40+00:00\",\"dateModified\":\"2025-12-19T15:54:35+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/sistema-de-alarma-antirrobos\\\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/sistema-de-alarma-antirrobos\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/sistema-de-alarma-antirrobos\\\/#primaryimage\",\"url\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2025\\\/12\\\/AlarmaMontada_SinFondo-1.png\",\"contentUrl\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2025\\\/12\\\/AlarmaMontada_SinFondo-1.png\",\"width\":1489,\"height\":987,\"caption\":\"Prototipo de alarma casera en una caja roja que cuenta en la parte frontal con un teclado num\u00e9rico, pantalla LCD, etiqueta RFID y sensores ultras\u00f3nicos en la parte inferior; y en la parte superior con un sensor de gas, un sensor de temperatura, un buzzer activo y un led rojo.\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/sistema-de-alarma-antirrobos\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Portada\",\"item\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Sistema de alarma antirrobos\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/#website\",\"url\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/\",\"name\":\"Proyectos con Arduino.\",\"description\":\"Blog de proyectos de Arduino de alumnos de la URJC\",\"publisher\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/#organization\",\"name\":\"Universidad Rey Juan Carlos\",\"url\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2022\\\/05\\\/logourjc-1.jpg\",\"contentUrl\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2022\\\/05\\\/logourjc-1.jpg\",\"width\":745,\"height\":288,\"caption\":\"Universidad Rey Juan Carlos\"},\"image\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/#\\\/schema\\\/person\\\/975dafc857dcb6daac0576fb9a28d4aa\",\"name\":\"dse2526g11\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/9f7279bd06d425bb510985ada7d5b028fa9f985dadce18494a69a2f007c19c5b?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/9f7279bd06d425bb510985ada7d5b028fa9f985dadce18494a69a2f007c19c5b?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/9f7279bd06d425bb510985ada7d5b028fa9f985dadce18494a69a2f007c19c5b?s=96&d=mm&r=g\",\"caption\":\"dse2526g11\"},\"url\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/author\\\/dse2526g11\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Sistema de alarma antirrobos - Proyectos con Arduino.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/blogs.etsii.urjc.es\/dseytr\/sistema-de-alarma-antirrobos\/","og_locale":"es_ES","og_type":"article","og_title":"Sistema de alarma antirrobos - Proyectos con Arduino.","og_description":"Descripci\u00f3n del proyecto Para este proyecto final, hemos decidido crear un sistema de alarma antirrobos. El objetivo es que una vez activado, el sistema monitorice continuamente el entorno mediante distintos sensores. Ante la detecci\u00f3n&#46;&#46;&#46;","og_url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/sistema-de-alarma-antirrobos\/","og_site_name":"Proyectos con Arduino.","article_published_time":"2025-12-18T18:35:40+00:00","article_modified_time":"2025-12-19T15:54:35+00:00","og_image":[{"width":1489,"height":987,"url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2025\/12\/AlarmaMontada_SinFondo-1.png","type":"image\/png"}],"author":"dse2526g11","twitter_card":"summary_large_image","twitter_misc":{"Escrito por":"dse2526g11","Tiempo de lectura":"23 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/sistema-de-alarma-antirrobos\/#article","isPartOf":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/sistema-de-alarma-antirrobos\/"},"author":{"name":"dse2526g11","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/#\/schema\/person\/975dafc857dcb6daac0576fb9a28d4aa"},"headline":"Sistema de alarma antirrobos","datePublished":"2025-12-18T18:35:40+00:00","dateModified":"2025-12-19T15:54:35+00:00","mainEntityOfPage":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/sistema-de-alarma-antirrobos\/"},"wordCount":548,"commentCount":0,"publisher":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/#organization"},"image":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/sistema-de-alarma-antirrobos\/#primaryimage"},"thumbnailUrl":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2025\/12\/AlarmaMontada_SinFondo-1.png","articleSection":["Proyectos"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/blogs.etsii.urjc.es\/dseytr\/sistema-de-alarma-antirrobos\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/sistema-de-alarma-antirrobos\/","url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/sistema-de-alarma-antirrobos\/","name":"Sistema de alarma antirrobos - Proyectos con Arduino.","isPartOf":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/#website"},"primaryImageOfPage":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/sistema-de-alarma-antirrobos\/#primaryimage"},"image":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/sistema-de-alarma-antirrobos\/#primaryimage"},"thumbnailUrl":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2025\/12\/AlarmaMontada_SinFondo-1.png","datePublished":"2025-12-18T18:35:40+00:00","dateModified":"2025-12-19T15:54:35+00:00","breadcrumb":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/sistema-de-alarma-antirrobos\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blogs.etsii.urjc.es\/dseytr\/sistema-de-alarma-antirrobos\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/sistema-de-alarma-antirrobos\/#primaryimage","url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2025\/12\/AlarmaMontada_SinFondo-1.png","contentUrl":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2025\/12\/AlarmaMontada_SinFondo-1.png","width":1489,"height":987,"caption":"Prototipo de alarma casera en una caja roja que cuenta en la parte frontal con un teclado num\u00e9rico, pantalla LCD, etiqueta RFID y sensores ultras\u00f3nicos en la parte inferior; y en la parte superior con un sensor de gas, un sensor de temperatura, un buzzer activo y un led rojo."},{"@type":"BreadcrumbList","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/sistema-de-alarma-antirrobos\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Portada","item":"https:\/\/blogs.etsii.urjc.es\/dseytr\/"},{"@type":"ListItem","position":2,"name":"Sistema de alarma antirrobos"}]},{"@type":"WebSite","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/#website","url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/","name":"Proyectos con Arduino.","description":"Blog de proyectos de Arduino de alumnos de la URJC","publisher":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blogs.etsii.urjc.es\/dseytr\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/#organization","name":"Universidad Rey Juan Carlos","url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/#\/schema\/logo\/image\/","url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2022\/05\/logourjc-1.jpg","contentUrl":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2022\/05\/logourjc-1.jpg","width":745,"height":288,"caption":"Universidad Rey Juan Carlos"},"image":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/#\/schema\/person\/975dafc857dcb6daac0576fb9a28d4aa","name":"dse2526g11","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/secure.gravatar.com\/avatar\/9f7279bd06d425bb510985ada7d5b028fa9f985dadce18494a69a2f007c19c5b?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/9f7279bd06d425bb510985ada7d5b028fa9f985dadce18494a69a2f007c19c5b?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/9f7279bd06d425bb510985ada7d5b028fa9f985dadce18494a69a2f007c19c5b?s=96&d=mm&r=g","caption":"dse2526g11"},"url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/author\/dse2526g11\/"}]}},"_links":{"self":[{"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/posts\/9580","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/users\/308"}],"replies":[{"embeddable":true,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/comments?post=9580"}],"version-history":[{"count":7,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/posts\/9580\/revisions"}],"predecessor-version":[{"id":9725,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/posts\/9580\/revisions\/9725"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/media\/9589"}],"wp:attachment":[{"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/media?parent=9580"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/categories?post=9580"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/tags?post=9580"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}