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;


}

}

Exibições: 2950

Responder esta

Respostas a este tópico

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 , este botão vc esta usando em uma entrada digutal pull low?
Em que esta no estado "0"
Desculpe galera pois sou novo no mundo ardoino e de programação, beleza .

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.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço