El código de @gonpezzi no está bien, lamento decirlo (perdón).
Si haces una pulsación corta (menor a 1 seg) igual cambia el estado del LED luego de 1 seg.
Ademas una pulsación corta entre pulsaciones largas cambia el estado de led_on, eso lleva a que led_on no esté sincronizado con el estado actual del LED y además cambia el valor de t_actual por lo que deja de hacer lo que queremos en el tiempo que esperamos y a nuestra vista parece dejar de responder.
Propongo hacerlo de la siguiente forma, con la aclaración que mientras se mantenga el botón pulsado o durante 1 seg, lo que sea menor, el programa se "bloquea", o sea, no se puede hacer otra cosa
# define LED 8
# define PULSADOR 4
unsigned long t_start;
bool puls_anterior = true, puls_actual = true, led_on = false, puls_larga = false;
void setup (){
pinMode(LED, OUTPUT);
pinMode(PULSADOR, INPUT_PULLUP);
}
void loop (){
puls_anterior = puls_actual;
puls_actual = digitalRead(PULSADOR);
if (puls_actual == LOW && puls_anterior == HIGH) { // pasa de no pulsado a pulsado
t_start = millis();
delay(20); // no me gusta pero es lo más simple para evitar rebotes
while(puls_actual == LOW) {
if(millis() - t_start >= 1000) {
puls_larga = true;
led_on = !led_on;
break;
}
puls_actual = digitalRead(PULSADOR); // verifica si el boton sigue pulsado para continuar dentro del lazo
}
}
if(puls_larga == true){
digitalWrite(LED, led_on);
puls_larga = false;
}
}
Lo explico rápidamente.
Copia el estado del botón en una variable de control para luego saber si hay cambio de estado.
Luego lee el puerto que maneja el botón.
Si el estado del botón pasa de no pulsado a pulsado, comienza a medir la duración de la pulsación, hace un breve delay() para evitar rebotes del botón, y entra en un lazo while() mientras el botón permanezca pulsado. Si dentro del lazo, se supera 1 seg, invierte el estado de led_on, pone en true una variable que indica que se ha producido una pulsación larga y sale del lazo while. Si todavía no ha pasado 1 seg, verifica si el botón sigue pulsado para quedar en el lazo o salir del mismo.
En caso contrario (no hay pulsación, se mantiene pulsado más de 1 seg o se libera el botón) simplemente lo ignora.
Luego verifica si se ha producido una pulsación larga, y si corresponde cambia el estado del LED según led_on y pone en falso la variable que indica la pulsación larga, quedando lista para su próximo uso.
Y vuelve a empezar el loop()
Creo que es la forma más simple de hacerlo. Claramente se puede mejorar para que no produzca bloqueos y permita hacer otras cosas si fuese necesario (incluso hay librerías que pueden manejar esto) pero la idea fue que sea simple y sencillo de entender.
Saludos
PD: por favor edita tu post para que el código se vea como corresponde tal como te ha indicado el moderador, es para tu beneficio.