Incrementar +1 em variável int mesmo em cliques longos

Olá amigos, estou com este cenário aqui.

Basicamente, quando o botão está pressionado, a variável contador começa a crescer até 5, resetando em seguida. A variável contador determina qual LED acenderá.

if (digitalRead(botao) == HIGH) {
contador++;
}

if (contador >= 1) {
digitalWrite(azul, HIGH);
}
else {
digitalWrite(azul, LOW);
}
if (contador >= 2) {
digitalWrite(verde, HIGH);
}
else {
digitalWrite(verde, LOW);
}
[…]
if (contador == 5) {
contador=0;

Quando eu mantenho o botão pressionado, a variável vai de 0 a 5 rapidamente. Enquanto que, preciso que ela aumente somente um, independente de quanto tempo o botão ficará pressionado.

Como eu posso fazer isso?

obs: sei que é possível fazer simplesmente colocando um delay no final do “if” mas isso delimitaria quanto tempo eu posso segurar e quanto tempo vou levar para fazer um segundo clique, e isso não é viável neste caso.

Olá, experimenta isto:

if (digitalRead(botao) == HIGH) {
while (digitalRead(botao) == HIGH){}
contador++;
}
Saudações

1 Like

Olá, funcionou! Muito obrigado! No entanto tenho mais duas dúvidas.

  1. Poderia me explicar o que o while fez neste caso? Por que o sistema se comportou dessa forma?

  2. Notei que o if só é executado quando eu solto o botão, há como fazer ele detectar já no momento que clica e não só depois de soltar? Valeu!!

O critério é simples, o if DETECTA o pressionamento do botão, o while é executado imediatamente, que faz o que tem que fazer até que o botão seja solto, e o que faz? … “{}”, NADA, apenas espere até que o botão esteja em LOW, ele está apenas lendo o pino até que você solte o botão, então continue o que está contido dentro do if.
Saudações

1 Like

Ótimo! Agradeço pela ajuda amigo!