#include <Wire.h>
// Dirección del EEPROM 24LC256 (A0,A1,A2 a GND)
#define EEPROM_ADDR 0x50
// Pines del encoder KY-040 para ESP32
const int pinCLK = 18;
const int pinDT = 19;
const int pinSW = 17;
// Flags minimalistas
volatile bool encoderCambio = false;
volatile bool botonPresionado = false;
volatile unsigned long lastInterruptTime = 0;
int contador = 0;
// ------------------- INTERRUPCIONES -------------------
void IRAM_ATTR onInterrupEncoder() {
unsigned long interruptTime = micros();
if (interruptTime - lastInterruptTime < 100000) return; // Anti-rebote
lastInterruptTime = interruptTime;
encoderCambio = true;
}
void IRAM_ATTR onButtonPress() {
botonPresionado = true;
}
// ------------------- EEPROM: ESCRIBIR -------------------
void eepromWriteWord(uint16_t addr, uint16_t value) {
Wire.beginTransmission(EEPROM_ADDR);
Wire.write(highByte(addr));
Wire.write(lowByte(addr));
Wire.write(highByte(value));
Wire.write(lowByte(value));
Wire.endTransmission();
delay(5); // Tiempo típico de escritura de EEPROM
}
// ------------------- EEPROM: LEER -------------------
uint16_t eepromReadWord(uint16_t addr) {
Wire.beginTransmission(EEPROM_ADDR);
Wire.write(highByte(addr));
Wire.write(lowByte(addr));
Wire.endTransmission();
Wire.requestFrom(EEPROM_ADDR, 2);
uint16_t value = 0;
value = (Wire.read() << 8) | Wire.read();
return value;
}
// ------------------- GUARDAR HORAS -------------------
void guardarHoras() {
Serial.println("Grabando datos de horas en EEPROM…");
eepromWriteWord(0, 6666); // 6 am
eepromWriteWord(2, 7777); // 7 am
eepromWriteWord(4, 1010); // 10 am
eepromWriteWord(6, 1111); // 11 am
eepromWriteWord(8, 101); // 1 pm (se guarda 0101)
eepromWriteWord(10, 606); // 6 pm
Serial.println("Datos guardados.\n");
}
// ------------------- SETUP -------------------
void setup() {
Wire.begin();
Serial.begin(115200);
// Encoder
pinMode(pinCLK, INPUT_PULLUP);
pinMode(pinDT, INPUT_PULLUP);
pinMode(pinSW, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(pinCLK), onInterrupEncoder, CHANGE);
attachInterrupt(digitalPinToInterrupt(pinSW), onButtonPress, FALLING);
Serial.println("EEPROM + Encoder listo.");
// Guardamos las horas al iniciar
guardarHoras();
}
// ------------------- LOOP -------------------
void loop() {
// Procesar encoder
if (encoderCambio) {
encoderCambio = false;
if (digitalRead(pinCLK) != digitalRead(pinDT)) contador++;
else contador--;
// Asegurar rango seguro
if (contador < 0) contador = 0;
if (contador > 6) contador = 6;
Serial.print("Leyendo dir ");
Serial.print(contador * 2);
Serial.print(": ");
uint16_t dato = eepromReadWord(contador * 2);
Serial.println(dato);
}
// Procesar botón → reset contador
if (botonPresionado) {
botonPresionado = false;
contador = 0;
Serial.println("Contador reiniciado a 0");
}
delay(1);
}