bottao

boas. tenho andado a dar umas vistas e a perguntar umas opiniões ali no forum geral mas ninguém me conseguiu ajudar ou explicar o seguinte.

Tenho um esquema do mais simples: um botão ligado entre o ground e o pin 2, o pin2 esta em pullup. se carregar no botão e largar o temporizador funciona. mas eu quero manter o botão primido(normalmente fechado) e começar a contar 5 segundas ate desligar o led. É que qualquer que seja o temporizador que use, ou ate mesmo o Delay() com 5 segundos, SÓ começa a contar depois de largar o botão e não assim que carrego.

Sou novo nisto dos arduinos e fraco na programação ,mas acho que se não consegui resolver isto vou ter de abandonar o arduino e fazer um timer com o 555 :~ =(

código que uso.

unsigned long elapsedTime;
unsigned long onTime;

void setup()
{
   
  pinMode(13, OUTPUT);  //Initialize pin 12 as status LED 
  pinMode(2, INPUT_PULLUP);    // Our button pin
  
}

void loop()
{
  if (digitalRead(2) == LOW)   // Switch is closed to start LED timer
         {
          digitalWrite(13, HIGH);  // LED comes On  
          onTime = millis();  
          }
      if(onTime > 0 && millis() - onTime > 5000)  
            {      
            digitalWrite(13, LOW);  // LED goes off
             onTime = 0;
            }
}

não sei se é uma questão de código pois como referi ,se substituir os millis por um simples delay ,o arduino comporta-se da mesma maneira. o que eu quero é:se o botão tiver a 1 ,o led fica a 1 (durante 5 segundos) depois passa a 0. mas não sei mesmo pk não funciona?

unsigned long elapsedTime;
unsigned long onTime;

void setup()
{
   
  pinMode(13, OUTPUT);  //Initialize pin 12 as status LED 
  pinMode(2, INPUT_PULLUP);    // Our button pin
  
}

unsigned char butBefore = HIGH; 

void loop()
{
  if (digitalRead(2) == LOW && butBefore == HIGH)   // Switch is closed and it was open... 
         {
          digitalWrite(13, HIGH);  // LED comes On  
          onTime = millis();  
          }
      if(onTime > 0 && millis() - onTime > 5000)  
            {      
            digitalWrite(13, LOW);  // LED goes off
             onTime = 0;
            }
butBefore = digitalRead(2); 
}

Tu precisas de detectar quando é que o botão mudou de estado... e não quando está premido... senão, enquanto estiver premido, vai continuar ligado.

epa! é isso mesmo que faltava ,Salvaste-me o dia . se tivesse o teu" know how" em C ja tinha o carro a ir sozinho para o trabalho :P

Obrigadão.