como ter um botão que aciona uma função secundária, mas que eu possa deliga-la no proximo clique

  • pessoal eu tenho um botão

  • é simples o que quero fazer é

  • o led piscar quando o botão for apertado e apagar quando for apertado novamente

  • estou usando o debounce

  • e tb este comando:

  • int switchPin = 2;

  • int ledPin = 13;

  • boolean lastButton = LOW;//variável representando o último estado do botão

  • boolean ledOn = false;//variável representando o estado do LED

  • void setup() { pinMode(switchPin, INPUT);

  • pinMode(ledPin, OUTPUT);

  • Serial.begin(9600); }

  • void setup()
    {
    pinMode(switchPin, INPUT);
    pinMode(ledPin, OUTPUT);
    Serial.begin(9600);
    }


    void loop()
    {
    Serial.println(digitalRead(switchPin));
    if (digitalRead(switchPin) == HIGH && lastButton == LOW)
    { //se último estado do botão éra "baixo" e a leitura atual do botão indica "alto"
    ledOn = !ledOn; //inverte estado do LED
    lastButton = HIGH; //coloca último estado do botão como "alto"
    }
    else //caso contrário:
    {
    //lastButton = LOW; //coloca último estado do botão como "baixo"
    lastButton = digitalRead(switchPin); //coloca o valor atual do botão na variável de último estado do botão
    }

    digitalWrite(ledPin, ledOn); //escreve o valor de estado do LED no pino referente

  • mas em nenhum dos dois, depois de que se lê que o botão esta em "HIGH", eu consigo executar um comando edepois desativa-lo quando o botão for apertado novamente

  • somente consigo apertar o botão e fazer o led piscar

  • p sempre

  • se eu aperto denovo não para

Exibições: 478

Responder esta

Respostas a este tópico

## o primeiro erro que verifiquei de cara foi na linha

boolean lastButton = LOW;//variável representando o último estado do botão

muda o LOW para false

###

Bom, eu faria da seguinte forma

####

/* Botão de ativação

   (C) João Carlos Pandolfi Santana

   2013 - Laboratório de Garagem */

int switchPin = 2;
int ledPin = 13;

boolean lastButton = false;//variável de controle
boolean ledOn = false;//variável representando o estado do LED

void setup() { pinMode(switchPin, INPUT);
pinMode(ledPin, OUTPUT);
Serial.begin(9600); }
void setup()
{
pinMode(switchPin, INPUT);
pinMode(ledPin, OUTPUT);
Serial.begin(9600);
}
void loop()
{
Serial.println(digitalRead(switchPin));

//verifico se o botao foi apertado
if (digitalRead(switchPin) == HIGH)
{
//verifico o estado anterior do botao e seto novo estado para o led
if(!lastButton)
ledOn = true;
else
ledOn = false;
}
//quando o botão for solto
else{
//verifico o ultimo estado setado para o botão e o led e seto estado anterior do botão
if(!lastButton && ledOn)
lastButton = true;
else if(lastButton && !ledOn)
lastButton = false;
}

digitalWrite(ledPin, ledOn);
}

 Certo, então quanto ao debounce funcionar, eu consegui, a minha dúvida é, eu não quero só inverter o estado do led, eu quero indicar um loop, que por exeplo é o led piscar.

usa um while com o parametro ledOn

e esse codigo dentro

if (digitalRead(switchPin) == HIGH)

//verifico o estado anterior do botao e seto novo estado para o led
if(!lastButton)
ledOn = true;
else
ledOn = false;
}
//quando o botão for solto
else{
//verifico o ultimo estado setado para o botão e o led e seto estado anterior do botão
if(!lastButton && ledOn)
lastButton = true;
else if(lastButton && !ledOn)
lastButton = false;
}

fica

while(ledOn){

if (digitalRead(switchPin) == HIGH)

//verifico o estado anterior do botao e seto novo estado para o led
if(!lastButton)
ledOn = true;
else
ledOn = false;
}
//quando o botão for solto
else{
//verifico o ultimo estado setado para o botão e o led e seto estado anterior do botão
if(!lastButton && ledOn)
lastButton = true;
else if(lastButton && !ledOn)
lastButton = false;
}

// comando que vai se repetir

}

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço