Created
August 28, 2024 15:05
-
-
Save maagmirror/1497e92a1db368e30b3765df167966c3 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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