Inserir timer em um botão

Olá Srs,

Tenho uma questão que não consigo resolver e desejo a ajuda de vocês.

No código abaixo, tenho um botão. Ele funciona bem, porém, quero que a função só seja ativada, somente após o botão ter sido pressionado por 3 segundos ou mais. Caso seja pressionado por menos do que 3 segundos, nada deve acontecer.

Obrigado!!!

PS: O código não esta lá aquelas coisas, mas quero implementar mais itens.

int Led_red = 5;        
int Led_green = 3;
int botao = 4;

void setup()
{
  pinMode(Led_red, OUTPUT);     
  pinMode(Led_green, OUTPUT);   
  pinMode(botao, INPUT_PULLUP);
  digitalWrite(Led_green, HIGH);
}
void loop()
{
  int start=digitalRead(botao);  
  if(start == LOW)
  alarma();       
  
  if(start == HIGH) 
  {   
  digitalWrite(Led_red, LOW); 
    
} 
  else {
       digitalWrite(Led_red, LOW);
}
}

void alarma() {               
  for (int x=0; x<5; x++)     
  {                           
    digitalWrite(Led_red, HIGH);
    delay(500);                 
    digitalWrite(Led_red, LOW); 
    delay(500);
  }
  delay(100);                   
  digitalWrite(Led_red, HIGH);  
  delay(100);                   
  digitalWrite(Led_red, LOW);   
}

Olá! Veja se este serve.

const byte botao = 4;
unsigned long millis_antes = 0;

void setup()
{
  Serial.begin(38400);
  pinMode(botao, INPUT_PULLUP);
}
void loop()
{
 Serial.println(digitalRead(botao));

  if(digitalRead(botao) == false)
  {
    millis_antes = millis();
  }
  while(digitalRead(botao) == false)
  {
   if((millis() - millis_antes) > 3000)
   {
    Serial.println("Hello!"); 
   }
  }
}

Abraço.

Olá Fernando,

Consegui utilizar parte do seu código. Funfou!

Obrigado!

Segue código para quem precise de algo parecido.

int Led_red = 5;        
int Led_green = 3;
int botao = 4;
unsigned long millis_antes = 0;

void setup()
{
  pinMode(Led_red, OUTPUT);     
  pinMode(Led_green, OUTPUT);   
  pinMode(botao, INPUT_PULLUP);
  digitalWrite(Led_green, HIGH);
}
void loop()
{
  int start=digitalRead(botao);  
  if(digitalRead(botao) == false)
  {
    millis_antes = millis();
  }
  while(digitalRead(botao) == false)
{
   if((millis() - millis_antes) > 3000){
   alarma();
   }
   }
}

void alarma() {               
  for (int x=0; x<5; x++)     
  {                           
    digitalWrite(Led_red, HIGH);
    delay(500);                 
    digitalWrite(Led_red, LOW); 
    delay(500);
  }
  delay(100);                   
  digitalWrite(Led_red, HIGH);  
  delay(100);                   
  digitalWrite(Led_red, LOW);   
}

Legal!

Essa linha é inútil.

  int start=digitalRead(botao);

Se quiser zerar o "timer" após executar uma vez a função alarma(), adicione um "break" no "while".

   if((millis() - millis_antes) > 3000){
   alarma();
   break;
   }
   }

Se o número for menor que 256 é melhor usar "const byte" neste caso:

int Led_red = 5;        
int Led_green = 3;
int botao = 4;

Abraço.

Acabo de implementar! Pois a coisa acabava funcionando sem contar o tempo :)

Obrigado!