collapse

* Posts Recentes

Amplificador - Rockboard HA 1 In-Ear por almamater
[27 de Março de 2024, 19:13]


O que é isto ? por KammutierSpule
[26 de Março de 2024, 19:35]


Bateria - Portátil por almamater
[25 de Março de 2024, 22:14]


Emulador NES em ESP32 por dropes
[13 de Março de 2024, 21:19]


Escolher Osciloscópio por jm_araujo
[06 de Fevereiro de 2024, 23:07]


TP4056 - Dúvida por dropes
[31 de Janeiro de 2024, 14:13]


Leitura de dados por Porta Serie por jm_araujo
[22 de Janeiro de 2024, 14:00]


Distancia Cabo por jm_araujo
[08 de Janeiro de 2024, 16:30]


Meu novo robô por josecarlos
[06 de Janeiro de 2024, 16:46]


Laser Engraver - Alguém tem? por almamater
[16 de Dezembro de 2023, 14:23]

Autor Tópico: [Dúvida] Controlo de contagem  (Lida 6891 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline Sovietico

  • Mini Robot
  • *
  • Mensagens: 113
[Dúvida] Controlo de contagem
« em: 25 de Agosto de 2013, 15:44 »
Boas pessoal. Eu estou-me a iniciar no arduino e ando a montar pequenos circuitos para tentar dominar pequenas acções especificas.
Neste momento estou a tentar controlar o numero de vezes que um led pisca. Para isso tenho um botão +, um botão - e um botão start.
Ou seja, por exemplo, se carregar 2x no botão mais e depois carregar no start o led pisca 2x. Após piscar essas 2x, se carregar no botão menos queria que ele piscasse 1x apenas. Porém, ele pisca 4x e se incrementar 1x ele pisca 8x

o código que tenho é:

const int led = 8;
const int indicador = 12;
const int mais = 4;
const int menos = 2;
const int start = 7;
int smais = 0;
int smenos = 0;
int sstart = 0;
int i = 0;
int c = 0;


void setup(){
 
  pinMode(led, OUTPUT);
  pinMode(indicador, OUTPUT);
  pinMode(mais, INPUT);
  pinMode(menos, INPUT);
  pinMode(start, INPUT);
}

void loop(){

  c = 1;
 
  smais = digitalRead(mais);
  smenos = digitalRead(menos);
  sstart = digitalRead(start);
 
  if (smais == HIGH){
 
    i = i+1;
    digitalWrite(indicador, HIGH);
    delay(50);
    digitalWrite(indicador, LOW);
  }
  else if(smenos == HIGH){
 
    i= i-1;
    digitalWrite(indicador, HIGH);
    delay(50);
    digitalWrite(indicador, LOW);
  }
  else if(sstart == HIGH){
 
    while(c <= i){
      digitalWrite(led, HIGH);
      delay(500);
      digitalWrite(led, LOW);
      delay(500);
      c = c+1;
    }
 
  }
}

Offline rglove

  • Mini Robot
  • *
  • Mensagens: 527
Re: [Dúvida] Controlo de contagem
« Responder #1 em: 25 de Agosto de 2013, 19:45 »
Hmm, como não tenho tempo de ver agora o código todo, li assim só por alto... Pareceu-me que não estás a considerar o ruído proveniente dos botões. Estás a fazer um delay quando o botão é pressionado, mas quando o botão é largado não estás. O ruído pode levar a que o microcontrolador apanhe mais "cliques" que o que é suposto apanhar...

Offline LuísR.A.

  • Mini Robot
  • *
  • Mensagens: 1.224
    • Clube de Robotica
Re: [Dúvida] Controlo de contagem
« Responder #2 em: 25 de Agosto de 2013, 20:35 »
Isso do ruido é estranho :/ em algo tao simples não me parece que aconteça.

Tens os botões em pull-down ou pull-up?
Tiva MCU é que é.

Tutoriais Tiva+codigos exemplo:
https://sites.google.com/site/luiselectronicprojects/

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: [Dúvida] Controlo de contagem
« Responder #3 em: 25 de Agosto de 2013, 20:38 »
Não é ruido, é oscilação dos contactos, pesquisem por button de-bounce.
Avr fanboy

Offline Njay

  • Mini Robot
  • *
  • Mensagens: 3.598
    • Tróniquices
Re: [Dúvida] Controlo de contagem
« Responder #4 em: 25 de Agosto de 2013, 20:40 »
O "ruído" a que o rglove se refere é o chamado "bouncing", e é um problema sim, e leva a que o software detecte mais cliques do que na realidade ocorreram. Ao carregar ou largar um botão, existe um momento na transição em que os contactos mecânicos "saltitam" e a electrónica como é rápida detecta todas essas transições.

Uma forma simples de dar a volta ao bouncing (fazer o chamado "debouncing") é esperar por uma alteração de estado dos botões, e a seguir esperar 50ms antes de ler o seu estado e considerar esse como o estado actual.

Offline LuísR.A.

  • Mini Robot
  • *
  • Mensagens: 1.224
    • Clube de Robotica
Re: [Dúvida] Controlo de contagem
« Responder #5 em: 25 de Agosto de 2013, 21:02 »
Pois agora reparei que o codigo não espera por premir.

Eu faria algo do género. O inserir codigo não está a funcionar não sei porque.
Primeiro espera por um dos botões ser premido. No fim de incrementar espera que nenhum dos botões esteja premido

const int led = 8;
const int indicador = 12;
const int mais = 4;
const int menos = 2;
const int start = 7;
int smais = 0;
int smenos = 0;
int sstart = 0;
int i = 0;
int c = 0;


void setup(){
 
  pinMode(led, OUTPUT);
  pinMode(indicador, OUTPUT);
  pinMode(mais, INPUT);
  pinMode(menos, INPUT);
  pinMode(start, INPUT);
}

void loop(){

  c = 1;
 
  while((smais==low)||(smenos==low)||(sstart==low)){
     smais = digitalRead(mais);
     smenos = digitalRead(menos);
     sstart = digitalRead(start);
  }
 
  if (smais == HIGH){
    i = i+1;
    digitalWrite(indicador, HIGH);
    delay(50);
    digitalWrite(indicador, LOW);
  }
  else if(smenos == HIGH){
 
    i= i-1;
    digitalWrite(indicador, HIGH);
    delay(50);
    digitalWrite(indicador, LOW);
  }
  else if(sstart == HIGH){
    while(c <= i){
      digitalWrite(led, HIGH);
      delay(500);
      digitalWrite(led, LOW);
      delay(500);
      c = c+1;
    } 
  }
 
  while((smais==high)||(smenos==high)||(sstart==high)){
     smais = digitalRead(mais);
     smenos = digitalRead(menos);
     sstart = digitalRead(start);
  }
}
Tiva MCU é que é.

Tutoriais Tiva+codigos exemplo:
https://sites.google.com/site/luiselectronicprojects/

Offline rglove

  • Mini Robot
  • *
  • Mensagens: 527
Re: [Dúvida] Controlo de contagem
« Responder #6 em: 25 de Agosto de 2013, 21:56 »
Exato, não me estava a lembrar do termo correcto

Offline Sovietico

  • Mini Robot
  • *
  • Mensagens: 113
Re: [Dúvida] Controlo de contagem
« Responder #7 em: 26 de Agosto de 2013, 00:08 »
Botões em pull up ou pull down como assim? Do lado oposto aos 5 volts tenho uma resistencia de 220ohms a ligar a terra e um cabo a ligar ao pino.

Podem me explicar o significado lógico do que está dentro do while?

Offline LuísR.A.

  • Mini Robot
  • *
  • Mensagens: 1.224
    • Clube de Robotica
Re: [Dúvida] Controlo de contagem
« Responder #8 em: 26 de Agosto de 2013, 01:06 »
Consegues fazer um esquema da montagem? Tipo no fritzng?

O while significa enquanto.
Enquanto o que esta dentro dos parentes se verificar nunca sai do while, fica em loop.

|| significa ou. Naquele caso tens 3 condições. Se alguma delas se verificar ele mantem-se no while. Isso faz-me lembrar que ta mal. Devia ser com &&. Depois explico e corrijo melhor
Tiva MCU é que é.

Tutoriais Tiva+codigos exemplo:
https://sites.google.com/site/luiselectronicprojects/

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: [Dúvida] Controlo de contagem
« Responder #9 em: 26 de Agosto de 2013, 01:24 »
Tem de ser OR, se não tens de carregar nos três botões para saires do while.
Avr fanboy

Offline Sovietico

  • Mini Robot
  • *
  • Mensagens: 113
Re: [Dúvida] Controlo de contagem
« Responder #10 em: 26 de Agosto de 2013, 02:09 »

Offline Sovietico

  • Mini Robot
  • *
  • Mensagens: 113
Re: [Dúvida] Controlo de contagem
« Responder #11 em: 26 de Agosto de 2013, 02:50 »
Alterei os operadores no código que postaram e já funciona ;)

