#include <LiquidCrystal_I2C.h>
#include <LiquidMenu.h>
#include <ezButton.h> // the library to use for SW pin
LiquidCrystal_I2C lcd(0x27, 20, 4);
//ENCODER
#define CLK_PIN 25 // ESP32 pin GPIO25 connected to the rotary encoder's CLK pin
#define DT_PIN 26 // ESP32 pin GPIO26 connected to the rotary encoder's DT pin
#define SW_PIN 27 // ESP32 pin GPIO27 connected to the rotary encoder's SW pin
#define DIRECTION_CW 0 // clockwise direction
#define DIRECTION_CCW 1 // counter-clockwise direction
int counter = 0;
int direction = DIRECTION_CW;
int CLK_state;
int prev_CLK_state;
ezButton button(SW_PIN); // create ezButton object that attach to pin 7;
// Para hacer el parpadeo sin DELAY
bool estadoLed = true;
unsigned long tiempoAnteriorEncendido = millis();
unsigned long tiempoAnteriorApagado;
//LEDS
#define ledPlaca 2
#define led1 0
#define led2 4
#define led3 16
void setup() {
// Pins de salida
pinMode(ledPlaca,OUTPUT);
pinMode(led1,OUTPUT);
pinMode(led2,OUTPUT);
pinMode(led3,OUTPUT);
// configure encoder pins as inputs
pinMode(CLK_PIN, INPUT);
pinMode(DT_PIN, INPUT);
button.setDebounceTime(50); // set debounce time to 50 milliseconds
// read the initial state of the rotary encoder's CLK pin
prev_CLK_state = digitalRead(CLK_PIN);
//pinMode(sw,INPUT_PULLUP);
// Inicializar el LCD
lcd.init();
// lcd.begin();
//Encender la luz de fondo.
lcd.backlight();
Serial.begin(115200);
Serial.println("Arrancando el ESP32...");
}
void loop() {
// Parpadeo cada 500 milisegundos
if(((millis() - tiempoAnteriorEncendido) >= 500) & estadoLed == true){
estadoLed = false;
digitalWrite(led1, estadoLed);
tiempoAnteriorApagado = millis();
}
if(((millis() - tiempoAnteriorApagado) >= 500) & estadoLed == false){
estadoLed = true;
digitalWrite(led1, estadoLed);
tiempoAnteriorEncendido = millis();
}
/* Control Encoder Rotativo */
// Control del Boton Encoder
button.loop(); // MUST call the loop() function first
// Lectura de la entrada del Pin_CLK
CLK_state = digitalRead(CLK_PIN);
// Si el estado ha cambiado
// Miramos en que setido ha sido
if (CLK_state != prev_CLK_state && CLK_state == HIGH) {
// if the DT state is HIGH
// the encoder is rotating in counter-clockwise direction => decrease the counter
if (digitalRead(DT_PIN) == HIGH) {
// Hemos girado en boton en sentido AntiHorario => counter--
counter--;
direction = DIRECTION_CCW;
digitalWrite(led2, HIGH);
digitalWrite(led3, LOW);
} else {
// Hemos girado en boton en sentido Horario => counter++
counter++;
direction = DIRECTION_CW;
digitalWrite(led3, HIGH);
digitalWrite(led2, LOW);
}
Serial.print("Rotacion Encoder:: sentido: ");
if (direction == DIRECTION_CW)
Serial.print("Horario");
else
Serial.print("AntiHorario");
Serial.print(" AV_Contador: ");
Serial.println(counter);
}
// save last CLK state
prev_CLK_state = CLK_state;
if (button.isPressed()) {
Serial.println("Se ha pulsado el BOTON_Encoder");
}
}
/*
void loop(){
// Parpadeo cada 500 milisegundos
if(((millis() - tiempoAnteriorEncendido) >= 500) & estadoLed == true){
estadoLed = false;
digitalWrite(led1, estadoLed);
tiempoAnteriorApagado = millis();
}
if(((millis() - tiempoAnteriorApagado) >= 500) & estadoLed == false){
estadoLed = true;
digitalWrite(led1, estadoLed);
tiempoAnteriorEncendido = millis();
}
// Control del Boton Encoder
button.loop(); // MUST call the loop() function first
// Lectura de la entrada del Pin_CLK
CLK_state = digitalRead(CLK_PIN);
// Si el estado ha cambiado
// Miramos en que setido ha sido
if (CLK_state != prev_CLK_state && CLK_state == HIGH) {
counter--;
digitalWrite(led2, HIGH);
digitalWrite(led3, LOW);
direction = DIRECTION_CCW;
} else {
// En sentido Horario
digitalWrite(led3, HIGH);
digitalWrite(led2, LOW);
counter++;
direction = DIRECTION_CW;
}
Serial.print("Rotacion Encoder:: sentido: ");
if (direction == DIRECTION_CW)
Serial.print("Horario");
else
Serial.print("AntiHorario");
Serial.print(" AV_Contador: ");
Serial.println(counter);
// save last CLK state
prev_CLK_state = CLK_state;
if (button.isPressed()) {
Serial.println("Se ha pulsado el BOTON_Encoder");
}
}
*/
/*
// Estado del Conmutador Rotativo
aState = digitalRead(outputA);
if (aState != aLastState){
if (digitalRead(outputB) != aState) {
digitalWrite(led2, HIGH);
digitalWrite(led3, LOW);
contadorDerecha++ ;
lcd.clear();
setCursor(uint8_t, uint8_t);
lcd.print("Cont Derecha: ");
lcd.print(contadorDerecha, DEC);
} else {
digitalWrite(led3, HIGH);
digitalWrite(led2, LOW);
contadorIzquierda++;
lcd.clear();
lcd.print("Cont Izquierda: ");
lcd.print(2,0,contadorIzquierda, DEC);
}
aLastState = aState;*/