Pages: [1]   Go Down
Author Topic: Duvida  (Read 448 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 2
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 2
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Alguem me ajuda '-'
Logged

Offline Offline
God Member
*****
Karma: 12
Posts: 510
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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;
}
Logged

Portugal
Offline Offline
Edison Member
*
Karma: 37
Posts: 1575
Pretending you know everything then you will learn nothing.
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
#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);
  }
}
« Last Edit: April 14, 2013, 04:07:55 pm by HugoPT » Logged

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


Offline Offline
God Member
*****
Karma: 12
Posts: 510
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Foi a ânsia de desejar ajudar  smiley-wink

My Fault!
Logged

Pages: [1]   Go Up
Jump to: