#include <Arduino.h>
#include <TM1637Display.h>
// Definición de pines
#define ENCODER_PIN_A 5 // Pin A del encoder (genera interrupción)
#define ENCODER_PIN_B 4 // Pin B del encoder (para determinar dirección)
#define TM1637_CLK 9 // Pin CLK del TM1637
#define TM1637_DIO 10 // Pin DIO del TM1637
#define BUTTON_GREEN 40 // Pulsador verde (manejado por sondeo)
#define BUTTON_BLUE 41 // Pulsador azul (manejado por interrupciones)
// Instancia del display TM1637
TM1637Display display(TM1637_CLK, TM1637_DIO);
// Variable global para el contador (volatile porque se modifica en ISR)
volatile int counter = 0;
// Función para actualizar el display con el contador
void updateDisplay() {
display.showNumberDec(counter, false, 4, 0); // Muestra el número en 4 dígitos, sin leading zeros
}
// ISR para el encoder (solo en pin A, rising edge)
void IRAM_ATTR encoderISR() {
// Leer el estado del pin B para determinar dirección
if (digitalRead(ENCODER_PIN_B) == HIGH) {
// Sentido horario: incrementar
counter++;
} else {
// Sentido antihorario: decrementar, pero no por debajo de 0
if (counter > 0) {
counter--;
}
}
// Actualizar el display
updateDisplay();
}
// ISR para el pulsador azul (reset)
void IRAM_ATTR resetISR() {
counter = 0;
updateDisplay();
}
void setup() {
// Inicializar Serial
Serial.begin(115200);
// Configurar pines del encoder como entrada
pinMode(ENCODER_PIN_A, INPUT_PULLUP);
pinMode(ENCODER_PIN_B, INPUT_PULLUP);
// Configurar pulsadores como entrada
pinMode(BUTTON_GREEN, INPUT_PULLUP);
pinMode(BUTTON_BLUE, INPUT_PULLUP);
// Inicializar display TM1637
display.setBrightness(0x0f); // Brillo máximo
updateDisplay(); // Mostrar 0 inicial
// Configurar interrupciones usando attachInterrupt (compatible con Arduino IDE)
attachInterrupt(digitalPinToInterrupt(ENCODER_PIN_A), encoderISR, RISING); // Solo en pin A, rising edge
attachInterrupt(digitalPinToInterrupt(BUTTON_BLUE), resetISR, FALLING); // Pulsador azul, falling edge
}
void loop() {
// Manejo por sondeo del pulsador verde
if (digitalRead(BUTTON_GREEN) == LOW) { // Asumiendo que LOW es presionado (con pullup)
// Imprimir en consola "n" asteriscos equivalentes al contador
for (int i = 0; i < counter; i++) {
Serial.print("*");
}
Serial.println(); // Nueva línea después de los asteriscos
// Pequeño delay para evitar rebotes y múltiples impresiones
delay(200);
}
// El loop principal no necesita hacer nada más, ya que las interrupciones manejan el encoder y el reset
}