Al esperar el boton hace falso antes de los segundos requeridos

Estoy haciendo un codigo en el cual tengo un final de carrera FC_S el cual se supone que debo mantenerlo presionado por al menos unos cuantos segundos antes de que se realice la funcion atras(); la cual hace girar un motor CD, sin embargo con el codigo que tengo, cuando presiono FC_S hace falso y avanza mm hasta despues de mas tiempo avanza hacia atras, estos falsos no deben ocurrir, intente utilizar un for y tampoco funciono.

Les comparto el codigo:


#include <LiquidCrystal_I2C.h>
#include <Wire.h>

LiquidCrystal_I2C lcd(0x27, 16, 2);
const int PB_ON = 1;
const int PB_OFF = 2;
int sistema;
int led = 3;

const int PB_D = 4;
const int PB_T = 5;

int ledD = 6;
int ledT = 7;

int MAD = 8;
int MAT = 9;

const int FC_D = 10;
const int FC_T = 11;
const int FC_S = 12;

void Apagado();
void Encendido();
void in_atras();

void atras();
void adelante();
void stop();

void setup() {
  Serial.begin(9600);
  lcd.init();
  lcd.backlight();
  lcd.clear();
  lcd.setCursor(3, 0);

  if (sistema == 0) {
    lcd.print("BIENVENIDO");
  }

  pinMode(PB_ON, INPUT_PULLUP);
  pinMode(PB_OFF, INPUT_PULLUP);
  pinMode(led, OUTPUT);

  pinMode(PB_D, INPUT_PULLUP);
  pinMode(PB_T, INPUT_PULLUP);

  pinMode(ledD, OUTPUT);
  pinMode(ledT, OUTPUT);

  pinMode(MAT, OUTPUT);
  pinMode(MAD, OUTPUT);

  pinMode(FC_D, INPUT_PULLUP);
  pinMode(FC_T, INPUT_PULLUP);
  pinMode(FC_S, INPUT_PULLUP);
}

void loop() {
  static unsigned long t = 0;
  if (digitalRead(PB_ON) == LOW) t = (t == 0) ? millis() : t;
  if (digitalRead(PB_ON) == LOW && millis() - t >= 1500) {
    sistema = 1;
    lcd.clear();
    in_atras();
    t = 0;
  }
  if (digitalRead(PB_ON) == HIGH) t = 0;

  if (digitalRead(PB_OFF) == HIGH) {
    sistema = 2;
  }

  if (sistema == 1) {
    Encendido();
    if (digitalRead(FC_S) == LOW) {
  bool mantenerPresionado = true;

  for (int i = 0; i < 2000; i++) {  // 2000 ms total
    delay(1);
    if (digitalRead(FC_S) == HIGH) {
      mantenerPresionado = false;
      break;  // Se soltó antes de tiempo, salir
    }
  }

  if (mantenerPresionado) {
    atras();  // Solo si se mantuvo LOW por 2s completos
  }
}
  }

  if (sistema == 2) {
    Apagado();
  }
}

void Encendido() {
  digitalWrite(led, HIGH);
  lcd.setCursor(3, 0);
  lcd.print("SISTEMA ON ");

  if (digitalRead(PB_D) == LOW) {
    adelante();
  } else if (digitalRead(FC_D) == LOW) {
    stop();
  }

  if (digitalRead(PB_T) == LOW) {
    atras();
  } else if (digitalRead(FC_T) == LOW) {
    stop();
  }

}

void Apagado() {
  digitalWrite(led, LOW);
  stop();
  lcd.setCursor(0, 1);
  lcd.print("               ");
  lcd.setCursor(3, 0);
  lcd.print("SISTEMA OFF");
}

void atras() {
  digitalWrite(MAT, LOW);
  digitalWrite(MAD, HIGH);
  digitalWrite(ledT, HIGH);
  digitalWrite(ledD, LOW);
}

void adelante() {
  digitalWrite(MAT, HIGH);
  digitalWrite(MAD, LOW);
  digitalWrite(ledT, LOW);
  digitalWrite(ledD, HIGH);
}

void stop() {
  digitalWrite(MAD, HIGH);
  digitalWrite(MAT, HIGH);
  digitalWrite(ledT, LOW);
  digitalWrite(ledD, LOW);
}

void in_atras() {
  unsigned long t_inicio = millis();
  atras();  // Empieza a girar hacia atrás

  // Girar máximo 1 segundo o hasta que PB_D sea LOW (presionado)
  while (millis() - t_inicio < 1000 && digitalRead(PB_D) == HIGH) {
    // Esperar
  }

  stop();
}

Su publicacion se MUEVE a su ubicacion actual ya que es mas adecuada.

Tu solución

o usa esta librería

Ambas hacen lo mismo.