Go Down

Topic: Duvida (Read 497 times) previous topic - next topic

Fiama

Olá.. eu sou super noob em arduino e estou com um duvida (não sei se vou conseguir explicar direito)

Eu tenho quatro canais de entrada (botões) e 4 leds, preciso desenvolver um projeto onde toda vez q aperto o botão 1  o led 1 irá ascender (a mesma coisa acontece para os outros botões e leds), mas esse led só pode ficar aceso por 20 segundos, então fiz essa logica:

Code: [Select]
void loop (){

     
  if (digitalRead(CH1)){
    acendeLed(0); 
   }
  if (digitalRead(CH2)){
    acendeLed(1);
     }
  if (digitalRead(CH3)){
    acendeLed(2);
  }
  if (digitalRead(CH4)){
    acendeLed(3); 
  }

}

void acendeLed (int numled){
  tempoDeCadaLED[numled] = millis() + 20000;
 
  while(millis() <= tempoDeCadaLED[numled])
    digitalWrite(vetorLeds[numled], HIGH);
 
  digitalWrite(vetorLeds[numled], LOW);
}


Mas o problema é que eu não consigo executar tudo ao mesmo tempo, o programa fica os 20 segundos preso no método acenderLed() e só após isso eu posso apertar outro botão.

Fiama

Alguem me ajuda '-'

Mortis

Fala ai Fiama,

O problema esta no loop, ou seja, o loop irá "parar" o programa até que acabe o tempo determinado 20000 milesenconds, certo?

pelo que percebo ApagaLed já é uma variável global, certo?

então tenta o abaixo:

Code: [Select]
unsigned long tempoDeCadaLED[] = {0,0,0,0}; //array de 4 para 4 legs

void loop (){
  if (digitalRead(CH1)){
    acendeLed(0); 
   }
  if (digitalRead(CH2)){
    acendeLed(1);
     }
  if (digitalRead(CH3)){
    acendeLed(2);
  }
  if (digitalRead(CH4)){
    acendeLed(3); 
  }
 
  numled = 0;
  while(numled <= 4){ //corre todos o leds a cada loop para ver se é tempo de apagar
    if (millis() - tempoDeCadaLED[numled] >= 20000) //se já deu to tempo do led
      digitalWrite(vetorLeds[numled], LOW); //apaha o led
    var++;
  }
}

void acendeLed (int numled){
  digitalWrite(vetorLeds[numled], HIGH);
  tempoDeCadaLED[numled] = millis() + 20000;
}

HugoPT

#3
Apr 14, 2013, 10:51 pm Last Edit: Apr 14, 2013, 11:07 pm by HugoPT Reason: 1
Quote
numled = 0;
 while(numled <= 4){ //corre todos o leds a cada loop para ver se é tempo de apagar
   if (millis() - tempoDeCadaLED[numled] >= 20000) //se já deu to tempo do led
     digitalWrite(vetorLeds[numled], LOW); //apaha o led
   var++;

Assim à primeira vista este while me parece que vai ser um ciclo infinito nao?
a condiçao do while numled <=4 nao é modificada por si só dentro do while por isso deve resultar sempre em verdade, logo o micro nunca deixará este while.
Ve se isto te ajuda a entender , fiz o programa rapidinho e fiz upload e está a funcionar aparentemente bem.
Code: [Select]
#define timerON 5000

long ledTriggerRed = 0;
long ledTriggerGreen = 0;
long ledTriggerYellow =0;
int CH1 = 4;
int CH2 = 5;
int CH3 = 6;

int ledRed = 7;
int ledGreen = 8;
int ledYelow = 9;

void setup()
{
pinMode(ledRed,OUTPUT);
pinMode(ledGreen,OUTPUT);
pinMode(ledYelow,OUTPUT);

pinMode(CH1,INPUT);
pinMode(CH2,INPUT);
pinMode(CH3,INPUT);
//Activa Pull-Ups nos pinos
digitalWrite(CH1,1);
digitalWrite(CH2,1);
digitalWrite(CH3,1);

}
void loop ()
{    
if (digitalRead(CH1) == LOW)
 {
   ledTriggerRed = millis();
   digitalWrite(ledRed,1);
     
 }
if (digitalRead(CH2) == LOW)
 {
   ledTriggerGreen = millis();
   digitalWrite(ledGreen,1);  
 }
if (digitalRead(CH3) == LOW)
 {
   ledTriggerYellow = millis();
   digitalWrite(ledYelow,1);  
 }
delayLed(ledRed,ledTriggerRed);
delayLed(ledGreen,ledTriggerGreen);
delayLed(ledYelow,ledTriggerYellow);
}

void delayLed(int led ,long triggeredLed)
{
if(millis() - triggeredLed >=timerON)
 {
 triggeredLed = 0;
 digitalWrite(led,0);
 }
}
Debian,Mint,Ubuntu
Arduino Mega 2560
Arduino Nano
Arduino Duemilanove
MAC OS Montain Lion
Raspberry PI Model B

Mortis

Me perdoem, eu errei ao digitar "var++;", o correto é "numled++;" e não percebi por não ter compilado!  =(

Foi a ânsia de desejar ajudar  ;)

My Fault!

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy