// Este funciona bien
#define pin_Encoder_A 6
#define pin_Encoder_B 7
int tercios_totales_de_vuelta = 0;
void setup() {
Serial.begin(9600);
pinMode(pin_Encoder_A, INPUT);
pinMode(pin_Encoder_B, INPUT);
}
void loop() {
Estado_Modificador();
}
void Estado_Modificador() {
int encoder_A_actual; // uint8_t es equivalente a byte y es lo que está definido como argumento en la función digitalWrite().
int encoder_A_anterior;
int encoder_B_actual;
int tercios_totales_de_vuelta_a_modificar;
encoder_A_anterior = digitalRead(pin_Encoder_A);
tercios_totales_de_vuelta_a_modificar = tercios_totales_de_vuelta;
while (1) {
encoder_A_actual = digitalRead(pin_Encoder_A);
// encoder_B_actual = digitalRead(pin_Encoder_B);
/*
Serial.print("encoder_A_anterior: ");
Serial.println(encoder_A_anterior);
Serial.print("encoder_A_actual: ");
Serial.println(encoder_A_actual);
Serial.print("Encoder_B: ");
Serial.println(digitalRead(pin_Encoder_B));
*/
if (encoder_A_actual != encoder_A_anterior) { // Si se rotó la perilla. Creo que en cada click el A pasa a cero y, luego a 1, por lo que solo hay que contabilizar uno de los dos estados.
if (encoder_A_actual == 1) { // Si se rotó la perilla. Creo que en cada click el A pasa a cero y, luego a 1, por lo que solo hay que contabilizar uno de los dos estados.
if (digitalRead(pin_Encoder_B) != encoder_A_actual) { // Se rotó en sentido horaio.
tercios_totales_de_vuelta_a_modificar++;
} else {
tercios_totales_de_vuelta_a_modificar--;
}
/*
Serial.print("encoder_A_anterior: ");
Serial.println(encoder_A_anterior);
Serial.print("encoder_A_actual: ");
Serial.println(encoder_A_actual);
Serial.print("Encoder_B: ");
Serial.println(digitalRead(pin_Encoder_B));
*/
Serial.print("tercios_a_modificar:");
Serial.println(tercios_totales_de_vuelta_a_modificar);
muestra_vueltas(tercios_totales_de_vuelta_a_modificar, 1);
}
encoder_A_anterior = encoder_A_actual;
}
delay(1); // Es el debouncer más simple que existe.
}
tercios_totales_de_vuelta = tercios_totales_de_vuelta_a_modificar;
muestra_vueltas(tercios_totales_de_vuelta, 0);
}
void muestra_vueltas(int tercios_de_vuelta, int fila) {
// fila indica la fila del display que debe ser cambiada con el dato de las vueltas.
int vueltas;
byte fraccion_de_vuelta;
char char_texto_linea_display[16];
vueltas = abs(tercios_de_vuelta / 3);
fraccion_de_vuelta = abs(tercios_de_vuelta % 3); // Toma valores 0, 1 o 2.
if (fila == 0) {
sprintf(char_texto_linea_display, " N: %s%03d %d/3", tercios_de_vuelta < 0 ? "-" : "", vueltas, fraccion_de_vuelta); // Muchos dicen que usar sprintf es lento, pero acá no me importa.
}
else {
sprintf(char_texto_linea_display, " Change: %s%03d %d/3", tercios_de_vuelta < 0 ? "-" : "", vueltas, fraccion_de_vuelta); // Muchos dicen que usar sprintf es lento, pero acá no me importa.
}
//Serial.print("Vueltas: ");
//Serial.println(tercios_de_vuelta);
Serial.println(char_texto_linea_display);
/*
Serial.print(" ");
Serial.print(fraccion_de_vuelta);
Serial.println("/3");
*/
}