/* ---- Pines I/O ---- */
// Rotary encoder Encoder (I)
#define ENCODER_CLK 14
#define ENCODER_DT 12
#define ENCODER_SW 13
#define DEBUG 1
// Constantes
const char DEBOUNCE_TIME = 50;
// Variables aplicacion
volatile unsigned char counter = 0; // Brillo led integrado
int valClk = HIGH;
int dtValue = HIGH;
long int clkLastChanged = 0; // cambio clk
long int resetLastChanged = 0; // cambio reset
// Reset del brillo
void resetEncoder() {
if (digitalRead(ENCODER_SW) == LOW && millis() - resetLastChanged > DEBOUNCE_TIME) {
resetLastChanged = millis();
counter = 0;
}
}
// Actualizancion del brillo
void updateEncoder() {
if ((millis() - clkLastChanged) < DEBOUNCE_TIME) // debounce time is 50ms
return;
dtValue = digitalRead(ENCODER_DT);
if (dtValue == LOW) {
// Serial.println("DOWN");
counter--;
}
else {
// Serial.println("UP");
counter++;
}
clkLastChanged = millis();
}
/* ---- Inicialización ---- */
void setup() {
// Inicializacion serial
Serial.begin(115200);
// Inicializacion I/O
pinMode(LED_BUILTIN,OUTPUT);
pinMode(ENCODER_CLK, INPUT);
pinMode(ENCODER_DT, INPUT);
pinMode(ENCODER_SW, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(ENCODER_CLK), updateEncoder, CHANGE);
attachInterrupt(digitalPinToInterrupt(ENCODER_SW), resetEncoder, CHANGE);
// Impresion en el monitor serial
Serial.print("Counter: ");
Serial.println(counter);
}
/* ---- Loop infinito ---- */
void loop() {
// Chequeo del reset presionado por un tiempo mayor de MAX_PUSH_TIME
analogWrite(LED_BUILTIN,counter);
Serial.print("Counter: ");
Serial.println(counter);
delay(100);
}