#include <EEPROM.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
//Parametros Encoder
const int salida_A = 2; //CLK
const int salida_B = 4; //DT
const int swPin = 3; //SW
#define buzzer 10
int contador = 0;
int A_estado_actual;
int A_ultimo_estado;
int velocidad_scroll = 300;
//::::::::::MENU::::::::::::::::::::::
String menu1[] = {"Temperatura","Presion","Distancia","Velocidad","Altura","Otros"}; //Inicializamos nuestro Array con los elementos del menu
int sizemenu1 = sizeof(menu1) / sizeof(menu1[0]); //Obtenemos el número de elementos ocupados en la matriz. en este caso 6
String menu2_1[] = {"",""};
String menu2[] = {"Ajustar","Salir"};
int sizemenu2 = sizeof(menu2) / sizeof(menu2[0]);
String menu3_1[] = {""};
String menu3[] = {"Izq --> Der","Der <-- Izq","Atras"};
int sizemenu3 = sizeof(menu3) / sizeof(menu3[0]);
String menu4_1[] = {""};
String menu4[] = {"Led1","Led2","Led3","Atras"};
int sizemenu4 = sizeof(menu4) / sizeof(menu4[0]);
String linea1,linea2,linea3,linea4; //Lineas del LCD
int seleccion = 0;
int pos = 0;
int level_menu = 0; //Iniciamos la variable en el menu principal 0 --> 6
int opcion = 0;
bool btnpress = false; //Esta variable de retorno en false aegurando que el boton del Encoder aun no se ha oprimido
byte flecha[] = {B10000,B11000,B11100,B11110,B11100,B11000,B10000,B00000}; //Creamos un array de 8 posiciones para la flecha del menu
void prueba(); //Prototipo para funcion de prueba.
void bienvenida(); //Prototipo para pantalla de bienvenida.
void menuSeleccionado();
const int led = 9; //El led estara en el pin 26
byte a[8] = { B11111,B11111,B11111,B11111,B11111,B11111,B11111,B11111}; //Rectangulo completo.
byte b[8] = { B00000,B00000,B00000,B00000,B00000,B00000,B11111,B11111}; //Complemento parte baja.
byte c[8] = { B11111,B11111,B00000,B00000,B00000,B00000,B00000,B00000}; //Complemento parte alta.
const int incrementar = 8;
const int decrementar = 7;
const int ejecutar = 6;
const int escape = 5;
int botonEjecutar = 1;
int temperatura=0;
int presion=1;
int distancia=2;
int velocidad = 3;
int altura = 4;
void setup() {
pinMode(buzzer,OUTPUT); //El buzzer sera una salida.
pinMode(led,OUTPUT); //El led sera una salida.
lcd.init(); //Inicializamos la pantalla.
lcd.backlight(); //Encendemos el led del fondo.
lcd.createChar(0, a); //Creamos un caracter de rectangulo completo.
lcd.createChar(1, b); //Creamos caracter de parte baja.
lcd.createChar(2, c); //Creamos caracter de parte alta.
pinMode(incrementar,INPUT_PULLUP);
pinMode(decrementar,INPUT_PULLUP);
pinMode(ejecutar,INPUT_PULLUP);
pinMode(escape,INPUT_PULLUP);
Serial.begin(9600); //Habilitamos la salida serial por USB
pinMode (salida_A,INPUT);
pinMode (salida_B,INPUT);
pinMode (swPin,INPUT_PULLUP);
lcd.init();
lcd.backlight();
lcd.createChar(3, flecha); //Caracter personalizado
//fn_creditos();
prueba(); //Llamamos la funcion prueba.
bienvenida(); //Llamamos la funcion de bienvenida.
fn_menu(contador,menu1,sizemenu1); //Iniciamos presentando el menu principal
A_ultimo_estado = digitalRead(salida_A); //Leemos el estado de la salida del Encoder usando el pin CLK
}
void loop() {
selectOption(); //Funcion para detectar cuando se oprime el encoder. btnpress == true
//Menu 1 {"Led1","Led2","Led3","Todos","Secuencias","Intensidad"}
if(level_menu == 0){ //Esta variable corresponde al nivel principal del menu. level_menu = 0.
if(fn_encoder(sizemenu1) ){ //Esta funcion muestra en el LCD el menu en el que estamos
fn_menu(contador,menu1,sizemenu1); //Esta funcion muestra la posicion dentro de ese menu segun el valor de la variable contador
}
if(btnpress){ //Verificamos si el boton del encoder fue oprimido. btnpress == true
//Led 1
if(contador == 0){
contador = 0; //Seleccionamos la posicion donde quedara la flecha de seleccion. On, Off, Atras
fn_menu(contador,menu2,sizemenu2); //Vamos a la funcion que nos muestra las opciones para el Led 1
level_menu = 1; //Esta variable corresponde al nivel secundario del menu. level_menu = 1.
}
//Led 2
if(contador == 1){
contador = 0;
fn_menu(contador,menu2,sizemenu2);
level_menu = 2;
}
//Led 3
if(contador == 2){
contador = 0;
fn_menu(contador,menu2,sizemenu2);
level_menu = 3;
}
//Todos
if(contador == 3){
contador = 0;
fn_menu(contador,menu2,sizemenu2);
level_menu = 4;
}
//Secuencias
if(contador == 4){
contador = 0;
fn_menu(contador,menu2,sizemenu3);
level_menu = 5;
}
//Intensidad
if(contador == 5){
contador = 0;
fn_menu(contador,menu4,sizemenu4);
level_menu = 6;
}
btnpress = false; // Nos aseguramos que esta variable de retorno de la funcion selectOption() vuelva a su estado inicial
}
}
//SubMenu Led 1 {"On","Off","Atras"}
if(level_menu == 1){
if(fn_encoder(sizemenu2)){ //Nos desplazamos con el encoder sleccionando las diferentes opciones
fn_menu(contador,menu2,sizemenu2);
}
if(btnpress){ //Verificamos si el boton del encoder fue oprimido. btnpress == true
if(contador == 0){
//Si se presiona ajustar
contador = temperatura;
lcd.clear();
do{
fn_contador_brillo();
temperatura = contador;
lcd.setCursor(0, 0);
lcd.print("Temperatura");
lcd.setCursor(0, 1);
lcd.print(temperatura);
}while(digitalRead(escape) == 1); //Instrucciones despues del do se repetirán mientras esta condición sea cierta
delay(500);
contador = 3; //Encendemos Led 1
}
if(contador == 1){
contador = 0;
fn_menu(contador,menu1,sizemenu1);
level_menu = 0; //Apagamos Led 1
}
btnpress = false;
}
}
//SubMenu Led 2 {"On","Off","Atras"}
if(level_menu == 2){
if(fn_encoder(sizemenu2)){
fn_menu(contador,menu2,sizemenu2);
}
if(btnpress){
if(contador == 0){
contador = presion;
lcd.clear();
do{
fn_contador_brillo();
presion = contador;
lcd.setCursor(0, 0);
lcd.print("Presion");
lcd.setCursor(0, 1);
lcd.print(presion);
}while(digitalRead(escape) == HIGH); //Instrucciones despues del do se repetirán mientras esta condición sea cierta
delay(500);
contador = 3;
}
if(contador == 1){
contador = 1;
fn_menu(contador,menu1,sizemenu1);
level_menu = 0;
}
btnpress = false;
}
}
//SubMenu Led 3 {"On","Off","Atras"}
if(level_menu == 3){
if(fn_encoder(sizemenu2)){
fn_menu(contador,menu2,sizemenu2);
}
if(btnpress){
if(contador == 0){
contador = distancia;
lcd.clear();
do{
fn_contador_brillo();
distancia = contador;
lcd.setCursor(0, 0);
lcd.print("Distancia");
lcd.setCursor(0, 1);
lcd.print(distancia);
}while(digitalRead(swPin) == HIGH); //Instrucciones despues del do se repetirán mientras esta condición sea cierta
delay(500);
contador = 3;
}
if(contador == 1){
contador = 1;
fn_menu(contador,menu1,sizemenu1);
level_menu = 0;
}
btnpress = false;
}
}
//SubMenu Todos {"On","Off","Atras"};
if(level_menu == 4){
if(fn_encoder(sizemenu2)){
fn_menu(contador,menu2,sizemenu2);
}
if(btnpress){
if(contador == 0){
contador = velocidad;
lcd.clear();
do{
fn_contador_brillo();
velocidad = contador;
lcd.setCursor(0, 0);
lcd.print("Velocidad");
lcd.setCursor(0, 1);
lcd.print(velocidad);
}while(digitalRead(swPin) == HIGH); //Instrucciones despues del do se repetirán mientras esta condición sea cierta
delay(500);
contador = 3;
}
if(contador == 1){
contador = 1;
fn_menu(contador,menu1,sizemenu1);
level_menu = 0;
}
/*if(contador == 0){
/*digitalWrite(led1,HIGH); //Encendemos todos los Leds
digitalWrite(led2,HIGH);
digitalWrite(led3,HIGH);
}
if(contador == 1){
digitalWrite(led1,LOW); //Apagamos todos los Leds
digitalWrite(led2,LOW);
digitalWrite(led3,LOW);
}
if(contador == 2){
contador = 3;
fn_menu(contador,menu1,sizemenu1);
level_menu = 0;
}
*/
btnpress = false;
}
}
//SubMenu Secuencias {"Izq --> Der","Der <-- Izq","Atras"}
if(level_menu == 5){
if(fn_encoder(sizemenu2)){
fn_menu(contador,menu2,sizemenu2);
}
if(btnpress){
if(contador == 0){
contador = altura;
lcd.clear();
do{
fn_contador_brillo();
altura = contador;
lcd.setCursor(0, 0);
lcd.print("Altura");
lcd.setCursor(0, 1);
lcd.print(altura);
}while(digitalRead(swPin) == HIGH); //Instrucciones despues del do se repetirán mientras esta condición sea cierta
delay(500);
contador = 3;
}
if(contador == 1){
contador = 1;
fn_menu(contador,menu1,sizemenu1);
level_menu = 0;
}
btnpress = false;
}
}
//SubMenu Intensidad {"Led1","Led2","Led3","Atras"}
if(level_menu == 6){
if(fn_encoder(sizemenu4)){
fn_menu(contador,menu4,sizemenu4);
}
if(btnpress){
if(contador == 0){
//contador = brillo_led1;
lcd.clear();
do{
fn_contador_brillo();
//brillo_led1 = contador;
lcd.setCursor(0, 0);
lcd.print("Brillo Led 1");
//analogWrite(led1,map(brillo_led1,0,9,0,255));
lcd.setCursor(0, 1);
//lcd.print(brillo_led1);
}while(digitalRead(swPin) == HIGH); //Instrucciones despues del do se repetirán mientras esta condición sea cierta
delay(500);
contador = 3;
}
if(contador == 1){
lcd.clear();
do{
fn_contador_brillo();
lcd.setCursor(0, 0);
lcd.print("Brillo Led 2");
lcd.setCursor(0, 1);
}while(digitalRead(swPin) == HIGH); //Instrucciones despues del do se repetirán mientras esta condición sea cierta
delay(500);
contador = 3;
}
if(contador == 2){
lcd.clear();
do{
fn_contador_brillo();
lcd.setCursor(0, 0);
lcd.print("Brillo Led 3");
lcd.setCursor(0, 1);
}while(digitalRead(swPin) == HIGH); //Instrucciones despues del do se repetirán mientras esta condición sea cierta
delay(500);
contador = 3;
}
if(contador == 3){
contador = 5; //Posicion del menu donde se genero el llamado 0 --> 5
fn_menu(contador,menu1,sizemenu1); //Retorna al Menu Principal a la posicion del menu donde se genero el llamado
level_menu = 0;
}
btnpress = false;
}
}
}
void selectOption(){
if(digitalRead(swPin) == LOW){
delay(500);
btnpress = true;
}
}
void fn_contador_brillo(){
A_estado_actual = digitalRead(salida_A);
if (A_estado_actual != A_ultimo_estado){
if (digitalRead(salida_B) != A_estado_actual){ //DT != CLK ``````````
contador ++;
tone(2, 262,100);
delay(250);
}
else {
contador --;
tone(2, 262,100);
delay(250);
}
}
if(contador>25){
contador = 25;
}
if(contador<0){
contador = 0;
}
}
void fn_creditos(){
lcd.setCursor(0, 0);
lcd.print("Robotica, Impresion, 3D y algo mas...");
delay(2000);
for (int positionCounter = 0; positionCounter < 21; positionCounter++) {
lcd.scrollDisplayLeft(); //Desplaza el texto del LCD hacia la Izquierda
delay(velocidad_scroll);
}
delay(2000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Encoder-Arduino");
lcd.setCursor(0, 1);
lcd.print("Menu - SubMenu");
delay(2000);
}
void fn_menu(int pos,String menus[],byte sizemenu){
lcd.clear();
linea1="";
linea2="";
linea3="";
linea4="";
if((pos % 4) == 0){
lcd.setCursor(0, 0);
lcd.write(byte(3));
linea1 = menus[pos];
linea2 = menus[pos+1];
linea3 = menus[pos+2];
if(pos+1 != sizemenu){
linea4 = menus[pos+3];
}
Serial.print("posicion: ");
Serial.println(pos);
}
else if(pos == 1){
linea1 = menus[pos-1];
lcd.setCursor(0, 1);
lcd.write(byte(3));
linea2 = menus[pos];
linea3 = menus[pos+1];
linea4 = menus[pos+2];
}
else if(pos == 2){
linea1 = menus[pos-2];
linea2 = menus[pos-1];
lcd.setCursor(0, 2);
lcd.write(byte(3));
linea3 = menus[pos];
linea4 = menus[pos+1];
}
else if(pos == 3){
linea1 = menus[pos-3];
linea2 = menus[pos-2];
linea3 = menus[pos-1];
lcd.setCursor(0, 3);
lcd.write(byte(3));
linea4 = menus[pos];
}
else{
linea1 = menus[pos-1];
linea2 = menus[pos];
lcd.setCursor(0, 1);
lcd.write(byte(3));
linea3 = menus[pos+1];
linea4 = menus[pos+2];
}
lcd.setCursor(1, 0);
lcd.print(linea1);
lcd.setCursor(1, 1);
lcd.print(linea2);
lcd.setCursor(1, 2);
lcd.print(linea3);
lcd.setCursor(1, 3);
lcd.print(linea4);
Serial.print("posicion: ");
Serial.println(pos);
}
bool fn_encoder(byte sizemenu){
bool retorno = false;
A_estado_actual = digitalRead(salida_A);
if (A_estado_actual != A_ultimo_estado){
if (digitalRead(salida_B) != A_estado_actual){ //DT != CLK
contador ++;
tone(buzzer,2000,50);
delay(250);
}
else {
contador --;
tone(buzzer,2000,50);
delay(250);
}
//Serial.print("Contador: ");
//Serial.println(contador);
if(contador <=0){
contador = 0;
}
if(contador >= sizemenu-1 ){
contador = sizemenu-1;
}
//Serial.print("Menu: ");
//Serial.println(contador);
retorno = true;
}
return retorno;
}
//----------------------------------Función prueba---------------------------------------
void prueba(){
for(int i = 0; i<3; i++){ //El bucle se ejecutara 3 veces.
digitalWrite(buzzer,HIGH); //Encendemos el buzzer.
delay(200); //Detenemos 200 ms.
digitalWrite(buzzer,LOW); //Apagamos el buzzer.
delay(200); //Detenemos 200 ms.
}
for(int i = 0; i<3; i++){ //El bucle se ejecutara 3 veces.
digitalWrite(led,HIGH); //Encendemos el led.
delay(200); //Detenemos 200 ms.
digitalWrite(led,LOW); //Apagamos el led.
delay(200); //Detenemos 200 ms.
}
}
//-------------------------------Acaba Función prueba-------------------------------------
//----------------------------------Función bienvenida---------------------------------------
void bienvenida(){
lcd.setCursor(0, 0); //Nos situamos en otras coordenadas.
lcd.write(byte(0)); //Imprimir el caracter creado 0.
lcd.setCursor(2, 0); //Nos situamos en otras coordenadas.
lcd.write(byte(0)); //Imprimir el caracter creado 0.
lcd.setCursor(0, 1); //Nos situamos en otras coordenadas.
lcd.write(byte(0)); //Imprimir el caracter creado 0.
lcd.setCursor(2, 1); //Nos situamos en otras coordenadas.
lcd.write(byte(0)); //Imprimir el caracter creado 0.
lcd.setCursor(2, 3); //Nos situamos en otras coordenadas.
lcd.write(byte(0)); //Imprimir el caracter creado 0.
lcd.setCursor(1, 1); //Nos situamos en otras coordenadas.
lcd.write(byte(1)); //Imprimir el caracter creado 1.
lcd.setCursor(1, 2); //Nos situamos en otras coordenadas.
lcd.write(byte(2)); //Imprimir el caracter creado 1.
lcd.setCursor(2, 2); //Nos situamos en otras coordenadas.
lcd.write(byte(0)); //Imprimir el caracter creado 0.
lcd.setCursor(6, 0); //Nos situamos en otras coordenadas.
lcd.print("Bienvenidos"); //Imprimir mensaje.
lcd.setCursor(7, 1); //Nos situamos en otras coordenadas.
lcd.print("Sistemas"); //Imprimir mensaje.
lcd.setCursor(7, 2); //Nos situamos en otras coordenadas.
lcd.print("Embebidos"); //Imprimir mensaje.
delay(3000); //Detenemos 1s.
lcd.clear(); //Limpiamos pantalla.
botonEjecutar = digitalRead(ejecutar);
while(botonEjecutar == 1){
lcd.print("Ensayo - Sistema XYZ"); //Imprimir mensaje.
lcd.setCursor(0,1); //Nos situamos en otras coordenadas.
lcd.print("Sensores Actuadores"); //Imprimir mensaje.
lcd.setCursor(0,2); //Nos situamos en otras coordenadas.
lcd.print("Planta Experimental"); //Imprimir mensaje.
lcd.setCursor(0,3); //Nos situamos en otras coordenadas.
lcd.print("(Esc)(Exe)(Dec)(Inc)"); //Imprimir mensaje.
//delay(1000); //Detenemos 1s.
//lcd.clear(); //Limpiamos pantalla.
botonEjecutar = digitalRead(ejecutar);
}
}
//-------------------------------Acaba Función bienvenida-------------------------------------