Eeprom Switch case , Display LCD , error al guardar 1 valor en memoria

hola saludos
El codigo esta hecho para irlo mejorando , para ir aprendiendo pero se me tranco el juego el codigo es como se podra ver que es un menu que tiene cuatro valores para ser ajustado
esta relacionado con voltaje AC , en mi pais tenemos 2 tipos de voltaje 1 ) 120v y otro 220v
pero es muy inestable
tienes 4 valores valorMIN , valorMax para el 120 , valorMin , valorMax para el 220
he puesto 5 botones , 2 para la naveg izq , der , que funcionan , me quedan 3 que seria uno para select y 2 para subir y baja los valores a partir del valor min y max aqui es donde se me tranca el juego he intentado de hacerlo funcionar el boton select seria para entrar y salir o activar y desactivar con lo botones de navg cae valores min o max y con los 2 botones up , down aumentar o disminuir el valor,

1 problema seria el ajuste de cada valor de la navegacion min , max subi , bajr y
bton select activar o desactivar el menu

quiero ir por parte despues con la ayuda de ustedes , agregar otras cosas como guardar los valores setado en la memora eeprom

sugerencia , ayudas , ideas


#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 20, 4);

int upButton = 6;
int downButton = 7;
int selectButton = 8;
int NavgLeftBtn = 9;
int NavgRightBtn = 10;

unsigned long time ;
unsigned long t = 0;
int dt = 200;

int adjV1MIN;
int adjV1MAX;
int adjV2MIN;
int adjV2MAX;

int menu = 1;


void setup() {

  adjV1MIN = 90;  // VOLTAJE FASE1 MIN
  adjV1MAX = 140; // VOLTAJE FASE1 MAX

  adjV2MIN = 190; // VFASE2 min 
  adjV2MAX = 240; // VFASE2 max

  lcd.begin();
  lcd.backlight();
  pinMode(upButton, INPUT_PULLUP);
  pinMode(downButton, INPUT_PULLUP);
  pinMode(selectButton, INPUT_PULLUP);
  pinMode(NavgLeftBtn, INPUT_PULLUP);
  pinMode(NavgRightBtn, INPUT_PULLUP);

  updateMenu();
}

void loop() {

  time = millis();
  if (time - t > dt) {
    t = time;

    NavgPressbtn ();
    
    if (!digitalRead(downButton)) {

    //  adjV1MIN = adjV1MIN + 5;
      //  updateMenu();

      while (!digitalRead(downButton));
    }

    if (!digitalRead(upButton)) {

    //  adjV1MIN = adjV1MIN - 5;

      // updateMenu();

      while (!digitalRead(upButton));
    }
    if (!digitalRead(selectButton)) {

      //  updateMenu();

      while (!digitalRead(selectButton));
    }

  }
  
}

void updateMenu() {
  switch (menu) {
    case 0:
      menu = 1;
      break;

    case 1:
      lcd.clear();
      lcd.setCursor(1, 1);
      lcd.print("ADJ TENSION [120]");
      lcd.setCursor(0, 2);
      lcd.print("> Set Vmin");
      lcd.setCursor(14, 2);
      lcd.print (adjV1MIN);

      break;

    case 2:
      lcd.clear();
      lcd.setCursor(1, 1);
      lcd.print("ADJ TENSION [120]");
      lcd.setCursor(0, 2);
      lcd.print("> Set Vmax");
      lcd.setCursor(14, 2);
      lcd.print (adjV1MAX);
      break;

    case 3:
      lcd.clear();
      lcd.setCursor(1, 1);
      lcd.print("ADJ TENSION [220]");
      lcd.setCursor(0, 2);
      lcd.print("> Set Vmin");
      lcd.setCursor(14, 2);
      lcd.print (adjV2MIN);

      break;

    case 4:
      lcd.clear();
      lcd.setCursor(1, 1);
      lcd.print("ADJ TENSION [220]");
      lcd.setCursor(0, 2);
      lcd.print("> Set Vmax");
      lcd.setCursor(14, 2);
      lcd.print (adjV2MAX);

      break;

    case 5:
      menu = 4;
      break;
  }
}

