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.
Tags:
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.
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)
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por