Go Down

Topic: Código 3 Leds e 2 botões :( (Read 3756 times) previous topic - next topic

brunoktm

Boas amigos... Estou a aprender a programar um pouco de arduino mas tenho tido algumas duvidas a fazer pequenos programas, como por exemplo um código com 3 leds e 2 botões..

O funcionamento que pretendia fazer era assim:
-Tinha o botao 1 e o botao 2 , quando clicava 1 VEZ no botao1 e UMA VEZ no botao 2 acendia o LED1;

-Quando clicava 2 VEZES no botão 1 e uma vez no botão 2 acendia o LED2 e apagava o LED1;

-Quando clicava 3 VEZES no botão 1 e uma vez no botão 2 acendia o LED3 e apagava o LED 2 e LED1;

Estou com algumas dificuldades a fazer isto..se me podessem ajudar agradecia  :)

Obrigado  :D

bubulindo

Se não colocares o que já fizeste aqui, a ideia com que ficamos é que pretendes alguém que te faça esse programa.

Coloca aqui o que já fizeste e nós indicámos-te o caminho a seguir.
This... is a hobby.

Filantropic

Escrevi um rascunho de programa aqui. Aviso que não testei e que seria necessário fazer os devidos ajustes. E não sei se os colegas do forum programam desta forma na hora de manipular botões. De qualquer forma, é melhor do que nada.

Code: [Select]

int mudaLuz;
int loop;
int loop2;
int loop3;

void loop(){
mudaLuz=0;
while(mudaLuz==0){
//pressiona o botao1 pela 1ª vez
if(Botao1==HIGH){
//espera o botao1 ser solto
While(botao1==HIGH){}
//entra em outro loop e espera o próximo botão
loop=1;
while(loop==1){
//pressiona o botao2 depois do botao 1
if(Botao2==HIGH){
//espera o botao2 ser solto
While(botao2==HIGH){}
//acender o led 1
acendeLed1();
//modificar a variável mudaluz
mudaLuz=1;
//sair do loop
loop=0;
}
//ou pressiona o botao1 pela segunda vez
if(Botao1==HIGH){
//espera o botao1 ser solto
While(botao1==HIGH){}
//entra em outro loop para esperar novo botão ser pressionado
loop2=1;
while(loop2==1){
//pressiona o botao2 depois do botao 1 duas vezes
if(Botao2==HIGH){
While(botao2==HIGH){}//espera o botao2 ser solto
//acender o led 2
acendeLed2();
//modificar a variável mudaluz
mudaLuz=1;
//sair do loop
loop=0;
loop2=0;
}
//ou pressiona o botao1 pela terceira vez
if(Botao1==HIGH){
//espera o botao1 ser solto
While(botao1==HIGH){}
//entra em outro loop para esperar novo botão ser pressionado
loop3=1;
while(loop3==1){
//pressiona o botao2 depois do botao 1 tres vezes
if(Botao2==HIGH){
While(botao2==HIGH){}//espera o botao2 ser solto
//acender o led 3
acendeLed3();
//apaga os outros leds
apagaLed2();
apagaLed1();
//modificar a variável mudaluz
mudaLuz=1;
//sair do loop
loop=0;
loop2=0;
loop3=0;
}
}
}
}
}
}
}
}
}


De qualquer forma, sou da mesma opinião do bubulindo. Quando for pedir algo, dar um código, mesmo que não funcione, é melhor do que nada.

Espero que o código acima ajude a pelo menos iniciar o projeto.

Abraços

Filantropic

Pensando bem, dá pra fazer algo muito mais simples que o que coloquei.
Cada vez que aperta o botão1 é só colocar para um contador adicionar. Aí é só atribuir uma ação dependendo do valor do contador.

Abraços

brunoktm

Aqui está a parte do programa...Peço desculpa nao sabia malta...

