Skip to content

Instantly share code, notes, and snippets.

@maagmirror
Created August 28, 2024 15:05
Show Gist options
  • Save maagmirror/1497e92a1db368e30b3765df167966c3 to your computer and use it in GitHub Desktop.
Save maagmirror/1497e92a1db368e30b3765df167966c3 to your computer and use it in GitHub Desktop.
#include <Servo.h>
#include <ezButton.h>
#include <EEPROM.h>
// Constantes
const int BUTTON_PIN_1 = 7;
const int SERVO_PIN = 8;
const int LED_PIN = 13;
ezButton button1(BUTTON_PIN_1); // Configuración del botón
Servo servo;
int angle = 0;
bool servoActive = false;
unsigned long lastToggleTime = 0;
const long toggleInterval = 500;
bool ignoreButtonPress = true; // Ignorar pulsaciones iniciales
unsigned long ignoreButtonTime = 1000; // Tiempo en milisegundos para ignorar pulsaciones
void setup() {
Serial.begin(9600);
servo.attach(SERVO_PIN);
pinMode(LED_PIN, OUTPUT);
// Leer el último ángulo guardado en la EEPROM
angle = EEPROM.read(0);
if (angle != 0 && angle != 110) {
angle = 0; // Si se lee un valor no válido, se establece en 0
}
servoActive = (angle == 110);
servo.write(angle);
updateLED();
// Ignorar pulsaciones de botones durante el primer segundo
delay(ignoreButtonTime);
ignoreButtonPress = false;
}
void loop() {
// Si aún estamos en el periodo de ignorar pulsaciones, salimos de la función
if (ignoreButtonPress) return;
button1.loop();
if (button1.isPressed()) {
unsigned long pressedTime = millis();
// Esperar un pequeño intervalo para asegurarse de que el botón realmente está presionado
while (button1.isPressed() && (millis() - pressedTime < 200)) {
// Esperar para asegurarnos de que la pulsación es real
}
// Solo considerar la pulsación si el botón permaneció presionado más de 200ms
if (millis() - pressedTime >= 200) {
if (millis() - lastToggleTime > toggleInterval) {
toggleServo();
lastToggleTime = millis();
}
}
}
}
void toggleServo() {
int newAngle = servoActive ? 0 : 110;
if (newAngle != angle) { // Solo escribir en la EEPROM si el ángulo ha cambiado
angle = newAngle;
EEPROM.write(0, angle);
}
servo.write(angle);
servoActive = !servoActive;
updateLED();
}
void updateLED() {
digitalWrite(LED_PIN, servoActive && abs(servo.read() - 110) <= 2 ? HIGH : LOW);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment