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();
}
}