int led1=12;      // led no pino 12
int led2=11;     // led no pino 11
int led3 10;     // led no pino 10
int botao1=9;  // botão no pino 9
int botao2=8; // botão pino 8
int var=0;       // valor instantaneo enviado pelo botão
int var2=0;     // valor guardado
int n=0;
int led2=10;
void setup()
{
  pinMode(led1,OUTPUT);
  pinMode(led2,OUTPUT);
  pinMode(led3,OUTPUT);
  pinMode(botao1,INPUT);
  pinMode(botao2,INPUT);
  Serial.begin(9600);
}
void loop()
{
  var=digitalRead(botao); // ler o valor enviado pelo botão: "HIGH" ou "LOW"
  delay (200);
  Serial.print (var);
  Serial.print (var2);
  Serial.println (n);
  if ((var == HIGH) && (var2 == LOW)) {
   
    n++;
    delay(20); // de-bouncing
  }
  var2=var; 
  if (n == 1) {
    digitalWrite(led, HIGH); // liga o led
    digitalWrite(led2, LOW);  // desliga o led
  }
  if (n == 2) {
    digitalWrite(led2, HIGH); // liga o led
    digitalWrite(led, LOW);  // desliga o led
  }
  if (n == 3) {
    digitalWrite(led, HIGH); // liga o led
    digitalWrite(led2,HIGH);  // desliga o led
  }
 
  if (n == 4){
    digitalWrite(led, LOW);  // desliga o led
    digitalWrite(led2, LOW);  // desliga o led
    n = 0;
  }
}

brunoktm

Alguma ajuda mais clara sff ? continuo com o mesmo problema  :smiley-sad-blue:

bubulindo

Definiste o led2 duas vezes... isso está errado e não deve compilar.

Uma das definições do led2 é a mesma que o led3... isso também não funciona.

Falta-te um = na definição do led3.

Ligaste resistências de pull-up nos botões?

a variável led3 não é usada em lado nenhum.

Definiste botão1 e botao2... usas a variável botao que não está definida em lado algum.

Resolve isto tudo que eu meti aqui e voltamos a ver se existem problemas.
This... is a hobby.

brunoktm

int led1=11;// led1 no pino 11
int led2=12;// led2 no pino 12
int led3=13;// led3 no pino 13
int bt1=8;// botão no pino 8
int bt2=9;// botao no pino 9
int var=0;// valor instantaneo enviado pelo botão
int var2=0;// valor guardado
int estado=0;// guarda o valor 0 ou 1 (HIGH ou LOW)
int n=0;
void setup()
{
  pinMode(led1,OUTPUT);
  pinMode(led2,OUTPUT);
  pinMode(led3,OUTPUT);
  pinMode(bt1,INPUT);
  pinMode(bt2,INPUT);
  Serial.begin(9600);
}
void loop()
{
  var=digitalRead(bt1); // ler o valor enviado pelo botão: "HIGH" ou "LOW"
  delay (200);
  Serial.print (var);
  Serial.print (var2);
  Serial.println (n);
  if ((var == HIGH) && (var2 == LOW)) {
    //estado = 1 - estado;
    n++;
    delay(20); // de-bouncing
  }
  var2=var;
  if (n==0) {
    digitalWrite(led1, LOW); // led1 apagado
    digitalWrite(led2, LOW); // led2 apagado
    digitalWrite(led3, LOW); // led3 apagado
  }
  if (n == 1) {
    digitalWrite(led1, HIGH); // liga led1
    digitalWrite(led2, LOW); // Não liga led2
    digitalWrite(led3, LOW); // Não liga led3
  }
  if (n == 2) {
    digitalWrite(led1, LOW); // Não liga led1
    digitalWrite(led2, HIGH);// Liga led2
    digitalWrite(led3, LOW);// Não liga led3
   }
 
  if (n == 3){
    digitalWrite(led1, LOW);  // Não liga led1
    digitalWrite(led2, LOW);  // Não liga led2
    digitalWrite(led3, HIGH); //Liga led3
    n = 0;
  }
 
  if (led3>=4){ // Volta para 1
    (led1==);
}
}





Assim está melhor amigos?

Filantropic

#8
Nov 05, 2013, 04:24 pm Last Edit: Nov 05, 2013, 04:31 pm by Filantropic Reason: 1
Quando você for colocar um código, utilize a opção "Insert code" do fórum. É o botão com um #. Sem esta formatação o código fica sem indetação, e fica mais difícil de ler.

Acredito que dará um problema nesta parte:
Code: [Select]

if ((var == HIGH) && (var2 == LOW)) {
   //estado = 1 - estado;
   n++;
   delay(20); // de-bouncing
 }


Não há qualquer parada neste if, com exceção daquele pequeno delay de 20. O loop vai passar diretamente por ele. Quando você apertá-lo o n será somado diversas vezes. Tente fazer isso:

Code: [Select]

if ((var == HIGH) && (var2 == LOW)) {
   //estado = 1 - estado;
    While(var==HIGH){}
   n++;
   delay(20); // de-bouncing
 }


Assim ele esperará o botão deixar de pressionado, sem fazer nada.

Outra coisa. O var2 seria o outro botão, não? Quando é que ele pega o valor deste botão?

Go Up