``Hola gente.
Soy nuevo en el tema de Arduino, pero ya me hecho alguna aplicación para controlar aparatos que fabrico, como lásers y otras.
Ahora estaba haciendo un pequeño menú, aunque he visto que ya hay ejemplos de navegación por menús, pero no los acabo de entender, además que con un simple menú de una sola fila con valores me basta.
Ya tengo hecho el código para moverme por el menú, entrar en el valor, modificar, guardar o salir sin modificar, pero el problema ha venido cuando guardo los valores en la eeprom del micro.
En principio la eeprom guarda los valores en formato "byte" y a la hora de mostrarlo por el LCD -> lcd.print(EEPROM.read(valor[indice],DEC);
Lo paso a Decimal para mostrar el valor, encuentro la limitación de hasta 255 valores, pero bueno, que le vamos a hacer, podría usar dos valores para obtener así 65536 valores, aunque tengo que ver como juntar dos valores en byte para luego interpretarlo como decimal.
Os enseño el código y el problema concreto:
// incluimos la librería de pantalla de cristal liquido:
#include <LiquidCrystal.h>
#include <string.h>
#include <EEPROM.h>
// Inicializa la librería con los pines correspondientes a la pantalla por defecto
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
// Definimos las variables y constantes necesarias:
// Creamos las matrices
int textomenu = -1;
boolean edita = false;
int seleccionar = 6; // Botones
int arriba = 7;
int abajo = 8;
int enter = 9;
const int totalopciones = 4;
int dato[totalopciones];
void setup() {
// Setea el numero de columnas y filas de la pantalla:
lcd.begin(16, 2);
pinMode(seleccionar, INPUT);
pinMode(arriba, INPUT);
pinMode(abajo, INPUT);
pinMode(enter, INPUT);
// lcd.print("hello, world!");
}
void loop() {
// Muestra en pantalla los menús
if(textomenu >= 0){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Menu");
lcd.setCursor(0,1);
lcd.print("Opcion ");
lcd.print(textomenu + 1);
lcd.print(" =");
dato[textomenu]= EEPROM.read(textomenu);
lcd.print(dato[textomenu], DEC);
if(edita == true){ // Si está en modo editar, muestra el cursor, sino no.
lcd.cursor();
}else{
lcd.noCursor();
}
delay(100);
}
// ------------------------------------------------ Movimiento por menú simple.
if(digitalRead(seleccionar)==HIGH && textomenu < 0){ // Caso de apretar "select" sin estar dentro del menú, pone "valor" a ++, o sea 0, sin menú está a -1
textomenu++;
delay(50);
}
if(textomenu >= 0 && edita == false){ // Dentro del menú diferentes opciones: ------------------
if(digitalRead(seleccionar)==HIGH){ // Caso de apretar select sale del menú sin guardar.
textomenu = -1;
edita = false;
delay(100);
lcd.clear();
// No guarda en eeprom, pero sí en variable RAM
}else if(digitalRead(arriba)==HIGH){ // Si sube, tira atrás, por tanto valor--
if(textomenu>0){ textomenu--; }
delay(100);
}else if(digitalRead(abajo)==HIGH){ // Si baja, tira alante por menú, por tanto valor++;
if(textomenu < totalopciones - 1){ textomenu++; }
delay(100);
}else if(digitalRead(enter)==HIGH){ // Si da enter, setea el bit de editar
edita = true;
delay(100);
}
}
if(edita == true){ // Si está editando, incrementa o decrementa el dato[] que corresponde.
if(digitalRead(arriba)==HIGH){
dato[textomenu]--;
if(dato[textomenu] < 0 ) dato[textomenu]=0; //Limite a 0 ----------------->>>> FALLA POR ALGUN MOTIVO, nunca se cumple
delay(100);
}else if(digitalRead(abajo)==HIGH){
dato[textomenu]++;
if(dato[textomenu] > 255 ) dato[textomenu]=255; // Limite a 255 ----->>> FALLA POR ALGUN MOTIVO , nunca se cumple
delay(100);
}else if(digitalRead(enter)==HIGH){ // Si toca enter o select sale del modo edición, guardando el valor en memoria volátil.
if( dato[textomenu] != EEPROM.read(textomenu)){
EEPROM.write(textomenu, dato[textomenu]); // Guarda en memoria el valor.
lcd.setCursor(0, 0);
lcd.print("Guardado EEPROM ");
}
edita = false;
delay(500);
lcd.clear();
}else if(digitalRead(seleccionar)==HIGH){ // Si no das a seleccionar sin dar a enter, sale de modo editar y volverá a leer la EEPROM del principio.
edita = false;
delay(100);
lcd.clear();
}
}
}
El problema es cuando tengo seteada el bit "edita", y entonces si subo o bajo, debería subir o bajar valor, pero como el valor es en "byte" pues creo que no lo hace, y además creo que no compara bien el valor "dato[textomenu]" que está como int
.
En la pantalla solo se ve que la opción EDITAR está presente por que sale el cursor, y en principio mostraba el valor "255" que debe ser lo que tenía en EEPROM el micro, pero de ahí no puedo modificar el valor, ni subir ni bajar.
Luego puse el ejemplo para escribir EEPROM todo a valores 0, y ahora me salen con 0 pero sin poder modificarlo.
Lo que no acabo de entender, por que si le doy a escribir la eeprom y le pongo valores entero, me los convierte a byte automáticamente , debe hacerlo automático por que está la opción en la librería EEPROM, no ?
Sabeis a que se debe el problema que tengo, es un error de tipos de variables ?
Gracias por vuestra ayuda.
Saludos
PD: La opción de los botones, para evitar rebote, he puesto un simple delay, para no complicarme mientras aprendo el tema de menús y eeprom, es que si ponía los botones con antirebote luego se hace un código demasiado grande para ir aprendiendo.