#include <Adafruit_SH110X.h>
#include <Wire.h>
#include <ESP32Encoder.h>
//Definicion de una expresion constante a nivel de compilacion
//led lo tiene que reemplazar por el valor 25(una macro)
//no ocupa ram porque directamente queda precompilado y quemado en la placa
#define LED 25
#define A 18
#define B 5
#define C 19
//proceso
void updateDisplay(int n, bool sentido, int led);
//VARIABLES
Adafruit_SH1106G display = Adafruit_SH1106G(128, 64, &Wire, -1);//la resolucion
ESP32Encoder enc;//constructor por defecto en c++(no hace falta el New)
int anterior =0, ledState= LOW;
bool sentido = false;
int n = 0;
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
//quiero indicar que el pin es una salida
pinMode(LED, OUTPUT);
//para saber que cuando se presione y devuelva 0(cierra circuito) detecta que se apretó
pinMode(C, INPUT_PULLUP);
display.begin(0x3c, true);
display.setTextSize(1);
//color de la letra
display.setTextColor(SH110X_WHITE);
//Estoy definiendo la interrupción para analizazar los cambios de estado
//de ese pin
enc.attachSingleEdge(A,B);
//inicializar para obtener la cantidad de pasos
enc.setCount(0);//pasos = 0
}
void loop() {
int n =enc.getCount();//si el contador es mas grande ->Me movi en sentido horario
//con esa info puedo mostrar la info en el display
if(n> anterior)
sentido = true;
else if (n< anterior)
sentido = false;
//SI está presionado el swtich del encoder, si esta prendido lo apago y viceversa, para eso tengo que saber su estado
//para que cuando detecte que apreto el boton lo cambie y me acuerde para la prox
if(digitalRead(C) == LOW){
ledState = digitalRead(LED);
digitalWrite(LED, !ledState);
}
updateDisplay(n, sentido, ledState);
delay(100);
}
void updateDisplay(int n, bool sentido, int led){
display.clearDisplay();
display.setCursor(0,0);
//Le paso la cant pasos, despues con un operador ternario decido el sentido y si el led esta on u off
display.printf("Pasos %d\nSentido: %s\nLED: %s",n,(sentido? "HORARIO":"ANTIHORARIO"),(led== 0?"ON":"OFF"));
//actualizar display
display.display();
}