#include <EEPROM.h>
// Definición del tamaño de la memoria EEPROM a utilizar
#define EEPROM_SIZE 1
const int buttonPin = 4;
const int ledPin = 16;
// Variables para el estado del LED y el botón
int ledState = HIGH;
int buttonState;
int lastButtonState = LOW;
// Variables para el debounce del botón
unsigned long lastDebounceTime = 0;
unsigned long debounceDelay = 50;
void setup() {
Serial.begin(115200);
// Inicialización de la memoria EEPROM con el tamaño definido
EEPROM.begin(EEPROM_SIZE);
// Define los pines como entrada y salida
pinMode(buttonPin, INPUT);
pinMode(ledPin, OUTPUT);
// Lectura del estado anterior del LED almacenado en la EEPROM
ledState = EEPROM.read(0);
}
// Bucle principal del programa
void loop() {
// Lee el estado actual del botón (HIGH o LOW) y lo almacena en la variable reading
int reading = digitalRead(buttonPin);
// Verifica si ha habido un cambio en el estado del botón. Si hay un cambio, actualiza lastDebounceTime con el tiempo actual en milisegundos utilizando millis()
if (reading != lastButtonState) {
lastDebounceTime = millis();
}
// Verifica si ha pasado suficiente tiempo desde el último cambio del botón. Si sí, continúa con la siguiente verificación.
if ((millis() - lastDebounceTime) > debounceDelay) {
// Verifica si el estado actual del botón es diferente al estado anterior (buttonState). Si hay un cambio, actualiza buttonState
if (reading != buttonState) {
buttonState = reading;
// Si el botón se ha presionado (buttonState es HIGH), invierte el estado actual del LED (ledState). si el LED está encendido, lo apaga, y viceversa.
if (buttonState == HIGH) {
ledState = !ledState; // Invertir el estado del LED
}
}
}
// Actualización del estado anterior del botón
lastButtonState = reading;
// Verifica si el estado actual del LED en la salida es diferente al estado que se ha calculado.
if (digitalRead(ledPin) != ledState) {
Serial.println("Estado cambiado");
// Actualiza el estado del LED en la salida de acuerdo con el estado calculado.
digitalWrite(ledPin, ledState);
// Escribe el estado actual del LED en la memoria EEPROM para que persista incluso después de reiniciar
EEPROM.write(0, ledState);
EEPROM.commit();
Serial.println("Estado guardado en la memoria");
}
}