void NavgPressbtn()
{
  if (!digitalRead (NavgLeftBtn) == HIGH)
  {
    menu--;
    updateMenu();

    while (!digitalRead(NavgLeftBtn));
  }

  if (!digitalRead (NavgRightBtn) == HIGH) {
    menu++;
    updateMenu();

    while (!digitalRead(NavgRightBtn));
  }
}







saludos,

ya pude resolver parte del problema que tenia al principo modificando, simplificando y agregando estructura de ontrol y otras variables y alguna cosas solo me quedaria poner limite en los valores min y max y que pueda guardar lo seteado en la memoria eeprom algun , sugerencia ayuda para seguir avanzando

saludos

comparto el codigo


#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 20, 4);

int upButton = 6;
int downButton = 7;
int selectButton = 8;
//int NavgLeftBtn = 9;
//int NavgRightBtn = 10;

int nPulso;
unsigned long time ;
unsigned long t = 0;
int dt = 200;

int adjV1MIN;
int adjV1MAX;
int adjV2MIN;
int adjV2MAX;


//Configuracion Pines y puerto serie
void setup ()
{
  adjV1MIN = 90;  // VOLTAJE FASE1 MIN
  adjV1MAX = 150; // VOLTAJE FASE1 MAX

  adjV2MIN = 190; // VFASE2
  adjV2MAX = 250; // VFASE2



  lcd.begin();
  lcd.backlight();


  pinMode(upButton, INPUT_PULLUP);
  pinMode(downButton, INPUT_PULLUP);
  pinMode(selectButton, INPUT_PULLUP);
  //  pinMode(NavgLeftBtn, INPUT_PULLUP);
  //  pinMode(NavgRightBtn, INPUT_PULLUP);
  Serial.begin (9600);

//  updateMenu();
}


void loop ()
{

  time = millis();
  if (time - t > dt) {
    t = time;
    
    if (!digitalRead(selectButton)) {
    //  updateMenu();
      nPulso ++;

      Serial.print (nPulso);

      while (!digitalRead(selectButton));
    }

    if (nPulso == 0)


      if (!digitalRead(upButton)) {
        adjV1MIN = adjV1MIN + 5;
        //  Serial.print (nPulso);

        while (!digitalRead(upButton));
      }

      else if (!digitalRead(downButton))
      {
        adjV1MIN = adjV1MIN - 5;
        while (!digitalRead(downButton));
      }

    if (nPulso == 1)


      if (!digitalRead(upButton)) {
        adjV1MAX = adjV1MAX + 5;
        //  Serial.print (nPulso);

        while (!digitalRead(upButton));
      }

      else if (!digitalRead(downButton))
      {
        adjV1MAX = adjV1MAX - 5;
        while (!digitalRead(downButton));
      }

    if (nPulso == 2)

      if (!digitalRead(upButton)) {
        adjV2MIN = adjV2MIN + 5;
        //  Serial.print (nPulso);

        while (!digitalRead(upButton));
      }

      else if (!digitalRead(downButton))
      {
        adjV2MIN = adjV2MIN - 5;
        while (!digitalRead(downButton));
      }

    if (nPulso == 3)

      if (!digitalRead(upButton)) {
        adjV2MAX = adjV2MAX + 5;
        //  Serial.print (nPulso);

        while (!digitalRead(upButton));
      }

      else if (!digitalRead(downButton))
      {
        adjV2MAX = adjV2MAX - 5;
        while (!digitalRead(downButton));
      }

    if (nPulso == 4) // vuelve a 0.
      nPulso = 0;
    updateMenu();
  
  }

}

