Go Down

Topic: Duvida (Read 483 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