#include <LiquidCrystal_I2C.h>//libreria LCD_I2C
#define clk 32//Pines
#define dt 35
#define sw 34
LiquidCrystal_I2C lcd(0x27,4,20);//LCD direccion,4 filas, 20 columnas
void setup() {
Serial.begin(115200);//Monitor serial 115200 baudios
pinMode(clk, INPUT_PULLUP);//pines con entrada con resistencia interna pullup
pinMode(dt, INPUT_PULLUP);
pinMode(sw, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(clk),cont_up,FALLING);//interrupcion
attachInterrupt(digitalPinToInterrupt(dt),cont_down,FALLING);
lcd.init();//iniciamos LCD
lcd.backlight();//Encendemos la retroiluminacion
lcd.setCursor(5,0);//posicionamos el cursor
lcd.print("Bienvenido");
delay(1000);
lcd.clear();//limpiamos la pantalla
}
int cont=1; //variable para el encoder
byte y=1; //variable para el cursor selector
bool boton; //variable para boton del encoder
void cont_up(){//funcion de interrupcion enconder contador
static unsigned long tiempo_anterior=0; //variable de tiempo
unsigned long tiempo=millis();//tiempo transcurrido desde el inicio del programa
if(tiempo-tiempo_anterior>50){//retardo sin delay
if(digitalRead(dt)==HIGH && digitalRead(clk)==LOW){//si el encoder gira a la derecha
cont++;//aumentamos la variable
if(cont>3){//limitamos el contador para que no suba de 3
cont=3;
}
y=cont;//y tendra el valor de cont
}
tiempo_anterior=tiempo;//ajustamos el intervalo del tiempo
}
}
void cont_down(){//interrupcion para decontador
static unsigned long tiempo_anterior=0;
unsigned long tiempo=millis();
if(tiempo-tiempo_anterior>50){
if(digitalRead(dt)==LOW && digitalRead(clk)==HIGH){//encoder gira a la izquierda
cont--;
if(cont<1){//limitamos el contador para que no baje de 1
cont=1;
}
y=cont;
}
tiempo_anterior=tiempo;
}
}
void loop() {
delay(100);
menu1();//llamamos el menu principal
}
void menu1(){
y=1;// empezamos la flecha en 1
lcd.setCursor(5,0);//cursor en columna 5 fila 0
lcd.print("Menu1");//titulo
do{//hacemos esto hasta presionar el boton
selector();//funcion de la flecha
lcd.setCursor(1,1);
lcd.print("Opcion 1");
lcd.setCursor(1,2);
lcd.print("Opcion 2");
lcd.setCursor(1,3);
lcd.print("Opcion 3");
boton=digitalRead(sw);//leemos el boton
//imprimimos boton y 'Y'
Serial.print("boton= ");
Serial.print(boton);
Serial.print(" y= ");
Serial.println(y);
}while(boton!=LOW);//salimos del bucle cuando se presiona el boton
lcd.clear();//limpiamos la pantalla
lcd.setCursor(5,0);
delay(250);
if(y==1){//si la posicion y es uno significa que esta seleccionando la opcion 1
Serial.println("opcion1");
opcion1();
}
else if(y==2){
Serial.println("opcion2");
opcion2();
}
else if(y==3){
Serial.println("opcion3");
opcion3();
}
}
void opcion1(){
y=1;
do{
selector(); //funcion de la flecha
lcd.setCursor(5,0);
lcd.print("Opcion1");
lcd.setCursor(1,1);
lcd.print("Parametro 1");
lcd.setCursor(1,2);
lcd.print("Parametro 2");
lcd.setCursor(1,3);
lcd.print("Volver");
boton=digitalRead(sw);
}while(boton!=LOW);
lcd.clear();
lcd.setCursor(5,0);
delay(250);
if(y==1){
}
else if(y==2){
}
else if(y==3){
menu1();
}
}
void opcion2(){
y=1;
do{
selector();
lcd.setCursor(5,0);
lcd.print("Opcion2");
lcd.setCursor(1,1);
lcd.print("Parametro 1");
lcd.setCursor(1,2);
lcd.print("Parametro 2");
lcd.setCursor(1,3);
lcd.print("Volver");
boton=digitalRead(sw);
}while(boton!=LOW);
lcd.clear();
lcd.setCursor(5,0);
delay(250);
if(y==1){
}
else if(y==2){
}
else if(y==3){
menu1();
}
}
void opcion3(){
y=1;
do{
selector();
lcd.setCursor(5,0);
lcd.print("Opcion3");
lcd.setCursor(1,1);
lcd.print("Parametro 1");
lcd.setCursor(1,2);
lcd.print("Parametro 2");
lcd.setCursor(1,3);
lcd.print("Volver");
boton=digitalRead(sw);
}while(boton!=LOW);
lcd.clear();
lcd.setCursor(5,0);
delay(250);
if(y==1){
}
else if(y==2){
}
else if(y==3){
menu1();
}
}
void selector(){
lcd.setCursor(0,1);
lcd.print(" ");//ponemos en blanco donde estaba la flecha
lcd.setCursor(0,2);
lcd.print(" ");//ponemos en blanco donde estaba la flecha
lcd.setCursor(0,3);
lcd.print(" ");//ponemos en blanco donde estaba la flecha
lcd.setCursor(0,y);
lcd.print(">");//dibujamos la flecha
delay(10);
}