#include <LiquidCrystal_I2C.h>
#include <Wire.h>
LiquidCrystal_I2C lcd(0x27, 16,2);
//encoder
#define DT 6
#define CLK 7
#define boton 4
#define led1 10
#define led2 9
#define led3 8
//enooder posicion
volatile int posicion=0;//es el valor inicial y almacenara el valor que incremete con cada interrupcion(volatile=variable global)
int posicion_ant=0;//Almacenaremos el numero anerior de posicion
void setup() {
lcd.
lcd.begin(16, 2);
pinMode(DT,INPUT);
pinMode(CLK,INPUT);
pinMode(boton,INPUT_PULLUP);
pinMode (led1,OUTPUT);
digitalWrite(led1,LOW);
pinMode (led2,OUTPUT);
digitalWrite(led2,LOW);
pinMode (led3,OUTPUT);
digitalWrite(led3,LOW);
//inicializamos el pin Trig en estado bajo
attachInterrupt(digitalPinToInterrupt(DT),enconder,LOW);// hace la interupcion en el pin asignado
}
void loop() {
if(posicion!=posicion_ant)//evaluara verdadero cuadno la variable posicion tenga un valor distinto a posicion anterios
{
posicion_ant=posicion;//almacenamos el valor posicion a la variable posicion anterior
menu1(); //mandamos a llamar a la funcion menu1
}
else if(digitalRead(boton)==LOW)
{
menu1(); //llamamos a la funcion menu 1
menu1(); //llamamos a la funcion menu 1
delay(200);
}else if(digitalRead(boton)==LOW)
{
menu1();
menu2();
delay(200); //llamamos a la funcion menu
}
}
void enconder()
{
static unsigned long interrupcion_anterior=0; //para mantener el valor de esta variable usamos static para que el compilador no borre el valor
unsigned long tiempoInterrupcion=millis();//aqui calculamos el tiempo que trasncurso entre interrupcion(unsigned lonf variable sin signo)
if(tiempoInterrupcion-interrupcion_anterior>5)//si la diferencia entre pulsos es maor a 5ms realizara lo que esta dentro
{
if(digitalRead(CLK)==HIGH)
{
posicion--;
}
else{ //si clk tiene un valor bajo aumentamos un valor a posicion(sentido horarioo)
posicion++;
}
; posicion=min(3,max(0,posicion));//colocaremos el tope del encoder con la formula planteada
}
}
void menu1()
{
switch(posicion)
{
case 1:
lcd.clear();
lcd.setCursor(0,0);
lcd.print(posicion);
lcd.setCursor(2,0);
lcd.print("Led1");
lcd.setCursor(2,1);
lcd.print("Encender");
lcd.setCursor(13,0);
lcd.print("<--");
break;
case 2:
lcd.clear();
lcd.setCursor(0,0);
lcd.print(posicion);
lcd.setCursor(2,0);
lcd.print("Led2");
lcd.setCursor(2,1);
lcd.print("Encender");
lcd.setCursor(13,0);
lcd.print("<--");
break;
case 3:
lcd.clear();
lcd.setCursor(0,0);
lcd.print(posicion);
lcd.setCursor(2,0);
lcd.print("Led3");
lcd.setCursor(2,1);
lcd.print("Encender");
lcd.setCursor(13,0);
lcd.print("<--");
break;
}
}
void menu2()
{
switch(posicion)
{
case 1:
if(digitalRead(boton)==LOW)
{
lcd.clear();
lcd.setCursor(0,1);
lcd.print("Led1 Encendido");
digitalWrite(led1,HIGH);
delay(100);
digitalWrite(led1,LOW);
}
break;
case 2:
if(digitalRead(boton)==LOW)
{
lcd.clear();
lcd.setCursor(0,1);
lcd.print("Led2 Encendido");
digitalWrite(led2,HIGH);
delay(100);
digitalWrite(led2,LOW);
}
break;
case 3:
if(digitalRead(boton)==LOW)
{
lcd.clear();
lcd.setCursor(0,1);
lcd.print("Led3 Encendido");
digitalWrite(led3,HIGH);
delay(100);
digitalWrite(led3,LOW);
}
break;
}
}