Intento hacer un pequeño juego, consiste en 5 leds parpadeando en secuencia y que cuando le das a un pulsador si el led central esta encendido hag aun pitido y hagan los parpadeos mas rapidos.
¿Alguien sabe por que no funciona?
comprueba() se ejecuta al finalizar secuencia() ,por lo que en ese momento todas las salidas estan en low y la condicion nunca se va cumplir.Una solucion rapida seria intercalar la funcion comprueba() despues de cada digitalWrite() .Otra solucion seria conectar el pulsador a una interrupcion y dentro de la ISR asociada a esa interrupcion comprobar las condiciones.
jamas puedds hacer un juego con la idea que tiene este si la secuencia depende de delay()
delay detiene la ejecución del programa de modo que JAMAS puedes presionar en ninguna posición que no sea la última.
debes usar millis()
jose:
comprueba() se ejecuta al finalizar secuencia() ,por lo que en ese momento todas las salidas estan en low y la condicion nunca se va cumplir.Una solucion rapida seria intercalar la funcion comprueba() despues de cada digitalWrite() .Otra solucion seria conectar el pulsador a una interrupcion y dentro de la ISR asociada a esa interrupcion comprobar las condiciones.
Probre al principio esa idea de poner la funcion despues de cada HIGH pero el tiempo que tienes para pulsar el boton es minino, tendria que añadir otro delay para que diera tiempo a actuar, por lo que descarte la idea.
Gracias de todas maneras.
jose:
comprueba() se ejecuta al finalizar secuencia() ,por lo que en ese momento todas las salidas estan en low y la condicion nunca se va cumplir.Una solucion rapida seria intercalar la funcion comprueba() despues de cada digitalWrite() .Otra solucion seria conectar el pulsador a una interrupcion y dentro de la ISR asociada a esa interrupcion comprobar las condiciones.
Estuve leyendo y haciendo pruebas con milis, consegui que funcionara, pero no termino de entenderlo.
También lo hice con una interrupción, pero me parece una solucion demasido drastica para esto.
¡Gracias, Ricardo!
¡Por fin me funciona sublime! y el premio le tocó a spifo98
const int led[] = {52, 50, 48, 46, 44}; //Array de pines de led
const int numleds = sizeof(led)/sizeof(int); // número de led conectados. Podría haber puesto directamente 5, pero la fórmula funciona
const int but1 = 42; // Botón
const int buzzer = 40; // Buzzer
unsigned long tiempo = 1000; // Tiempo entre secuencias que irá disminuyendo
unsigned long startBuzzer = 0; // Si comienza a sonar el buzzer, aquí anotamos "la hora" para saber cuándo parar.
unsigned long startLed; // Cuando enciende un led, aquí anotamos "la hora" para saber cuándo saltar al siguiente
void setup(){
for (int i=0; i<numleds; i++) { // Establecemos todos los led como output
pinMode(led[i], OUTPUT);
}
pinMode(but1, INPUT);
pinMode(buzzer, OUTPUT);
}
void comprueba(){
if (startBuzzer) { // Si el buzzer está sonando (startbuzzer será distinto de cero)
if ((millis()-startBuzzer) > 100) { // si han transcurrido 100 milisegundos desde encendido de buzzer...
digitalWrite(buzzer, LOW); // Lo apagamos
startBuzzer = 0; // e indicamos que ya no está sonando
}
}
else if (digitalRead(but1) && digitalRead(led[2])){ // si no está sonando, y está el pulsador on y el tercer led encendido
tiempo-=20; // restamos 20 milisegundos al tiempo entre secuencias
digitalWrite(buzzer, HIGH); // e iniciamos el buzzer
startBuzzer = millis(); // y lo indicamos, poniendo la "hora" de inicio del buzzer
}
}
void loop() {
for (int i=0; i<numleds; i++) { // recorremos los leds
digitalWrite(led[i], HIGH); // encendemos el led correspondiente
startLed = millis(); // Apuntamos la "hora" de encendido de led
while (millis()-startLed < tiempo) // miramos el reloj a ver si ha transcurrido el tiempo de ese led
comprueba(); // ¿Aún no ha transcurrido?, pues vamos a comprobar lo demás
digitalWrite(led[i], LOW); // Ya transcurrió, saltamos al led siguiente
}
}
Creo que está bien comentado. Si lo entiendes bien, te será muy sencillo cambiar el número de leds, duraciones, número de led reductor de tiempo, etc.