Boa noite.

Estou tentando, sem sucesso, uma forma de adicionar um delay (ou millis) dentro de um script para "push on / push off". Alguém poderia dar uma ajuda?

O script (sem o delay) é o seguinte:

int buttonPin = 2;

int ledPin = 3;

boolean lastButtonState = LOW;

boolean buttonState = LOW;

boolean on = false;


void setup() { 

  pinMode(buttonPin, INPUT); 

  pinMode(ledPin, OUTPUT);

}


void loop() {

  pushOnPushOff_theShortWay();

  setLed();

}

void pushOnPushOff_theLongWay() {

  lastButtonState = buttonState;    

  buttonState = digitalRead(buttonPin);


if(buttonState == HIGH && lastButtonState == LOW) {     

  delay(5); //to prevent noise     

    if(on == false) {       

      on = true;       

      on = false;     

      } else if(on == true) {       

      on = false;     

      }   

      } else if(buttonState == LOW && lastButtonState == HIGH) {     

        delay(5); //to prevent noise   

      }

}


void pushOnPushOff_theShortWay() {

  lastButtonState = buttonState;    

  buttonState = digitalRead(buttonPin);   

if(buttonState == HIGH && lastButtonState == LOW) {     

  delay(5); //to prevent noise     

  on = !on;

} else if(buttonState == LOW && lastButtonState == HIGH) {     

  delay(5); //to prevent noise   

}

}


void setLed() {

if(on == true) {   

  digitalWrite(ledPin, HIGH);   

} else if(on == false) {     

  digitalWrite(ledPin, LOW);   

}  

}

Nele é possível acender e apagar o led através do botão no pino 2, com o funcionamento de push on / push off.

Gostaria que, ao apertar o botão uma vez, ao invés de o led ficar aceso direto, tivesse um delay para apaga-lo, E se caso o botão fosse apertado mais uma vez antes do termino do delay, apagasse o led.

Ex: 

Led apagado; Apertou botão, acende led por x tempo, mas enquanto está aceso, se apertar botão novamente, apaga o led.

Alguém poderia dar uma luz?

Obrigado.

Exibições: 386

Responder esta

Respostas a este tópico

Este link poderá ajudar a entender o conceito:

https://learn.adafruit.com/multi-tasking-the-arduino-part-1/using-m...

Rapaz, confesso que estou tentando.

Tá difícil! Sou iniciante e não sou programador. ahahaha

Vlw pelas dicas. Estou tentando...

Para registro, e futuras pesquisas segue um sketch Arduino que define Classes de C++ para LED temporizado e para controle de botão push com  debouncing ajustável, sem uso de delay(), ou seja, é um método non-blocking de controlar temporizações. O sketch não foi testado, apenas compilado, mas os conceitos podem ser úteis.

teste_de_LED_com_Botao_V3.ino

Testei e funcionou corretamente.

Há um erro no setup() uso de índices errados no array ... ooops .... :

void setup() {

  led[0].setLED(5, 2000);   // LED 1 no pino 2 com tempo total de 2 segundos
  led[1].setLED(6, 5000);   // LED 2 no pino 3 com tempo total de 5 segundos
  led[2].setLED(7, 10000); // LED 3 no pino 4 com tempo total de 10 segundos

  button[0].setButton(2);   // Botão 1 no pino 5
  button[1].setButton(3);   // Botão 2 no pino 6
  button[2].setButton(4);   // Botão 3 no pino 7
}

Além disso, no meu teste usei INPUT_PULLUP para facilitar a montagem no protoboard, sem precisar dos push buttons. Com isso basta levar os pinos 2, 3 ou 4 para GND que aciona o botão.

Mas precisa inverter a lógica do teste de digitalRead() no void DebouncedButton::scanButton()

e alterar para iniciar o pino em pull up em void DebouncedButton::setButton(int pin)

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço