#include <TinyWireM.h>
#include <U8g2lib.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
U8G2_SSD1306_128X64_NONAME_F_SW_I2C oled(U8G2_R0, /* clock=*/ 2, /* data=*/ 3, /* reset=*/ U8X8_PIN_NONE); // Pantalla OLED usando software I2C
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.clearBuffer();
oled.setFont(u8g2_font_ncenB08_tr);
// 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.clearBuffer();
oled.setCursor(0, 10);
oled.print("Servo a 0 grados");
} else {
myServo.write(180); // Mover el servo a 180 grados
oled.clearBuffer();
oled.setCursor(0, 10);
oled.print("Servo a 180 grados");
}
oled.sendBuffer(); // Enviar los datos a la pantalla
servoPosition = !servoPosition; // Alternar la variable de posición
lastMoveTime = millis(); // Registrar el tiempo del último movimiento
}
delay(50); // Anti-rebote
}
void showTimeSelection() {
oled.clearBuffer();
oled.setCursor(0, 10);
oled.print("Tiempo: ");
oled.print(timeOptions[selectedTimeIndex]);
oled.print(" ms");
oled.sendBuffer(); // Enviar los datos a la pantalla
}