void updateMenu() {
  switch (nPulso) // definido 4 cases.
  {
    case 0:
      lcd.clear();
      lcd.setCursor(1, 1);
      lcd.print("ADJ TENSION [120]");
      lcd.setCursor(0, 2);
      lcd.print("> Set Vmin");
      lcd.setCursor(14, 2);
      lcd.print (adjV1MIN);
      break;

    case 1:
      lcd.clear();
      lcd.setCursor(1, 1);
      lcd.print("ADJ TENSION [120]");
      lcd.setCursor(0, 2);
      lcd.print("> Set Vmax");
      lcd.setCursor(14, 2);
      lcd.print (adjV1MAX);
      break;

    case 2:
      lcd.clear();
      lcd.setCursor(1, 1);
      lcd.print("ADJ TENSION [220]");
      lcd.setCursor(0, 2);
      lcd.print("> Set Vmin");
      lcd.setCursor(14, 2);
      lcd.print (adjV2MIN);
      break;

    case 3:
      lcd.clear();
      lcd.setCursor(1, 1);
      lcd.print("ADJ TENSION [220]");
      lcd.setCursor(0, 2);
      lcd.print("> Set Vmax");
      lcd.setCursor(14, 2);
      lcd.print (adjV2MAX);
      break;
    case 4:
      break;
  }
}

SALUDOS ,

YA pude resolver el ingreso de los valores minimos y maximo para poder setear , lo que quedaria es resolver GRABAR LOS DATOS en la memoria eeprom ,
si alguien me puede dar una idea , si se podra mejorar este codigo , con respecto a los botones y los rebotes , lo botones andan bien o quizas este equivocado en alguna parte del programa algo q nod eba estar , asi como esta hace lo quiero solo falta q grabe en la eeprom

sugerencia , comentario de los expertos
gracias saludos


#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 20, 4);

int upButton = 6;
int downButton = 7;
int selectButton = 8;
//int NavgLeftBtn = 9;
//int NavgRightBtn = 10;

int nPulso;
unsigned long time ;
unsigned long t = 0;
int dt = 100;

int adjV1MIN;
int adjV1MAX;
int adjV2MIN;
int adjV2MAX;


//Configuracion Pines y puerto serie
void setup ()
{
  adjV1MIN = 90;  // VOLTAJE FASE1 MIN
  adjV1MAX = 150; // VOLTAJE FASE1 MAX

  adjV2MIN = 190; // VFASE2
  adjV2MAX = 250; // VFASE2



  lcd.begin();
  lcd.backlight();

  // pinMode (led, OUTPUT);
  pinMode(upButton, INPUT_PULLUP);
  pinMode(downButton, INPUT_PULLUP);
  pinMode(selectButton, INPUT_PULLUP);
  //  pinMode(NavgLeftBtn, INPUT_PULLUP);
  //  pinMode(NavgRightBtn, INPUT_PULLUP);
  Serial.begin (9600);

  updateMenu();
}


void loop ()
{

  time = millis();
  if (time - t > dt) {
    t = time;

    if (!digitalRead(selectButton)) {
      //   updateMenu();
      nPulso ++;

      Serial.print (nPulso);

      while (!digitalRead(selectButton));
    }

    if (nPulso == 0)

      if (!digitalRead(upButton)) {

        if ( adjV1MIN <= 105) {

          adjV1MIN = adjV1MIN + 5;
          lcd.setCursor(12, 2);
          lcd.print((char)126);
        }
        while (!digitalRead(upButton));
      }

      else if (!digitalRead(downButton))
      {

        if ( adjV1MIN >= 95) {

          adjV1MIN = adjV1MIN - 5;
          lcd.setCursor(12, 2);
          lcd.print((char)127);
        }

        while (!digitalRead(downButton));
      }


    if (nPulso == 1) // VALOR MAX


      if (!digitalRead(upButton)) {

        if ( adjV1MAX >= 135) {

          adjV1MAX = adjV1MAX - 5;
          lcd.setCursor(12, 2);
          lcd.print((char)127);
        }
        while (!digitalRead(upButton));
      }

    if (!digitalRead(downButton))
    {

      if ( adjV1MAX <= 145) {

        adjV1MAX = adjV1MAX + 5;

        lcd.setCursor(12, 2);
        lcd.print((char)126);
      }
      while (!digitalRead(downButton));
    }

    if (nPulso == 2)

      if (!digitalRead(upButton)) {
        if ( adjV2MIN <= 205) {

          adjV2MIN = adjV2MIN + 5;
          lcd.setCursor(12, 2);
          lcd.print((char)126);
        }
        //  Serial.print (nPulso);

        while (!digitalRead(upButton));
      }

      else if (!digitalRead(downButton))
      {
        if ( adjV2MIN >= 195) {
          adjV2MIN = adjV2MIN - 5;
          lcd.setCursor(12, 2);
          lcd.print((char)127);
        }


        while (!digitalRead(downButton));
      }

    if (nPulso == 3)

      if (!digitalRead(upButton)) {
        if ( adjV2MAX >= 235) {

          adjV2MAX = adjV2MAX - 5;
          lcd.setCursor(12, 2);
          lcd.print((char)127);
        }
        //  Serial.print (nPulso);

        while (!digitalRead(upButton));
      }

      else if (!digitalRead(downButton))
      {
        if ( adjV2MAX <= 245) {

          adjV2MAX = adjV2MAX + 5;
          lcd.setCursor(12, 2);
          lcd.print((char)126);
        }
        while (!digitalRead(downButton));
      }

    if (nPulso == 4) // vuelve a 0.
      nPulso = 0;
    updateMenu();

  }

}

void updateMenu() {
  switch (nPulso) // definido 4 cases.
  {
    case 0:
      // lcd.clear();
      lcd.setCursor(1, 1);
      lcd.print("AJUSTE FASE [120]");
      lcd.setCursor(0, 2);
      lcd.print("> Set Vmin");
      lcd.setCursor(13, 2);
      lcd.print("    ");
      lcd.setCursor(14, 2);
      lcd.print (adjV1MIN);

      break;

    case 1:
      // lcd.clear();
      lcd.setCursor(1, 1);
      lcd.print("AJUSTE FASE [120]");
      lcd.setCursor(0, 2);
      lcd.print("> Set Vmax");
      lcd.setCursor(14, 2);
      lcd.print (adjV1MAX);
      break;

    case 2:
      //  lcd.clear();
      lcd.setCursor(1, 1);
      lcd.print("AJUSTE FASE [220]"); //alt 126 249
      lcd.setCursor(0, 2);
      lcd.print("> Set Vmin");
      lcd.setCursor(14, 2);
      lcd.print (adjV2MIN);
      break;

    case 3:
      //   lcd.clear();
      lcd.setCursor(1, 1);
      lcd.print("AJUSTE FASE [220]");
      lcd.setCursor(0, 2);
      lcd.print("> Set Vmax");
      lcd.setCursor(14, 2);
      lcd.print (adjV2MAX);

      break;
    case 4:
      break;
  }
}

hola un gran saludo ,

Resolviendo casi todo los inconveniente que tuve desde que postee , he ido resolviendo ylos problemas que se me habian ido presentndo uno seria las grabacion de los valores min , max en la eeprom solo q me surgio otro problemitaque al guardar un valor tengo q ejecutar 2 veces en modo de seleccion para q se guarde q es el valor de rango max ac ( 120 ) , q podria ser ¿¿

sigo pidiendo sugerencia con el uso de los botones , con los rebotes , delay mal puestos , mejorar la estructura al grabar los datos

he cambiado alguna cosa

codigo seria


#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <EEPROM.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);

int upButton = 6;
int downButton = 7;
int selectButton = 8;
int grabartBtn = 9;
//int NavgLeftBtn = 9;
//int NavgRightBtn = 10;
int td = 100;
int nPulso;
unsigned long time ;
unsigned long t = 0;
int dt = 150;

int adjV1MIN ;
int adjV1MAX ;
int adjV2MIN ;
int adjV2MAX ;


void setup ()
{
  adjV1MIN = 90;  // VOLTAJE FASE1 MIN
  adjV1MAX = 150; // VOLTAJE FASE1 MAX

  adjV2MIN = 190; // VFASE2
  adjV2MAX = 250; // VFASE2



  lcd.begin();
  lcd.backlight();

  // pinMode (led, OUTPUT);
  pinMode(upButton, INPUT_PULLUP);
  pinMode(downButton, INPUT_PULLUP);
  pinMode(selectButton, INPUT_PULLUP);
  pinMode(grabartBtn, INPUT_PULLUP);

  //  pinMode(NavgLeftBtn, INPUT_PULLUP);
  //  pinMode(NavgRightBtn, INPUT_PULLUP);;

  Serial.begin(9600);        // inicializa monitor serie a 9600 bps

  EEPROM.get(0, adjV1MIN);     
  EEPROM.get(4, adjV1MAX);     
  EEPROM.get(8, adjV2MIN);     
  EEPROM.get(12, adjV2MAX);    


//  Serial.println( EEPROM.get(0, adjV1MIN) );     
//  Serial.println( EEPROM.get(4, adjV1MAX) );    
//  Serial.println( EEPROM.get(8, adjV2MIN) );   
//  Serial.println( EEPROM.get(12, adjV2MAX) );   
//
//  Serial.println(" ");            // espacio en blanco

  // updatedatos();

}

void loop ()
{
// Serial.println (millis());
  time = millis();
  if (time - t > dt) {
    t = time;

    if (!digitalRead(selectButton)) {

      nPulso ++;

      while (!digitalRead(selectButton));
    }

    if (nPulso == 0)

      if (!digitalRead(upButton)) {

        if ( adjV1MIN <= 105) {

          adjV1MIN = adjV1MIN + 5;
          //   EEPROM.put(0, adjV1MIN);
          lcd.setCursor(12, 2);
          lcd.print((char)126);
        }
        while (!digitalRead(upButton));
      }

      else if (!digitalRead(downButton))
      {

        if ( adjV1MIN >= 95) {

          adjV1MIN = adjV1MIN - 5;
          //    EEPROM.put(0, adjV1MIN);
          lcd.setCursor(12, 2);
          lcd.print((char)127);
        }

        while (!digitalRead(downButton));
      }


    if (nPulso == 1) // VALOR MAX


      if (!digitalRead(upButton)) {

        if ( adjV1MAX >= 135) {

          adjV1MAX = adjV1MAX - 5;
          lcd.setCursor(12, 2);
          lcd.print((char)127);
        }
        while (!digitalRead(upButton));
      }

    if (!digitalRead(downButton))
    {

      if ( adjV1MAX <= 145) {

        adjV1MAX = adjV1MAX + 5;

        lcd.setCursor(12, 2);
        lcd.print((char)126);
      }
      while (!digitalRead(downButton));
    }

    if (nPulso == 2)

      if (!digitalRead(upButton)) {
        if ( adjV2MIN <= 205) {

          adjV2MIN = adjV2MIN + 5;
          lcd.setCursor(12, 2);
          lcd.print((char)126);
        }
        //  Serial.print (nPulso);

        while (!digitalRead(upButton));
      }

      else if (!digitalRead(downButton))
      {
        if ( adjV2MIN >= 195) {
          adjV2MIN = adjV2MIN - 5;
          lcd.setCursor(12, 2);
          lcd.print((char)127);
        }


        while (!digitalRead(downButton));
      }

    if (nPulso == 3)

      if (!digitalRead(upButton)) {
        if ( adjV2MAX >= 235) {

          adjV2MAX = adjV2MAX - 5;
          lcd.setCursor(12, 2);
          lcd.print((char)127);
        }
        //  Serial.print (nPulso);

        while (!digitalRead(upButton));
      }

      else if (!digitalRead(downButton))
      {
        if ( adjV2MAX <= 245) {

          adjV2MAX = adjV2MAX + 5;
          lcd.setCursor(12, 2);
          lcd.print((char)126);
        }
        while (!digitalRead(downButton));
      }


    if (nPulso == 4)

      if (!digitalRead(grabartBtn)) {
        updatedatos();
        lcd.clear();
        lcd.setCursor(5, 2);
        lcd.print ("GUARDANDO");
        lcd.setCursor(0, 1);
        lcd.print (".");  // efecto de barra
        delay(td);
        lcd.print (".");
        delay(td);
        lcd.print (".");
        delay(td);
        lcd.print (".");
        delay(td);
        lcd.print (".");
        delay(td);
        lcd.print (".");
        delay(td);
        lcd.print (".");
        delay(td);
        lcd.print (".");
        delay(td);
        lcd.print (".");
        delay(td);
        lcd.print (".");
        delay(td);
        lcd.print (".");
        delay(td);
        lcd.print (".");
        delay(td);
        lcd.print (".");
        delay(td);
        lcd.print (".");
        delay(td);
        lcd.print (".");
        delay(td);
        lcd.print (".");
        delay(td);
        lcd.print (".");
        delay(td);
        lcd.print (".");
        delay(td);
        lcd.print (".");
         delay(td);
        lcd.print (".");
         delay(td);
        lcd.print (".");
        while (!digitalRead(grabartBtn));
        lcd.clear();
        nPulso = 0;
      }

    if (nPulso == 5) // vuelve al inicio.
      nPulso = 0;
    updateMenu();

  }
}

void updateMenu() {
  switch (nPulso) // definido 4 cases.
  {
    case 0:
      // lcd.clear();
      lcd.setCursor(1, 1);
      lcd.print("[AJUSTE FASE  120]");
      lcd.setCursor(0, 2);
      lcd.print("> RANGO Min");
      lcd.setCursor(16, 2);
      lcd.print("   ");
      lcd.setCursor(15, 2);
      lcd.print (adjV1MIN);

      break;

    case 1:
      // lcd.clear();
      lcd.setCursor(1, 1);
      lcd.print("[AJUSTE FASE  120]");
      lcd.setCursor(0, 2);
      lcd.print("> RANGO Max");
      lcd.setCursor(15, 2);
      lcd.print (adjV1MAX);
      break;

    case 2:
      //  lcd.clear();
      lcd.setCursor(1, 1);
      lcd.print("[AJUSTE FASE  220]");  //alt 126 249
      lcd.setCursor(0, 2);
      lcd.print("> RANGO Min");
      lcd.setCursor(15, 2);
      lcd.print (adjV2MIN);
      break;

    case 3:
      //   lcd.clear();
      lcd.setCursor(1, 1);
      lcd.print("[AJUSTE FASE  220]");
      lcd.setCursor(0, 2);
      lcd.print("> RANGO Max");
      lcd.setCursor(15, 2);
      lcd.print (adjV2MAX);
      break;

    case 4:
      //   lcd.clear();
      lcd.setCursor(1, 1);
      lcd.print (" PRESIONE GUARDAR ");
      lcd.setCursor(1, 1);
      lcd.print ("");
      lcd.setCursor(0, 2);
      lcd.print ("                   ");
     // nPulso = 4 ;
      break;

  }
}

void updatedatos() {

  if (nPulso == 4)

    EEPROM.put(0, adjV1MIN);
  EEPROM.put(4, adjV1MAX);
  EEPROM.put(8, adjV2MIN);
  EEPROM.put(12, adjV2MAX);

}



Has visto las librerías en el Administrador de Librerías, hay varias para LCD que manejan Menúes de modo no se si fácil pero si muy profesional.
Hay que tomarle la mano.
Menu2lib creo que se llama.

saludos surb , no conocia esa libreria y parece excelente , me podria servir para otro inventos q se me ocurren aveces jajajaja

para el caso mio necesitaba algo sencillo , al principo habia comenzado con menu de 2 opcion con 2 submenu cada uno para los ajuste de los parametros , a la fina lo reduje a una sola linea para q sea mas rapido y directo mediante switch case al presionar boton para cambiar el estado seleccionadp y poder elegir el valor min y max , y luego agragrle q s egauraden el eepron llegue hasta aqui pero se me ha presentado algunos problemas

en los botones se me quedan pomo lageado o se tarda para subir o bajar , no se si es que tengo mal estructurado el codigo , estaria probando , lo de la grabacion en la eeprom si lo hace creo q hasta ahy estaria bien como ves la estructura de el codigo

si me puede dar una mano , o sugerencia gracias

Acá esta, hay dos versiones, la 1 y la 2.
Yo usé la 1 y luego me pasé a la 2, pero la usé hace 1 año y te aseguro que requiere un tiempo para prestarle su atención, ahora el resultado es profesional.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.