Ajuda com push button liga/desliga com temporizador

Rapaziada, bom dia.

Estou com certa dificuldade para entender um problema no meu sketch de ligar e desligar o sistema com temporizador (que no meu caso exemplificado com o acionamento de um led). Ao pressionar o push button por 5 segundos o led liga. Ao pressionar novamente durante 5 segundos o led desliga.

O sketch funciona perfeitamente.
So que ha um erro!

Quando o led ligado, ao pressionar umas vez o botao (o led nao desliga) e em seguida segurar durante 5 segundos ele desliga, porem começa a dar erro, ligando e desligando.....

alguem pode me ajudar?

https://uploaddeimagens.com.br/imagens/botao_onoff_com_temporizador_para_ligar-jpeg

segue o codigo:

#define buttonPin 13 
#define ledligado 8 
#define debounce 20 
#define holdTime 2000


int buttonVal = 0; 
int buttonLast = 0; 
long btnDnTime; 
long btnUpTime; 
boolean ignoreUp = false; 


void setup() 
{
pinMode(buttonPin, INPUT);
digitalWrite(buttonPin, LOW );
pinMode(ledligado, OUTPUT);
digitalWrite(ledligado, LOW);
}


void loop()
{
buttonVal = digitalRead(buttonPin);

if (buttonLast == HIGH && buttonVal == LOW && (millis() - btnDnTime) > long(debounce))
{
btnUpTime = millis();
}

if (buttonLast == LOW && buttonVal == HIGH && (millis() - btnUpTime) > long(debounce))
{
btnDnTime = millis();
}

if (buttonVal == HIGH && (millis() - btnDnTime) > long(holdTime))
{
event1();
ignoreUp = true;
btnDnTime = millis();
}

if (buttonVal == HIGH && (millis() - btnUpTime) > long(holdTime))
{
event2();
ignoreUp = true;
btnUpTime = millis();
}


buttonLast = buttonVal;
delay:500;
}


void event1()
{
digitalWrite(ledligado,HIGH);
delay:500;
}

void event2()
{
digitalWrite(ledligado, LOW);
delay:500;
}

Benfica:
O sketch funciona perfeitamente.
So que ha um erro!

Isto quer dizer que o sketch não funciona perfeitamente...

Com essa temporização não faz sentido procurar pela mudança do sinal. As tuas condições para ligar e desligar não parecem fazer sentido já que deveria ser a mesma, mas não é.

Verdade!

Me expressei mal.....
Realmente não consigo entender.

Esta condição tem de ser satisfeita para a variável btnDnTime ser actualizada.

if (buttonLast == LOW && buttonVal == HIGH && (millis() - btnUpTime) > long(debounce))

No entanto aqui estás a ver se o estado do botão é o inverso da condição em cima.

if (buttonVal == HIGH && (millis() - btnDnTime) > long(holdTime))

Porque não teres o código para detectar se o botão foi pressionado e depois trocar o estado duma variável? Se foi o que entendi que queres fazer.