timer

Olá pessoal,

seguinte, tenho um projetinho que eu fiz aqui de um painel com 5 botoes touch, um desses botoes eh um botao de timer, quando eu ativo ele, depois de um certo tempo ele desliga todas as funcoes, bom ateh ai daria tudo certo, seria só eu ativar o botao timer, depois jogar um delay() com o tempo que eu preciso e depois do tempo mandar desligar tudo, porem enquanto o tempo do delay() esta ativo nao consigo usar as funcões dos outros botões acender lampadas etc, preciso que quando eu ativar o botao timer ele conte um tempo para executar a função de desligar, mas enquanto ele esteja fazendo isso as outras opções possam ser executadas, estou postando um video e um código para vc's entenderem melhor.

// Ligações de entradas
const int BTPower = A0;
const int BTMenos = A1; 
const int BTMais = A2;
const int BTTimer = A3;
const int BTLamp = A4;


//Ligações de saída 
const int SaidaBTPower = 3;
const int SaidaBTTimer = 4;
const int SaidaBTLamp = 5;


//Ligações de saída das velocidades
const int SaidaVel1 = 6;
const int SaidaVel2 = 7;
const int SaidaVel3 = 8; 
const int SaidaVel4 = 9;


//Variáveis do programa
int EstadoPower = 0;

int VelAtivo = 0;

int ContBTPower = 0;
int EstadoBTPower = 0;
int UltimoEstadoBTPower = 0; 

int ContBTMenos = 0;
int EstadoBTMenos = 0;
int UltimoEstadoBTMenos = 0; 

int ContBTMais = 0;
int EstadoBTMais = 0;
int UltimoEstadoBTMais = 0; 

int ContBTTimer = 0;
int EstadoBTTimer = 0;
int UltimoEstadoBTTimer = 0; 

int ContBTLamp = 0;
int EstadoBTLamp = 0;
int UltimoEstadoBTLamp = 0; 


//Programa
void setup() {
  //Váriaveis de entrada
  pinMode(BTPower, INPUT); 
  pinMode(BTMenos, INPUT); 
  pinMode(BTMais, INPUT); 
  pinMode(BTTimer, INPUT); 
  pinMode(BTLamp, INPUT); 
  
  //Váriaveis de saida
  pinMode(SaidaBTPower, OUTPUT);
  pinMode(SaidaBTTimer, OUTPUT);
  pinMode(SaidaBTLamp, OUTPUT);
  pinMode(SaidaVel1, OUTPUT);
  pinMode(SaidaVel2, OUTPUT);
  pinMode(SaidaVel3, OUTPUT);
  pinMode(SaidaVel4, OUTPUT);
}


void loop() {
  
  //Circuito BT Power
  EstadoBTPower = analogRead(BTPower);
  
  if(EstadoBTPower != UltimoEstadoBTPower) {
    if(EstadoBTPower == HIGH) {
      ContBTPower++;
      delay(400);
    }
  }
  else if(ContBTPower % 2 == 0) { 
    EstadoPower = 1;
    VelAtivo = 1;
    digitalWrite(SaidaBTPower, HIGH);
    digitalWrite(SaidaVel1, HIGH);
  }
  else if (ContBTPower % 1 == 0) { 
    EstadoPower = 0;
    VelAtivo = 0;
    digitalWrite(SaidaBTPower, LOW);
    digitalWrite(SaidaBTTimer, LOW);
    digitalWrite(SaidaVel1, LOW);
    digitalWrite(SaidaVel2, LOW);
    digitalWrite(SaidaVel3, LOW);
    digitalWrite(SaidaVel4, LOW);
  }
  
  
  //Circuito BT Mais
  EstadoBTMais = analogRead(BTMais);
  
  if(EstadoPower == 1) { 
    if(EstadoBTMais != UltimoEstadoBTMais) { 
      if(EstadoBTMais == HIGH) { 
        ContBTMais++;
        delay(400);
      }
    }
    else if(ContBTMais % 2 == 0) { 
      if(VelAtivo == 1) { 
        VelAtivo = 2; 
        digitalWrite(SaidaVel1, LOW);
        digitalWrite(SaidaVel2, HIGH); 
        delay(200);
      }
      else if(VelAtivo == 2) { 
        VelAtivo = 3; 
        digitalWrite(SaidaVel2, LOW);
        digitalWrite(SaidaVel3, HIGH);
        delay(200);
      }
      else if(VelAtivo == 3) { 
        VelAtivo = 4; 
        digitalWrite(SaidaVel3, LOW);
        digitalWrite(SaidaVel4, HIGH);
        delay(200);
      }
    }
  }
  
  
  //Circuito BT Menos
  EstadoBTMenos = analogRead(BTMenos); 
  
  if(EstadoPower == 1) { 
    if(EstadoBTMenos != UltimoEstadoBTMenos) { 
      if(EstadoBTMenos == HIGH) { 
        ContBTMenos++;
        delay(400);
      }
    }
    else if(ContBTMenos % 2 == 0) { 
      if(VelAtivo == 4) { 
        VelAtivo = 3; 
        digitalWrite(SaidaVel3, HIGH);
        digitalWrite(SaidaVel4, LOW); 
        delay(200);
      }
      else if(VelAtivo == 3) { 
        VelAtivo = 2; 
        digitalWrite(SaidaVel2, HIGH);
        digitalWrite(SaidaVel3, LOW);
        delay(200);
      }
      else if(VelAtivo == 2) { 
        VelAtivo = 1; 
        digitalWrite(SaidaVel1, HIGH);
        digitalWrite(SaidaVel2, LOW);
        delay(200);
      }
    }
  }
  
  
  //Circuito BT Timer
  EstadoBTTimer = analogRead(BTTimer);
  
  if(EstadoBTTimer != UltimoEstadoBTTimer) {
    if(EstadoBTTimer == HIGH) {
      ContBTTimer++;
      delay(400);
    }
  }
  else if(ContBTTimer % 2 == 0) { 
    digitalWrite(SaidaBTTimer, HIGH);
    // aqui tem que desligar tudo depois de um tempo
  }
  else if (ContBTTimer % 1 == 0) { 
    digitalWrite(SaidaBTTimer, LOW); 
    // aqui tem que interromper o timer e caso ele seja ativo novamente contar do 0
  }
  
  
  //Circuito BT Lamp
  EstadoBTLamp = analogRead(BTLamp);
  
  if(EstadoBTLamp != UltimoEstadoBTLamp) {
    if(EstadoBTLamp == HIGH) {
      ContBTLamp++;
      delay(400);
    }
  }
  else if(ContBTLamp % 2 == 0) { 
    digitalWrite(SaidaBTLamp, HIGH);
  }
  else if (ContBTLamp % 1 == 0) { 
    digitalWrite(SaidaBTLamp, LOW); 
  }
  
}

video do projetinho no youtube: http://www.youtube.com/watch?v=z8KesCvfl80

abraços

a funcão delay(1000) é basicamente isto:

temp = 1000;
while (temp)
temp--;

No arduino creio que o que pretendes se consegue com a funcão milis ou millis.

Obrigado, resolvi com o MSTimer :)

http://www.arduino.cc/playground/Main/MsTimer2

abraços