#include "myDisplay.h"
#include <Wire.h>
#include "driver/gpio.h"
#include "soc/gpio_reg.h"
#include "soc/io_mux_reg.h"
// Dirección del EEPROM
#define DIRECCION_EEPROM 0x50
// Pines del encoder
const int pinCLK = 25;
const int pinDT = 26;
const int pinSW= 27;
// Banderas
volatile bool cambioEncoder = false;
volatile bool botonPresionado = false;
volatile unsigned long ultimoTiempoInterrupcion = 0;
int contador = 0;
myDisplay display;
// ------------------- INTERRUPCIONES -------------------
void IRAM_ATTR interrupcionEncoder() {
unsigned long tiempoActual = micros();
if (tiempoActual - ultimoTiempoInterrupcion < 100000) return; // 0.1 segundos
ultimoTiempoInterrupcion = tiempoActual;
cambioEncoder = true;
}
void IRAM_ATTR interrupcionBoton() {
botonPresionado = true;
}
// ------------------- EEPROM: ESCRIBIR -------------------
void escribirEEPROM(uint16_t direccion, uint16_t valor) {
Wire.beginTransmission(DIRECCION_EEPROM);
Wire.write(highByte(direccion));
Wire.write(lowByte(direccion));
Wire.write(highByte(valor));
Wire.write(lowByte(valor));
Wire.endTransmission();
delay(5);
}
// ------------------- EEPROM: LEER -------------------
uint16_t leerEEPROM(uint16_t direccion) {
Wire.beginTransmission(DIRECCION_EEPROM);
Wire.write(highByte(direccion));
Wire.write(lowByte(direccion));
Wire.endTransmission();
Wire.requestFrom(DIRECCION_EEPROM, 2);
uint16_t valor = 0;
valor = (Wire.read() << 8) | Wire.read();
return valor;
}
// ------------------- GUARDAR HORAS -------------------
void guardarHoras() {
Serial.println("Guardando horas en EEPROM...");
escribirEEPROM(0, 6666); // 6 am
escribirEEPROM(2, 7777); // 7 am
escribirEEPROM(4, 1010); // 10 am
escribirEEPROM(6, 1111); // 11 am
escribirEEPROM(8, 101); // 1 pm
escribirEEPROM(10, 202); // 2 pm
escribirEEPROM(12, 303); // 3 pm
escribirEEPROM(14, 404); // 4 pm
escribirEEPROM(16, 505); // 5 pm
escribirEEPROM(18, 606); // 6 pm
Serial.println("Horas guardadas.\n");
}
// ------------------- SETUP -------------------
void setup() {
Wire.begin();
Serial.begin(115200);
display.begin();
// Configurar como entrada con pull-up usando registros de ESP-IDF
REG_WRITE(GPIO_ENABLE_W1TC_REG, (1 << pinCLK) | (1 << pinDT) | (1 << pinSW));
gpio_config_t io_conf = {};
io_conf.pin_bit_mask = (1ULL << pinCLK) | (1ULL << pinDT) | (1ULL << pinSW);
io_conf.mode = GPIO_MODE_INPUT;
io_conf.pull_up_en = GPIO_PULLUP_ENABLE;
io_conf.pull_down_en = GPIO_PULLDOWN_DISABLE;
io_conf.intr_type = GPIO_INTR_DISABLE;
gpio_config(&io_conf);
attachInterrupt(digitalPinToInterrupt(pinCLK), interrupcionEncoder, CHANGE);
attachInterrupt(digitalPinToInterrupt(pinSW), interrupcionBoton, FALLING);
Serial.println("Sistema listo");
// Guardar horas al iniciar
guardarHoras();
}
// ------------------- LOOP -------------------
void loop() {
// Procesar encoder
if (cambioEncoder) {
cambioEncoder = false;
// Leer los pines directamente usando GPIO_READ
int clkState = (REG_READ(GPIO_IN_REG) & (1 << pinCLK)) ? 1 : 0; // Leer el estado de pinCLK
int dtState = (REG_READ(GPIO_IN_REG) & (1 << pinDT)) ? 1 : 0; // Leer el estado de pinDT
if (clkState != dtState) contador++;
else contador--;
// Limitar rango
if (contador < 0) contador = 0;
if (contador > 9) contador = 9; // Asegúrate de que el rango es adecuado para tu EEPROM
Serial.print("Leyendo dirección ");
Serial.print(contador * 2);
Serial.print(": ");
uint16_t dato = leerEEPROM(contador * 2);
Serial.println(dato);
display.print(dato);
}
// Procesar botón
if (botonPresionado) {
botonPresionado = false;
contador = 0;
display.print(0);
Serial.println("Contador reiniciado a 0");
}
display.refresh();
// delay(1); // Se puede ajustar o eliminar si no es necesario
}