Duda sobre el código a generar

Me gustaría construir un pequeño juego con tres leds (rojo, verde, azul).
A través de un número aleatorio encendería uno de los leds.
El usuario debería pulsar uno de los tres botones de los mismos colores que los leds.
Si el botón pulsado es del mismo color que el led encendido, entonces se apagará el led y volverá a empezar.
Si el botón pulsado no es del mismo color que el led encendido, o bien han transcurrido más de 5 segundos sin pulsar botón alguno, entonces sonará un pitido (buzzer activo) y el bucle empezará de nuevo.

He diseñado el siguiente pseudocódigo. Alguien podría decirme si es correcto?. En especial tengo la duda de el tiempo que el software recuerda la señal HIGH del botón apretado, pues hay varias condiciones (sentencias) que se procesan a continuación.

Loop

generar número aleatorio (1, 2 o 3)
encender led correspondiente (rojo, verde, azul)
guardar led encendido (1= rojo, 2= verde, 3= azul)
guardar momento del tiempo desde led encendido (millis)
botón apretado = 0
Mientras no se haya pulsado ningún botón ni hayan transcurrido más de 5 segundos
no hacer nada

Guardar botón apretado (1= rojo, 2= verde, 3= azul, 0=ningún botón apretado)

Si botón apretado = led encendido

Apagar todos los leds

else

Activar buzzer activo por un segundo

Apagar todos los leds

Endloop

Es mejor que publiques el código normal para que así podamos ver si es correcto. Pero tu pseudocodigo parece correcto.

Cierto, pasa tu pdf al IDE del arduino y publícalo según las normas del foro punto 7 y modifica tu primer post.

Y como dice @marcolaguna5181 es un seudocódigo correcto. Lo siguiente es empezar a traducirlo a ordenes concretas de codificación, una primera aproximación, (es la primera que se me viene a la cabeza) y que podría resolver tu duda sobre el tiempo y condiciones, podría ser la siguiente:

Loop { 
  -Apagar todos los leds
  -Generar número aleatorio
  -Encender led correspondiente (rojo, verde, azul)
  -Guardar led encendido
  -Guardar momento del tiempo desde led encendido
  while (no hayan transcurrido más de 5 segundos)
   {
    -Si botón rojo apretado y led rojo encendido {
       -Apagar led rojo
       -Borrar led encendido
       break; // corta el while antes de pasar los 5 segundos
      }
    -Si botón verde apretado y led verde encendido{
       -Apagar led verde
       -Borrar led encendido
       break; // corta el while antes de pasar los 5 segundos
      }
    -Si botón azul apretado y led azul encendido{
       -Apagar led azul
       -Borrar led encendido
       break; // corta el while antes de pasar los 5 segundos
      }
   }  
  -Si no se ha borrado el led encendido{
    -Activar buzzer activo por un segundo
   }
} // End Loop

Moderador
Hola @amuntanerc deberías leer las normas del foro y postear tu código o pseudocódigo usando etiquetas. Mira otros hilos y entenderas.

Gracias, tan pronto lo acabe lo publico.

Muchas gracias. Así lo haré.

Moderador
No comprendiste mi pedido.
No permitimos archivos en pdf que pueden tener código malicioso, por supuesto que tal vez no sea tu caso pero mi AV suele ponerme como sospechoso cuanto archivo pdf tengo nuevo, que vienen de empresas de electrónica, imagina enun foro público como este.
Ahora copia y pega el contenido del pdf y hazlo visible para todos, o tendre que borrarlo.
Y ya @gonpezzi lo ha abierto desconociendo tal vez esto que escribo solo que mi reclamo es genuino.
Las cosas deben ser transparentes para todos.

Tu pseudocódigo describe la lógica general del juego que quieres implementar y parece estar en el camino correcto. Sin embargo, hay algunos puntos que podrían mejorarse o aclararse. Aquí tienes algunas sugerencias:

  1. Control de tiempo utilizando millis(): En lugar de esperar activamente durante un tiempo determinado, es mejor usar la función millis() para realizar un seguimiento del tiempo transcurrido desde que se encendió el LED. De esta manera, el programa no se bloqueará y podrás seguir verificando si se ha pulsado un botón o si ha transcurrido el tiempo límite.
  2. Asegúrate de limpiar las variables adecuadamente: Después de cada ciclo, es importante restablecer las variables necesarias, como el estado del botón apretado, para que el juego funcione correctamente en el siguiente ciclo.
  3. Manejo de múltiples condiciones: Tu enfoque de verificar si el botón pulsado es igual al LED encendido es correcto. Sin embargo, ten en cuenta que también necesitas verificar si no se ha pulsado ningún botón dentro del tiempo límite. Esto se puede hacer verificando si la variable que registra el botón apretado sigue siendo cero después de que haya transcurrido el tiempo límite.
  4. Puede ser útil incluir un pequeño retraso entre ciclos: Puedes agregar un pequeño retraso entre ciclos para darle al usuario un tiempo breve para procesar la situación antes de comenzar el próximo ciclo.

Aquí hay una revisión de tu pseudocódigo incorporando estas sugerencias:

Loop
    Generar número aleatorio (1, 2 o 3)
    Encender LED correspondiente (rojo, verde, azul)
    Guardar LED encendido (1= rojo, 2= verde, 3= azul)
    Guardar momento del tiempo desde LED encendido (millis)
    Botón apretado = 0
    
    Mientras no se haya pulsado ningún botón ni hayan transcurrido más de 5 segundos
        Si se ha pulsado un botón
            Guardar botón apretado (1= rojo, 2= verde, 3= azul, 0=ningún botón apretado)
        
    Si han transcurrido más de 5 segundos o no se ha pulsado ningún botón
        Activar buzzer activo por un segundo
    Sino
        Si botón apretado = LED encendido
            Apagar todos los LEDs
        Sino
            Activar buzzer activo por un segundo
            Apagar todos los LEDs
    Fin Si
    
    Esperar un breve período de tiempo (opcional)
Fin Loop

Este pseudocódigo debería proporcionarte una base sólida para implementar tu juego en código real. Recuerda adaptar el código según las características específicas de tu hardware y entorno de desarrollo. Si tienes más preguntas o necesitas más ayuda, ¡no dudes en preguntar!

Muchas gracias Eduardo, estupenda aportación. La tendré en cuenta.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.