efecto amanecer. código se reinicia solo.

Hola a todos.
Quería preguntaros sobre un pequeño problemilla que ya he resuelto pero al que no le encuentro una respuesta muy lógica.
He hecho un efecto amanecer para mi acuario. Y una vez que ha terminado de "amanecer" puedo seleccionar mediante un solo pulsador, 3 opciones de potencia.
La verdad es que todo funciona bien hasta que una vez que ha "amanecido" el código está continuamente leyendo el pulsador. Y todo va bien y puedo elegir la potencia de salida. Pero si estoy dos o tres minutos sin pulsar nada, automáticamente se reinicia todo y empieza de nuevo con el efecto amanecer sin que en ningún momento yo le diga que salga del código de leer el pulsador.
A base de hacer pruebas he podido solucionarlo cambiando una llave de sitio.
En mi opinión (de novato) creo que la llave estaría bien en cualquiera de los dos sitios. Pero no entiendo por qué al estar donde está ahora, sí que funciona bien, y si dejo la llave que está más arriba y quito la de abajo, se reincia el programa.
He pensado en el watchdog por eso de que está siempre leyendo el pulsador, pero no sé si arduino tiene de eso.
También me ha comentado un amigo que tal vez sería mejor usar un "while" en lugar de un "if" para la lectura del pulsador. Pero tampoco sé si arduino acepta el "while". De hecho lo he probado pero no ha cambiado el resultado.
Si pudiérais echar un vistazo al código que es muy sencillo y ver la diferencia entre las dos llaves que os digo, tal vez me podríais resolver esta pequeña duda que aunque no me impide hacer el circuito porque ya he encontrado solución, sí que me gustaría tener más clara para el futuro.

Gracias y un saludo.

int led = 9; // the pin that the LED is attached to
int brightness = 200; // how bright the LED is
int fadeAmount = 1; // how many points to fade the LED by
int pulsador =8;
int contador = 0;

void setup() {
Serial.begin (9600);
pinMode(led, OUTPUT);
pinMode (pulsador, INPUT);
}

void loop() {

amanecer();

}

void amanecer()
{
brightness = brightness - fadeAmount;
Serial.println (brightness);
analogWrite(led, brightness);
delay (500);
if (brightness <= 25) {

Serial.println (brightness);
analogWrite(led, 25);

pulsadores();
}
}

void pulsadores ()
{

delay(50);

if ( digitalRead (pulsador) == HIGH){
delay(500);

contador++ ;

//} // Esta llave es la que tengo que poner comentada.Y la que está más abajo, justo encima de "pulsadores();" es la que tengo que dejar puesta.

if (contador ==1){
analogWrite (led,179 );
delay (50);
pulsadores();
}
if (contador == 2){
analogWrite(led, 98);
delay(50);
pulsadores();

}
if (contador == 3){
analogWrite(led, 25 );
contador = 0;
delay(50);
}

} // Esta llave es la que tengo que dejar puesta. Y la que está más arriba, justo debajo de "contador ++" la que tengo que quitar.
pulsadores();

}

Hola :slight_smile: Dos cosas:
-Mediante el pulsador cambias el valor del pin 'led' y al volver a amanecer() sobreescribes el valor del 'led' con 'brightness', con lo que aparentemente no sirve de nada que cambies 'led'. ¿Se aprecia cambio al pulsar? De todos modos no debería, ya que...
-Con los brackets que tienes estás llamando a pulsadores() dentro de la propia función pulsadores(), causando desbordamiento de la pila (el mítico stack overflow), que es lo que probablemente causa el reinicio.

Una cosa: añadir comentarios puede ayudar a que la gente que lea el código comprenda lo que quieres hacer: qué hace cada loop, cada if, etc. Con el código que muestras entran dudas de qué debe hacer cada función o cada if :wink:

Ya nos cuentas si se soluciona el tema. Salud :slight_smile: