MENWIZ problema variabili.

Salve, siccome devo creare un display LCD che mi mostri, oltre al Preset corrente di una pedaliera MIDI, anche la parte relativa alla Programmazione, stavo provando a gestire il tutto con la Libreria Menwiz.

Vi spiego un pò come deve risultare il Menu:
Per accedere al Main Menu bisogna premere un button e cosi facendo si passa dal modo preset a quello di programmazione.
Il Main menu ha 3 sottomenu:

  • MIDI
  • Testo Preset
  • Save and Exit che richiede una conferma

Il Sottomenu MIDI ha a sua volta 2 Sottomenu:

  • Program Change
  • Control Change

Sia i Sottomenu "Program Change" che "Control Change" hanno 2 Variabili ciascuna che andranno salvate su memoria eeprom, rispettivamente:
Program Change:

  • N°Channel MIDI (1-16 oppure Omni ovvero su tutti i Canli)
  • N° Preset

Program Change:

  • N°Channel MIDI (1-16 oppure Omni ovvero su tutti i Canli)
  • N° Controllo

Fino ad ora sono riuscito a creare i menu cono i sottomenu e le relative variabili con la possibilità di salvare su eeprom.

questo è il Codice che ho adattato prendendo spunto dallo sketch di esempio allegato alla libreria:

//MENWIZ ESAMPLE
#include <Wire.h>
//INSERT ALL THE FOLLOWING 5 INCLUDES AFTER INCLUDING WIRE LIB 
#include <LCD.h>
#include <LiquidCrystal_I2C.h>
#include <buttons.h>
#include <MENWIZ.h>
#include <EEPROM.h>    // to be included only if defined EEPROM_SUPPORT

// DEFINE ARDUINO PINS FOR THE NAVIGATION BUTTONS
#define UP_BUTTON_PIN       2
#define DOWN_BUTTON_PIN     3
#define LEFT_BUTTON_PIN     4
#define RIGHT_BUTTON_PIN    5
#define CONFIRM_BUTTON_PIN  6
#define ESCAPE_BUTTON_PIN   7

//Create global object menu and lcd
menwiz menu;
LiquidCrystal_I2C lcd(0x38, 4, 5, 6, 0, 1, 2, 3, 7, NEGATIVE); // Addr, En, Rw, Rs, d4, d5, d6, d7, backlighpin, polarity

//instantiate global variables to bind to menu
int      tp=0;
float    f=26.0;
boolean  bb=0;
byte     b=50;

void setup(){
  _menu *r,*s1,*s2;
  _var *v; 
  int  mem;

  Serial.begin(19200);  
  
  // have a look on memory before menu creation
  Serial.println(sizeof(menwiz));
  mem=menu.freeRam();
  
  // inizialize the menu object (20 colums x 4 rows)
  menu.begin(&lcd,16,2);
  //menu.setBehaviour(MW_MENU_INDEX,false);    

  //create the menu tree
  r=menu.addMenu(MW_ROOT,NULL,F("MAIN MENU"));      //create a root menu at first (required)
      s1=menu.addMenu(MW_SUBMENU,r,F("MIDI"));
          s2=menu.addMenu(MW_VAR,s1,F("Program Change"));
              s2->addVar(MW_AUTO_BYTE,&b,25,254,10);          //add a terminal node (that is "variable"); 
              s2->setBehaviour(MW_SCROLL_HORIZONTAL,true); 
          s2=menu.addMenu(MW_VAR,s1,F("Control Change"));            //add a terminal node (that is "variable"); 
              s2->addVar(MW_AUTO_BYTE,&b,25,254,10);         
               //create a variable of type "boolean" 
  
      s1=menu.addMenu(MW_VAR,r,F("SAVE TO EPROM"));           //add a terminal node (that is "variable") create an "action" associated to the terminal node... 
          s1->addVar(MW_ACTION,savevar);                     //the act function as default will be called when enter button is pushed

  //declare navigation buttons (required)
  menu.navButtons(UP_BUTTON_PIN,DOWN_BUTTON_PIN,ESCAPE_BUTTON_PIN,CONFIRM_BUTTON_PIN,LEFT_BUTTON_PIN,RIGHT_BUTTON_PIN);


  //(optional) create a splash screen (duration 5.000 millis)with some usefull infos the character \n marks end of LCD line 
  //(tip): use preallocated internal menu.sbuf buffer to save memory space!
//  sprintf(menu.sbuf,"MENWIZ TEST V %s\n.Free mem. :%d\n.Used mem  :%d\n.Lap secs  :%d",menu.getVer(),menu.freeRam(),mem-menu.freeRam(),5);
//  menu.addSplash((char *) menu.sbuf, 5000);
  }

void loop(){
  menu.draw(); 
  //PUT APPLICATION CODE HERE (if any)
  }


void act(){
  Serial.println("FIRED ACTION!");
 }
 
void savevar(){
  menu.writeEeprom();
  }

Dunque, a parte che ancora non ho la cononscenza necessaria per capire se i valori sono stati effettivamente salvati e come richiamarli nella modalità preset e ci penserò più avanti, il problema su cui mi stò concentrando è nella modifica delle variabili, vi metto una foto cosi mi spiego meglio:

Come vedete nella foto, sono nel sottomenu Program Change che gestisce le variabili Program e Channel, in realtà nella foto le variabili sono 3 ma per il momento non è importante il problema stà nel fatto che nonostante abbia inserito tutti i pulsanti di navigazione:

  //declare navigation buttons (required)
  menu.navButtons(UP_BUTTON_PIN,DOWN_BUTTON_PIN,ESCAPE_BUTTON_PIN,CONFIRM_BUTTON_PIN,LEFT_BUTTON_PIN,RIGHT_BUTTON_PIN);

non riesco ad andare a modificare le variabili a destra e a sinistra di quella centrale evidenziata dalle parentesi quadre e non ne capisco il perchè, inoltre la variabile centrale la posso incrementare o decrementare di 10 in 10 e quindi non potrei scivere per esempio il valore 11 o 121.

Qualcuno di voi ha esperienza con la seguente libreria?

Biagetti:
Qualcuno di voi ha esperienza con la seguente libreria?

Puoi contattare l'autore nel topic della libreria --> MENWIZ: una libreria per creare menu su LCD - Megatopic - Arduino Forum

 s2->addVar(MW_AUTO_BYTE,&b,25,254,10);          //add a terminal node (that is "variable");

crei la voce del menu, 25 è il valore minimo che può assumere e 254 quello massimo, mente 10 è di quanto decrementi o incrementi.

i valori a destra e sinistra non li puoi modificare perche sono le soglie.

es:
 s2->addVar(MW_AUTO_BYTE,&b,0,100,1);

cosi potrai modificare la fariabile con scalini di 1 da 0 a 100

da qui scarichi tutto compreso di pdf con la spiegazione della libreria
https://github.com/brunialti/MENWIZ/archive/master.zip

Intanto vi ringrazio delle dritte, nel pomeriggio proverò con i consigli che mi avete postato.

Chiedo scusa al Moderatore, prima per avere creato il primo post nella sezione generale invece nella sezione software e poi per averne creata un'altra nella sezione giusta convinto che potessi essere in grado di cancellare il topic nella sezione Generale.

è possibile stampare su LCD solo il valore senza le soglie?

inoltre se volessi fare apparire su LCD due valori con sopra la definizione del Sottomenu?

Esempio:
Program Change
Preset 128 Ch16

magari creando 2 Variabili con addVar tipo:

 s2->addVar(MW_AUTO_BYTE,&b,0,16,1);          //add a terminal node (that is "variable");
 s2->addVar(MW_AUTO_BYTE,&b,1,127,1);          //add a terminal node (that is "variable");