Olá, Quero fazer um controle de cliques do botão que funcione da seguinte forma. Se dou apenas um clique acende um LED Vermelho Se dou dois cliques irá acender o LED Verde se dou três cliques irá acender o Led Laranja. Já tentei de varias formas, mais não funciona como o desejado. Eu desejo que funcione dessa forma: Se quero acender o LED Laranja dou 3 cliques e acenderá o LED Laranja. Se quero acender o LED Vermelho dou apenas um Clique acenderá o LED Vermelho. Não quero que seja uma sequencia.
O codigo abaixo esta funcionando, porém em sequencia. Se dou um toque acende o vermelho, se dou outro toque apaga o vermelho e acende o verde. se dou mais um toque apaga o verde e acende o amarelo.
int estadoBotao = 0;
int contadorBotao = 0;
int lastcontagembotao = 0;
#define botao 8
#define led_red 11
#define led_green 13
#define led_yellon 12
void setup() {
pinMode(botao, INPUT_PULLUP);
pinMode(led_red, OUTPUT);
pinMode(led_green, OUTPUT);
}
void loop() {
estadoBotao = digitalRead(botao);
if (estadoBotao == LOW && contadorBotao <= 3 ) {
contadorBotao++;
if (estadoBotao == LOW && contadorBotao == 1) {
digitalWrite(led_red,HIGH);
digitalWrite(led_green,LOW);
digitalWrite(led_yellon,LOW);
delay(300);
}
else if (estadoBotao == LOW && contadorBotao == 2) {
digitalWrite(led_green,HIGH);
digitalWrite(led_red,LOW);
digitalWrite(led_yellon,LOW);
delay(300);
}
else if (estadoBotao == LOW && contadorBotao == 3) {
digitalWrite(led_yellon,HIGH);
digitalWrite(led_green,LOW);
digitalWrite(led_red,LOW);
delay(300);
}
else if (contadorBotao >= 4 ) {
contadorBotao = 0;
}
}
}
Tags:
Do jeito que está o teu código, tu vai apertar uma vez, ele vai somar ao contadorbotao, e vai seguir pra testar qual led acender. O que eu faria é trocar o primeiro IF por um while e adicionar um delay para que seja possível ter tempo de adicionar outro clique ao contador. Minha dúvida é se vai funcionar devido a condição de teste, que caso na hora da leitura o botão esteja na transição entre HIGH e LOW ele pode seguir o código sem a informação certa.
void loop() {
estadoBotao = digitalRead(botao);
while (estadoBotao == LOW && contadorBotao <= 3 ) {
contadorBotao++;
delay(300);
}
if (estadoBotao == LOW && contadorBotao == 1) {
digitalWrite(led_red,HIGH);
digitalWrite(led_green,LOW);
digitalWrite(led_yellon,LOW);
delay(300);
}
else if (estadoBotao == LOW && contadorBotao == 2) {
digitalWrite(led_green,HIGH);
digitalWrite(led_red,LOW);
digitalWrite(led_yellon,LOW);
delay(300);
}
else if (estadoBotao == LOW && contadorBotao == 3) {
digitalWrite(led_yellon,HIGH);
digitalWrite(led_green,LOW);
digitalWrite(led_red,LOW);
delay(300);
}
else if (contadorBotao >= 4 ) {
contadorBotao = 0;
}
}
Olá amigo,
Obrigado por tentar ajudar, mais seu codigo não aconteceu nada. Não acendeu nenhum led.
precisaria implementar um sistema para detectar o intervalo de tempo em que os cliques deverão ser detectados.
exemplo: às 23h00m00s apertei 1x
às 23h00m05s apertei 2x
o sketch irá detectar uma pressionada e depois 2 pressionadas ou ele vai detectar 3 pressionadas?
entende? vc precisará limitar a contagem de pressionamentos pra ocorrerem dentro de um tempo curto, como por exemplo, detecção de pressionamentos dentro de 1 segundo contados a partir do primeiro pressionamento.
após passar 1 segundo, o comando de acendimento deverá ser executado e o contador deverá zerar para aguardar novo pressionamento
Sim foi o que andei pensando usar um RTC ou algo parecido.
é que queira sem o delay , mais dificil ter o controle dos cliques assim
não é pra usar delay e não precisa de rtc
basta usar a função millis()
Blz vou tentar
no site Arduino Playground, na seção Input tem a biblioteca ClickButton q facilita esse controle para ti...
Marcelo, Bom dia. Primeiro muito obrigado. Pois seu código me ajudou muito. Queria saber apenas se sabe o que devo alterar para que sempre inicie com o led red aceso, pois como está inicia com todos os leds desligados.
Obrigado,
William Carvalho.
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por