const unsigned long RETARDO = 1000UL;
const unsigned long DURACION = 2000UL;

const byte PIN_SELECTOR = 2;
const byte PIN_LED = 3;
const byte PIN_BOTON = 12;

unsigned long tiempoHi;
unsigned long tiempoLo;

bool flancoHi;
bool flancoLo;
bool activado;
bool tiempoFijo;

byte estadoActual = LOW;
byte estadoAnterior = LOW;

void tiempo_fijo() {
  estadoActual = digitalRead(PIN_BOTON);
  if (estadoActual != estadoAnterior) {
    estadoAnterior = estadoActual;
    if (estadoActual == HIGH) {  // flanco ascendente, se pulsa boton/sensor
      digitalWrite(LED_BUILTIN, HIGH);
      flancoHi = true;
      tiempoHi = millis();
    }
    else {  // flanco descendente, se libera boton/sensor
      digitalWrite(LED_BUILTIN, LOW);
    }
  }

  if (flancoHi) {
    if (millis() - tiempoHi >= RETARDO) {
      digitalWrite(PIN_LED, HIGH);
      flancoHi = false;
      activado = true;
    }
  }

  if (activado) {
    if (millis() - tiempoHi >= RETARDO + DURACION) {
      digitalWrite(PIN_LED, LOW);
      activado = false;
    }
  }
}

void tiempo_segun_sensor() {
  estadoActual = digitalRead(PIN_BOTON);
  if (estadoActual != estadoAnterior) {
    estadoAnterior = estadoActual;
    if (estadoActual == HIGH) {  // flanco ascendente, se pulsa boton/sensor
      digitalWrite(LED_BUILTIN, HIGH);
      flancoHi = true;
      tiempoHi = millis();
    }
    else {  // flanco descendente, se libera boton/sensor
      digitalWrite(LED_BUILTIN, LOW);
      flancoLo = true;
      tiempoLo = millis();
    }
  }

  if (flancoHi) {
    if (millis() - tiempoHi >= RETARDO) {
      digitalWrite(PIN_LED, HIGH);
      flancoHi = false;
    }
  }

  if (flancoLo) {
    if (millis() - tiempoLo >= RETARDO) {
      digitalWrite(PIN_LED, LOW);
      flancoLo = false;
    }
  }
}

void setup() {
  pinMode(PIN_SELECTOR, INPUT_PULLUP);
  pinMode(PIN_BOTON, INPUT);
  pinMode(LED_BUILTIN, OUTPUT);
  pinMode(PIN_LED, OUTPUT);
  digitalWrite(LED_BUILTIN, LOW);
  digitalWrite(PIN_LED, LOW);
}

void loop() {
  tiempoFijo = digitalRead(PIN_SELECTOR);
  if (tiempoFijo) {
    tiempo_fijo();
  } else {
    tiempo_segun_sensor();
  }
}