Duda programación.

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?

int led1 = 52;
int led2 = 50;
int led3 = 48;
int led4 = 46;
int led5 = 44;
int tiempo = 1000;
int but1 = 42;
int buzzer = 40;

void setup(){
  pinMode(52, OUTPUT);
  pinMode(50, OUTPUT);
  pinMode(48, OUTPUT);
  pinMode(46, OUTPUT);
  pinMode(44, OUTPUT);
  pinMode(42, INPUT);
  pinMode(40, OUTPUT);
}

void comprueba(){
  
if(digitalRead(but1) == HIGH && digitalRead(led3) == HIGH){
  tiempo=tiempo-20;
  digitalWrite(buzzer, HIGH);
  delay(100);
  digitalWrite(buzzer, LOW);
  }
}

  void secuencia(){
    digitalWrite(led1, HIGH);
    delay(tiempo);
    digitalWrite(led1, LOW);
    delay(tiempo);
    digitalWrite(led2, HIGH);
    delay(tiempo);
    digitalWrite(led2, LOW);
    delay(tiempo);
    digitalWrite(led3, HIGH);
    delay(tiempo);
    digitalWrite(led3, LOW);
    delay(tiempo);
    digitalWrite(led4, HIGH);
    delay(tiempo);
    digitalWrite(led4, LOW);
    delay(tiempo);
    digitalWrite(led5, HIGH);
    delay(tiempo);
    digitalWrite(led5, LOW);
    delay(tiempo);
    }

  void loop() {
    secuencia();
    comprueba();
  }

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.

Gracias me voy a informar sobre millis().

Con delay no puedes resolver tu problema. Debes reescribir tu programa usando millis() y te aclaro que no es un reemplazo directo.

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 :wink:

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.