apagar led transcurrido un tiempo

buenas tardes compañeros, tengo una salida que me esta encendiendo un led con un pulsador durante 30 segundos y luego lo apaga, lo que necesito es apagar ese led con ese mismo pulsador en cualquier momento, sin necesidad de esperar que transcurran los 30 segundos.

agradezco su colaboracion.

saludos

Hola
Es mas fácil ayudar si pones el código que tienes, así solo hacemos las modificaciones necesarias

Supongo que los 30 segundos lo controlas con la función millis(), porque si usas delay() no vas a poder hacer lo que pedis.

Podes usar un flag dentro de la condición para hacer lo que precisas.

Busca lo que tiene que ver con interrupciones, ahi la respuesta para que lo apagues en cualquier momento y no uses funciones delay()...

Se pueden usar interrupciones? Si, se pueden, pero para qué si puedes hacerlo prescindiendo de ellas!!

Veo una tendencia a escribir 4 lineas de código y manejar un pulsador con interrupciones, cuando no hace falta.

Pueden programar limpiamente con millis() y atender todo.

Ademas, un código con delay a la larga tiene problemas, no tomen esto como REGLA porque hay muchos codigos con delay pero en lo personal no me gustan.
Me enseñaron que las interrupciones se usan para seguir eventos que las requieren no por cualquier situación que me resuelve el problema.

Lean el texto

una salida que me esta encendiendo un led con un pulsador durante 30 segundos y luego lo apaga, lo que necesito es apagar ese led con ese mismo pulsador en cualquier momento, sin necesidad de esperar que transcurran los 30 segundos.

30 segundos!!!!! y como solución dan interrupciones.. para mi es como usar un 555 con un Arduino sabiendo que hay TIMER para hacerlo.

No estoy contra genobraker, que quede claro, pero imaginen esto

void loop() {
   digitalWrite(pin, HIGH);   // prendo led
   delay(30000);                // 30 segundos
   digitalWrite(pin, LOW);   // prendo led
   delay(30000);                // 30 segundos
}

En este código pretenden poner una interrupción?

no puede hacer esto

void loop() {
   switch(estado) {
       case 0:  digitalWrite(pin, HIGH);   // prendo led
                   estado = 1;
                   start = millis();   // tomo el tiempo parcial
                   break;
       case 1: if (millis() - start > 30000) {
                      digitalWrite(pin, LOW);   // prendo led
                      start = millis();
                      estado = 2;
                  }
                  break;
       case 2: if (millis() - start > 30000) {
                      estado = 0;                   // ser repite todo
                  }
                  break;
     }
}

aca tienen un código que fluye sin frenos (delay()), que permite leer un pulsador fuera del switch sin usar interrupciones.
Es complicado ? menos que usar interrupciones.

Elijan el método que gusten, pero aprendan a usar interrupciones que hacen falta.

Es mi opinión y no tienen porque seguirla.