// MENU LCD con Arduino
// Importar las librerias LiquidCrystal I2C y Wire
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Iniciar la libreria
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Encoder esta conectado a los puertos 6, 7 y 4
#define outputA 6 //boton para bajar
#define outputB 7 //boton para subir
#define sw 4 // boton para seleccionar
// declaracion e inicializacion del menu principal y los submenus
// MENU principal
String menu1[] = {"Automatico","Manual"};
int sizemenu1 = sizeof(menu1) / sizeof(menu1[0]);
// Submenu 1
// para modo automatico y volver al menu principal
String menu2[] = {"Seguir de Linea","Ultrasonido","Triangulo","Rectangulo","Circulo","Volver"};
int sizemenu2 = sizeof(menu2) / sizeof(menu2[0]);
//Submenu 2
// para encender leds en secuencia
// 1) de izquiera a derecha
// 2) de derecha a izquierda
// 3) volver al menu principal
String menu3[] = {"Izq -> Der","Der -> Izq","Volver"};
int sizemenu3 = sizeof(menu3) / sizeof(menu3[0]);
// VARIABLES GLOBALES
int counter = 0; //contador
int aState; //estado actual
int aLastState; //ultimo estado
String Scount;
String linea1,linea2; //lineas de la pantalla
int seleccion = 0; //opcion seleccionada
int pos = 0; //posicion
int level_menu = 0; //si esta en menu principal o dentro de un submenu
int opcion = 0; //opcion de menu y/o submenu
bool btnpress = false; //si se ha pulsado el boton del Encoder
byte brilloled3 = 0; //nivel del brillo del Led 1
byte flecha[] = {B00000,B00100,B00110,B11111,B00110,B00100,B00000,B00000}; // la flecha
void setup() {
Serial.begin(9600);
//configuracion del Encoder
pinMode (outputA,INPUT);
pinMode (outputB,INPUT);
pinMode (sw,INPUT);
digitalWrite(sw, HIGH);
lcd.begin(0x27, 16, 2); //inicia la pantalla
lcd.backlight(); //ilumina la pantalla
lcd.createChar(0, flecha); // muestra la flecha en posicion 0
//funcion_credits(); // funcion que muestra los creditos
funcion_menu(counter,menu1,sizemenu1); // funcion que muestra el menu principal despues de 5 segundos
}
void loop() {
lcd.setCursor(0, 0);
selectOption();
//menu principal
if(level_menu == 0){
if(funcion_boton(sizemenu1) ){
//mostrar menu principal
funcion_menu(counter,menu1,sizemenu1);
}
if(btnpress){
//led1
if(counter == 0){
counter = 0;
//mostrar submenu 1 (On, Off, Volver)
funcion_menu(counter,menu2,sizemenu2);
//cambiar nivel del menu
level_menu = 1;
}
//led2
if(counter == 1){
counter = 0;
//mostrar submenu 1 (On, Off, Volver)
funcion_menu(counter,menu2,sizemenu2);
//cambiar nivel del menu
level_menu = 2;
}
//led3
if(counter == 2){
counter = 0;
//mostrar submenu 1 (On, Off, Volver)
funcion_menu(counter,menu2,sizemenu2);
//cambiar nivel del menu
level_menu = 3;
}
//todos leds
if(counter == 3){
counter = 0;
//mostrar submenu 1 (On, Off, Volver)
funcion_menu(counter,menu2,sizemenu2);
//cambiar nivel del menu
level_menu = 4;
}
//secuencias
if(counter == 4){
counter = 0;
//mostrar submenu 2 (Izq -> Der, Der -> Izq, Volver)
funcion_menu(counter,menu3,sizemenu3);
//cambiar nivel del menu
level_menu = 5;
}
//Intensidad
if(counter == 5){
counter = brilloled3;
level_menu = 6;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Brillo Led1");
lcd.setCursor(0, 1);
lcd.print(brilloled3);
}
btnpress = false;
}
}
//Submenu led 1
if(level_menu == 1){
if(funcion_boton(sizemenu2)){
funcion_menu(counter,menu2,sizemenu2);
}
if(btnpress){
if(counter == 0){
digitalWrite(led1,HIGH); //encender led 1
}
if(counter == 1){
digitalWrite(led1,LOW); // apagar led 1
}
if(counter == 2){
//volver a mostrar el menu principal
counter = 0;
funcion_menu(counter,menu1,sizemenu1);
level_menu = 0;
}
btnpress = false;
}
}
//Submenu led 2
if(level_menu == 2){
if(funcion_boton(sizemenu2)){
funcion_menu(counter,menu2,sizemenu2);
}
if(btnpress){
if(counter == 0){
digitalWrite(led2,HIGH); //encender led 2
}
if(counter == 1){
digitalWrite(led2,LOW); //apagar led 2
}
if(counter == 2){
// volver a mostrar el menu principal
counter = 1;
funcion_menu(counter,menu1,sizemenu1);
level_menu = 0;
}
btnpress = false;
}
}
//Submenu led 3
if(level_menu == 3){
if(funcion_boton(sizemenu2)){
funcion_menu(counter,menu2,sizemenu2);
}
if(btnpress){
if(counter == 0){
digitalWrite(led3,HIGH); //encender led 3
brilloled3 = 10;
}
if(counter == 1){
digitalWrite(led3,LOW); // apagar led 3
brilloled3 = 0;
}
if(counter == 2){
//volver a mostrar el menu principal
counter = 2;
funcion_menu(counter,menu1,sizemenu1);
level_menu = 0;
}
btnpress = false;
}
}
//Submenu todos leds
if(level_menu == 4){
if(funcion_boton(sizemenu2)){
funcion_menu(counter,menu2,sizemenu2);
}
if(btnpress){
if(counter == 0){
//encender todos leds
digitalWrite(led1,HIGH);
digitalWrite(led2,HIGH);
digitalWrite(led3,HIGH);
brilloled3 = 10;
}
if(counter == 1){
//apagar todos leds
digitalWrite(led1,LOW);
digitalWrite(led2,LOW);
digitalWrite(led3,LOW);
brilloled3 = 0;
}
if(counter == 2){
//volver a mostrar el menu principal
counter = 3;
funcion_menu(counter,menu1,sizemenu1);
level_menu = 0;
}
btnpress = false;
}
}
//Submenu secuencias
if(level_menu == 5){
if(funcion_boton(sizemenu3)){
funcion_menu(counter,menu3,sizemenu3);
}
if(btnpress){
//encender y apagar leds con delay de izquierda a derecha
if(counter == 0){
digitalWrite(led1,HIGH);
delay(500);
digitalWrite(led1,LOW);
digitalWrite(led2,HIGH);
delay(500);
digitalWrite(led2,LOW);
digitalWrite(led3,HIGH);
delay(500);
digitalWrite(led3,LOW);
brilloled3 = 0;
}
//encender y apagar leds con delay de derecha a izquierda
if(counter == 1){
digitalWrite(led3,HIGH);
delay(500);
digitalWrite(led3,LOW);
digitalWrite(led2,HIGH);
delay(500);
digitalWrite(led2,LOW);
digitalWrite(led1,HIGH);
delay(500);
digitalWrite(led1,LOW);
brilloled3 = 0;
}
if(counter == 2){
//volver a mostrar el menu principal
counter = 4;
funcion_menu(counter,menu1,sizemenu1);
level_menu = 0;
}
btnpress = false;
}
}
//Submenu Intensidad
if (level_menu == 6){
if(funcion_boton(11)){
brilloled3 = counter;
//controlar la intensidad del led 1
funcion_intensidad();
}
if(btnpress){
counter = 5;
level_menu = 0;
//volver a mostrar el menu principal
funcion_menu(counter,menu1,sizemenu1);
btnpress = false;
}
}
}
//FUNCION PARA MOSTRAR MENU PRINCIPAL O SUBMENU
void funcion_menu(int pos,String menus[],byte sizemenu){
lcd.clear();
linea1="";
linea2="";
if((pos % 2) == 0){
lcd.setCursor(0, 0);
lcd.write(byte(0));
linea1 = menus[pos];
if(pos+1 != sizemenu){
linea2 = menus[pos+1];
}
}else{
linea1 = menus[pos-1];
lcd.setCursor(0, 1);
lcd.write(byte(0));
linea2 = menus[pos];
}
lcd.setCursor(1, 0);
lcd.print(linea1);
lcd.setCursor(1, 1);
lcd.print(linea2);
}
//FUNCION PARA CONTROLAR EL ENCODER
bool funcion_boton(byte sizemenu){
bool retorno = false;
if (digitalRead(outputB) == LOW) {
counter --;
delay(100);
retorno = true;
}
if (digitalRead(outputA) == LOW) {
counter ++;
delay(100);
retorno = true;
}
if(counter <=0){
counter = 0;
}
if(counter >= sizemenu-1 ){
counter = sizemenu-1;
}
return retorno;
}
//FUNCION PARA VER SI SE HA SELECCIONADO ALGUNA OPCION
void selectOption()
{
if(digitalRead(sw) == LOW){
delay(100);
btnpress = true;
}
}
}