- Moderador
- #1
Bien, una vez tengamos el boton y el potenciometro funcionando vamos a crear un programa que los utilice para poder movernos por el menu que necesitemos en nuestro controlador.
El código de ejemplo que expongo es muy muy sencillo, se trata de un simple menú de 2 submenus, luego cada uno debe ir ampliandolo de tal forma que cumpla con sus requisitos.
Mi consejo es que primero anoteis en un papel la opciones que creeis importantes en vuestro controlador.
Por favor no copiar y pegar, ir leyendo linea a linea el código hasta que lo entendais , de esta manera os será más facil crear vuestro menu.
Este es el que yo uso:
* ESQUEMA MENUS
-CONFIGURACION MODULOS ACTIVOS
* - MODULO PH
* - MODULO RELLENO
* - MODULO TEMPERATURA AGUA
* - MODULO TEMPERATURA LEDs
* - MODULO LUCES
* - MODULO OLEAJE
* - MODULO HUMEDAD
* - MODULO PERISTALTICAS
* - MODULO ENCHUFES
* - MODULO ENCHUFES2
* - MODULO WIFI
* - VOLVER
-CONFIGURACION RELOJ
-ACCESOS DIRECTOS
* - MANTENIMIENTO
* - ENCHUFES MANUAL
* - CALIBRACION PH
* - MODO TORMENTA
* - TEST LUCES
* - RESUMEN LUCES
* - LCD NOCTURNO
* - ACTIVAR/DESACTIVAR SONIDO
* - RESETEAR ERRORES
* - CEBAR PERISTALTICAS
* - HORAS ACTIVO
* - OFFSET RELOJ
* - CALIBRACION ULTRASONIDO
* - VOLVER
-SALIR
Como vereis acontinuación en el código utilizamos el subprograma:
- botpot(x,y) , desde aqui llamamos a programa que lee la posicion del potenciometro y mediante la funcion MAP nos dice en que menu según la posicion del potenciometro nos encontramos , X sería el inicio del menu (normalmente 1 e Y sería la ultima opción del menu). Nos devuelve la variable "menupot"
Lo dicho leerlo despacio y tratar de entenderlo.....y luego resolvemos las dudas aquí en el foro.
Saludos
El código de ejemplo que expongo es muy muy sencillo, se trata de un simple menú de 2 submenus, luego cada uno debe ir ampliandolo de tal forma que cumpla con sus requisitos.
Mi consejo es que primero anoteis en un papel la opciones que creeis importantes en vuestro controlador.
Por favor no copiar y pegar, ir leyendo linea a linea el código hasta que lo entendais , de esta manera os será más facil crear vuestro menu.
Este es el que yo uso:
* ESQUEMA MENUS
-CONFIGURACION MODULOS ACTIVOS
* - MODULO PH
* - MODULO RELLENO
* - MODULO TEMPERATURA AGUA
* - MODULO TEMPERATURA LEDs
* - MODULO LUCES
* - MODULO OLEAJE
* - MODULO HUMEDAD
* - MODULO PERISTALTICAS
* - MODULO ENCHUFES
* - MODULO ENCHUFES2
* - MODULO WIFI
* - VOLVER
-CONFIGURACION RELOJ
-ACCESOS DIRECTOS
* - MANTENIMIENTO
* - ENCHUFES MANUAL
* - CALIBRACION PH
* - MODO TORMENTA
* - TEST LUCES
* - RESUMEN LUCES
* - LCD NOCTURNO
* - ACTIVAR/DESACTIVAR SONIDO
* - RESETEAR ERRORES
* - CEBAR PERISTALTICAS
* - HORAS ACTIVO
* - OFFSET RELOJ
* - CALIBRACION ULTRASONIDO
* - VOLVER
-SALIR
Como vereis acontinuación en el código utilizamos el subprograma:
- botpot(x,y) , desde aqui llamamos a programa que lee la posicion del potenciometro y mediante la funcion MAP nos dice en que menu según la posicion del potenciometro nos encontramos , X sería el inicio del menu (normalmente 1 e Y sería la ultima opción del menu). Nos devuelve la variable "menupot"
Código:
//CAP3.3 Manejando menus con boton y potenciometro
//LIBRERIAS
#include <Wire.h>
#include <LiquidCrystal_I2C.h>// Debemos instalar la libreria LiquidCrystal_I2C en la carpeta "libraries" del arduino IDE
LiquidCrystal_I2C lcd(0x27,16,2); // direccion i2c(puede variar segun la placa) del LCD y columnas,lineas
/*PINES CONECTADO EN ARDUINO MEGA
ANALOGICOS:
A14 - Potenciometro
DIGITALES:
D19 - Boton
D20 - SDA I2C / LCD
D21 - SCL I2C / LCD
*/
//VARIABLES
byte boton=19, pot=A14; //declaramos que la variable de los pines donde esta conectado boton y potenciometro
int menupot;// numero de menu
byte vboton,menus, menuactual,cambiomenu;//variables para los menus
void setup()
{
pinMode(boton, INPUT);//Inidicamos que es una entrada
pinMode(pot, INPUT);
lcd.init();//Inicializamos el LCD
lcd.backlight();//Encendemos la luz
lcd.print(" CAP3.3 MENUS ");
delay(2000);//Hacemos una pausa de 2 segundos
lcd.init();//Al inicializar el LCD tambien borramos la pantalla
}
void loop()
{
if (digitalRead(boton)==HIGH)//Si pulsamos el boton entramos al menu
{
menu(); // Activamos el subprograma menu
}
delay(500);
}
void menu()
{
lcd.init();
lcd.print(" Menu principal ");
delay(1000);
iniciomenu://///// INICIO MENU, lo utilizaremos luego con el GOTO para volver a este punto
botpot(1,2);//subprograma, indicamos que tenemos dentro de este menu 2 opciones, desde la 1 a la 2, si fueran 4 submenus seria botpot (1,4) (segun movamos el potenciometro)
cambiomenu=1;//inicializamos variable
switch (menupot) //menupot es la variable que hemos ajustado con el potenciometro
{
case 1: //opcion 1
if (cambiomenu==1) //Si hemos movido el potenciometro....
{
lcd.setCursor(0,1);
lcd.print(" Submenu 1 ");
if (digitalRead(boton)==HIGH)//Si pulsamos el boton entramos al menu
{
lcd.init();
lcd.print("Dentro Menu1 ");
delay(2000);
//Aqui pondriamos lo que quisieramos hacer en este menu
}
goto iniciomenu;
}
break;//Fin del submenu 1
case 2: //opcion 2
if (cambiomenu==1)
{
lcd.setCursor(0,1);
lcd.print(" Submenu 2 ");
if (digitalRead(boton)==HIGH)//Si pulsamos el boton entramos al menu
{
lcd.init();
lcd.print("Dentro Menu2 ");
lcd.setCursor(0,1);
lcd.print("Pulsa para salir");
delay(2000);
if (digitalRead(boton)==HIGH)//Si pulsamos el boton entramos al menu
{
break;//Salimos del swicth
}
//Aqui pondriamos lo que quisieramos hacer en este menu
}
goto iniciomenu;
}
break;
}
lcd.init();
}
void botpot(int menuini, int menufin) //menuini y menufin son variables que hemos pasado cuando llamamos ala funcion botpot
{
menupot=0;int i=0;int valpot=0;int leepot=0;
leepot= analogRead(A14);//leemos posicion potenciometro
while (i<4)
{
leepot= (leepot+ analogRead(A14));
i++;
}
valpot=(leepot/5);//Lo leemos 5 veces para mayor fiabilidad
menupot = map (valpot,0,1023,menuini,menufin); //La funcion MAP lo que hace es situar el valor leido dentro del rango que le pongamos
if (menupot==menuactual) {cambiomenu=0;}//si no movemos el potenciometro el menu será el mismo , no habrá cambio asi no lo "dibujamos" otra vez en el LCD
else {menuactual=menupot;cambiomenu=1;}
}
Lo dicho leerlo despacio y tratar de entenderlo.....y luego resolvemos las dudas aquí en el foro.
Saludos
Última edición: