#include <TinyWireM.h>
#include <Tiny4kOLED.h>
#include <Adafruit_SoftServo.h>
const int buttonPin = 1; // Pin del pulsador (PB1)
const int servoPin = 0; // Pin del servo (PB0)
Adafruit_SoftServo myServo; // Crea un objeto para el servo
//Tiny4kOLED oled; // Pantalla OLED
bool buttonPressed = false; // Estado del pulsador
int selectedTimeIndex = 0; // Índice del tiempo seleccionado
const int timeOptions[] = {1000, 2000, 3000}; // Tiempos de espera en milisegundos
const int numOptions = sizeof(timeOptions) / sizeof(timeOptions[0]); // Número de opciones
void setup() {
pinMode(buttonPin, INPUT_PULLUP); // Configuración con resistencia interna de pull-up
myServo.attach(servoPin); // Conecta el servo al pin especificado
myServo.write(0); // Inicia el servo en 0 grados
oled.begin();
oled.clear();
oled.on();
oled.setFont(FONT8X16);
// Mostrar el tiempo inicial en la pantalla
showTimeSelection();
}
void loop() {
bool currentButtonState = digitalRead(buttonPin) == LOW; // LOW indica que el botón está presionado
if (currentButtonState && !buttonPressed) { // Detectar transición de botón presionado
buttonPressed = true; // Actualizar el estado del botón
// Cambiar al siguiente tiempo de espera
selectedTimeIndex = (selectedTimeIndex + 1) % numOptions;
showTimeSelection(); // Actualizar la pantalla con el nuevo tiempo seleccionado
if (!currentButtonState && buttonPressed) { // Detectar cuando el botón se suelta
buttonPressed = false;
}
// Mover el servo después del tiempo de espera seleccionado
static unsigned long lastMoveTime = 0;
static bool servoPosition = false;
if (millis() - lastMoveTime >= timeOptions[selectedTimeIndex]) {
if (servoPosition) {
myServo.write(0); // Mover el servo a 0 grados
oled.clear();
oled.setCursor(0, 0);
oled.print(F("Servo a 0 grados"));
} else {
myServo.write(180); // Mover el servo a 180 grados
oled.clear();
oled.setCursor(0, 0);
oled.print(F("Servo a 180 grados"));
}
servoPosition = !servoPosition; // Alternar la variable de posición
lastMoveTime = millis(); // Registrar el tiempo del último movimiento
}
delay(250); // Anti-rebote
}
void showTimeSelection() {
oled.clear();
oled.setCursor(0, 0);
oled.print(F("Tiempo: "));
oled.print(timeOptions[selectedTimeIndex]);
oled.print(F(" ms"));
}