Go Down

Topic: Piscar LED baseado em Variável (Read 1 time) previous topic - next topic

fireballsp

Pessoas, boa tarde.

Preciso de uma ajuda.. Estou iniciando agora no arduino e não consegui achar um modo de fazer o que tenho em mente. Fiz um circuito simples com um push button e dois LED, que quando aperta o push button ele acende o primeiro e depois de um tempo acende o segundo. Em paralelo ele conta quantas vezes o botão foi pressionado.

A minha dúvida agora é a seguinte, eu quero fazer que o segundo LED pisque para indicar o a quantidade de vezes que o botão foi pressionado e isso será convertido para o delay() em segundos.

Por exemplo, se pressionar 4 vezes, o segundo LED precisa piscar 4 vezes e gerar um delay de 4 segundos para uma função delay(). O meu código inicialmente está assim:

---
const int buttonPin = 2;
const int ledPin =  4;
const int ledazul =  3;

int contador = 0;

int buttonState = 0;

void setup() {
  Serial.begin(9600);
  pinMode(ledPin, OUTPUT); 
  pinMode(ledazul, OUTPUT); 
  pinMode(buttonPin, INPUT); 
}

void loop(){
  buttonState = digitalRead(buttonPin);

  if (buttonState == HIGH) {     
    Serial.println(contador);
    contador++;
    digitalWrite(ledPin, HIGH);
    delay(500);
    digitalWrite(ledPin, LOW);
      digitalWrite(ledazul, HIGH); 
      delay(250);
      digitalWrite(ledazul, LOW);
  } else {
    // turn LED off:
  }
}
---

Alguém tem alguma dica de como fazer isso funcionar?

Obrigado pela ajuda!!

[]'s

bubulindo

Uma dica é esqueceres que o delay existe. Para temporizações vai ver o exemplo blink without delay.

Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

vasr

#2
Aug 19, 2013, 12:14 am Last Edit: Aug 19, 2013, 12:16 am by vasr Reason: 1
O código seguinte é para colocar o segundo LED a piscar consoante o número de vezes que pressionas o botão, só pisca se o botão for pressionado.
Código:
Code: [Select]
void loop(){
 buttonState = digitalRead(buttonPin);
 if (buttonState == HIGH) {    
   Serial.println(contador);
   contador++;
   for(int i=contador;i>0;i--){
   digitalWrite(ledazul, HIGH);
   delay(1000);//Tempo que o led esta ligado
   digitalWrite(ledazul, LOW);
    }

Teste o código e vesse ajuda no teu problema.Não usei o delay como referiste mas penso que é a solução mais fácil.

bubulindo

#3
Aug 19, 2013, 02:14 am Last Edit: Aug 19, 2013, 02:16 am by bubulindo Reason: 1

Uma dica é esqueceres que o delay existe. Para temporizações vai ver o exemplo blink without delay.



void loop(){
 buttonState = digitalRead(buttonPin);
 if (buttonState == HIGH) {    
   Serial.println(contador);
   contador++;
   for(int i=contador;i>0;i--){
   digitalWrite(ledazul, HIGH);
   delay(1000);//Tempo que o led esta ligado
   digitalWrite(ledazul, LOW);
    }


Qual é a parte de "esquece que o delay existe" que não percebeste?
Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

HugoPT

Vou tentar explicar te porque deves seguir o conselho do Bubulindo.
Quote
delay(1000);//Tempo que o led esta ligado

Com isto o microcontrolador fica parado sem fazer rigorosamente nada, o que é mau pois tu podes querer carregar no botão para mudares o teu delay.
Teres isto no codigo vai fazer com que por vezes tu carregues no botao e nada aconteça.Existe uma soluçao simples e podes descobri-la procurando por "Blink Without delay".
Outra coisa que deves procurar e que terá impacto no teu codigo é o  "Debouncing" do botão.
Quando pressionas o botão ocorrem "saltos" rápidos provocados pela própria natureza do botão, no qual a entrada do Arduino ira contar indevidamente como um impulso, causando que por vezes quando carregas apenas uma vez no botão conte mais que uma vez.

Debian,Mint,Ubuntu
Arduino Mega 2560
Arduino Nano
Arduino Duemilanove
MAC OS Montain Lion
Raspberry PI Model B

bubulindo


Vou tentar explicar te porque deves seguir o conselho do Bubulindo.
Quote
delay(1000);//Tempo que o led esta ligado

Com isto o microcontrolador fica parado sem fazer rigorosamente nada, o que é mau pois tu podes querer carregar no botão para mudares o teu delay.
Teres isto no codigo vai fazer com que por vezes tu carregues no botao e nada aconteça.Existe uma soluçao simples e podes descobri-la procurando por "Blink Without delay".
Outra coisa que deves procurar e que terá impacto no teu codigo é o  "Debouncing" do botão.
Quando pressionas o botão ocorrem "saltos" rápidos provocados pela própria natureza do botão, no qual a entrada do Arduino ira contar indevidamente como um impulso, causando que por vezes quando carregas apenas uma vez no botão conte mais que uma vez.


+1 karma pela paciência que tens.
Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

HugoPT

Debian,Mint,Ubuntu
Arduino Mega 2560
Arduino Nano
Arduino Duemilanove
MAC OS Montain Lion
Raspberry PI Model B

vasr

Obrigado pela explicação HugoPT, esta percebido.

ViniciusTech

Porem, caso queira utilizar o delay . Pode deixar o botão em um pino attach.
Arduino Duemilanove
Arduino Mega 2560  
Xbox 360

fireballsp

Caros,

Acho que houve uma confusão.. O que não estou conseguindo fazer é o led piscar na quantidade de vezes que eu pressiono o botão..

Por exemplo:
Pressionei 1 vez, o led pisca 1 vez
Pressionei 5 vezes, o led pisca 5 vezes

Pretendo usar isso como interface para o usuário, assim ele sabe que quando tempo terá de delay em outro pino. Nessa segunda fase, se o led piscou 5 vezes outro pino irá enviar um pulso a cada 5 segundos...

Obrigado

HugoPT

Quote
Porem, caso queira utilizar o delay . Pode deixar o botão em um pino attach.

???
O que é um pino attach?
Quote
Acho que houve uma confusão.. O que não estou conseguindo fazer é o led piscar na quantidade de vezes que eu pressiono o botão..[/quote
Nao o estas a conseguir porque a soluçao para o teu problema como te ja foi dito consiste  em:
Remover o delay(resolves a possivel falha de o cpu estar parado no momento que alguem carrega no botao)
Usar tecnica de debounce no botao(evitar que se tu carregares uma vez apenas o arduino nao interprete como umas 3 ou 4 vezes)
Sabendo isto consegues escrever o codigo?
Debian,Mint,Ubuntu
Arduino Mega 2560
Arduino Nano
Arduino Duemilanove
MAC OS Montain Lion
Raspberry PI Model B

bubulindo


Porem, caso queira utilizar o delay . Pode deixar o botão em um pino attach.


Suponho que queiras dizer configurar o pino como uma interrupcão. E ao fazer isso, não resolveste um problema, criaste outro.
Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

Go Up