{"id":10334,"date":"2026-05-06T12:00:10","date_gmt":"2026-05-06T10:00:10","guid":{"rendered":"https:\/\/blogs.etsii.urjc.es\/dseytr\/?p=10334"},"modified":"2026-05-06T12:00:12","modified_gmt":"2026-05-06T10:00:12","slug":"turbo-reflex-un-juego-de-reflejos","status":"publish","type":"post","link":"https:\/\/blogs.etsii.urjc.es\/dseytr\/turbo-reflex-un-juego-de-reflejos\/","title":{"rendered":"Turbo Reflex: un juego de reflejos"},"content":{"rendered":"\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"590\" src=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2026\/05\/turboreflex-1-1024x590.jpeg\" alt=\"\" class=\"wp-image-10339\" srcset=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2026\/05\/turboreflex-1-1024x590.jpeg 1024w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2026\/05\/turboreflex-1-300x173.jpeg 300w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2026\/05\/turboreflex-1-768x443.jpeg 768w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2026\/05\/turboreflex-1-1536x885.jpeg 1536w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2026\/05\/turboreflex-1.jpeg 1600w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p><strong>Turbo Reflex<\/strong> es un proyecto que convierte una placa Arduino en un juego interactivo de reflejos. La din\u00e1mica es sencilla: una pantalla LCD muestra una acci\u00f3n que el jugador debe realizar en un tiempo limitado. Si lo consigue, recibe una se\u00f1al positiva; si falla, el sistema lo indica con un aviso negativo. Adem\u00e1s, al finalizar el juego en caso de superar todos los retos sonar\u00e1 un sonido de victoria y en caso contrario sonar\u00e1 un sonido de derrota<\/p>\n\n\n\n<p>El juego est\u00e1 dise\u00f1ado para ser din\u00e1mico, portable, flexible y desafiante. Incluye distintos modos (individual y multijugador) y cuatro niveles de dificultad (f\u00e1cil, medio, dif\u00edcil e insano), lo que permite adaptar la experiencia a diferentes usuarios.<\/p>\n\n\n\n<p>En el modo multijugador, los jugadores deben pasarse el dispositivo tras completar cada reto, lo que a\u00f1ade un componente social y competitivo. Adem\u00e1s, las distintas dificultades no solo modifican el tiempo disponible para responder, sino tambi\u00e9n el n\u00famero de vidas, haciendo que el juego sea progresivamente m\u00e1s exigente.<\/p>\n\n\n\n<p>A nivel t\u00e9cnico, el sistema integra m\u00faltiples componentes como sensores de ultrasonido, infrarrojos, LDR, joystick, entre otros, junto con una pantalla LCD y un buzzer. Esta combinaci\u00f3n permite detectar acciones en tiempo real y proporcionar un feedback inmediato al jugador, tanto visual como sonoro.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"989\" height=\"699\" src=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2026\/05\/Captura-de-pantalla-2026-05-06-113416.png\" alt=\"\" class=\"wp-image-10336\" srcset=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2026\/05\/Captura-de-pantalla-2026-05-06-113416.png 989w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2026\/05\/Captura-de-pantalla-2026-05-06-113416-300x212.png 300w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2026\/05\/Captura-de-pantalla-2026-05-06-113416-768x543.png 768w\" sizes=\"auto, (max-width: 989px) 100vw, 989px\" \/><\/figure>\n\n\n\n<p>El funcionamiento sigue un flujo claro: el juego esta inicialmente apagado, tras encenderse el usuario selecciona el modo y el nivel de dificultad, el sistema muestra un reto en pantalla y los sensores verifican si se completa correctamente dentro del tiempo establecido. Los retos se generan de forma aleatoria, lo que aumenta la rejugabilidad.<\/p>\n\n\n\n<p>El sistema tambi\u00e9n incorpora un control mediante mando que permite apagar el juego en cualquier momento. Al volver a encenderlo, el sistema se reinicia completamente, asegurando una experiencia limpia desde el inicio.<\/p>\n\n\n\n<p>Para gestionar todo esto, el programa se estructura en tres estados principales: <em>apagado<\/em>, <em>iniciando<\/em> y <em>jugando<\/em>. Esto facilita el control del flujo del juego y mejora la organizaci\u00f3n interna del c\u00f3digo.<\/p>\n\n\n\n<p>Durante el desarrollo surgieron desaf\u00edos como la limitaci\u00f3n de pines del Arduino o conflictos entre componentes (por ejemplo, el uso simult\u00e1neo del buzzer y el mando). Estos problemas se resolvieron optimizando el uso de pines \u2014incluso reutilizando pines anal\u00f3gicos como digitales\u2014 y simplificando las conexiones.<\/p>\n\n\n\n<p>El resultado final es un prototipo jugable, escalable y entretenido, que demuestra la correcta integraci\u00f3n de hardware, programaci\u00f3n y sistemas en tiempo real.<\/p>\n\n\n\n<p><strong>Conexiones<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"768\" data-id=\"10338\" src=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2026\/05\/WhatsApp-Image-2026-05-06-at-11.47.58-1024x768.jpeg\" alt=\"\" class=\"wp-image-10338\" srcset=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2026\/05\/WhatsApp-Image-2026-05-06-at-11.47.58-1024x768.jpeg 1024w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2026\/05\/WhatsApp-Image-2026-05-06-at-11.47.58-300x225.jpeg 300w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2026\/05\/WhatsApp-Image-2026-05-06-at-11.47.58-768x576.jpeg 768w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2026\/05\/WhatsApp-Image-2026-05-06-at-11.47.58-1536x1152.jpeg 1536w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2026\/05\/WhatsApp-Image-2026-05-06-at-11.47.58.jpeg 1600w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/figure>\n\n\n\n<p><strong>C\u00f3digo<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">#include &lt;Arduino.h&gt;\n#include &lt;IRremote.hpp&gt;\n#include &lt;LiquidCrystal.h&gt;\n#include &lt;TM1637Display.h&gt;\n\n#define NOTE_G4 392\n#define NOTE_C5 523\n#define NOTE_E5 659\n#define NOTE_G5 784\n#define NOTE_C6 1047\n#define NOTE_E6 1319\n#define NOTE_G6 1568\n#define NOTE_GS4 415\n#define NOTE_DS5 622\n#define NOTE_GS5 831\n#define NOTE_DS6 1245\n#define NOTE_GS6 1661\n#define NOTE_AS4 466\n#define NOTE_F5 698\n#define NOTE_AS5 932\n#define NOTE_F6 1397\n#define NOTE_AS6 1865\n#define NOTE_C7 2093\n#define NOTE_D5 587\n#define NOTE_D6 1175\n\n\/\/           LCD (RS, E, D4, D5, D6, D7)\nLiquidCrystal lcd(12, 11, 10, 9, 8, 13);\n\nconst int LDR = A0;\nconst int BUZZER = 2;\nconst int TILTBALL = 3;\nconst int JOYSTICK = 5;\n\nconst int pinX = A1;\nconst int pinY = A2;\n\nconst int IR_RECEIVE_PIN = 7;\nconst int CLK = 6;\nTM1637Display display(CLK, A5);\nconst unsigned long APAGAR = 0xBA45FF00;\n\nenum EstadoSistema { APAGADO,\n                     INICIANDO,\n                     JUGANDO };\nvolatile EstadoSistema estadoActual = APAGADO;\nvolatile bool peticionCambio = false;\nbool menuMostrado = false;\nunsigned long tiempoMenu = 0;\nint modoActual = -1;\nconst int MULTIJUGADOR = 0;\nconst int SOLITARIO = 1;\nconst int tiltPin = 13;\nint ultimoSegundoSonao = -1;\nint canalRetoActual;\nconst int CANAL_BUZZER = 3;\nunsigned long mapaIR[] = {\n  0xE916FF00,  \/\/ [0]\n  0xF30CFF00,  \/\/ [1]\n  0xE718FF00,  \/\/ [2]\n  0xA15EFF00,  \/\/ [3]\n  0xF708FF00,  \/\/ [4]\n  0xE31CFF00,  \/\/ [5]\n  0xA55AFF00,  \/\/ [6]\n  0xBD42FF00,  \/\/ [7]\n  0xAD52FF00,  \/\/ [8]\n  0xB54AFF00   \/\/ [9]\n};\n\n\n\nint dificultad;\n\nconst int FACIL = 0;\nconst int MEDIA = 1;\nconst int DIFICIL = 2;\nconst int INSANO = 3;\nconst int trigPin = A3;\nconst int echoPin = A4;\n\nenum SubMenu {\n  MENU_MODO,\n  MENU_DIFICULTAD\n};\n\nSubMenu subMenu = MENU_MODO;\n\nvoid setup() {\n  Serial.begin(9600);\n  IrReceiver.begin(IR_RECEIVE_PIN);\n  lcd.begin(16, 2);\n  randomSeed(analogRead(3));\n  pinMode(JOYSTICK, OUTPUT);\n  digitalWrite(JOYSTICK, HIGH);\n\n  pinMode(LDR, INPUT);\n  pinMode(TILTBALL, INPUT);\n  pinMode(BUZZER, OUTPUT);\n\n  pinMode(A4, OUTPUT);\n\n  pinMode(trigPin, OUTPUT);\n  pinMode(echoPin, INPUT);\n  \n  display.setBrightness(7);\n  display.clear();\n  delay(1000);\n}\n\n\n\n\nvoid loop() {\n  \/\/ 1. Siempre escuchamos el mando\n  if (IrReceiver.decode()) {\n    if (IrReceiver.decodedIRData.decodedRawData == APAGAR) {\n      peticionCambio = true;\n      Serial.println(\"\u00a1Bot\u00f3n pulsado!\");\n    }\n    IrReceiver.resume();\n  }\n\n  \/\/ 2. M\u00e1quina de Estados\n  switch (estadoActual) {\n\n    case JUGANDO:\n      if (peticionCambio) {\n        \/\/ ACCI\u00d3N AL APAGAR\n        lcd.clear();\n        lcd.noDisplay();  \/\/ Apaga el texto\n        Serial.println(\"Entrando en modo APAGADO...\");\n        estadoActual = APAGADO;\n        peticionCambio = false;  \/\/ Consumimos la pulsaci\u00f3n\n      } else {\n        iniciarJuego();\n      }\n      break;\n\n    case APAGADO:\n      lcd.clear();\n      display.clear();\n      \/\/ En este estado, el Arduino no hace NADA.\n      \/\/ Solo espera a que peticionCambio sea true otra vez.\n      if (peticionCambio) {\n        Serial.println(\"Despertando y Reiniciando...\");\n        lcd.display();             \/\/ Encendemos el driver del LCD\n        estadoActual = INICIANDO;  \/\/ Vamos a reiniciar\n        peticionCambio = false;    \/\/ Consumimos la pulsaci\u00f3n\n      }\n      break;\n\n    case INICIANDO:\n      if (subMenu == MENU_MODO) {\n\n        if (!menuMostrado) {\n          IrReceiver.resume();\n          IrReceiver.stopTimer();\n          IrReceiver.start();\n\n          lcd.clear();\n          lcd.setCursor(0, 0);\n          lcd.print(\"TURBO REFLEX\");\n          lcd.setCursor(0, 1);\n          lcd.print(\"LISTO\");\n\n          delay(1000);\n\n          lcd.clear();\n          lcd.print(\"0:Multi 1:Soli\");\n\n          tiempoMenu = millis();\n          menuMostrado = true;\n        }\n\n        if (millis() - tiempoMenu &gt; 20000) {\n          menuMostrado = false;\n        }\n\n        if (IrReceiver.decode()) {\n\n          uint32_t codigo = IrReceiver.decodedIRData.decodedRawData;\n          IrReceiver.resume();\n\n          if (codigo == APAGAR) {\n            estadoActual = APAGADO;\n            peticionCambio = false;\n            menuMostrado = false;\n            return;\n          }\n\n          if (codigo == mapaIR[0]) {\n            modoActual = MULTIJUGADOR;\n            lcd.clear();\n          lcd.print(\"Modo multi\");\n          } else if (codigo == mapaIR[1]) {\n            modoActual = SOLITARIO;\n            lcd.clear();\n            lcd.print(\"Modo solitario\");\n          } else {\n            return;\n          }\n\n          \n          delay(800);\n\n          \/\/ \ud83d\udc49 pasas a dificultad\n          subMenu = MENU_DIFICULTAD;\n          menuMostrado = false;\n        }\n      }\n\n      \/\/ =========================\n      \/\/ DIFICULTAD\n      \/\/ =========================\n      else if (subMenu == MENU_DIFICULTAD) {\n        \n        if (!menuMostrado) {\n          lcd.clear();\n          lcd.print(\"Seleccione la\"); \n          lcd.setCursor(0, 1); \n          lcd.print(\"dificultad\"); \n          delay(1000); \n          lcd.clear(); \n          lcd.print(\"0: facil 1:medio\"); \n          lcd.setCursor(0, 1); \n          lcd.print(\"2:dif 3:insano\");\n          tiempoMenu = millis();\n          menuMostrado = true;\n        }\n\n        if (millis() - tiempoMenu &gt; 20000) {\n          subMenu = MENU_MODO;\n          menuMostrado = false;\n        }\n\n        if (IrReceiver.decode()) {\n\n          uint32_t codigo = IrReceiver.decodedIRData.decodedRawData;\n          IrReceiver.resume();\n\n          if (codigo == APAGAR) {\n            estadoActual = APAGADO;\n            peticionCambio = false;\n            menuMostrado = false;\n            subMenu = MENU_MODO;\n            return;\n          }\n\n          if (codigo == mapaIR[0]){\n            dificultad = FACIL;\n            lcd.clear();\n            lcd.print(\"Modo facil\");\n          } else if (codigo == mapaIR[1]){\n            dificultad = MEDIA;\n            lcd.clear();\n            lcd.print(\"Modo medio\");\n          }else if(codigo == mapaIR[2]){\n            dificultad = DIFICIL;\n            lcd.clear();\n            lcd.print(\"Modo dificil\");\n          }\n          else if(codigo == mapaIR[3]){\n            dificultad = INSANO;\n            lcd.clear();\n            lcd.print(\"Modo insano\");\n          }else return;\n\n          delay(800);\n\n          estadoActual = JUGANDO;\n          menuMostrado = false;\n          subMenu = MENU_MODO;  \/\/ reset para la pr\u00f3xima vez\n        }\n      }\n      break;\n  }\n}\n\n\/\/Funciones auxiliares\nint SetMuxChannel(byte channel) {\n  digitalWrite(muxS0, bitRead(channel, 0));\n  digitalWrite(muxS1, bitRead(channel, 1));\n  digitalWrite(muxS2, bitRead(channel, 2));\n  digitalWrite(muxS3, bitRead(channel, 3));\n}\n\n\nvoid iniciarJuego() {\n  int retoActual;\n  int retosSuperados = 0;\n  int numVidas;\n  int tiempoReto;\n  bool inicio = true;\n  bool superado;\n\n  if (dificultad == FACIL) {\n    numVidas = 3;\n    tiempoReto = 13000;\n  } else if (dificultad == MEDIA) {\n    numVidas = 3;\n    tiempoReto = 8000;\n  } else if (dificultad == DIFICIL) {\n    numVidas = 2;\n    tiempoReto = 5000;\n  } else {\n    numVidas = 1;\n    tiempoReto = 2500;\n  }\n\n  if (IrReceiver.decode()) {\n    if (IrReceiver.decodedIRData.decodedRawData == APAGAR) {\n      peticionCambio = true;\n      Serial.println(\"Apagar pulsado!\");\n      IrReceiver.resume();\n      return;\n    }\n    IrReceiver.resume();\n  }\n  while (retosSuperados != 15 &amp;&amp; numVidas != 0) {\n    if (!inicio &amp;&amp; modoActual == MULTIJUGADOR) {\n      lcd.clear();\n      lcd.print(\"Pasalo!\");\n      delay(500);\n    }\n    lcd.clear();\n    if (inicio) {\n      inicio = false;\n    }\n\n    retoActual = random(0, 5);\n    switch (retoActual) {\n      case 0:\n        if (retoInclinacion(tiempoReto)) {\n          retosSuperados++;\n        } else {\n          numVidas--;\n          lcd.clear();\n          lcd.setCursor(0, 0);\n          lcd.print(\"Fallaste\");\n          lcd.setCursor(0, 1);\n          lcd.print(String(\"Vidas: \") + numVidas);\n          delay(1000);\n        }\n\n        break;\n      case 1:\n        if (retoMando(tiempoReto)) {\n          retosSuperados++;\n        } else {\n          numVidas--;\n          lcd.clear();\n          lcd.setCursor(0, 0);\n          lcd.print(\"Fallaste \");\n          lcd.setCursor(0, 1);\n          lcd.print(String(\"Vidas: \") + numVidas);\n          delay(1000);\n        }\n\n        break;\n      case 2:\n        if (retoJoystick(tiempoReto)) {\n          retosSuperados++;\n        } else {\n          numVidas--;\n          lcd.clear();\n          lcd.setCursor(0, 0);\n          lcd.print(\"Fallaste \");\n          lcd.setCursor(0, 1);\n          lcd.print(String(\"Vidas: \") + numVidas);\n          delay(1000);\n        }\n        break;\n      case 3:\n        if (retoLDR(tiempoReto)) {\n          retosSuperados++;\n        } else {\n          numVidas--;\n          lcd.clear();\n          lcd.setCursor(0, 0);\n          lcd.print(\"Fallaste \");\n          lcd.setCursor(0, 1);\n          lcd.print(String(\"Vidas: \") + numVidas);\n          delay(1000);\n        }\n        break;\n      case 4:\n        if (retoDistancias(tiempoReto)) {\n          retosSuperados++;\n        } else {\n          numVidas--;\n          lcd.clear();\n          lcd.setCursor(0, 0);\n          lcd.print(\"Fallaste \");\n          lcd.setCursor(0, 1);\n          lcd.print(String(\"Vidas: \") + numVidas);\n          delay(1000);\n        }\n        break;\n    }\n    if (peticionCambio) {\n      estadoActual = APAGADO;\n      peticionCambio = false;\n      return;\n    }\n\n    display.clear();\n    delay(500);\n  }\n  display.clear();\n  if (retosSuperados == 15) {\n    lcd.clear();\n    lcd.setCursor(0, 0);\n    lcd.print(\"Enhorabuena!\");\n    lcd.setCursor(0, 1);\n    lcd.print(\":)\");\n    playMarioVictory();\n  } else {\n    lcd.clear();\n    lcd.setCursor(0, 0);\n    lcd.print(\"Perdiste\");\n    lcd.setCursor(0, 1);\n    lcd.print(\":(\");\n    playMarioDefeat();\n  }\n  delay(2000);  \/\/se muestra 2 segundo\n  menuMostrado = false;\n  estadoActual = INICIANDO;\n}\n\nbool retoInclinacion(int tiempoReto) {\n  lcd.setCursor(0, 1);\n  lcd.print(\"Inclina!\");\n  delay(1000);\n  unsigned long tInicio = millis();\n\n  while (millis() - tInicio &lt;= tiempoReto) {  \/\/ 10 segundos\n    mostrarCuentaAtras(tInicio, tiempoReto);\n    int estado = digitalRead(TILTBALL);\n\n    if (IrReceiver.decode()) {\n      if (IrReceiver.decodedIRData.decodedRawData == APAGAR) {\n        peticionCambio = true;\n        Serial.println(\"Apagar pulsado!\");\n        IrReceiver.resume();\n        return false;\n      }\n      IrReceiver.resume();\n    }\n\n    if (estado == LOW) {\n      lcd.clear();\n      lcd.print(\"Superado!\");\n      delay(1000);\n      return true;\n    }\n    delay(10);  \/\/ &lt;-- clave para estabilidad\n  }\n\n\n  return false;\n}\n\nbool retoMando(int tiempoReto) {\n  int pulsarNum = random(0, 10);\n  lcd.clear();\n  lcd.setCursor(0, 0);\n  lcd.print(String(\"Pulsa \") + pulsarNum);\n  Serial.println(pulsarNum);\n  delay(1000);\n\n  unsigned long tInicio = millis();\n  while (millis() - tInicio &lt;= tiempoReto) {  \/\/le damos 20 segundos\n    mostrarCuentaAtras(tInicio, tiempoReto);\n    if (IrReceiver.decode()) {\n      uint32_t codigo = IrReceiver.decodedIRData.decodedRawData;\n      Serial.println(codigo);\n      IrReceiver.resume();\n      if (codigo == 0xFFFFFFFF || codigo == 0x0) {  \/\/ignorar ruido\n        continue;\n      }\n\n      if (codigo == mapaIR[pulsarNum]) {\n        lcd.clear();\n        lcd.print(\"Superado!\");\n        delay(1000);\n        return true;\n      } else if (codigo == APAGAR) {\n        peticionCambio = true;\n        Serial.println(\"Apagar pulsado!\");\n        return false;\n      } else {\n        return false;\n      }\n    }\n    delay(10);\n  }\n\n  return false;\n}\n\nbool retoJoystick(int tiempoReto) {\n  String objetivo;\n  int tipo = random(0, 4);\n\n  switch (tipo) {\n    case 0: objetivo = \"IZQUIERDA\"; break;\n    case 1: objetivo = \"DERECHA\"; break;\n    case 2: objetivo = \"ARRIBA\"; break;\n    case 3: objetivo = \"ABAJO\"; break;\n  }\n\n  lcd.clear();\n  lcd.print(\"Haz: \");\n  lcd.setCursor(0, 1);\n  lcd.print(objetivo);\n\n  unsigned long tInicio = millis();\n\n  while (millis() - tInicio &lt; tiempoReto) {\n    mostrarCuentaAtras(tInicio, tiempoReto);\n    if (IrReceiver.decode()) {\n      if (IrReceiver.decodedIRData.decodedRawData == APAGAR) {\n        peticionCambio = true;\n        Serial.println(\"Apagar pulsado!\");\n        IrReceiver.resume();\n        return false;\n      }\n      IrReceiver.resume();\n    }\n\n    String accion = leerJoystick();\n\n    if (accion == objetivo) {\n      lcd.clear();\n      lcd.print(\"Correcto!\");\n      delay(800);\n      return true;\n    } else if (accion != \"CENTRO\") {\n      return false;\n    }\n\n    delay(50);\n  }\n\n  lcd.clear();\n  lcd.print(\"Tiempo!\");\n  delay(800);\n  return false;\n}\n\nString leerJoystick() {\n  int x = analogRead(pinX);\n  int y = analogRead(pinY);\n  \/\/ Mostrar valores crudos\n  Serial.print(\"X: \");\n  Serial.print(x);\n  Serial.print(\" | Y: \");\n  Serial.println(y);\n\n  delay(200);\n\n  if (x &lt; 300) return \"IZQUIERDA\";\n  if (x &gt; 700) return \"DERECHA\";\n  if (y &gt; 700) return \"ABAJO\";\n  if (y &lt; 300) return \"ARRIBA\";\n\n\n  return \"CENTRO\";\n}\n\nbool retoLDR(int tiempoReto) {\n  \n\n  lcd.clear();\n  lcd.setCursor(0, 0);\n  lcd.print(\"Tapa el LDR\");\n  lcd.setCursor(0, 1);\n  lcd.print(\"Rapido!\");\n\n  delay(1000);\n\n  unsigned long tInicio = millis();\n\n  while (millis() - tInicio &lt;= tiempoReto) {  \/\/ 10 segundos\n    mostrarCuentaAtras(tInicio, tiempoReto);\n    int valorLDR = analogRead(LDR);\n    Serial.println(valorLDR);\n\n    if (IrReceiver.decode()) {\n      uint32_t codigo = IrReceiver.decodedIRData.decodedRawData;\n      IrReceiver.resume();\n\n      if (codigo == APAGAR) {\n        peticionCambio = true;\n        Serial.println(\"Apagar pulsado!\");\n        return false;\n      }\n    }\n\n    if (valorLDR &lt;= 220) {\n      delay(700);\n      lcd.clear();\n      lcd.print(\"Superado!\");\n      delay(1000);\n      return true;\n    }\n\n\n    delay(50);\n  }\n\n  \/\/ \u23f1\ufe0f Tiempo agotado\n  lcd.clear();\n  lcd.print(\"Tiempo!\");\n  delay(800);\n  return false;\n}\n\nbool retoDistancias(int tiempoReto) {\n  int objetivo = random(5, 51);  \/\/ 1 a 50 cm\n\n  lcd.clear();\n  lcd.setCursor(0, 0);\n  lcd.print(\"Ponte a:\");\n  lcd.setCursor(0, 1);\n  lcd.print(objetivo);\n  lcd.print(\" cm\");\n\n  delay(2000);\n\n  unsigned long tInicio = millis();\n\n  while (millis() - tInicio &lt;= tiempoReto) {\n    mostrarCuentaAtras(tInicio, tiempoReto);\n    digitalWrite(trigPin, LOW);\n    delayMicroseconds(2);\n    digitalWrite(trigPin, HIGH);\n    delayMicroseconds(10);\n    digitalWrite(trigPin, LOW);\n\n    long duracion = pulseIn(echoPin, HIGH, 30000);  \/\/ timeout\n\n    int distancia = duracion * 0.034 \/ 2;\n\n    Serial.print(\"Distancia: \");\n    Serial.println(distancia);\n\n    \/\/ Control IR\n    if (IrReceiver.decode()) {\n      uint32_t codigo = IrReceiver.decodedIRData.decodedRawData;\n      IrReceiver.resume();\n\n      if (codigo == APAGAR) {\n        peticionCambio = true;\n        return false;\n      }\n    }\n\n    if (abs(distancia - objetivo) &lt;= 2) {\n      lcd.clear();\n      lcd.print(\"Superado!\");\n      delay(1000);\n      return true;\n    }\n\n    delay(100);\n  }\n\n  lcd.clear();\n  lcd.print(\"Tiempo!\");\n  delay(800);\n  return false;\n}\nvoid mostrarCuentaAtras(unsigned long tiempoInicio, unsigned long duracion) {\n  unsigned long tiempoTranscurrido = millis() - tiempoInicio;\n  int segundosRestantes = (duracion - tiempoTranscurrido) \/ 1000;\n\n  if (segundosRestantes &lt; 0) segundosRestantes = 0;\n\n  display.showNumberDec(segundosRestantes, true);\n}\n\n\n\n\/\/ --- MELOD\u00cdA DE VICTORIA (BANDERA) ---\nvoid playMarioVictory() {\n\n  \/\/ Primer arpegio (Do Mayor)\n  tone(BUZZER, NOTE_G4, 100);\n  delay(120);\n  tone(BUZZER, NOTE_C5, 100);\n  delay(120);\n  tone(BUZZER, NOTE_E5, 100);\n  delay(120);\n  tone(BUZZER, NOTE_G5, 100);\n  delay(120);\n  tone(BUZZER, NOTE_C6, 100);\n  delay(120);\n  tone(BUZZER, NOTE_E6, 100);\n  delay(120);\n  tone(BUZZER, NOTE_G6, 300);\n  delay(350);\n  tone(BUZZER, NOTE_E6, 300);\n  delay(350);\n\n  \/\/ Segundo arpegio (Sol Sostenido Mayor)\n  tone(BUZZER, NOTE_GS4, 100);\n  delay(120);\n  tone(BUZZER, NOTE_C5, 100);\n  delay(120);\n  tone(BUZZER, NOTE_DS5, 100);\n  delay(120);\n  tone(BUZZER, NOTE_GS5, 100);\n  delay(120);\n  tone(BUZZER, NOTE_C6, 100);\n  delay(120);\n  tone(BUZZER, NOTE_DS6, 100);\n  delay(120);\n  tone(BUZZER, NOTE_GS6, 300);\n  delay(350);\n  tone(BUZZER, NOTE_DS6, 300);\n  delay(350);\n\n  \/\/ Tercer arpegio (Si Bemol Mayor)\n  tone(BUZZER, NOTE_AS4, 100);\n  delay(120);\n  tone(BUZZER, NOTE_D5, 100);\n  delay(120);\n  tone(BUZZER, NOTE_F5, 100);\n  delay(120);\n  tone(BUZZER, NOTE_AS5, 100);\n  delay(120);\n  tone(BUZZER, NOTE_D6, 100);\n  delay(120);\n  tone(BUZZER, NOTE_F6, 100);\n  delay(120);\n  tone(BUZZER, NOTE_AS6, 300);\n  delay(350);\n\n  \/\/ Final triunfal\n  tone(BUZZER, NOTE_AS6, 100);\n  delay(120);\n  tone(BUZZER, NOTE_AS6, 100);\n  delay(120);\n  tone(BUZZER, NOTE_AS6, 100);\n  delay(120);\n  tone(BUZZER, NOTE_C7, 600);\n  delay(800);\n\n  noTone(BUZZER);\n\n}\n\n\/\/ --- MELOD\u00cdA DE DERROTA (GAME OVER \/ LOSE LIFE) ---\nvoid playMarioDefeat() {\n  Serial.print(\"llegaaa\");\n  \n  \/\/ Notas r\u00e1pidas descendentes cl\u00e1sicas\n  tone(BUZZER, 1047, 100);\n  delay(150);  \/\/ C6\n  tone(BUZZER, 784, 100);\n  delay(150);  \/\/ G5\n  tone(BUZZER, 659, 100);\n  delay(150);  \/\/ E5\n\n  tone(BUZZER, 880, 150);\n  delay(200);  \/\/ A5\n  tone(BUZZER, 988, 150);\n  delay(200);  \/\/ B5\n  tone(BUZZER, 880, 150);\n  delay(200);  \/\/ A5\n\n  tone(BUZZER, 831, 150);\n  delay(200);  \/\/ G#5\n  tone(BUZZER, 932, 150);\n  delay(200);  \/\/ A#5\n  tone(BUZZER, 831, 150);\n  delay(200);  \/\/ G#5\n\n  tone(BUZZER, 784, 300);\n  delay(400);  \/\/ G5\n  noTone(BUZZER);\n\n}<\/pre>\n\n\n\n<p><strong>Explicaci\u00f3n del c\u00f3digo<\/strong><\/p>\n\n\n\n<p>El c\u00f3digo implementa la l\u00f3gica completa del juego <strong>Turbo Reflex<\/strong> utilizando Arduino. Se apoya en varias librer\u00edas para gestionar los distintos componentes: la pantalla LCD, el receptor infrarrojo (mando) y el display de 7 segmentos.<\/p>\n\n\n\n<p>La estructura principal del programa se basa en una <strong>m\u00e1quina de estados<\/strong>, con tres modos definidos: <em>apagado<\/em>, <em>iniciando<\/em> y <em>jugando<\/em>. Esto permite organizar el flujo del sistema de forma clara. En estado <em>apagado<\/em>, el dispositivo no interact\u00faa; en <em>iniciando<\/em>, el jugador selecciona modo y dificultad mediante el mando; y en <em>jugando<\/em>, se ejecutan los retos.<\/p>\n\n\n\n<p>El mando infrarrojo tiene un papel clave, ya que permite tanto controlar los men\u00fas como <strong>apagar el sistema en cualquier momento<\/strong>. Cuando se apaga y se vuelve a encender, el juego se reinicia completamente, volviendo al estado inicial.<\/p>\n\n\n\n<p>El n\u00facleo del juego est\u00e1 en la funci\u00f3n <code>iniciarJuego()<\/code>, donde se gestionan las partidas: se establecen las vidas y el tiempo seg\u00fan la dificultad, y se ejecutan retos aleatorios hasta ganar (superando 15 retos) o perder (quedarse sin vidas).<\/p>\n\n\n\n<p>Los retos est\u00e1n implementados en funciones independientes, cada una usando un sensor distinto:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Inclinaci\u00f3n (tilt ball)<\/li>\n\n\n\n<li>Mando (botones)<\/li>\n\n\n\n<li>Joystick (direcciones)<\/li>\n\n\n\n<li>Luz (LDR)<\/li>\n\n\n\n<li>Distancia (sensor ultras\u00f3nico)<\/li>\n<\/ul>\n\n\n\n<p>Cada reto debe completarse dentro de un tiempo l\u00edmite, que se muestra con una cuenta atr\u00e1s en el display. Adem\u00e1s, el sistema comprueba constantemente si el jugador quiere apagar el juego.<\/p>\n\n\n\n<p>Finalmente, el buzzer se utiliza para dar feedback sonoro, reproduciendo una melod\u00eda diferente seg\u00fan se gane o se pierda la partida. En conjunto, el c\u00f3digo demuestra una correcta integraci\u00f3n de sensores, control en tiempo real y organizaci\u00f3n modular mediante funciones y estados.<\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Turbo Reflex es un proyecto que convierte una placa Arduino en un juego interactivo de reflejos. La din\u00e1mica es sencilla: una pantalla LCD muestra una acci\u00f3n que el jugador debe realizar en un tiempo&#46;&#46;&#46;<\/p>\n","protected":false},"author":336,"featured_media":10337,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-10334","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.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Turbo Reflex: un juego de reflejos - 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\/turbo-reflex-un-juego-de-reflejos\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Turbo Reflex: un juego de reflejos - Proyectos con Arduino.\" \/>\n<meta property=\"og:description\" content=\"Turbo Reflex es un proyecto que convierte una placa Arduino en un juego interactivo de reflejos. La din\u00e1mica es sencilla: una pantalla LCD muestra una acci\u00f3n que el jugador debe realizar en un tiempo&#046;&#046;&#046;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/turbo-reflex-un-juego-de-reflejos\/\" \/>\n<meta property=\"og:site_name\" content=\"Proyectos con Arduino.\" \/>\n<meta property=\"article:published_time\" content=\"2026-05-06T10:00:10+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-05-06T10:00:12+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2026\/05\/turboreflex.jpeg\" \/>\n\t<meta property=\"og:image:width\" content=\"1600\" \/>\n\t<meta property=\"og:image:height\" content=\"922\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"seytrmo2526g06\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"seytrmo2526g06\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"12 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\\\/turbo-reflex-un-juego-de-reflejos\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/turbo-reflex-un-juego-de-reflejos\\\/\"},\"author\":{\"name\":\"seytrmo2526g06\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/#\\\/schema\\\/person\\\/95a35b8d9dc2dc6943676a688a90faad\"},\"headline\":\"Turbo Reflex: un juego de reflejos\",\"datePublished\":\"2026-05-06T10:00:10+00:00\",\"dateModified\":\"2026-05-06T10:00:12+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/turbo-reflex-un-juego-de-reflejos\\\/\"},\"wordCount\":712,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/turbo-reflex-un-juego-de-reflejos\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2026\\\/05\\\/turboreflex.jpeg\",\"articleSection\":[\"Proyectos\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/turbo-reflex-un-juego-de-reflejos\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/turbo-reflex-un-juego-de-reflejos\\\/\",\"url\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/turbo-reflex-un-juego-de-reflejos\\\/\",\"name\":\"Turbo Reflex: un juego de reflejos - Proyectos con Arduino.\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/turbo-reflex-un-juego-de-reflejos\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/turbo-reflex-un-juego-de-reflejos\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2026\\\/05\\\/turboreflex.jpeg\",\"datePublished\":\"2026-05-06T10:00:10+00:00\",\"dateModified\":\"2026-05-06T10:00:12+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/turbo-reflex-un-juego-de-reflejos\\\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/turbo-reflex-un-juego-de-reflejos\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/turbo-reflex-un-juego-de-reflejos\\\/#primaryimage\",\"url\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2026\\\/05\\\/turboreflex.jpeg\",\"contentUrl\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2026\\\/05\\\/turboreflex.jpeg\",\"width\":1600,\"height\":922},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/turbo-reflex-un-juego-de-reflejos\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Portada\",\"item\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Turbo Reflex: un juego de reflejos\"}]},{\"@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\\\/95a35b8d9dc2dc6943676a688a90faad\",\"name\":\"seytrmo2526g06\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/9b25f71d6620c00a48e1aa7574154d66ad6d0e7b992a5204a41e9e1d803f2d81?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/9b25f71d6620c00a48e1aa7574154d66ad6d0e7b992a5204a41e9e1d803f2d81?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/9b25f71d6620c00a48e1aa7574154d66ad6d0e7b992a5204a41e9e1d803f2d81?s=96&d=mm&r=g\",\"caption\":\"seytrmo2526g06\"},\"url\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/author\\\/seytrmo2526g06\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Turbo Reflex: un juego de reflejos - 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\/turbo-reflex-un-juego-de-reflejos\/","og_locale":"es_ES","og_type":"article","og_title":"Turbo Reflex: un juego de reflejos - Proyectos con Arduino.","og_description":"Turbo Reflex es un proyecto que convierte una placa Arduino en un juego interactivo de reflejos. La din\u00e1mica es sencilla: una pantalla LCD muestra una acci\u00f3n que el jugador debe realizar en un tiempo&#46;&#46;&#46;","og_url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/turbo-reflex-un-juego-de-reflejos\/","og_site_name":"Proyectos con Arduino.","article_published_time":"2026-05-06T10:00:10+00:00","article_modified_time":"2026-05-06T10:00:12+00:00","og_image":[{"width":1600,"height":922,"url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2026\/05\/turboreflex.jpeg","type":"image\/jpeg"}],"author":"seytrmo2526g06","twitter_card":"summary_large_image","twitter_misc":{"Escrito por":"seytrmo2526g06","Tiempo de lectura":"12 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/turbo-reflex-un-juego-de-reflejos\/#article","isPartOf":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/turbo-reflex-un-juego-de-reflejos\/"},"author":{"name":"seytrmo2526g06","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/#\/schema\/person\/95a35b8d9dc2dc6943676a688a90faad"},"headline":"Turbo Reflex: un juego de reflejos","datePublished":"2026-05-06T10:00:10+00:00","dateModified":"2026-05-06T10:00:12+00:00","mainEntityOfPage":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/turbo-reflex-un-juego-de-reflejos\/"},"wordCount":712,"commentCount":0,"publisher":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/#organization"},"image":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/turbo-reflex-un-juego-de-reflejos\/#primaryimage"},"thumbnailUrl":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2026\/05\/turboreflex.jpeg","articleSection":["Proyectos"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/blogs.etsii.urjc.es\/dseytr\/turbo-reflex-un-juego-de-reflejos\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/turbo-reflex-un-juego-de-reflejos\/","url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/turbo-reflex-un-juego-de-reflejos\/","name":"Turbo Reflex: un juego de reflejos - Proyectos con Arduino.","isPartOf":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/#website"},"primaryImageOfPage":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/turbo-reflex-un-juego-de-reflejos\/#primaryimage"},"image":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/turbo-reflex-un-juego-de-reflejos\/#primaryimage"},"thumbnailUrl":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2026\/05\/turboreflex.jpeg","datePublished":"2026-05-06T10:00:10+00:00","dateModified":"2026-05-06T10:00:12+00:00","breadcrumb":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/turbo-reflex-un-juego-de-reflejos\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blogs.etsii.urjc.es\/dseytr\/turbo-reflex-un-juego-de-reflejos\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/turbo-reflex-un-juego-de-reflejos\/#primaryimage","url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2026\/05\/turboreflex.jpeg","contentUrl":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2026\/05\/turboreflex.jpeg","width":1600,"height":922},{"@type":"BreadcrumbList","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/turbo-reflex-un-juego-de-reflejos\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Portada","item":"https:\/\/blogs.etsii.urjc.es\/dseytr\/"},{"@type":"ListItem","position":2,"name":"Turbo Reflex: un juego de reflejos"}]},{"@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\/95a35b8d9dc2dc6943676a688a90faad","name":"seytrmo2526g06","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/secure.gravatar.com\/avatar\/9b25f71d6620c00a48e1aa7574154d66ad6d0e7b992a5204a41e9e1d803f2d81?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/9b25f71d6620c00a48e1aa7574154d66ad6d0e7b992a5204a41e9e1d803f2d81?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/9b25f71d6620c00a48e1aa7574154d66ad6d0e7b992a5204a41e9e1d803f2d81?s=96&d=mm&r=g","caption":"seytrmo2526g06"},"url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/author\/seytrmo2526g06\/"}]}},"_links":{"self":[{"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/posts\/10334","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\/336"}],"replies":[{"embeddable":true,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/comments?post=10334"}],"version-history":[{"count":1,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/posts\/10334\/revisions"}],"predecessor-version":[{"id":10347,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/posts\/10334\/revisions\/10347"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/media\/10337"}],"wp:attachment":[{"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/media?parent=10334"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/categories?post=10334"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/tags?post=10334"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}