Alguém me pode explicar como é que este código evita o boucing e o meu não?

Offline samc

  • Mini Robot
  • *
  • Mensagens: 442
Re: [Dúvida] Controlo de contagem
« Responder #12 em: 26 de Agosto de 2013, 10:54 »
se quiseres aprender programação podes tentar escrever um código que utilize a função milis() para evitar a repetição da leitura após receberes o sinal de um botão, ou então...


...podes usar uma biblioteca externa que te faz isso e apenas precisas de a declarar:

http://playground.arduino.cc//Code/Bounce

Offline Sovietico

  • Mini Robot
  • *
  • Mensagens: 113
Re: [Dúvida] Controlo de contagem
« Responder #13 em: 26 de Agosto de 2013, 11:43 »
A programação em parte não é problema. Eu tive Algoritmia na fauldade e embora apenas ter dado VBA tenho algum racicíonio presente onde basta ver alguns exemplos para aprender.
Quanto à maneira de como o código postado previne o boucing do botão acho que já precebi ;)

Offline LuísR.A.

  • Mini Robot
  • *
  • Mensagens: 1.224
    • Clube de Robotica
Re: [Dúvida] Controlo de contagem
« Responder #14 em: 26 de Agosto de 2013, 12:13 »
Tem de ser OR, se não tens de carregar nos três botões para saires do while.

Não vê senso, é um enquanto, não um se.

while(ssmais==low)||(smenos==low)||(sstart==low)
isto dá enquanto qualquer um dos botões esteja low. Tinhas de premir todos ao mesmo tempo para sair. Por isso é que estava errado.

while(ssmais==low)&&(smenos==low)&&(sstart==low)
Enquanto estiverem todos a low. Bast um não estar para sair do while.

Isto tambem mes costuma apanhar sempre :/

Tiva MCU é que é.

Tutoriais Tiva+codigos exemplo:
https://sites.google.com/site/luiselectronicprojects/