Ir ao conteúdo
  • Cadastre-se

Arduino Interpretar botão fechado com arduino


Ir à solução Resolvido por eletron1791,

Posts recomendados

Colegas,

 

Tenho um led num pino digital do arduino UNO que deve acender ao pressionar um botão que está num outro pino digital. Mas é assim, se eu apetar o botão e manter ele pressionado, o led deve piscar 1 vez. Do jeito que eu fiz aqui se eu manter o botão pressionado o led pisca direto, se eu coloco um while o botão só funciona quando abre, aí dá certo. Mas não é esse o objetivo. Tem que fazer o led piscar 1 única vez logo quando o botão fechar os contatos. Se manter o botão fechado dane-se. O led só deve piscar de novo quando o botão abrir e fechar novamente. Tentei pôr um delay no botão mas se segurar o botão por um tempo maior que o delay o led pisca novamente e não seria esse o caso.

 

Assim não dá certo:

if (digitalRead(BUTTON_PIN) == 0) {

digitalWrite(led, HIGH);
   delay(100);
   digitalWrite(led,LOW);

 

Como tem que ficar ?

 

 

Link para o comentário
Compartilhar em outros sites

3 horas atrás, eletron1791 disse:

Como tem que ficar ?

 

 

if (digitalRead(BUTTON_PIN) == 0) {

digitalWrite(led, HIGH);
   delay(100);
   digitalWrite(led,LOW);

while(digitalRead(BUTTON_PIN) ==0) //aqui no momento eu não sei se coloca ";" ou  //não

delay(100); // para o caso de ter anti-debounce

 

👍

 

Link para o comentário
Compartilhar em outros sites

12 horas atrás, Maria Cristina Oliveira disse:

//aqui no momento eu não sei se coloca ";"

não bota se quiser que o "delay(100);" se repita no loop... caso queira que rode um nada, coloque o ';' sim

 

 

eu faria assim:

bool botao, botaoVelho;

botao = digitalRead(BUTTON_PIN);

if ((botao == 1) && (botaoVelho != botao))
  /* caso queira inverter (quando pressionar ou quando soltar), mude o numero para 0 */
{
  digitalWrite(led, HIGH);
  delay(100);
  digitalWrite(led,LOW);
}
botaoVelho = botao;
/* em situações normais, eu colocaria um anti-debounce aqui, mas já tem um delay dentro do if, e ele substitui o debounce */
/* coloque isso em um loop, e caso queira usar com "multitarefas", pesquise sobre o comando millis */

 

  • Confuso 1
Link para o comentário
Compartilhar em outros sites

1 hora atrás, Um mero usuário disse:

não bota se quiser que o "delay(100);" se repita no loop... caso queira que rode um nada, coloque o ';' sim

 

Obrigada por lembrar, amigo! 

 

Às vezes me confundo, mas já fiz certo! :)

P2_6=!P2_6;
    while (!P3_0); 
    while (tempo<10000){    //tive que colocar isso porque também tem...

 

Então fica assim...

 

14 horas atrás, Maria Cristina Oliveira disse:

if (digitalRead(BUTTON_PIN) == 0) {

digitalWrite(led, HIGH);
   delay(100);
   digitalWrite(led,LOW);

while(digitalRead(BUTTON_PIN) ==0);

delay(100); // para o caso de ter anti-debounce

 

Interessante o programa que você fez (vou copiar pra mim).🤔

 

OBS: Anti-debounce é piada interna...:lol:

https://www.clubedohardware.com.br/forums/topic/1533966-filtro-anti-debounce-na-linguagem-c/page/2/?tab=comments#comment-8161418

  • Haha 1
Link para o comentário
Compartilhar em outros sites

1 minuto atrás, Maria Cristina Oliveira disse:

Interessante o programa que você fez (vou copiar pra mim).🤔

o programa q você copiou foi o seu mesmo hahaha...

if (digitalRead(BUTTON_PIN) == 0) { //se botão desligado

   digitalWrite(led, HIGH); //ligar
   delay(100); //esperar
   digitalWrite(led,LOW); //desligar

}

while(digitalRead(BUTTON_PIN)==0); //enquanto desligado fazer nada

delay(100); // para o caso de ter anti-debounce //logo após, esperar

 

imagino que isso seja dentro de um loop... no caso, esse "delay" final aí é inútil, pois já tem um "delay" dentro do if, mas se não houvesse, seria fundamental

 

1 minuto atrás, Maria Cristina Oliveira disse:

OBS: Anti-debounce é piada interna...:lol:

para mim é algo real mesmo... sem o anti-debounce, vamos colocar que ao apertar o botão, uma variavel do tipo bool muda de estado... como o botão tem o efeito debounce, a variavel muda inumeras vezes de estado nesse periodo de tempo ínfimo... adicionando um delay, se elimina esse efeito

  • Confuso 1
Link para o comentário
Compartilhar em outros sites

Vamos juntar nossos neurônios...

 

image.png.bd1c5e45d1f4de41d827aa818fdc12d2.png

11 minutos atrás, Um mero usuário disse:

 

 

o programa q você copiou foi o seu mesmo hahaha...

 

O programa que eu copiei foi o seu, não o meu... 

2 horas atrás, Um mero usuário disse:

bool botao, botaoVelho; botao = digitalRead(BUTTON_PIN); if ((botao == 1) && (botaoVelho != botao)) /* caso queira inverter (quando pressionar ou quando soltar), mude o numero para 0 */ { digitalWrite(led, HIGH);  delay(100);  digitalWrite(led,LOW); } botaoVelho = botao; /* em situações normais, eu colocaria um anti-debounce aqui, mas já tem um delay dentro do if, e ele substitui o debounce */ /* coloque isso em um loop, e caso queira usar com "multitarefas", pesquise sobre o comando millis */

 

18 minutos atrás, Um mero usuário disse:

"delay" final aí é inútil, pois já tem um "delay" dentro do if, mas se não houvesse, seria fundamental

 

 É que às vezes, tem bouncing quando se desliga a chave....

 

19 minutos atrás, Um mero usuário disse:

para mim é algo real mesmo... sem o anti-debounce, vamos colocar que ao apertar o botão, uma variavel do tipo bool muda de estado... como o botão tem o efeito debounce, a variavel muda inumeras vezes de estado nesse periodo de tempo ínfimo... adicionando um delay, se elimina esse efeito

 

O termo anti-debounce não existe (piada interna, descobri dias atrás). Ou é Anti-bouncing ou debounce

 

Desculpe as brincadeiras... (acordei bem-humorada).😔

 

 

Link para o comentário
Compartilhar em outros sites

Maria, no meu texto inicial comentei sobre o uso do while e de fato ao colocá-lo o botão não repete a atuação porém o led só pisca quando eu solto o botão. Lembrando que eu tenho um 10K indo para o GND e o botão ao fechar manda 5 volts para o pino. O que eu preciso é que o efeito do botão ocorra logo quando ele fechar seus contatos e não quando abrir. Ou seja, logo que o pino, que é 0, for para 1 o led pisca e para mesmo que fique mantido no 1 (manter o botão fechado). Para o LED piscar novamente tem que abrir o botão e fechá-lo na sequencia.

 

Um mero usuário, eu tenho uma linha escrito #define botao 12 (pino 12), daí deu erro e não compilou ao colocar o seu bool botao

 

Perdão, o correto aqui é assim:

if (digitalRead(BUTTON_PIN) == 1) {

digitalWrite(led, HIGH);
   delay(100);
   digitalWrite(led,LOW);

  • Confuso 1
Link para o comentário
Compartilhar em outros sites

33 minutos atrás, eletron1791 disse:

Maria, no meu texto inicial comentei sobre o uso do while e de fato ao colocá-lo o botão não repete a atuação porém o led só pisca quando eu solto o botão. Lembrando que eu tenho um 10K indo para o GND e o botão ao fechar manda 5 volts para o pino. O que eu preciso é que o efeito do botão ocorra logo quando ele fechar seus contatos e não quando abrir. Ou seja, logo que o pino, que é 0, for para 1 o led pisca e para mesmo que fique mantido no 1 (manter o botão fechado). Para o LED piscar novamente tem que abrir o botão e fechá-lo na sequencia.

 

Então fica assim...

 

if (digitalRead(BUTTON_PIN) == 1) { 

digitalWrite(led, HIGH);
   delay(100);
   digitalWrite(led,LOW);

while(digitalRead(BUTTON_PIN) ==1);

delay(100); // para o caso de ter bouncing 👍 

 

 

image.png

Link para o comentário
Compartilhar em outros sites

18 horas atrás, Maria Cristina Oliveira disse:

O programa que eu copiei foi o seu, não o meu... 

entendi, é que como você disse que copiou e logo em seguida botou seu codigo, confundi

 

18 horas atrás, Maria Cristina Oliveira disse:

É que às vezes, tem bouncing quando se desliga a chave....

hmmmm... bom saber

 

18 horas atrás, Maria Cristina Oliveira disse:

O termo anti-debounce não existe (piada interna, descobri dias atrás). Ou é Anti-bouncing ou debounce

hmmmmm... bom saber mesmo, mas ainda vou falar anti-debounce hahahaha

 

16 horas atrás, eletron1791 disse:

Um mero usuário, eu tenho uma linha escrito #define botao 12 (pino 12), daí deu erro e não compilou ao colocar o seu bool botao

bem fácil de resolver: troque em todos os lugares que tem a variavel bool botao citada por joaozinho, banana, botaum... é só mudar o nome

 

 

desculpe @Maria Cristina Oliveira, mas vou falar mal de seu código hahaha

se for necessário usar outras coisas, por exemplo, o arduino fica calculando numeros e respondendo por serial, evite colocar o while, entende? no caso para apenas o led não tem problema, mas se tivesse mais coisa teria ;)

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Em 03/05/2021 às 12:17, Maria Cristina Oliveira disse:

Vamos juntar nossos neurônios..

Me lembrei desse episódio do Jornada nas Estrelas ... esse era o Spock teóricamente mau ( de outra realidade ) mas que acabou cedendo à lógica e colaborou permitindo a troca dos dois capitães Kirk...

 

estou vendo que você ficou expert em Bouncing ( ou em antí-debouncing ????         kkk ) !

 

Paulo....

 

 

  • Haha 2
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...