{"id":9070,"date":"2024-12-20T17:41:24","date_gmt":"2024-12-20T16:41:24","guid":{"rendered":"https:\/\/blogs.etsii.urjc.es\/dseytr\/?p=9070"},"modified":"2025-01-13T13:34:24","modified_gmt":"2025-01-13T12:34:24","slug":"pigiti","status":"publish","type":"post","link":"https:\/\/blogs.etsii.urjc.es\/dseytr\/pigiti\/","title":{"rendered":"PiGiTi"},"content":{"rendered":"\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"3024\" height=\"3024\" src=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/imagen_2024-12-19_201900478-edited.png\" alt=\"\" class=\"wp-image-9274\" srcset=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/imagen_2024-12-19_201900478-edited.png 3024w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/imagen_2024-12-19_201900478-edited-300x300.png 300w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/imagen_2024-12-19_201900478-edited-1024x1024.png 1024w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/imagen_2024-12-19_201900478-edited-150x150.png 150w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/imagen_2024-12-19_201900478-edited-768x768.png 768w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/imagen_2024-12-19_201900478-edited-1536x1536.png 1536w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/imagen_2024-12-19_201900478-edited-2048x2048.png 2048w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/imagen_2024-12-19_201900478-edited-80x80.png 80w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/imagen_2024-12-19_201900478-edited-320x320.png 320w\" sizes=\"auto, (max-width: 3024px) 100vw, 3024px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Autores<\/h2>\n\n\n\n<p>ADRI\u00c1N G\u00d3MEZ-LOBO NU\u00d1EZ<br>JOSE MANUEL PASTOR GONZ\u00c1LEZ<br>JORGE BERNAB\u00c9 MOLINERO<br>ALONSO MART\u00cdN ARROYO<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u00cdndice<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Introducci\u00f3n<\/li>\n\n\n\n<li>Planteamiento<\/li>\n\n\n\n<li>Materiales \/ Precio<\/li>\n\n\n\n<li>Circuito<\/li>\n\n\n\n<li>Proceso\n<ul class=\"wp-block-list\">\n<li>C\u00f3digo<\/li>\n\n\n\n<li>Ensamblaje<\/li>\n\n\n\n<li>Dificultades<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Funcionamiento<\/li>\n\n\n\n<li>V\u00eddeo del funcionamiento<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Introducci\u00f3n<\/h2>\n\n\n\n<p>El origen del proyecto surge de la votaci\u00f3n de las diferentes ideas que tuvimos&nbsp; para el proyecto se baraj\u00f3 desde la idea de una alarma, un robot, incluso una gorra inteligente pero finalmente nos decantamos por la idea de un Bob It, que es un juguete interactivo y electr\u00f3nico dise\u00f1ado para desafiar la coordinaci\u00f3n, los reflejos y la capacidad de seguir instrucciones r\u00e1pidas Al que bautizamos PiGiTi<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Planteamiento<\/h2>\n\n\n\n<p>Pensar los diferentes minijuegos en los que se incluir\u00edan en el proyecto y los diferentes materiales extras que necesit\u00e1ramos para llevarlos a cabo. Ten\u00edamos claro desde el principio que adem\u00e1s del material ofrecido en la asignatura necesit\u00e1bamos botones, algo que se pudiera girar como una tuerca, un sensor que pudiera detectar el movimiento y alg\u00fan tipo de mp3 para el audio. Aunque tambi\u00e9n a\u00f1adimos una matriz que refleje de forma m\u00e1s clara las instrucciones que deb\u00eda seguir la persona que lo pruebe.<\/p>\n\n\n\n<p>Despu\u00e9s crear un c\u00f3digo que cumpla las funciones de los diferentes minijuegos planteados y cuando tuvi\u00e9ramos los materiales ir probando uno por uno los diferentes juegos hasta poder implementarlos todos.<\/p>\n\n\n\n<p>Y finalmente la construcci\u00f3n del proyecto en s\u00ed.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Materiales \/ Precio<\/h2>\n\n\n\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<figure class=\"wp-block-table aligncenter\"><table class=\"has-fixed-layout\"><tbody><tr><td class=\"has-text-align-center\" data-align=\"center\"><strong>Clase<\/strong> (Precio Estimado \u20ac)<\/td><td class=\"has-text-align-center\" data-align=\"center\"><strong>A\u00f1adido<\/strong> (Precio \u20ac)<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">Placa Arduino 5,99\u20ac<\/td><td class=\"has-text-align-center\" data-align=\"center\">Mini MP3 + Lector SD 9,99\u20ac<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">Protoboard 4,99\u20ac<\/td><td class=\"has-text-align-center\" data-align=\"center\">M\u00f3dulo de pantalla LED 10,99\u20ac<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">Cables 0,50\u20ac<\/td><td class=\"has-text-align-center\" data-align=\"center\">Botones grandes 12X12MM 11,49\u20ac<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">Sensor inclinaci\u00f3n 0,71\u20ac<\/td><td class=\"has-text-align-center\" data-align=\"center\">Caja de metal 14,99\u20ac<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">Potenci\u00f3metro 2\u20ac<\/td><td class=\"has-text-align-center\" data-align=\"center\"><\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">Total: 14,19<\/td><td class=\"has-text-align-center\" data-align=\"center\">Total: 47,46\u20ac<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Circuito<\/h2>\n\n\n\n<p>Para representar el circuito hemos usado un diagrama de tinkercad, en la primera ilustraci\u00f3n debido a la falta de componentes de la herramienta, falta por representar el altavoz integrado y la pantalla led usada en el circuito completo, los cuales est\u00e1n representados en las siguientes dos ilustraciones del circuito. En el circuito final todos los componentes mencionados son a\u00f1adidos en un \u00fanico circuito.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"466\" height=\"398\" src=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/Captura-de-pantalla-1-1.png\" alt=\"\" class=\"wp-image-9235\" srcset=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/Captura-de-pantalla-1-1.png 466w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/Captura-de-pantalla-1-1-300x256.png 300w\" sizes=\"auto, (max-width: 466px) 100vw, 466px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"682\" height=\"273\" src=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/Captura-de-pantalla-2-1.png\" alt=\"\" class=\"wp-image-9237\" srcset=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/Captura-de-pantalla-2-1.png 682w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/Captura-de-pantalla-2-1-300x120.png 300w\" sizes=\"auto, (max-width: 682px) 100vw, 682px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Proceso<\/strong><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">C\u00f3digo<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ C++ code\n\/\/\n#include &lt;MD_MAX72xx.h&gt;\n#include &lt;SoftwareSerial.h&gt;\n#include &lt;DFRobotDFPlayerMini.h&gt;\n\n\/\/BOTONES\n\nint buttonPinR = 2;\nint buttonPinG = 3;\nint buttonPinB = 4;\nint buttonPinA = 5;\n\n\/\/lectura valor botones\n\n int _entradaR,_entradaG,_entradaB,_entradaA;\n\/\/DISPLAY\nSoftwareSerial mySerial(10, 11); \/\/ RX, TX\nDFRobotDFPlayerMini myDFPlayer;\n\/\/POTENCIOMETRO\nint potPin=0;\n\/\/Tilt Sensor\nint tiltPin=6;\n\/\/ MATRIX DISPLAY\n#define HARDWARE_TYPE MD_MAX72XX::FC16_HW\n#define MAX_DEVICES 4      \/\/ N\u00famero de m\u00f3dulos (4 en este caso)\n#define CLK_PIN 13         \/\/ Pin CLK\n#define DATA_PIN 9        \/\/ Pin DIN\n#define CS_PIN 8          \/\/ Pin CS\n\n\/\/ Crear una instancia del display\nMD_MAX72XX matrix = MD_MAX72XX(HARDWARE_TYPE, DATA_PIN, CLK_PIN, CS_PIN, MAX_DEVICES);\n\n\/\/ Variables de control de juego\nint delayTime=750;\nint nJugadores;\nint nMiniGames=4;\nenum colors{black,red,green,blue,yellow};\nbool interrupt=false;\n\/\/ Variables de juego\nint players&#091;4]={1,2,3,4};\nint puntuation&#091;4];\nint miniGamesPlayed&#091;4];\nint basePuntuation=50;\n\n\/\/\/\/FUNCIONES\/\/\/\/\/\/\/\/\/\/\n\n\n\n\/\/\/\/FUNCIONES AUX\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\nvoid ButtonsReading(){\/\/Lectura de los botones\n   _entradaR=digitalRead(buttonPinR);\n   _entradaG=digitalRead(buttonPinG);\n   _entradaB=digitalRead(buttonPinB);\n   _entradaA=digitalRead(buttonPinA);\n}\nvoid ResetButtons(){\/\/Resetear botones\n  _entradaR=LOW;\n   _entradaG=LOW;\n   _entradaB=LOW;\n   _entradaA=LOW;\n}\nint WhatButton(){\n  \/\/Devuelve que boton se ha pulsado y resetea el valor de entrada\n   if(_entradaR==HIGH){\n    _entradaR=LOW;\n    return red;\n    \n  }\n  else if(_entradaG==HIGH){\n    _entradaG=LOW;\n    return green;\n   \n  }\n  \n  else if(_entradaB==HIGH){\n    _entradaB=LOW;\n    return blue;\n    \n  }\n  else if(_entradaA==HIGH){\n    _entradaA=LOW;\n    return yellow;\n    \n  }\n  else{\n   Serial.println(\"Error, demasiados botones pulsados\"); \n    return -1;\n  }\n}\nString ColorToString(int color){\n  switch(color){\n    case black:\n    return \"NEGRO\";\n    break;\n    \n    case red:\n    return \"ROJO\";\n    break;\n\n    case green:\n    return(\"VERDE\");\n    break;\n\n    case blue:\n    return(\"AZUL\");\n    break;\n\n    case yellow:\n    return(\"AMARI\");\n    break;\n    \n  }\n  return \"NOCOLOR\";\n}\nvoid PrintColor(int color){\n  \/\/Imprime por pantalla el color\n  switch(color){\n    case black:\n    Serial.print(\"Negro\");\n    break;\n    \n    case red:\n    Serial.print(\"Rojo\");\n    break;\n    case green:\n    Serial.print(\"Verde\");\n    break;\n    case blue:\n    Serial.print(\"Azul\");\n    break;\n    case yellow:\n    Serial.print(\"Amarillo\");\n    break;\n  }\n}\nvoid ButtonPause(int mode){\n  String message;\n  \n  switch(mode){\n    case 1:\n    message=\"PULSA PARA CONTINUAR\";\n    break;\n    case 2:\n    break;\n    case 3:\n    message=\"OPERACION CANCELADA\";\n    break;\n    case 4:\n    message=\"ENHORABUENA JUGADOR \";\n    message+=String(players&#091;0]);\n    message+=\": \";\n    message+=String(puntuation&#091;0]);\n    message+=\" PUNTOS\";\n\n\n  }\n  int offset=0;\n  ResetButtons();\n int time=millis();\n int timePassing; \n int timeToFinish=10000;\n  while(_entradaR==LOW &amp;&amp; _entradaG==LOW &amp;&amp;\n        _entradaB==LOW &amp;&amp; _entradaA==LOW){\n    display(message,offset);\n    offset--;\n    ButtonsReading();\n    timePassing=millis()-time;\n    \/\/Serial.println(timePassing);\n    if(timePassing&gt;timeToFinish){\n      PlayAudio(23);\n      time=millis();\n      timeToFinish+=5000;\n      \n    }\n      }\n  \tResetButtons();\n}\nvoid PotenciometerPause(int deltaRange){\n  \/\/deltaRange dice de cuanto rango tiene que ser el giro para\n  \/\/que haya valido el giro al potenciometro\n int _inPotNew;\/\/lecturapotenciometro\n _inPotNew=analogRead(potPin);\n int _inPotOld=_inPotNew;\n  while(Abs(_inPotNew-_inPotOld)&lt;deltaRange){\n    _inPotOld=_inPotNew;\n    _inPotNew=analogRead(potPin);\n   \/\/ Serial.print(_inPotNew-_inPotOld);\n  }\n}\nint Abs(int a){\nreturn a= a&lt;0 ? -a:a; \n}\nString InvertirCadena(String cadena){\n  String inverso;\n  for(int i=0;i&lt;cadena.length();i++){\n    inverso+=cadena&#091;cadena.length()-i-1];\n  }\nreturn inverso;\n}\nvoid OrderMaxToMin(){\n int n=4;\n  \/\/Algoritmo de ordenacion de mayor a menor\n   for (int i = 0; i &lt; n - 1; i++) {\n        for (int j = 0; j &lt; n - i - 1; j++) {\n            if (puntuation&#091;j] &lt; puntuation&#091;j + 1]) {\n                \/\/ Intercambiar elementos\n                int temp = puntuation&#091;j];\n                puntuation&#091;j] = puntuation&#091;j + 1];\n              \tpuntuation&#091;j + 1] = temp;\n               \tint tempPlayer = players&#091;j];\n                players&#091;j] = players&#091;j + 1];\n              \tplayers&#091;j + 1] = tempPlayer;\n            }\n        }\n    }\n  \n}\nvoid display(String message, int offset) {\n\/\/31 izquierda del todo\n\/\/0 derecha del todo\n\/\/esquina inferior izquierda + 4 derecha(5 total ocupa)\n    \/\/ Borra el display\n    matrix.clear();\n    int totalMessageSpace = message.length() * 5; \/\/el tama\u00f1o de cada caracter es de 5 celdas de la matriz\n    \/\/Serial.print(message.length());\n    \n    if (totalMessageSpace+ message.length() &lt; 32) {\n        \/\/Centrar si se puede\n        int borderSpace;\n        if(offset==0) borderSpace=(32-totalMessageSpace)\/2;\n        else borderSpace=0;\n        offset=offset%32;\n        \n        \/\/Serial.print(borderSpace);\n        \/\/Empezar por borderSpace\n            for (int i = message.length()-1; i &gt;=0 ; i--) {\n              int position=(31-(i)*5-borderSpace-offset);\n                matrix.setChar(position, message&#091;i]);\n                if((position&lt;5)&amp;&amp;offset!=0)\/\/Si est\u00e1 llegando al borde de la derecha aparece por la izquierda duplicado\n                  matrix.setChar(31+position,message&#091;i]);\n                if(position&gt;31&amp;&amp;offset!=0){\n                  matrix.setChar(-31+position,message&#091;i]);\n                }\n        }\n       \n        \/\/Preparar mensaje\n        matrix.update();\n    }\n    else {\/\/necesita un tratamiento distinto al ser la cadena m\u00e1s grande, s\u00f3lo puede mostrar el inicio y fin\n        offset=offset%totalMessageSpace;\/\/el offset ha de ser tama\u00f1o cadena\n        matrix.clear();\n         \n        for (int i = message.length()-1; i &gt;=0 ; i--) {\n          \n              int position=(31-(i)*5-offset);\/\/empieza izquierda(offset=0)\n              \/\/checkear si est\u00e1 a la vista\n              if(position&lt;-(totalMessageSpace-32))\/\/Si est\u00e1 fuera de limites y tu posicion supera el limite\n                position=31+position%(totalMessageSpace-32);\n              if(position&gt;(totalMessageSpace-32))\n                position=-31+position%(totalMessageSpace-32);\n                 \/\/ position=16-i*5-offset%32;\n                \n                matrix.setChar(position, message&#091;i]);\n\n               \n                  \n        }\n        matrix.update();\n    }\n    \n    \n\n\n}\nvoid displayStatic(String message){\n  delay(delayTime);\n  for(int i=0;i&lt;10;i++){\n    display(message,0);\n  }\n}\n\nvoid displayNumbers(int timeMill) {\/\/tiempo en segs\nint mode=1000;\/\/mins:segs o segs:mill\n   int minutos = timeMill \/ mode;  \/\/ Divide el tiempo total para obtener los minutos.\n    int segundos = timeMill % mode; \/\/ Obtiene los segundos restantes.\n    \n    \/\/ Si los segundos son 0 pero hay minutos, ajustamos para que se muestren como 59 segundos.\n    \/\/ if (segundos == 0 &amp;&amp; minutos &gt; 0) {\n    \/\/     minutos--;     \/\/ Resta un minuto.\n    \/\/     segundos = 59; \/\/ Ajusta los segundos.\n    \/\/ }\n    \n    String timeSegs = InvertirCadena(String(segundos));\n    String timeMins = InvertirCadena(String(minutos));\n    if(timeMins&#091;0]=='1'||timeMins&#091;1]=='1'||timeSegs&#091;0]=='1'||timeSegs&#091;1]=='1') matrix.clear(); \/\/Absurdo de cojones, pero el paso del dos al uno est\u00e1 buggeado\n    char uno = (timeMins&#091;1] != '\\0') ? timeMins&#091;1] : '0';\n    char dos = (timeMins&#091;0] != '\\0') ? timeMins&#091;0] : '0';\n    char tres = (timeSegs&#091;1] != '\\0') ? timeSegs&#091;1] : '0';\n    char cuatro = (timeSegs&#091;0] != '\\0') ? timeSegs&#091;0] : '0';\n        matrix.setChar(28,uno);\n        matrix.setChar(22,dos);\n        matrix.setChar(16, ':');\n        matrix.setChar(13,tres);\n        matrix.setChar(7, cuatro);\n        \n       \n    matrix.update();\n\n\n\n}\n\nvoid PlayAudio(int track) {\n\n \/\/ Detener el audio actual si hay alguno reproduci\u00e9ndose\n  if (myDFPlayer.readState()== 513) {\n    myDFPlayer.stop();\n    Serial.println(\"Audio interrumpido.\");\n    delay(100); \/\/ Peque\u00f1o retardo para asegurar la detenci\u00f3n\n  }\n \/\/ Serial.println(myDFPlayer.readState());\n  Serial.print(\"Reproduciendo pista: \");\n  Serial.println(track);\n  myDFPlayer.play(track);\n  \n}\nvoid ResetAllVariables(){\n  matrix.clear();\n  ResetButtons();\n  nJugadores=0;\n  for (int i=0;i&lt;4;i++){\n  players&#091;i]=i+1;\n  puntuation&#091;i]=0;\n  }\n}\n\/\/FUNCIONES ESTADO 1\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\nint SelectPlayers(int seleccion){\n \n  \/\/Mientras que no se pulse un bot\u00f3n se mantiene dentro del bucle\n  \/\/el bucle leyendo una entrada\nint offset=0;\n\n  while(_entradaR==LOW &amp;&amp; _entradaG==LOW &amp;&amp;\n        _entradaB==LOW &amp;&amp; _entradaA==LOW){\n    String selectMessage;\n    if(seleccion==-1){\n      selectMessage=\"SELECCIONE EL NUMERO DE JUGADORES\";\n    }\n    else{\n      selectMessage=\"CONFIRMAR \";\n      selectMessage+=String(seleccion);\n      selectMessage+=\" JUGADORES\";\n      \n    }\n    display(selectMessage,offset);\n    offset--;\n    ButtonsReading();\n\n  }\n \/\/ Serial.println(\"boton pulsado\");\n  return WhatButton();\n \/\/Serial.println(nJugadores);\n  delay(delayTime); \n  return -1;\n}\n\/\/FUNCIONES ESTADO 2\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\nbool PlayAMiniGame(int player,int minigamesCount){\n  \/\/Esta funcion es la terminal donde van a apareciendo los minijuegos\n  \/\/Recibe como argumentos el jugador actual y cuantos juegos lleva\n  \/\/minigamesCount sirve para ajustar la dificultad de cada juego(reducir tiempos de respuesta, aumentar el numero de iteraciones etc)\n  \n  int _minigame=(minigamesCount-1)%nMiniGames+1;\n  \/\/_minigame=2;\n  bool _miss;\n  \/\/los minijuegos devuelven un booleano\n  \/\/si se ha fallado o no\n  \/\/Estructura para crear un minijuego\n  \/\/_miss=NombreMinijuego(player,minigamesCount);\n  \n  displayStatic(\"LISTO\");\n  PlayAudio(18);\n \n  Serial.println(\"Simon dice comienza\\n\");\n  switch(_minigame){\n    case 1:\n    \t_miss=SimonSaysButtons(player,minigamesCount);\n    break;\n    case 2:\n    \t_miss=SimonSaysPotenciometer(player,minigamesCount);\n    break;\n    case 3:\n    \t_miss=SimonSaysTiltSensor(player,minigamesCount);\n    break;\n    case 4:\n    \t_miss=SimonSaysEnd(player,minigamesCount);\n   \tbreak;\n    default:\n    _miss=true;\n    break;\n  }\n  \n  return _miss;\n}\n\/\/Minijuegos\nbool SimonSaysButtons(int player, int minigamesCount){\n int nIteraciones=rand()%3+minigamesCount;\n int _ranCol;\n bool _miss;\n \n  \/\/variable bonus puntuacion\n  int _timeBonus=0;\n  \/\/variables que miden el tiempo\n  \/\/Son locales porque cada juego creo\n  \/\/que necesitara sus propios ajustes\n\t  int _timeToFinish=4000;\/\/Se empieza con un margen de 2.5 segs\n    int steps=150;\/\/Cada vez hay menos tiempo\n  \tint unsigned long _time;\/\/Mide el tiempo inicial\n  \tint _minReactionTime;\/\/Tiempo minimo reaccion\n  \tint _timePassing;\n  \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\n  for(int i=0;i&lt;nIteraciones;i++){\/\/Es finito con n iteraciones\n  _ranCol=random(1, 5);\n \/\/ rand()%4+1;\n    Serial.print(\"Pulsa el boton \");\n    PrintColor(_ranCol);\n    Serial.println(\"\");\n    PlayAudio(19+_ranCol-1);\n    String pulsa=ColorToString(_ranCol);\n    \n      displayStatic(pulsa);\n    \n    _time=millis();\n    while(_entradaR==LOW &amp;&amp; _entradaG==LOW &amp;&amp;\n        _entradaB==LOW &amp;&amp; _entradaA==LOW){\n      \n    \tButtonsReading();\n      _timePassing=millis()-_time;\/\/Tiempo transcurrido\n      if(_timePassing&gt;=_timeToFinish){\n        \/\/Serial.println(millis());\n        \/\/Serial.println(_time);\n        \/\/Serial.println(millis()-_time);\n        Serial.println(\"Womp, womp, demasiado lento\");\n        displayStatic(\"LENTO\");\n        PlayAudio(23);\n        return true;\n      }\n\t\t\/\/Serial.println(_timeToFinish-_timePassing);\n      \/\/Cuenta atr\u00e1s usar display\n  \t}\n    \n      if(WhatButton()==_ranCol){\n      Serial.println(\"Bien! Continuamos...\");\n      displayStatic(\"BIEN\");\n      PlayAudio(25);\n        _timeBonus=+(_timeToFinish-_timePassing)\/100;\n        \/\/Se resta el tiempo con clamp en _minReactionTime\n       _timeToFinish=_timeToFinish-steps&gt;_minReactionTime?_timeToFinish-steps:_minReactionTime;\n        \n     }else{\n       Serial.println(\"Estas ciego?\");\n       displayStatic(\"ERROR\");\n        PlayAudio(26);\n\n       return true;\/\/falla, se termina minijuego\n  \t}\n  }\n \n      displayStatic(\"PUNTOS\");\n\n  Serial.println(\"Enhorabuena, sumando puntuaciones...\");\n  \n  PlayAudio(27);\n  delay(delayTime);\n  puntuation&#091;player-1]+=(basePuntuation*minigamesCount)\/4+\n    basePuntuation*nIteraciones+_timeBonus;\n return false;\n  \n}\nbool SimonSaysPotenciometer(int player,int miniGamesCount){\n  \n  \n  int maxRange=400;\n  int deltaRange=miniGamesCount*100&lt;maxRange ? miniGamesCount*100 : maxRange;\n  int _inPotNew;\/\/lecturapotenciometro\n _inPotNew=analogRead(potPin);\n int _inPotOld=_inPotNew;\n  \/\/variable bonus puntuacion\n  int _timeBonus=0;\n  \/\/variables que miden el tiempo\n  \/\/Son locales porque cada juego creo\n  \/\/que necesitara sus propios ajustes\n  int _minReactionTime=500;\/\/Tiempo minimo reaccion\n  int _maxTime=7000;\n\tint _timeToFinish=_maxTime-miniGamesCount*100&gt;_minReactionTime?_maxTime-miniGamesCount*100:_minReactionTime;\/\/Se empieza con un margen de 2.5 segs\n    int steps=100;\/\/Cada vez hay menos tiempo\n  \tint unsigned long _time=millis();\/\/Mide el tiempo inicial\n  \tint _timePassing;\n  Serial.print(\"GIRA LA RUEDITA\\n\");\n  displayStatic(\"GIRA\");\n  PlayAudio(28);\n  while(Abs(_inPotNew-_inPotOld)&lt;deltaRange){\n    _inPotOld=_inPotNew;\n    _inPotNew=analogRead(potPin);\n    _timePassing=millis()-_time;\n     _timeBonus=+(_timeToFinish-_timePassing)\/100;\n     displayNumbers(_timeToFinish-_timePassing);\n    if(_timePassing&gt;=_timeToFinish){\n      \n      Serial.print(\"Te pasa algo en las manos?\\n\");\n      displayStatic(\"LENTO\");\n      PlayAudio(29);\n      delay(delayTime);\n     return true;\n    }\n  }\nSerial.print(\"Enhorabuena, sumando puntuacion...\\n\");\n  displayStatic(\"BIEN\");\n  PlayAudio(32);\n  PlayAudio(27);\n  puntuation&#091;player-1]+=(miniGamesCount+_timeBonus)*5;\n  return false;\n}\nbool SimonSaysTiltSensor(int player, int miniGamesCount){\n  \/\/Este minijuego lo que hace es pedirte que inclines o dejes \n  \/\/en reposo el cacharro seg\u00fan como lo tengas sujeto(lo contrario)\n  \n  int tiltState = digitalRead(tiltPin); \/\/ Lee el estado del sensor\n  int condition;\n  \n  if (tiltState == LOW) { \/\/ LOW significa que el circuito est\u00e1 cerrado (sensor inclinado)\n    condition=HIGH;\n    PlayAudio(30);\/\/Inclina\n  } else {\n    condition=LOW;\n    PlayAudio(31);\/\/Estabiliza\n  }\n  \/\/variable bonus puntuacion\n  int _timeBonus=0;\n  \/\/variables que miden el tiempo\n  \/\/Son locales porque cada juego creo\n  \/\/que necesitara sus propios ajustes\n  int _minReactionTime=500;\/\/Tiempo minimo reaccion\n  int steps=100;\/\/Cada vez hay menos tiempo\n  int _maxTime=6000;\n\tint _timeToFinish=_maxTime-miniGamesCount*steps&gt;_minReactionTime?_maxTime-miniGamesCount*steps:_minReactionTime;\/\/Se empieza con un margen de 2.5 segs\n  \tint unsigned long _time=millis();\/\/Mide el tiempo inicial\n  \tint _timePassing;\n  Serial.print(\"INCLINA EL CACHARRO\\n\");\n  displayStatic(\"TILT\");\n  while(tiltState!=condition){\n    tiltState = digitalRead(tiltPin);\n     displayNumbers((_timeToFinish-_timePassing));\n    _timePassing=millis()-_time;\n    _timeBonus=+(_timeToFinish-_timePassing)\/100;\n   \n\n    if(_timePassing&gt;=_timeToFinish){\n      Serial.print(\"Eres lento?\\n\");\n      displayStatic(\"LENTO\");\n      PlayAudio(24);\n      delay(delayTime);\n     return true;\n    }\n  }\n  Serial.print(\"Bravo, sumando puntuaciones\\n\");\n  displayStatic(\"BIEN\");\n  PlayAudio(32);\n  puntuation&#091;player-1]+=(miniGamesCount+_timeBonus)*2;\n  return false;\n}\n\nbool SimonSaysEnd(int player, int miniGamesCount){\n int nIteraciones=rand()%3+miniGamesCount;\n bool _miss;\n Serial.println(\"Listo para un reto?\\n\");\n displayStatic(\"BANZAI\");\n PlayAudio(1);\n delay(delayTime+500);\n \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\n  \n  for(int i=0;i&lt;nIteraciones;i++){\/\/Es finito con n iteraciones\n    delay(100);\n    int randomMinigame=random(1, 4);\n    \/\/rand()%3+1;\n    \n    \/\/Serial.print(randomMinigame);\n    switch(randomMinigame){\n    case 1: \/\/Botones\n   \t\t_miss=SimonSaysButtons(player,0);\n    break;\n   \n    case 2: \/\/Potenciometro\n      _miss=SimonSaysPotenciometer(player,miniGamesCount);\n    break;\n    case 3: \/\/Tilt Sensor\n      _miss=SimonSaysTiltSensor(player,miniGamesCount);\n     break;\n    \n    }\n    if(_miss) return _miss;\n  }\n  \n  \n  \n  Serial.println(\"Enhorabuena, sumando puntuaciones extra...\");\n  PlayAudio(2);\n  puntuation&#091;player-1]+=(basePuntuation*miniGamesCount)\/2+\n  basePuntuation*nIteraciones;\n return false;\n  \n}\nvoid setup()\n{\n  \/\/srand(time(0));\n \n  \/\/BOTONES\n  pinMode(buttonPinR, INPUT_PULLUP);\n  pinMode(buttonPinG, INPUT_PULLUP);\n  pinMode(buttonPinB, INPUT_PULLUP);\n  pinMode(buttonPinA, INPUT_PULLUP);\n  \/\/POTENCIOMETRO\n  pinMode(potPin,INPUT);\n  \/\/Tilt Sensor\n  pinMode(tiltPin,INPUT_PULLUP);\n  \/\/DISPLAY\n  matrix.begin();           \/\/ Inicializar  display\n  matrix.control(MD_MAX72XX::INTENSITY, 5);  \/\/ Ajustar brillo (0-15)\n  \n  Serial.begin(9600);\n  mySerial.begin(9600);\n\n  if (!myDFPlayer.begin(mySerial)) {\n    Serial.println(\"Error al inicializar DFPlayer Mini.\");\n    while (true);\n  }\n  Serial.println(\"DFPlayer Mini inicializado correctamente.\");\n\n}\n\n\n\nvoid loop()\n{\n\/\/  unsigned long seed = analogRead(A0); \/\/ Lee ruido del pin A0\n\/\/   randomSeed(seed); \/\/ Inicializa la semilla\n\/\/   Serial.print(\"Semilla generada: \");\n\/\/   Serial.println(seed);\n\n\/\/   Serial.println(\"N\u00fameros aleatorios:\");\n\/\/   for (int i = 0; i &lt; 5; i++) {\n\/\/     Serial.println(random(0, 100)); \/\/ Genera n\u00fameros aleatorios entre 0 y 99\n\/\/   }\n\n  \/\/IMPORTANTE \n  \/\/NOTAS\n  \/\/TODOS y digo TODOS los print ser\u00e1n sustituidos por los\n  \/\/mensajes de voz\n  \n \/\/Estado 0 Presentacion\n  \/\/En este estado se hace una peque\u00f1a presentaci\u00f3n del juego\n  \/\/que alguien lo defina\n  \n \/\/Estado 1 Seleccion de jugadores\n  \/\/En este estado se selecciona el numero de jugadores\n  \n  \/\/Ese valor se almacena en nJugadores\n  \n  \/\/Hay que pulsar dos veces el mismo boton\n  bool finishSelection=false;\n  while(!finishSelection){\/\/Mientras no se haya confirmado no se para\n\n    Serial.println(\"Seleccione el numero de jugadores\");\n    PlayAudio(3);\n   \n  int _seleccion=SelectPlayers(-1);\/\/Se selecciona por primera vez\n  if(_seleccion!=-1){\n        delay(500);\n        Serial.print(\"Se van a seleccionar \");\n        Serial.print(_seleccion);\n        Serial.println(\" jugadores.\");\n    Serial.println(\"Confirme el numero de jugadores\");\n    PlayAudio(4);\n    if(SelectPlayers(_seleccion)==_seleccion){\/\/Se confirma el numero\n     \tnJugadores=_seleccion;\n     \tSerial.print(\"Van a jugar \");\n    \tSerial.print(nJugadores);\n    \tSerial.println(\" jugadores.\");\n      \tfinishSelection=true;\n    }else{\n     \n       Serial.println(\"Cancelando\");\n       PlayAudio(5);\n       delay(delayTime);\n       ButtonPause(3);\n       \n       \n    }\n                   \n  }\n  }\n  \n \/\/Estado 2 Minijuegos\n  Serial.println(\"Que comiencen los juegos\");\n  \n  displayStatic(\"PLAY\");\n  PlayAudio(6);\n  \n  bool _miss=false;\n  int _minigamesCount=0;\n  \n  Serial.println(\"Comienza el jugador 1\");\n  PlayAudio(8);\n  Serial.println(\"Pulse cualquier boton para empezar\");\n  delay(delayTime);\n  ButtonPause(1);\n  for(int i=1;i&lt;nJugadores+1;i++){\/\/Por nJugadores hacer n partidas\n    while(!_miss){\n      _minigamesCount++;\n      _miss=PlayAMiniGame(i,_minigamesCount);\n      delay(delayTime);\n    }\n    _miss=false;\/\/resetear el valor\n    if(i+1!=nJugadores+1){\n   \n    Serial.print(\"Pasando al jugador \");\n    displayStatic(\"NEXT\");\n    PlayAudio(12);\n    \n    Serial.println(i+1);\n    _minigamesCount=0;\n   \tdelay(delayTime);\n    Serial.println(\"Pulse cualquier boton para empezar\");\n  \tButtonPause(1);\n    PlayAudio(8+i);\/\/Jugador 1+i\n    }\n    \n  }\n  \/\/Estado 3 Puntuaciones\n  Serial.println(\"Hora de ver las puntaciones\");\n  PlayAudio(13);\n  delay(delayTime);\n  for(int i=0;i&lt;nJugadores;i++){\n    Serial.print(\"El jugador \");\n    Serial.println(players&#091;i]);\n    Serial.print(\"Puntuacion: \");\n    Serial.println(puntuation&#091;i]);\n  }\n  OrderMaxToMin();\n  delay(delayTime);\n  Serial.print(\"Enhorabuena al jugador \");\n  Serial.println(players&#091;0]);\n  PlayAudio(14+players&#091;0]-1);\/\/Jugador 1+ players&#091;0]-1 players va de 1 a 4\n  Serial.print(\"Puntuacion de \");\n  Serial.println(puntuation&#091;0]);\n \n  \/\/FIN DE JUEGO resetear variables y dar un tiempo de espera\n delay(delayTime);\n ButtonPause(4);\n  \n  ResetAllVariables();\n  delay(delayTime);\n  Serial.println(\"Pulse cualquier boton para continuar\");\n  PlayAudio(7);\n  ButtonPause(1);\n  \n}<\/code><\/pre>\n\n\n\n<p>Primero tuvimos que pensar los diferentes minijuegos que \u00edbamos a incluir y programarlos, los cuales deb\u00edan ser completados antes de que se acabara el tiempo, estos consisten en:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Pulsa!<\/strong>: en que el juego dice el color del bot\u00f3n que el jugador debe pulsar y este debe accionar ese bot\u00f3n o de lo contrario pierde.<\/li>\n\n\n\n<li><strong>Gira!<\/strong>: en el que el jugador debe girar una tuerca.<\/li>\n\n\n\n<li><strong>Inclina \/ Estabiliza!: <\/strong>en el que el jugador debe girar el juguete.<\/li>\n<\/ol>\n\n\n\n<p>Adem\u00e1s se a\u00f1adi\u00f3 la funci\u00f3n de seleccionar la cantidad de jugadores pudiendo jugar&nbsp; hasta un m\u00e1ximo de 4 jugadores y almacenando las puntuaciones de cada uno en funci\u00f3n de la cantidad de minijuegos completados y revelando el ganador al final.<\/p>\n\n\n\n<p>Todo esto queda encapsulado siguiendo una sencilla m\u00e1quina de estados. Siendo estos estados: seleccionar jugadores, jugar partida y obtener resultados.<\/p>\n<\/div><\/div>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXc3FE4pCWo-6aVq5Pycha714cPcYIZy7Ti8Yst9Cxb6PRU96aedquVw8d_TZMna2V7j2J_852P839FXS1IqSkmqi9ah3O5ysqr23QLluv71jgnlgHBTEj8OhLArB-c28jD4pHqoBw?key=1WztDiTS6JRmmcFqHuxMUj1D\" alt=\"\" \/><\/figure>\n\n\n\n<p>Este peque\u00f1o fragmento muestra c\u00f3mo funciona el primer estado. Se selecciona el n\u00famero de jugadores, si es el deseado se confirma. Si no se cancela y se vuelve a iterar. Esta selecci\u00f3n viene dada por el bot\u00f3n pulsado.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXegub-h1Pj4Ucg0SGkcufPdTXddYWw6W2V0poyU1VgMNA6VIotgobjsmxyk_JfLNbN__BDQ-733t7NgA6ZlsuaUdbdcYYFGRFVoO7yC8Tg50OKldfbSml_ZYR8m3qhTNj3XUOCaRw?key=1WztDiTS6JRmmcFqHuxMUj1D\" alt=\"\" \/><\/figure>\n\n\n\n<p>Este otro fragmento mostrar\u00eda lo que hace el segundo estado. Mientras que el jugador que est\u00e1 jugando no falle el minijuego este sigue jugando. En el caso de que falle se pasa al siguiente jugador. Entre turno y turno hay habilitada una pausa para que el jugador que entre tenga tiempo de prepararse.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXc8T0sv0mkenJSLuh6R3qHmNssTT-qIP13ToPVY0hCD0o6xmpj4HZrDRaYeSnbPhiYGxuTH23H-xwxd-czwwX1Uxo5yiGWZVAxmM1fu_unISr6z_8kTyk-G6dgpFFKnwTouHVGsbQ?key=1WztDiTS6JRmmcFqHuxMUj1D\" alt=\"\" \/><\/figure>\n\n\n\n<p>En este \u00faltimo estado se muestra la puntuaci\u00f3n final del jugador ganador. Con un sencillo algoritmo de ordenaci\u00f3n se reordena el array de puntuaciones y con ello se muestra la del jugador con m\u00e1s puntuaci\u00f3n. Despu\u00e9s, se resetean todas las variables y el juego vuelve a comenzar.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXdr6hFmxkcOhADPquaNAzU-J30SEo_mM4HY-uZfQmGcpJdstndDz62JCYRpvcZ0-hGxnNCbHdmIoFA-JP2ynA1ggVWraBasJx03zPrc4L4cUpp8dI9ZEGczE_0QxLhA9a7VuElwUA?key=1WztDiTS6JRmmcFqHuxMUj1D\" alt=\"\" \/><\/figure>\n\n\n\n<p>Los minijuegos que aparecen son secuenciales. Esto significa que siguen un orden establecido. Primero empieza el juego de los botones, le sigue el del potenci\u00f3metro, luego el del tilt sensor y por \u00faltimo puede aparecer una sucesi\u00f3n de estos tres. La funci\u00f3n devuelve el booleano \u201c_miss\u201d que indica si se ha fallado o no.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXdle9tECbYYhS34Vrs0fC7PV_h2IQ7an__RpyZ8WNwzSxOlwWmuHJW-RvLLhVQguX850fmYsaMZ4zFlSxGQy_JmFbc7RWhBtKmV4S0s41CJcmOMfN1BRv5wUbmjyyLqyV6VOryY8A?key=1WztDiTS6JRmmcFqHuxMUj1D\" alt=\"\" \/><\/figure>\n\n\n\n<p>Este es un ejemplo sencillo de minijuego. Al entrar se preparan todas las variables. Se inician los tiempos y se ajusta la dificultad en base a la cuenta de minijuegos jugados. Despu\u00e9s dentro del bucle while se espera hasta que el jugador consiga superarlo. En caso de que se acabe el tiempo la funci\u00f3n devuelve true(ha fallado). Si lo supera calcula la puntuaci\u00f3n seg\u00fan el tiempo en el que lo haya superado(cuanto m\u00e1s r\u00e1pido mejor) y los minijuegos superados y devuelve false(no ha fallado).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Ensamblaje<\/h3>\n\n\n\n<p>Para empezar el ensamblaje del proyecto tuvimos que crear una caja en la que montar\u00edamos todo el circuito y los componentes del proyecto. Para ello usamos un trozo de metal en el cual cortamos agujeros para los botones y un agujero un poco m\u00e1s grande para ocultar todo el hardware dentro y acoplar una pantalla. A su vez, tambi\u00e9n la pintamos de negro por est\u00e9tica.<\/p>\n\n\n\n<p>Con la caja lista, tuvimos que comprar ciertos componentes antes de ponernos con el ensamblaje final:&nbsp;<\/p>\n\n\n\n<p>Unos botones nuevos m\u00e1s grandes y con colores distintos que se pudieran acoplar a la caja de manera sencilla y de un tama\u00f1o grande para que fuesen f\u00e1ciles de usar.<\/p>\n\n\n\n<p>Una pantalla led para usar de display en los juegos entre otras cosas.<\/p>\n\n\n\n<p>Un lector de sd, una tarjeta sd y altavoz mini en el que se pueden reproducir varios sonidos distintos guardados previamente en la tarjeta sd.<\/p>\n\n\n\n<p>Una vez ten\u00edamos todo comprado, antes de montarlo en la caja, tuvimos que conectar todo el circuito de manera robusta para evitar cortocircuitos o alg\u00fan tipo de problema. Para ello tuvimos que soldar ciertos componentes que eran propensos a dar problemas, entre ellos soldamos el potenci\u00f3metro y el altavoz con esta\u00f1o, de esta manera la conexi\u00f3n es estable y evitamos falsos valores.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"502\" height=\"342\" src=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/Captura-de-pantalla-ens1-1.png\" alt=\"\" class=\"wp-image-9238\" srcset=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/Captura-de-pantalla-ens1-1.png 502w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/Captura-de-pantalla-ens1-1-300x204.png 300w\" sizes=\"auto, (max-width: 502px) 100vw, 502px\" \/><\/figure>\n\n\n\n<p>En el siguiente paso integramos todos los componentes como los botones, pantalla, etc. en la caja, organizando todo el cableado y asegur\u00e1ndonos que las conexiones eran estables y no hab\u00eda ning\u00fan corto circuito.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"345\" height=\"460\" src=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/Captura-de-pantalla-ens2-1.png\" alt=\"\" class=\"wp-image-9239\" srcset=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/Captura-de-pantalla-ens2-1.png 345w, https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/Captura-de-pantalla-ens2-1-225x300.png 225w\" sizes=\"auto, (max-width: 345px) 100vw, 345px\" \/><\/figure>\n\n\n\n<p>Por \u00faltimo hicimos un testeo de todo el ensamblaje tanto se software como de hardware verificando que todo estuviese bien montado<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Dificultades<\/h3>\n\n\n\n<p>A lo largo de todo el proceso se han tenido la complicaciones que cabr\u00edan esperar en un proyecto.<\/p>\n\n\n\n<p>En cuanto al c\u00f3digo este ha sido una fuente inagotable de problemas e inconvenientes. Esto se debe a la reducida capacidad de c\u00f3mputo que ofrece la placa de arduino. No poder realizar lanzamiento de threads y ejecutar todo de forma secuencial ha supuesto tener que tomar desv\u00edos y formas poco ortodoxas para conseguir el mismo funcionamiento. Adem\u00e1s, al tener un c\u00f3digo de un tama\u00f1o bastante considerable el rendimiento comienza a verse perjudicado. Tambi\u00e9n se han conseguido resolver bugs y problemas con la l\u00f3gica del juego despu\u00e9s de realizar varias pruebas.<\/p>\n\n\n\n<p>Han habido tambi\u00e9n problemas con el montaje y algunos componentes ya sea con algunos de los ofrecidos en la asignatura ya que debido al continuo uso de estos materiales en a\u00f1os anteriores no estaban en su mejor condici\u00f3n o por nuestros propios a\u00f1adidos a la hora de intentar integrarlos al proyecto. Sobre todo los altavoces. Aunque finalmente conseguimos superar estos obst\u00e1culos.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Funcionamiento del juego<\/h2>\n\n\n\n<p>Primero se debe elegir el n\u00famero de jugadores pulsando el bot\u00f3n correspondiente. Empezando por el n\u00famero 1 siendo el color rojo y el resto yendo en escala hasta el 4. Despu\u00e9s volver a pulsar el mismo para confirmar la acci\u00f3n ya que si se pulsa un bot\u00f3n distinto se cancela la selecci\u00f3n. En cuanto se confirma el primer jugador este toma el PiGiTi y empieza a jugar a los diferentes minijuegos, adem\u00e1s a medida que los vaya superando el tiempo para completar los minijuegos se ir\u00e1 reduciendo gradualmente aumentando su dificultad hasta que el jugador falle o no lo complete a tiempo, cuando ocurra se pasa al siguiente jugador, confirma que est\u00e1 listo y se repite el proceso hasta que hayan jugado todos, finalmente el PiGiTi revelar\u00e1 al ganador y su puntuaci\u00f3n.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">V\u00eddeo del funcionamiento<\/h2>\n\n\n\n<figure class=\"wp-block-video\"><video height=\"720\" style=\"aspect-ratio: 1280 \/ 720;\" width=\"1280\" controls src=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/IMG_5881.mp4\"><\/video><\/figure>\n\n\n\n<figure class=\"wp-block-video\"><video height=\"720\" style=\"aspect-ratio: 1280 \/ 720;\" width=\"1280\" controls src=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/IMG_5882.mp4\"><\/video><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>Autores ADRI\u00c1N G\u00d3MEZ-LOBO NU\u00d1EZJOSE MANUEL PASTOR GONZ\u00c1LEZJORGE BERNAB\u00c9 MOLINEROALONSO MART\u00cdN ARROYO \u00cdndice Introducci\u00f3n El origen del proyecto surge de la votaci\u00f3n de las diferentes ideas que tuvimos&nbsp; para el proyecto se baraj\u00f3 desde la&#46;&#46;&#46;<\/p>\n","protected":false},"author":245,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-9070","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>PiGiTi - 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\/pigiti\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"PiGiTi - Proyectos con Arduino.\" \/>\n<meta property=\"og:description\" content=\"Autores ADRI\u00c1N G\u00d3MEZ-LOBO NU\u00d1EZJOSE MANUEL PASTOR GONZ\u00c1LEZJORGE BERNAB\u00c9 MOLINEROALONSO MART\u00cdN ARROYO \u00cdndice Introducci\u00f3n El origen del proyecto surge de la votaci\u00f3n de las diferentes ideas que tuvimos&nbsp; para el proyecto se baraj\u00f3 desde la&#046;&#046;&#046;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/pigiti\/\" \/>\n<meta property=\"og:site_name\" content=\"Proyectos con Arduino.\" \/>\n<meta property=\"article:published_time\" content=\"2024-12-20T16:41:24+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-01-13T12:34:24+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/imagen_2024-12-19_201900478-edited-1024x1024.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1024\" \/>\n\t<meta property=\"og:image:height\" content=\"1024\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"dse2425g07\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"dse2425g07\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"18 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\\\/pigiti\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/pigiti\\\/\"},\"author\":{\"name\":\"dse2425g07\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/#\\\/schema\\\/person\\\/aeef4954b2158221b9eac342bef4df84\"},\"headline\":\"PiGiTi\",\"datePublished\":\"2024-12-20T16:41:24+00:00\",\"dateModified\":\"2025-01-13T12:34:24+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/pigiti\\\/\"},\"wordCount\":1405,\"publisher\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/pigiti\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2024\\\/12\\\/imagen_2024-12-19_201900478-edited.png\",\"articleSection\":[\"Proyectos\"],\"inLanguage\":\"es\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/pigiti\\\/\",\"url\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/pigiti\\\/\",\"name\":\"PiGiTi - Proyectos con Arduino.\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/pigiti\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/pigiti\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2024\\\/12\\\/imagen_2024-12-19_201900478-edited.png\",\"datePublished\":\"2024-12-20T16:41:24+00:00\",\"dateModified\":\"2025-01-13T12:34:24+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/pigiti\\\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/pigiti\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/pigiti\\\/#primaryimage\",\"url\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2024\\\/12\\\/imagen_2024-12-19_201900478-edited.png\",\"contentUrl\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2024\\\/12\\\/imagen_2024-12-19_201900478-edited.png\",\"width\":3024,\"height\":3024},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/pigiti\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Portada\",\"item\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"PiGiTi\"}]},{\"@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\\\/aeef4954b2158221b9eac342bef4df84\",\"name\":\"dse2425g07\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/158ba204e80bddedee108b95506f4ea29fcf60b543fb171b4597195c46e1704b?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/158ba204e80bddedee108b95506f4ea29fcf60b543fb171b4597195c46e1704b?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/158ba204e80bddedee108b95506f4ea29fcf60b543fb171b4597195c46e1704b?s=96&d=mm&r=g\",\"caption\":\"dse2425g07\"},\"url\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/author\\\/dse2425g07\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"PiGiTi - 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\/pigiti\/","og_locale":"es_ES","og_type":"article","og_title":"PiGiTi - Proyectos con Arduino.","og_description":"Autores ADRI\u00c1N G\u00d3MEZ-LOBO NU\u00d1EZJOSE MANUEL PASTOR GONZ\u00c1LEZJORGE BERNAB\u00c9 MOLINEROALONSO MART\u00cdN ARROYO \u00cdndice Introducci\u00f3n El origen del proyecto surge de la votaci\u00f3n de las diferentes ideas que tuvimos&nbsp; para el proyecto se baraj\u00f3 desde la&#46;&#46;&#46;","og_url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/pigiti\/","og_site_name":"Proyectos con Arduino.","article_published_time":"2024-12-20T16:41:24+00:00","article_modified_time":"2025-01-13T12:34:24+00:00","og_image":[{"width":1024,"height":1024,"url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/imagen_2024-12-19_201900478-edited-1024x1024.png","type":"image\/png"}],"author":"dse2425g07","twitter_card":"summary_large_image","twitter_misc":{"Escrito por":"dse2425g07","Tiempo de lectura":"18 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/pigiti\/#article","isPartOf":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/pigiti\/"},"author":{"name":"dse2425g07","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/#\/schema\/person\/aeef4954b2158221b9eac342bef4df84"},"headline":"PiGiTi","datePublished":"2024-12-20T16:41:24+00:00","dateModified":"2025-01-13T12:34:24+00:00","mainEntityOfPage":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/pigiti\/"},"wordCount":1405,"publisher":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/#organization"},"image":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/pigiti\/#primaryimage"},"thumbnailUrl":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/imagen_2024-12-19_201900478-edited.png","articleSection":["Proyectos"],"inLanguage":"es"},{"@type":"WebPage","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/pigiti\/","url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/pigiti\/","name":"PiGiTi - Proyectos con Arduino.","isPartOf":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/#website"},"primaryImageOfPage":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/pigiti\/#primaryimage"},"image":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/pigiti\/#primaryimage"},"thumbnailUrl":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/imagen_2024-12-19_201900478-edited.png","datePublished":"2024-12-20T16:41:24+00:00","dateModified":"2025-01-13T12:34:24+00:00","breadcrumb":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/pigiti\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blogs.etsii.urjc.es\/dseytr\/pigiti\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/pigiti\/#primaryimage","url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/imagen_2024-12-19_201900478-edited.png","contentUrl":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2024\/12\/imagen_2024-12-19_201900478-edited.png","width":3024,"height":3024},{"@type":"BreadcrumbList","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/pigiti\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Portada","item":"https:\/\/blogs.etsii.urjc.es\/dseytr\/"},{"@type":"ListItem","position":2,"name":"PiGiTi"}]},{"@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\/aeef4954b2158221b9eac342bef4df84","name":"dse2425g07","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/secure.gravatar.com\/avatar\/158ba204e80bddedee108b95506f4ea29fcf60b543fb171b4597195c46e1704b?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/158ba204e80bddedee108b95506f4ea29fcf60b543fb171b4597195c46e1704b?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/158ba204e80bddedee108b95506f4ea29fcf60b543fb171b4597195c46e1704b?s=96&d=mm&r=g","caption":"dse2425g07"},"url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/author\/dse2425g07\/"}]}},"_links":{"self":[{"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/posts\/9070","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\/245"}],"replies":[{"embeddable":true,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/comments?post=9070"}],"version-history":[{"count":26,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/posts\/9070\/revisions"}],"predecessor-version":[{"id":9283,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/posts\/9070\/revisions\/9283"}],"wp:attachment":[{"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/media?parent=9070"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/categories?post=9070"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/tags?post=9070"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}