{"id":9515,"date":"2025-12-10T11:35:11","date_gmt":"2025-12-10T10:35:11","guid":{"rendered":"https:\/\/blogs.etsii.urjc.es\/dseytr\/?p=9515"},"modified":"2025-12-10T11:35:13","modified_gmt":"2025-12-10T10:35:13","slug":"super-paco-bombastic-system","status":"publish","type":"post","link":"https:\/\/blogs.etsii.urjc.es\/dseytr\/super-paco-bombastic-system\/","title":{"rendered":"SUPER PACO BOMBASTIC SYSTEM"},"content":{"rendered":"\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"863\" src=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2025\/12\/WhatsApp-Image-2025-12-06-at-19.59.32-1024x863.jpeg\" alt=\"\" class=\"wp-image-9517\" srcset=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2025\/12\/WhatsApp-Image-2025-12-06-at-19.59.32-1024x863.jpeg 1024w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2025\/12\/WhatsApp-Image-2025-12-06-at-19.59.32-300x253.jpeg 300w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2025\/12\/WhatsApp-Image-2025-12-06-at-19.59.32-768x647.jpeg 768w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2025\/12\/WhatsApp-Image-2025-12-06-at-19.59.32.jpeg 1152w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Descripci\u00f3n de proyecto <\/h2>\n\n\n\n<p>El proyecto que presento a continuaci\u00f3n es un juego interactivo inspirado en el cl\u00e1sico <em>\u201cEscondite Ingl\u00e9s\u201d<\/em>, pero con una tem\u00e1tica moderna y llena de tensi\u00f3n: <strong>la desactivaci\u00f3n de una bomba de tiempo<\/strong>. El objetivo es simple: los jugadores deben avanzar con el joystick de la bomba mientras el sem\u00e1foro se encuentra en la luz verde, pero deben quedarse completamente quietos cuando la luz roja se enciende. Si se detecta movimiento en el momento incorrecto, se contabilizaran strikes por cada error cometido y si se cometen 3 strikes, el juego terminara.<br><br>El juego tambien acabara por tiempo si no se ha logrado completar dentro del limite establecido, en este caso el jugador tambien perdera. <br><br>Si se logra completar la barra de progreso dentro del tiempo establecido, el jugador ganar\u00e1 el juego. <br><br>Este proyecto combina electr\u00f3nica, programaci\u00f3n, dise\u00f1o 3D y creatividad. <\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Presupuesto total<\/h2>\n\n\n\n<p>Para construir este juguete se necesitan unos pocos componentes electr\u00f3nicos y algunas piezas impresas en 3D.<br>A continuaci\u00f3n se muestra una tabla con el presupuesto aproximado para orientar al lector sobre el coste total del montaje. Los precios pueden variar dependiendo de la tienda o pa\u00eds, pero sirven como referencia general:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td>1x Microcontrolador Elegoo Uno R3<\/td><td>6 \u20ac<\/td><\/tr><tr><td>3x LED Rojo 5mm<\/td><td>0,51 \u20ac<\/td><\/tr><tr><td>7x LED Amarillo 5mm<\/td><td>0,42 \u20ac<\/td><\/tr><tr><td>1x LED Blanco 5mm<\/td><td>0,06 \u20ac<\/td><\/tr><tr><td>2x LED Verde 5mm<\/td><td>0,12 \u20ac<\/td><\/tr><tr><td>1x Joystick Analogico 5 pines<\/td><td>2,80 \u20ac<\/td><\/tr><tr><td>15x Resistores de100 Ohmios<\/td><td>1,50 \u20ac<\/td><\/tr><tr><td>25x Jumpers Macho-Macho<br>5x Jumpers Macho-Hembra<\/td><td>3,50 \u20ac<\/td><\/tr><tr><td>1x Registro de Desplazamiento 74HC595<\/td><td>0,46 \u20ac<\/td><\/tr><tr><td>1x Buzzer<\/td><td>0,90 \u20ac<\/td><\/tr><tr><td>1x Full BreadBoard<\/td><td>5,43 \u20ac<\/td><\/tr><tr><td>Impresion 3D <\/td><td>3 \u20ac<\/td><\/tr><tr><td><strong>TOTAL<\/strong><\/td><td><strong>24,70 \u20ac<\/strong><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Diagrama de dise\u00f1o de proyecto<\/h2>\n\n\n\n<p>Para facilitar el montaje, hemos incluido un <strong>diagrama completo del circuito<\/strong> donde se muestra c\u00f3mo debe conectarse cada LED y m\u00f3dulo al microcontrolador.<br>Gracias a este esquema, el proyecto puede montarse sin dificultades.<br>Solo tienes que consultar la imagen que aparece m\u00e1s abajo y replicar el cableado tal cual aparece indicado.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Diagrama de Hardware (Wokwi.com)<\/h3>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"810\" height=\"727\" src=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2025\/12\/5efb19db-fb8e-4382-934e-2e7138ebba05.jpg\" alt=\"\" class=\"wp-image-9524\" srcset=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2025\/12\/5efb19db-fb8e-4382-934e-2e7138ebba05.jpg 810w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2025\/12\/5efb19db-fb8e-4382-934e-2e7138ebba05-300x269.jpg 300w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2025\/12\/5efb19db-fb8e-4382-934e-2e7138ebba05-768x689.jpg 768w\" sizes=\"auto, (max-width: 810px) 100vw, 810px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Ejemplo de hardware f\u00edsico:<\/h3>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"576\" src=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2025\/12\/a2dbb0c7-409a-4400-8620-70f9d734c3d0-1024x576.jpg\" alt=\"\" class=\"wp-image-9525\" srcset=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2025\/12\/a2dbb0c7-409a-4400-8620-70f9d734c3d0-1024x576.jpg 1024w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2025\/12\/a2dbb0c7-409a-4400-8620-70f9d734c3d0-300x169.jpg 300w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2025\/12\/a2dbb0c7-409a-4400-8620-70f9d734c3d0-768x432.jpg 768w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2025\/12\/a2dbb0c7-409a-4400-8620-70f9d734c3d0-1536x864.jpg 1536w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2025\/12\/a2dbb0c7-409a-4400-8620-70f9d734c3d0.jpg 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h1 class=\"wp-block-heading\">Recursos adicionales<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">C\u00f3digo<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>#include &lt;Arduino.h&gt; \/\/ si se trabaja en IDE de arduino , comentar esta linea\n#include &lt;limits.h&gt;\n\n#define NOTE_B0  31\n#define NOTE_C1  33\n#define NOTE_CS1 35\n#define NOTE_D1  37\n#define NOTE_DS1 39\n#define NOTE_E1  41\n#define NOTE_F1  44\n#define NOTE_FS1 46\n#define NOTE_G1  49\n#define NOTE_GS1 52\n#define NOTE_A1  55\n#define NOTE_AS1 58\n#define NOTE_B1  62\n#define NOTE_C2  65\n#define NOTE_CS2 69\n#define NOTE_D2  73\n#define NOTE_DS2 78\n#define NOTE_E2  82\n#define NOTE_F2  87\n#define NOTE_FS2 93\n#define NOTE_G2  98\n#define NOTE_GS2 104\n#define NOTE_A2  110\n#define NOTE_AS2 117\n#define NOTE_B2  123\n#define NOTE_C3  131\n#define NOTE_CS3 139\n#define NOTE_D3  147\n#define NOTE_DS3 156\n#define NOTE_E3  165\n#define NOTE_F3  175\n#define NOTE_FS3 185\n#define NOTE_G3  196\n#define NOTE_GS3 208\n#define NOTE_A3  220\n#define NOTE_AS3 233\n#define NOTE_B3  247\n#define NOTE_C4  262\n#define NOTE_CS4 277\n#define NOTE_D4  294\n#define NOTE_DS4 311\n#define NOTE_E4  330\n#define NOTE_F4  349\n#define NOTE_FS4 370\n#define NOTE_G4  392\n#define NOTE_GS4 415\n#define NOTE_A4  440\n#define NOTE_AS4 466\n#define NOTE_B4  494\n#define NOTE_C5  523\n#define NOTE_CS5 554\n#define NOTE_D5  587\n#define NOTE_DS5 622\n#define NOTE_E5  659\n#define NOTE_F5  698\n#define NOTE_FS5 740\n#define NOTE_G5  784\n#define NOTE_GS5 831\n#define NOTE_A5  880\n#define NOTE_AS5 932\n#define NOTE_B5  988\n#define NOTE_C6  1047\n#define NOTE_CS6 1109\n#define NOTE_D6  1175\n#define NOTE_DS6 1245\n#define NOTE_E6  1319\n#define NOTE_F6  1397\n#define NOTE_FS6 1480\n#define NOTE_G6  1568\n#define NOTE_GS6 1661\n#define NOTE_A6  1760\n#define NOTE_AS6 1865\n#define NOTE_B6  1976\n#define NOTE_C7  2093\n#define NOTE_CS7 2217\n#define NOTE_D7  2349\n#define NOTE_DS7 2489\n#define NOTE_E7  2637\n#define NOTE_F7  2794\n#define NOTE_FS7 2960\n#define NOTE_G7  3136\n#define NOTE_GS7 3322\n#define NOTE_A7  3520\n#define NOTE_AS7 3729\n#define NOTE_B7  3951\n#define NOTE_C8  4186\n#define NOTE_CS8 4435\n#define NOTE_D8  4699\n#define NOTE_DS8 4978\n#define REST      0\n\n\/\/ MULTIPLEXORES\n\n  \/\/ Funciones\n\n  void actualizarShiftRegisters();\n  void setProgreso(int index, bool estado);\n  void setStrike(int index, bool estado);\n  void setMovimiento(bool verde, bool rojo);\n\n  \/\/ Pines para multiplexor 74HC595\n  const int PIN_DATA  = 11;   \/\/ DS\n  const int PIN_LATCH = 8;   \/\/ ST_CP\n  const int PIN_CLOCK = 12;   \/\/ SH_CP\n\n  byte estadoProgreso = 0b00000000; \/\/ 8 LEDs PROGRESO\n  \n  \/\/ STRIKES + MOVIMIENTO\n  const int LED_STRIKE&#091;2] = {4, 7};     \/\/ const int LED_STRIKE&#091;3] = {9, 10, 11};\n  const int LED_MOV_VERDE = 3;\n  const int LED_MOV_ROJO  = 5;\n\n\/\/ ESTADO DE MOVIMIENTO\n  const int num_parpadeos = 5;          \/\/ N\u00famero de parpadeos antes del cambio.\n  const int delay_parpadeos = 100;      \/\/ Delay entre parpadeos, debe usar millis().\n\n  const int MIN_TIEMPO_RESTORE = 1000;  \/\/ Tiempo m\u00ednimo antes de restaurar.\n  const int MIN_TIEMPO_CAMBIO = 3000;   \/\/ Tiempo m\u00ednimo antes del cambio, m\u00e1ximo para restaurar.\n  const int MAX_TIEMPO_CAMBIO = 7000;   \/\/ Tiempo m\u00e1ximo antes del cambio.\n\n  bool estadoMovimiento = true;         \/\/ true = VERDE | false = ROJO\n  unsigned long tCambio = 0;            \/\/ Pr\u00f3ximo momento en el que se debe evaluar el cambio\n  bool enParpadeo = false;              \/\/ Para saber si est\u00e1 parpadeando o no.\n  int contadorParpadeos = 0;            \/\/ N\u00famero de parpadeos.\n  unsigned long tiempoParpadeo = 0;     \/\/ Tiempo de parpadeo.\n\n  void actualizar_estado_movimiento();  \/\/ Cambiar entre VERDE y ROJO con transici\u00f3n (parpadeo).\n\n\/\/ LECTURA DE JOYSTICK\n\n  const int JOYSTICK&#091;2] = {A0, A1};     \/\/ Pines del joystick (lectura anal\u00f3gica).\n  const int PIN_RESET = 2;              \/\/ Bot\u00f3n joystick, para reset.\n\n  \/\/ Reset por pulsaci\u00f3n larga\n  const unsigned long RESET_HOLD_TIME = 3000; \/\/ 3 segundos\n  unsigned long tiempoInicioHold = 0;\n  bool holdEnProgreso = false;\n\n  void detectar_reset();\n  void resetearJuego();\n  \n  const int VUELTAS_POR_LUZ = 20;       \/\/ Vueltas necesarias para cada luz.\n  int vueltas = 0;                      \/\/ Vueltas dadas con el joystick.\n\n  \/\/ Para calcular seg\u00fan orientaci\u00f3n joystick.\n  float angulo_anterior = 0, angulo_actual = 0;\n  int vueltasCompletas = 0, vueltasParciales = 0, vueltasPrevias = 0;\n\n  void leer_joystick_prueba();\n  void leer_joystick();                 \/\/ Captar cu\u00e1nto gira el joystick para iluminar LEDs.\n\n\/\/ LEDS DE PROGRESO\n  unsigned long lastPWM = 0;            \/\/ Controla cada cu\u00e1nto se ejecuta un paso de PWM.\n  int pwmStep = 0;                      \/\/ Nivel actual dentro del ciclo PWM.\n\n  void actualizar_progreso();           \/\/ Actualizar los LEDS_PROGRESO.\n\n\/\/ GESTI\u00d3N DE STRIKES\n  const int MAX_STRIKES = 3;            \/\/ Cantidad m\u00e1xima de STRIKES.\n  const int COOLDOWN_STRIKE = 1000;     \/\/ Cooldown para el STRIKE.\n\n  int strikesCount = 0;                 \/\/ N\u00famero actual de STRIKES.\n\n  bool puedeMover = true;               \/\/ true - PUEDE MOVER | false - NO PUEDE MOVER.\n  unsigned long tiempoStrike = 0;       \/\/ Tiempo hasta permitir el siguiente STRIKE.\n\n  void gestionar_strikes();             \/\/ Actualizar los LEDS_STRIKES cuando sea necesario.\n\n\/\/ ACTUALIZACI\u00d3N DE TIEMPO\n  const int LED_TIEMPO = 10;                     \/\/ Pin PWM\n  const unsigned long TIEMPO_TOTAL = 150000UL;   \/\/ 2:30 minutos en milisegundos\n  unsigned long tiempoInicio;                    \/\/ Tiempo en el que se inicia la partida.\n  bool gameOver = false;                         \/\/ Para saber cuando se ha acabado el tiempo.\n  bool victoria = false;                         \/\/ Para saber cuando ha terminado el juego por victoria.\n  void actualizar_tiempo();                      \/\/ Actualizar el display del tiempo.\n\n\/\/ SONIDO\n  const int PIN_ZUMBADOR = 9;           \/\/ Pin para el zumbador.\n  \n  \/\/ VICTORIA\n  const int VICTORY_SOUND = 0;          \/\/ Sonido de victoria.\n\n  int v_tempo = 85;\n\n  \/\/ Melod\u00eda completa\n  int v_melody&#091;] = {\n    NOTE_D5,-4, NOTE_A5,8, NOTE_FS5,8, NOTE_D5,8,\n    NOTE_E5,-4, NOTE_FS5,8, NOTE_G5,4,\n    NOTE_FS5,-4, NOTE_E5,8, NOTE_FS5,4,\n    NOTE_D5,-2,\n    NOTE_D5,-4, NOTE_A5,8, NOTE_FS5,8, NOTE_D5,8,\n    NOTE_E5,-4, NOTE_FS5,8, NOTE_G5,4,\n    NOTE_FS5,-1,\n    NOTE_D5,-4, NOTE_A5,8, NOTE_FS5,8, NOTE_D5,8,\n    NOTE_E5,-4, NOTE_FS5,8, NOTE_G5,4,\n    \n    NOTE_FS5,-4, NOTE_E5,8, NOTE_FS5,4,\n    NOTE_D5,-2,\n    NOTE_D5,-4, NOTE_A5,8, NOTE_FS5,8, NOTE_D5,8,\n    NOTE_E5,-4, NOTE_FS5,8, NOTE_G5,4,\n    NOTE_FS5,-1,\n  };\n\n  int v_notes = sizeof(v_melody) \/ sizeof(v_melody&#091;0]) \/ 2;\n  int v_wholenote = (60000 * 4) \/ v_tempo;\n\n  \/\/ Variables para reproducci\u00f3n NO bloqueante\n  bool reproduciendoVictoria = false;\n  unsigned long v_notaInicio = 0;\n  int v_notaIndex = 0;\n  unsigned int v_notaDuracion = 0;\n\n  \/\/ DERROTA\n  const int FAILURE_SOUND = 1;          \/\/ Sonido de derrota.\n\n  int f_tempo = 108;\n\n  \/\/ Melod\u00eda de Zelda\u2019s Lullaby (versi\u00f3n derrota).\n  int f_melody&#091;] = {\n    NOTE_E4,2, NOTE_G4,4,\n    NOTE_D4,2, NOTE_C4,8, NOTE_D4,8,\n    NOTE_E4,2, NOTE_G4,4,\n    NOTE_D4,-2,\n    NOTE_E4,2, NOTE_G4,4,\n    NOTE_D5,2, NOTE_C5,4,\n    NOTE_G4,2, NOTE_F4,8, NOTE_E4,8,\n    NOTE_D4,-2,\n    NOTE_E4,2, NOTE_G4,4,\n    NOTE_D4,2, NOTE_C4,8, NOTE_D4,8,\n    NOTE_E4,2, NOTE_G4,4,\n    NOTE_D4,-2,\n    NOTE_E4,2, NOTE_G4,4,\n\n    NOTE_D5,2, NOTE_C5,4,\n    NOTE_G4,2, NOTE_F4,8, NOTE_E4,8,\n    NOTE_F4,8, NOTE_E4,8, NOTE_C4,2,\n    NOTE_F4,2, NOTE_E4,8, NOTE_D4,8,\n    NOTE_E4,8, NOTE_D4,8, NOTE_A3,2,\n    NOTE_G4,2, NOTE_F4,8, NOTE_E4,8,\n    NOTE_F4,8, NOTE_E4,8, NOTE_C4,4, NOTE_F4,4,\n    NOTE_C5,-2\n  };\n\n  \/\/ N\u00famero total de notas.\n  int f_notes = sizeof(f_melody) \/ sizeof(f_melody&#091;0]) \/ 2;\n\n  \/\/ Duraci\u00f3n de nota completa en ms.\n  int f_wholenote = (60000 * 4) \/ f_tempo;\n\n  \/\/ Estado interno de reproducci\u00f3n.\n  bool reproduciendoDerrota = false;\n  unsigned long f_noteStart = 0;\n  int f_noteIndex = 0;\n  unsigned int f_noteDuration = 0;\n\n  void play_sound(int id);              \/\/ Funci\u00f3n para reproducir sonido.\n  void stop_sound();                    \/\/ Parar sonido.\n  void actualizar_sonido();             \/\/ Para gestionar melod\u00edas complejas.\n\n\/\/ GENERAL\n  void init_pins();                     \/\/ Inicializar de PINES (mayor limpieza de SETUP).\n\n\/\/ SETUP\n  void setup()\n  {\n    \/\/ Se inicializa el Serial.\n    Serial.begin(9600);\n\n    \/\/ Se inicializan los pines.\n    init_pins();\n\n    \/\/ Se prepara el primer tiempo de cambio aleatorio.\n    tCambio = millis() + random(MIN_TIEMPO_CAMBIO, MAX_TIEMPO_CAMBIO);\n\n    \/\/ Se prepara el tiempo de juego.\n    tiempoInicio = millis();\n    pinMode(LED_TIEMPO, OUTPUT);\n    analogWrite(LED_TIEMPO, 255); \/\/ Empieza encendido al m\u00e1ximo\n  }\n\n\/\/ LOOP\n  void loop()\n  {\n    detectar_reset();\n    actualizar_sonido();\n\n    \/\/leer_joystick_prueba();\n    leer_joystick();\n    actualizar_progreso();\n    actualizar_estado_movimiento();\n    gestionar_strikes();\n    actualizar_tiempo();\n\n    delay(20);\n  }\n\n\/\/ IMPLEMENTACI\u00d3N DE FUNCIONES\n\n  \/\/ MULTIPLEXORES\n\n  void actualizarShiftRegisters()\n  {\n    digitalWrite(PIN_LATCH, LOW);\n    shiftOut(PIN_DATA, PIN_CLOCK, MSBFIRST, estadoProgreso); \/\/ 1\u00ba registro\n    digitalWrite(PIN_LATCH, HIGH);\n  }\n\n  void setProgreso(int index, bool estado)\n  {\n    if(index &lt; 0 || index &gt; 7) return;\n    bitWrite(estadoProgreso, index, estado);\n  }\n\n  void setStrike(int index, bool estado)\n  {\n    digitalWrite(LED_STRIKE&#091;index], estado);\n  }\n\n  void setMovimiento(bool verde, bool rojo)\n  {\n    digitalWrite(LED_MOV_VERDE, verde);\n    digitalWrite(LED_MOV_ROJO, rojo);\n  }\n\n  \/\/ Cambiar entre VERDE y ROJO con transici\u00f3n (parpadeo).\n  void actualizar_estado_movimiento()\n  {\n    \/\/ Si el juego termin\u00f3 (tiempo == 0), apagar parpadeo y fijar en ROJO.\n    if (gameOver)\n    {\n      enParpadeo = false;\n      estadoMovimiento = (victoria) ? true : false; \/\/ VERDE O ROJO.\n      setMovimiento(estadoMovimiento, !estadoMovimiento);\n      puedeMover = false;\n\n      \/\/ Congelar completamente el sistema de sem\u00e1foro\n      tCambio = ULONG_MAX;          \/\/ Nunca m\u00e1s habr\u00e1 cambio\n      contadorParpadeos = 0; \n\n      return;   \/\/ IMPORTANTE: no seguir ejecutando la funci\u00f3n\n    }\n    \/\/ Se guarda el tiempo actual para comparar sin bloquear.\n    unsigned long ahora = millis();\n\n    \/\/ Si a\u00fan no es momento de cambiar y no est\u00e1 parpadeando, se muestra el estado normal.\n    if (!enParpadeo &amp;&amp; ahora &lt; tCambio)\n    {\n      setMovimiento(estadoMovimiento, !estadoMovimiento);\n      return;\n    }\n\n    \/\/ Si NO est\u00e1 parpadeando y es momento de cambiar, se inicia el parpadeo.\n    if (!enParpadeo)\n    {\n      enParpadeo = true;\n      contadorParpadeos = 0;\n      tiempoParpadeo = ahora;\n    }\n\n    \/\/ Manejar el parpadeo.\n    if (ahora - tiempoParpadeo &gt;= delay_parpadeos)\n    {\n      tiempoParpadeo = ahora;\n      contadorParpadeos++;\n\n      \/\/ Alternar LEDs en parpadeo\n      bool parp = contadorParpadeos % 2;\n      setMovimiento(parp, parp);\n\n      \/\/ Parpadeo terminado, se cambia el estado.\n      if (contadorParpadeos &gt;= num_parpadeos * 2)\n      {       \n        \/\/ Cambiar estado\n        estadoMovimiento = !estadoMovimiento;\n        enParpadeo = false;\n\n        \/\/ Nuevo tiempo antes del siguiente cambio\n        if (estadoMovimiento)\n        {\n          \/\/ si ahora est\u00e1 verde \u2192 espera m\u00e1s tiempo antes de volver a rojo\n          tCambio = ahora + random(MIN_TIEMPO_CAMBIO, MAX_TIEMPO_CAMBIO);\n        }\n        else\n        {\n          \/\/ si ahora est\u00e1 rojo \u2192 espera menos tiempo antes de volver a verde\n          tCambio = ahora + random(MIN_TIEMPO_RESTORE, MIN_TIEMPO_CAMBIO);\n        }\n\n        \/\/ Actualizar LED final tras cambio.\n        setMovimiento(estadoMovimiento, !estadoMovimiento);\n      }\n    }\n\n    \/\/ Evitar errores.\n    puedeMover = estadoMovimiento;\n  }\n\n  \/\/ Captar cu\u00e1nto gira el joystick para iluminar LEDs.\n  void leer_joystick_prueba()\n  {\n    if (gameOver) return;\n\n    int y = analogRead(JOYSTICK&#091;1]) - 512;\n\n    static unsigned long ultimaVuelta = 0;\n    const unsigned long DELAY_VUELTA = 150; \/\/ velocidad a la que simula vueltas\n\n    \/\/ Solo sumar vueltas si se mantiene hacia arriba\n    if (y &lt; -200)   \/\/ Ajustable seg\u00fan sensibilidad del joystick\n    {\n        unsigned long ahora = millis();\n\n        if (ahora - ultimaVuelta &gt;= DELAY_VUELTA)\n        {\n            ultimaVuelta = ahora;\n            vueltas++;\n\n            vueltasCompletas = vueltas \/ VUELTAS_POR_LUZ;\n            vueltasParciales = vueltas % VUELTAS_POR_LUZ;\n\n            Serial.print(\"Vueltas simuladas: \");\n            Serial.print(vueltas);\n            Serial.print(\" | completas: \");\n            Serial.print(vueltasCompletas);\n            Serial.print(\" | parciales: \");\n            Serial.println(vueltasParciales);\n        }\n    }\n  }\n\n  void leer_joystick()\n  {\n    if (gameOver) return;\n\n    \/\/ Se lee el joystick en el eje X e Y, centr\u00e1ndolo con 512 (2^9).\n    int x = analogRead(JOYSTICK&#091;0]) - 512;\n    int y = analogRead(JOYSTICK&#091;1]) - 512;\n\n    \/*\n    Serial.print(\"X: \");\n    Serial.print(x);\n    Serial.print(\" Y: \");\n    Serial.println(y);\n    *\/\n\n    \/\/ Si el joystick est\u00e1 cerca del centro, no se cuenta como giro.\n    if (abs(x) &lt; 50 &amp;&amp; abs(y) &lt; 50) return;\n\n    \/\/ Calcular \u00e1ngulo en grados (0\u00b0 a 360\u00b0).\n    \/\/ En caso de valor negativo, se a\u00f1ade 360\u00b0 (valores positivos).\n    angulo_actual = atan2(y, x) * 180.0 \/ PI;\n    if (angulo_actual &lt; 0) angulo_actual += 360;\n\n    \/*\n    Serial.print(\"\u00c1ngulo actual: \");\n    Serial.println(angulo_actual);\n    *\/\n\n    \/\/ Detecci\u00f3n de paso por cero \u2192 una vuelta\n    \/\/ Si antes estaba cerca de 350\u00b0 y ahora est\u00e1 cerca de 10\u00b0, pas\u00f3 por 0\n    if (angulo_anterior &gt; 300 &amp;&amp; angulo_actual &lt; 60)\n    {\n      vueltas++; \/\/ Se incrementan vueltas completas\n      vueltasCompletas = vueltas \/ VUELTAS_POR_LUZ;\n      vueltasParciales = vueltas % VUELTAS_POR_LUZ;\n\n      \/*\n      Serial.print(\"Vueltas: \");\n      Serial.println(vueltas);\n      Serial.print(\"Vueltas completas: \");\n      Serial.println(vueltasCompletas);\n      Serial.print(\"Vueltas parciales: \");\n      Serial.println(vueltasParciales);\n      *\/\n    }\n\n    \/\/ Guardar para la pr\u00f3xima comparaci\u00f3n\n    angulo_anterior = angulo_actual;\n  }\n\n  \/\/ Actualizar los LEDS_PROGRESO.\n  void actualizar_progreso()\n  {\n    if (gameOver)\n    {\n      \/\/ NO actualizar nada, mantener lo \u00faltimo mostrado\n      return;\n    }\n\n    \/\/ PWM suave, se repite r\u00e1pido sin bloquear.\n    if (millis() - lastPWM &gt;= 5)\n    {\n      lastPWM = millis();\n      pwmStep = (pwmStep + 1) % VUELTAS_POR_LUZ;\n    }\n\n    \/\/ Encender por completo los LEDs terminados.\n    for(int i = 0; i &lt; vueltasCompletas &amp;&amp; i &lt; 8; i++)\n      setProgreso(i, true);\n\n    \/\/ Brillo progresivo del LED en curso.\n    if (vueltasCompletas &lt; 8)\n    {\n      bool encender = (pwmStep &lt; vueltasParciales);\n      setProgreso(vueltasCompletas, encender);\n    }\n\n    \/\/ Apagar los que todav\u00eda no deber\u00edan encenderse\n    for(int i = vueltasCompletas + 1; i &lt; 8; i++)\n    {\n      setProgreso(i, false);\n    }\n\n    Serial.print(\"Estado de progreso: \");\n    Serial.println(estadoProgreso, BIN);\n\n    actualizarShiftRegisters();\n\n    \/\/ COMPROBAR SI SE HA COMPLETADO EL PROGRESO TOTAL PARA VICTORIA\n    if (vueltasCompletas &gt;= 8 &amp;&amp; !gameOver)\n    {\n        gameOver = true;\n        victoria = true;\n\n        vueltasPrevias = vueltas;\n\n        \/\/ Congelar tiempo\n        \/\/analogWrite(LED_TIEMPO, 255);\n\n        \/\/ Congelar sem\u00e1foro\n        estadoMovimiento = true;\n        enParpadeo = false;\n        tCambio = ULONG_MAX;\n        setMovimiento(true, false);\n\n        \/\/ No permitir m\u00e1s movimiento\n        puedeMover = false;\n\n        play_sound(VICTORY_SOUND);\n\n        return;\n    }\n  }\n\n  \/\/ Actualizar los LEDS_STRIKES cuando sea necesario.\n  void gestionar_strikes()\n  {\n    unsigned long ahora = millis();\n\n    \/\/ Si el juego termin\u00f3, NO revisar strikes ni castigos.\n    if (gameOver)\n    {\n      return;\n    }\n\n    \/\/ Detectar si se intent\u00f3 mover estando en ROJO\n    if (!estadoMovimiento &amp;&amp; vueltas &gt; vueltasPrevias)\n    {\n      \/\/ Solo permitir un strike cada cierto tiempo\n      if (ahora - tiempoStrike &gt;= COOLDOWN_STRIKE)\n      {\n        Serial.println(\"\u00a1STRIKE!\");\n        tiempoStrike = ahora;\n        strikesCount++;\n\n        \/\/ Encender LEDs de strikes\n        if (strikesCount &gt;= 1) setStrike(0, true);\n        if (strikesCount &gt;= 2) setStrike(1, true);\n        \/\/ if (strikesCount &gt;= 3) setStrike(LED_STRIKE&#091;2], true);\n\n        \/\/ Si lleg\u00f3 al m\u00e1ximo, castigo (GAME OVER).\n        if (strikesCount &gt;= MAX_STRIKES)\n        {\n          Serial.println(\"\u00a1GAME OVER POR STRIKE!\");\n          gameOver = true;\n          victoria = false;\n\n          \/\/ Congelar sem\u00e1foro\n          estadoMovimiento = false;\n          enParpadeo = false;\n          tCambio = ULONG_MAX;\n          setMovimiento(false, true);\n\n          \/\/ Congelar progreso\n          puedeMover = false;\n\n          \/\/ Mostrar strikes finales\n          setStrike(0, true);\n          setStrike(1, true);\n\n          vueltasPrevias = vueltas;\n\n          play_sound(FAILURE_SOUND);\n\n          return;\n        }\n      }\n    }\n\n    vueltasPrevias = vueltas; \/\/ Actualizar referencia\n  }\n\n  \/\/ Actualizar el display del tiempo.\n  void actualizar_tiempo()\n  {\n    unsigned long ahora = millis();\n    unsigned long transcurrido = ahora - tiempoInicio;\n\n    \/\/ Si el juego ya termin\u00f3, no hacer nada m\u00e1s.\n    if (gameOver)\n    {\n      return;\n    }\n\n    \/\/ Tiempo agotado resulta en GAME OVER.\n    if (transcurrido &gt;= TIEMPO_TOTAL)\n    {\n      \/\/ Congelar progreso: no borrar LEDs y evitar que se actualicen.\n      pwmStep = vueltasParciales;      \/\/ Mantiene el brillo final parcial\n\n      gameOver = true;\n\n      strikesCount = MAX_STRIKES;\n\n      vueltasPrevias = vueltas;\n\n      \/\/ Encender los 3 LEDs de STRIKE.\n      setStrike(0, true);\n      setStrike(1, true);\n      \/\/ setStrike(LED_STRIKE&#091;2], true);\n\n      \/\/ Poner el sem\u00e1foro en ROJO.\n      estadoMovimiento = false;\n      enParpadeo = false;\n      setMovimiento(false, true);\n\n      \/\/ Resetear progreso.\n      \/*\n      vueltas = 0;\n      vueltasPrevias = 0;\n      vueltasCompletas = 0;\n      vueltasParciales = 0;\n      pwmStep = 0;\n      estadoProgreso = 0;\n      actualizarShiftRegisters();\n      *\/\n\n      \/\/ Apagar LED de tiempo.\n      analogWrite(LED_TIEMPO, 0);\n\n      play_sound(FAILURE_SOUND);\n\n      return;\n    }\n\n    \/\/ Si a\u00fan hay tiempo, calcular brillo proporcional.\n    float progreso = 1.0 - (float)transcurrido \/ (float)TIEMPO_TOTAL;\n    int brillo = progreso * 255;\n    brillo = constrain(brillo, 0, 255);\n\n    analogWrite(LED_TIEMPO, brillo);\n  }\n\n  \/\/ Funciones para resetear el juego.\n  void detectar_reset()\n  {\n    bool pulsado = (digitalRead(PIN_RESET) == LOW);\n    unsigned long ahora = millis();\n\n    if (pulsado &amp;&amp; !holdEnProgreso)\n    {\n      \/\/ Empez\u00f3 a mantener pulsado.\n      holdEnProgreso = true;\n      tiempoInicioHold = ahora;\n    }\n    else if (!pulsado)\n    {\n      \/\/ Si lo suelta antes de llegar a los 3s, cancelar RESET.\n      holdEnProgreso = false;\n    }\n    else if (pulsado &amp;&amp; holdEnProgreso)\n    {\n      \/\/ Est\u00e1 manteniendo el bot\u00f3n, comprobar tiempo.\n      if (ahora - tiempoInicioHold &gt;= RESET_HOLD_TIME)\n      {\n        \/\/ Reset REAL aqu\u00ed.\n        resetearJuego();\n        holdEnProgreso = false;  \/\/ Evita m\u00faltiples resets.\n      }\n    }\n  }\n\n  void resetearJuego()\n  {\n    Serial.println(\"\u00a1RESETEO EN PROGRESO!\");\n\n    stop_sound();\n\n    \/\/ Reset estados principales.\n    gameOver = false;\n    enParpadeo = false;\n\n    \/\/ Reset sem\u00e1foro (empieza en verde).\n    estadoMovimiento = true;\n    setMovimiento(true, false);\n\n    \/\/ Reset tiempos.\n    tiempoInicio = millis();\n    tCambio = tiempoInicio + random(MIN_TIEMPO_CAMBIO, MAX_TIEMPO_CAMBIO);\n\n    \/\/ Reset strikes.\n    strikesCount = 0;\n    setStrike(0, false);\n    setStrike(1, false);\n\n    \/\/ Reset progreso.\n    vueltas = 0;\n    vueltasPrevias = 0;\n    vueltasCompletas = 0;\n    vueltasParciales = 0;\n\n    pwmStep = 0;\n    estadoProgreso = 0;\n    actualizarShiftRegisters();\n    analogWrite(LED_TIEMPO, 255); \/\/ Tiempo al m\u00e1ximo.\n\n    \/\/ Permitir movimiento\n    puedeMover = true;\n    Serial.println(\"\u00a1RESETEO COMPLETADO!\");\n  }\n\n  \/\/ Funciones para SONIDO.\n\n  void play_sound(int id)\n  {\n    if (id == FAILURE_SOUND)\n    {\n        stop_sound();              \/\/ Asegura que no se solapen sonidos.\n        reproduciendoDerrota = true;\n        f_noteIndex = 0;\n        f_noteStart = millis();\n        return;\n    }\n\n    if (id == VICTORY_SOUND)\n    {\n      stop_sound();              \/\/ Asegura que no se solapen sonidos.\n      reproduciendoVictoria = true;\n      v_notaIndex = 0;\n      v_notaInicio = millis();\n      return;\n    }\n  }\n\n  void stop_sound()\n  {\n    noTone(PIN_ZUMBADOR);\n    reproduciendoVictoria = false;\n    reproduciendoDerrota = false;\n  }\n\n  void actualizar_sonido()\n  {\n    if (!reproduciendoVictoria &amp;&amp; !reproduciendoDerrota) return;\n\n    if(reproduciendoVictoria)\n    {\n      unsigned long ahora = millis();\n\n      \/\/ Si ha terminado la nota actual \u2192 pasar a la siguiente\n      if (ahora - v_notaInicio &gt;= v_notaDuracion)\n      {\n        \/\/ Avanzar al siguiente par (nota + duraci\u00f3n)\n        v_notaIndex += 2;\n\n        \/\/ Si se acab\u00f3 la melod\u00eda \u2192 detener\n        if (v_notaIndex &gt;= v_notes * 2)\n        {\n          stop_sound();\n          return;\n        }\n\n        int nota = v_melody&#091;v_notaIndex];\n        int divider = v_melody&#091;v_notaIndex + 1];\n\n        if (divider &gt; 0)\n          v_notaDuracion = v_wholenote \/ divider;\n        else\n        {\n          v_notaDuracion = (v_wholenote \/ abs(divider)) * 1.5;\n        }\n\n        tone(PIN_ZUMBADOR, nota, v_notaDuracion * 0.9);\n\n        v_notaInicio = ahora;\n      }\n    }\n    else if(reproduciendoDerrota)\n    {\n       unsigned long ahora = millis();\n\n      \/\/ \u00bftermin\u00f3 la nota actual?\n      if (ahora - f_noteStart &gt;= f_noteDuration)\n      {\n          f_noteIndex += 2;\n\n          \/\/ Si ya no quedan notas \u2192 parar\n          if (f_noteIndex &gt;= f_notes * 2)\n          {\n              stop_sound();\n              return;\n          }\n\n          int nota = f_melody&#091;f_noteIndex];\n          int divider = f_melody&#091;f_noteIndex + 1];\n\n          if (divider &gt; 0)\n              f_noteDuration = f_wholenote \/ divider;\n          else\n              f_noteDuration = (f_wholenote \/ abs(divider)) * 1.5;\n\n          tone(PIN_ZUMBADOR, nota, f_noteDuration * 0.9);\n\n          f_noteStart = ahora;\n      }\n    }\n  }\n\n  \/\/ Inicializar de PINES (mayor limpieza de SETUP).\n  void init_pins()\n  {\n    \/\/ Multiplexores.\n    pinMode(PIN_DATA, OUTPUT);\n    pinMode(PIN_LATCH, OUTPUT);\n    pinMode(PIN_CLOCK, OUTPUT);\n\n    digitalWrite(PIN_DATA, LOW);\n    digitalWrite(PIN_LATCH, LOW);\n    digitalWrite(PIN_CLOCK, LOW);\n\n    estadoProgreso = 0;\n    actualizarShiftRegisters();\n\n    pinMode(LED_STRIKE&#091;0], OUTPUT);\n    pinMode(LED_STRIKE&#091;1], OUTPUT);\n    \/\/ pinMode(LED_STRIKE&#091;2], OUTPUT);\n\n    pinMode(LED_MOV_VERDE, OUTPUT);\n    pinMode(LED_MOV_ROJO, OUTPUT);\n\n    pinMode(LED_TIEMPO, OUTPUT);\n    analogWrite(LED_TIEMPO, 255);\n\n    \/\/ Setup para JOYSTICK.\n    for(int i = 0; i &lt; 2; i++)\n    {\n      pinMode(JOYSTICK&#091;i], INPUT);\n    }\n\n    pinMode(PIN_RESET, INPUT_PULLUP);\n\n    pinMode(PIN_ZUMBADOR, OUTPUT);\n  }<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Recursos de sonido para c\u00f3digo del zumbador: <\/h3>\n\n\n\n<p><a href=\"https:\/\/github.com\/robsoncouto\/arduino-songs\/tree\/master\">https:\/\/github.com\/robsoncouto\/arduino-songs\/tree\/master<\/a><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Caja para hardware Impresi\u00f3n 3D (Realizado en Blender):<\/h3>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"580\" src=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2025\/12\/imagen_2025-12-10_112649351-1024x580.png\" alt=\"\" class=\"wp-image-9530\" srcset=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2025\/12\/imagen_2025-12-10_112649351-1024x580.png 1024w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2025\/12\/imagen_2025-12-10_112649351-300x170.png 300w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2025\/12\/imagen_2025-12-10_112649351-768x435.png 768w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2025\/12\/imagen_2025-12-10_112649351-1536x870.png 1536w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2025\/12\/imagen_2025-12-10_112649351.png 1579w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Enlace de descarga de ficheros para impresi\u00f3n 3D:<\/h3>\n\n\n\n<p><a href=\"https:\/\/drive.google.com\/file\/d\/1pbpP2CmvOY0ibrxBsVmDKQd9et9kSnkw\/view?usp=drive_link\">https:\/\/drive.google.com\/file\/d\/1pbpP2CmvOY0ibrxBsVmDKQd9et9kSnkw\/view?usp=drive_link<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Descripci\u00f3n de proyecto El proyecto que presento a continuaci\u00f3n es un juego interactivo inspirado en el cl\u00e1sico \u201cEscondite Ingl\u00e9s\u201d, pero con una tem\u00e1tica moderna y llena de tensi\u00f3n: la desactivaci\u00f3n de una bomba de&#46;&#46;&#46;<\/p>\n","protected":false},"author":306,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-9515","post","type-post","status-publish","format-standard","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>SUPER PACO BOMBASTIC SYSTEM - 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\/super-paco-bombastic-system\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"SUPER PACO BOMBASTIC SYSTEM - Proyectos con Arduino.\" \/>\n<meta property=\"og:description\" content=\"Descripci\u00f3n de proyecto El proyecto que presento a continuaci\u00f3n es un juego interactivo inspirado en el cl\u00e1sico \u201cEscondite Ingl\u00e9s\u201d, pero con una tem\u00e1tica moderna y llena de tensi\u00f3n: la desactivaci\u00f3n de una bomba de&#046;&#046;&#046;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/super-paco-bombastic-system\/\" \/>\n<meta property=\"og:site_name\" content=\"Proyectos con Arduino.\" \/>\n<meta property=\"article:published_time\" content=\"2025-12-10T10:35:11+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-12-10T10:35:13+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2025\/12\/WhatsApp-Image-2025-12-06-at-19.59.32.jpeg\" \/>\n\t<meta property=\"og:image:width\" content=\"1152\" \/>\n\t<meta property=\"og:image:height\" content=\"971\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"dse2526g09\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"dse2526g09\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"15 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\\\/super-paco-bombastic-system\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/super-paco-bombastic-system\\\/\"},\"author\":{\"name\":\"dse2526g09\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/#\\\/schema\\\/person\\\/5a91a48206c24a434c629c146d81c231\"},\"headline\":\"SUPER PACO BOMBASTIC SYSTEM\",\"datePublished\":\"2025-12-10T10:35:11+00:00\",\"dateModified\":\"2025-12-10T10:35:13+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/super-paco-bombastic-system\\\/\"},\"wordCount\":382,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/super-paco-bombastic-system\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2025\\\/12\\\/WhatsApp-Image-2025-12-06-at-19.59.32-1024x863.jpeg\",\"articleSection\":[\"Proyectos\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/super-paco-bombastic-system\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/super-paco-bombastic-system\\\/\",\"url\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/super-paco-bombastic-system\\\/\",\"name\":\"SUPER PACO BOMBASTIC SYSTEM - Proyectos con Arduino.\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/super-paco-bombastic-system\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/super-paco-bombastic-system\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2025\\\/12\\\/WhatsApp-Image-2025-12-06-at-19.59.32-1024x863.jpeg\",\"datePublished\":\"2025-12-10T10:35:11+00:00\",\"dateModified\":\"2025-12-10T10:35:13+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/super-paco-bombastic-system\\\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/super-paco-bombastic-system\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/super-paco-bombastic-system\\\/#primaryimage\",\"url\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2025\\\/12\\\/WhatsApp-Image-2025-12-06-at-19.59.32.jpeg\",\"contentUrl\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2025\\\/12\\\/WhatsApp-Image-2025-12-06-at-19.59.32.jpeg\",\"width\":1152,\"height\":971},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/super-paco-bombastic-system\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Portada\",\"item\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"SUPER PACO BOMBASTIC SYSTEM\"}]},{\"@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\\\/5a91a48206c24a434c629c146d81c231\",\"name\":\"dse2526g09\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/939126bed9de5158556a040174d848e559fc1c476640c368694cc019a8021415?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/939126bed9de5158556a040174d848e559fc1c476640c368694cc019a8021415?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/939126bed9de5158556a040174d848e559fc1c476640c368694cc019a8021415?s=96&d=mm&r=g\",\"caption\":\"dse2526g09\"},\"url\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/author\\\/dse2526g09\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"SUPER PACO BOMBASTIC SYSTEM - 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\/super-paco-bombastic-system\/","og_locale":"es_ES","og_type":"article","og_title":"SUPER PACO BOMBASTIC SYSTEM - Proyectos con Arduino.","og_description":"Descripci\u00f3n de proyecto El proyecto que presento a continuaci\u00f3n es un juego interactivo inspirado en el cl\u00e1sico \u201cEscondite Ingl\u00e9s\u201d, pero con una tem\u00e1tica moderna y llena de tensi\u00f3n: la desactivaci\u00f3n de una bomba de&#46;&#46;&#46;","og_url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/super-paco-bombastic-system\/","og_site_name":"Proyectos con Arduino.","article_published_time":"2025-12-10T10:35:11+00:00","article_modified_time":"2025-12-10T10:35:13+00:00","og_image":[{"width":1152,"height":971,"url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2025\/12\/WhatsApp-Image-2025-12-06-at-19.59.32.jpeg","type":"image\/jpeg"}],"author":"dse2526g09","twitter_card":"summary_large_image","twitter_misc":{"Escrito por":"dse2526g09","Tiempo de lectura":"15 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/super-paco-bombastic-system\/#article","isPartOf":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/super-paco-bombastic-system\/"},"author":{"name":"dse2526g09","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/#\/schema\/person\/5a91a48206c24a434c629c146d81c231"},"headline":"SUPER PACO BOMBASTIC SYSTEM","datePublished":"2025-12-10T10:35:11+00:00","dateModified":"2025-12-10T10:35:13+00:00","mainEntityOfPage":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/super-paco-bombastic-system\/"},"wordCount":382,"commentCount":0,"publisher":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/#organization"},"image":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/super-paco-bombastic-system\/#primaryimage"},"thumbnailUrl":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2025\/12\/WhatsApp-Image-2025-12-06-at-19.59.32-1024x863.jpeg","articleSection":["Proyectos"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/blogs.etsii.urjc.es\/dseytr\/super-paco-bombastic-system\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/super-paco-bombastic-system\/","url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/super-paco-bombastic-system\/","name":"SUPER PACO BOMBASTIC SYSTEM - Proyectos con Arduino.","isPartOf":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/#website"},"primaryImageOfPage":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/super-paco-bombastic-system\/#primaryimage"},"image":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/super-paco-bombastic-system\/#primaryimage"},"thumbnailUrl":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2025\/12\/WhatsApp-Image-2025-12-06-at-19.59.32-1024x863.jpeg","datePublished":"2025-12-10T10:35:11+00:00","dateModified":"2025-12-10T10:35:13+00:00","breadcrumb":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/super-paco-bombastic-system\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blogs.etsii.urjc.es\/dseytr\/super-paco-bombastic-system\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/super-paco-bombastic-system\/#primaryimage","url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2025\/12\/WhatsApp-Image-2025-12-06-at-19.59.32.jpeg","contentUrl":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2025\/12\/WhatsApp-Image-2025-12-06-at-19.59.32.jpeg","width":1152,"height":971},{"@type":"BreadcrumbList","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/super-paco-bombastic-system\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Portada","item":"https:\/\/blogs.etsii.urjc.es\/dseytr\/"},{"@type":"ListItem","position":2,"name":"SUPER PACO BOMBASTIC SYSTEM"}]},{"@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\/5a91a48206c24a434c629c146d81c231","name":"dse2526g09","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/secure.gravatar.com\/avatar\/939126bed9de5158556a040174d848e559fc1c476640c368694cc019a8021415?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/939126bed9de5158556a040174d848e559fc1c476640c368694cc019a8021415?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/939126bed9de5158556a040174d848e559fc1c476640c368694cc019a8021415?s=96&d=mm&r=g","caption":"dse2526g09"},"url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/author\/dse2526g09\/"}]}},"_links":{"self":[{"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/posts\/9515","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\/306"}],"replies":[{"embeddable":true,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/comments?post=9515"}],"version-history":[{"count":14,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/posts\/9515\/revisions"}],"predecessor-version":[{"id":9534,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/posts\/9515\/revisions\/9534"}],"wp:attachment":[{"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/media?parent=9515"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/categories?post=9515"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/tags?post=9515"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}