#include <Adafruit_SoftServo.h>
const int pinServo = 0; // P0
const int pinBoton = 2; // P2 con pull-up interna
const int pinLed1 = 1; // P1
const int pinLed2 = 4; // P4
Adafruit_SoftServo servo;
enum Estado { SELECCION, INDICAR_INICIO, CUENTA, FINAL };
Estado estado = SELECCION;
unsigned long tiempoInicio = 0;
unsigned long tiempoPresionado = 0;
int indiceTiempo = 0;
const unsigned long tiempos[] = {1000, 5000, 10000}; // ms
bool botonAnterior = HIGH;
// Variables parpadeo inicio
int parpadeosInicio = 0;
unsigned long tiempoUltimoCambio = 0;
bool ledsEncendidos = false;
void setup() {
pinMode(pinBoton, INPUT_PULLUP);
pinMode(pinLed1, OUTPUT);
pinMode(pinLed2, OUTPUT);
servo.attach(pinServo);
servo.write(0);
}
void loop() {
servo.refresh();
bool boton = digitalRead(pinBoton);
unsigned long ahora = millis();
switch (estado) {
case SELECCION:
if (boton == LOW && botonAnterior == HIGH) {
tiempoPresionado = ahora;
}
if (boton == HIGH && botonAnterior == LOW) {
unsigned long duracion = ahora - tiempoPresionado;
if (duracion < 500) {
// Pulsación corta: cambiar selección
indiceTiempo = (indiceTiempo + 1) % 3;
} else {
// Pulsación larga: iniciar indicación inicio
estado = INDICAR_INICIO;
parpadeosInicio = 0;
tiempoUltimoCambio = ahora;
ledsEncendidos = false;
}
}
// Mostrar selección con LEDs siempre encendidos
switch (indiceTiempo) {
case 0:
digitalWrite(pinLed1, HIGH);
digitalWrite(pinLed2, LOW);
break;
case 1:
digitalWrite(pinLed1, LOW);
digitalWrite(pinLed2, HIGH);
break;
case 2:
digitalWrite(pinLed1, HIGH);
digitalWrite(pinLed2, HIGH);
break;
}
break;
case INDICAR_INICIO:
if (ahora - tiempoUltimoCambio >= 100) { // 100 ms parpadeo rápido
tiempoUltimoCambio = ahora;
ledsEncendidos = !ledsEncendidos;
digitalWrite(pinLed1, ledsEncendidos ? HIGH : LOW);
digitalWrite(pinLed2, ledsEncendidos ? HIGH : LOW);
if (!ledsEncendidos) { // contar solo cuando se apagan
parpadeosInicio++;
if (parpadeosInicio >= 6) { // 3 ciclos on/off
estado = CUENTA;
tiempoInicio = ahora;
}
}
}
break;
case CUENTA:
// Parpadeo alternado rápido cada 150 ms
if ((ahora / 150) % 2 == 0) {
digitalWrite(pinLed1, HIGH);
digitalWrite(pinLed2, LOW);
} else {
digitalWrite(pinLed1, LOW);
digitalWrite(pinLed2, HIGH);
}
if (ahora - tiempoInicio >= tiempos[indiceTiempo]) {
estado = FINAL;
servo.write(90);
tiempoInicio = ahora;
digitalWrite(pinLed1, LOW);
digitalWrite(pinLed2, LOW);
}
break;
case FINAL:
if (ahora - tiempoInicio >= 1000) {
servo.write(0);
estado = SELECCION;
}
break;
}
botonAnterior = boton;
delay(10);
}
Una pulsación corta en el botón cambiará
el LED seleccionado (y su tiempo asociado).
Una pulsación larga en el mismo botón
iniciará el ciclo del servo, usando el
tiempo del LED que estaba seleccionado
en ese momento.
El código ahora te permite seleccionar entre tres duraciones de tiempo diferentes usando solo dos LEDs y un único botón.
Cómo funciona:
Selección de Tiempo (Pulsación Corta):
Una pulsación corta en el botón cambia el tiempo seleccionado.
La selección se muestra así:
LED 1 encendido: Representa el primer tiempo.
LED 2 encendido: Representa el segundo tiempo.
LED 1 y LED 2 encendidos: Representa el tercer tiempo.
Este ciclo se repite (LED1, luego LED2, luego ambos, y se reinicia).
Activación del Servo (Pulsación Larga):
Mantener el botón presionado durante más de 1 segundo (pulsación larga) activa el ciclo del servo.
Durante este ciclo:
Los LEDs parpadean alternativamente (LED1 y LED2) para indicar que el proceso está en curso.
El servo se mueve a 90 grados después de que ha transcurrido el tiempo seleccionado (el que estaba activo cuando se hizo la pulsación larga).
Después de 1 segundo, el servo regresa a su posición inicial (0 grados).
Una vez que el ciclo del servo termina, los LEDs vuelven a mostrar la selección de tiempo que estaba activa.