Solo me realiza la secuencia una vez

Estoy investigando el función millis() y realice este pequeño ensayo, la cuestión es que me lo gestiona bien la primera vez, después solo se enciende el led mientras presiona el pulsador ??????

Otra cuestión, la interrupciones no son muy compatibles con la función millis, ya se que no es con el delay() por esa razón estoy mirando esta función aparte de parecerme interesante.

float s,r;
int led=13;
int PulPers=6;
void setup()
   {   Serial.begin(9600);
       
       pinMode(led, OUTPUT);

       pinMode(PulPers, INPUT);
   }
void loop()
   {
       if (digitalRead(PulPers))
          {     
           prende();
          }
         
   }

void prende()
{
  digitalWrite(led, HIGH);
  s=millis();
  while (r < 5000)
  {
    r=millis()-s;
  }
  digitalWrite(led, LOW);
}

Gracias

Primero: no declares r y s como float. Decláralas como unsigned long. Ese no es el problema, pero es la forma correcta de hacerlo para estos casos.

Segundo: el problema es que r, cuando sale del while la primera vez que entra, se queda con el valor igual o mayor que 5000, y nunca vuelves a ponerla a cero. Con lo que nunca vuelve a entrar en el while. Prueba a poner

[b]r = 0;[/b]

justo antes del while.

Tercero: si estás investigando la función millis() con idea de quitarte los delay() de en medio (verás que todo el mundo dice que los delay() son el demonio y que lo bueno es millis(), pero pocos dicen cómo), no es la forma más adecuada. Ya que tal como lo estás usando (ya sé que estás investigando) "bloquea" la ejecución del loop() durante el tiempo que quieres controlar (5000 milisegundos en este caso) y de lo que se trata es de controlar el tiempo sin que el loop() se quede bloqueado.

Si no lo has visto aún, mira este ejemplo de la web de Arduino Tutorial BlinkWithoutDelay que, a pesar de estar en inglés, alguna idea te dará. Aunque no me extrañaría nada que ya lo hubieras visto.

Pero la realidad suele ser algo más compleja que el hacer parpadear un LED y nada más. Así que normalmente se combina los millis() con máquinas de estados. Si te encuentras con ánimos de leer un buen rato y ver una larga explicación de cómo implementar algo "pequeño" con millis()] y máquinas de estados, te recomiendo que te leas de este foro el post alarma temporizada en un mismo led al presionar un botón. Donde en mi respuestas explico un poco cómo usar ambas cosas.

Mira que lo mire, pero ya sabes te hay veces que por mucho que lo mires no ves la respuesta y la tienes delante, eso y que eran las dos de la mañana :slight_smile: sabia que era una tontería.

Gracias.

El tutorial ya lo aviá mirado y ahora que lo e vuelto a mirar me dio otra idea.

El post lo voy a mirar con calma es interesante.

Gracias.