MENWIZ: una libreria per creare menu su LCD

quindi in:

menu.navButtons(UP_BUTTON_PIN,DOWN_BUTTON_PIN,LEFT_BUTTON_PIN,RIGHT_BUTTON_PIN,ESCAPE_BUTTON_PIN,CONFIRM_BUTTON_PIN);

metti il valore di resistenza associato ad ogni bottone ?

... metti, come suggerito dal nome dei parametri, il pin di Arduino su cui attesti ciascun pushbutton.
Comunque se non provi a usare i pushbutton indipendentemente da menwiz, capendo come funzionano e come usare i pin analogici di Arduino, seguendo i link che ti ho dato o altri che troverai googlando è inutile continuare a chiedere aiuto su questo topic.

un ultimissima cosa, leggendo su internet il define si usa per definire una costantname in un constant value,

quando fai define UP_Button_Pin 9 non stai definendo il pin a cui è collegato il pulsante di up ? E quindi non sono più analogici ?

ouch! I pushbutton sono connessi con pin digitali. In alcuni casi i pin analogici vengono usati come digitali quando necessario.... come sto facendo io in questo momento ..) ma questa è un'altra storia....

credo si stia incasinando sui due metodi possibili per usare dei bottoni. Visto che lui parla di resistenze credo si riferisca all'uso di bottoni paralleli ad una serie di resistenze, e la lettura degli stessi con un unico incresso analogico.
La tua libreria gestisce gia' di per se questo tipo di connessione ?

la prima cosa che fa menwiz "standard" è quella di verificare se e quale bottone è stato premuto, tramite la seguente funzione "built in":

int menwiz::scanNavButtons(){ 

  if(btx->BTU.check()==ON){
    return MW_BTU;}
  else if (btx->BTD.check()==ON){
    return MW_BTD;}
  else if (btx->BTL.check()==ON){
    return MW_BTL;}
  else if (btx->BTR.check()==ON){
    return MW_BTR;}
  else if (btx->BTE.check()==ON){
    return MW_BTE;}
  else if (btx->BTC.check()==ON){
    return MW_BTC;}
  else
    return MW_BTNULL;
  }

Per far conoscere a menwiz quali sono i pin che utilizzo per i bottoni (mappatura) devo usare in setup la seguente funzione:
menu.navButtons(UP_BUTTON_PIN,DOWN_BUTTON_PIN,LEFT_BUTTON_PIN,RIGHT_BUTTON_PIN,ESCAPE_BUTTON_PIN,CONFIRM_BUTTON_PIN);

se un utente invece dei bottoni "standard" vuol usare una altra modalità/device deve semplicemente riscrivere una funzione come la precedente che ritorni gli stessi valori con logica di gestione "custom". Per esempio se voglio usare una keypad 4x4 scriverò la seguente funzione

int menuKeys()
{
  char keyPressed = customKeypad.getKey(); // read the keypad to see if a key has been pressed
  
  switch (keyPressed)
  {
    case NO_KEY:
      return MW_BTNULL; // no key pressed
    case '2':
      return MW_BTU; // key 2 pressed for direction UP
    case '8':
      return MW_BTD; // key 8 pressed for direction DOWN
    case '4':
      return MW_BTL; // key 4 pressed for direction LEFT
    case '6':
      return MW_BTR; // key 6 pressed for direction RIGHT
    case '*':
      return MW_BTE; // key * pressed for ESCAPE
    case '#':
      return MW_BTC; // key # pressed for CONFIRM
  }
}

per "dire" a menwiz che deve usare la mia funzione e non quella "built in" in setup devo usare al posto della chiamata a navButtons di cui sopra il metodo
menu.addUsrNav(menuKeys,6);

Questo fa si che menwiz non chiami più la funzione "built in" ma chieami quella definita dall'utente.

Un caso particolare è quello in cui per risparmiare pin di Arduino si utilizzi un solo pin analogico associndo a ciascun bottone una resistenza di valore noto e differente per ciascun botton, che permette, misurando il valore del pin analogico, di capire quale tasto è stato premuto sulla base del valore di input. esempi di utilizzo di questo metodo ce ne sonmo nei topics su menwiz in inglese, con esempi di scrittura della funzione "custom" che comunque è abbasAtnza semplice (come vedi tutto si riduce a poche righe di codice). Io non ho però un esempio disponibile, ma ne sono stati messi in linea.

Spero di essere stato chiaro.

Perfetto ... è quello che cercavo di capire ... mi leggo il forum in inglese.

Testato aveva capito la mia esigenza, ovvero usare un pin analogico per non avere troppi pin occupati per una semplice lettura di tasto. Grazie.Mille.

Vai in questo topic.
potrai trovare sia il codice che lo schema. E' per 4 bottoni, ma estenderla dovrebbe essere banale.
C'è anche il debouncing.

http://forum.arduino.cc/index.php?topic=122636.15

Perfetto :slight_smile: ... ache se nell esempio iniziale mettono:

#define KEY_UP 1
#define KEY_CONFIRM 2
#define KEY_DOWN 3
#define KEY_ESCAPE 4
#define KEY_NONE 11

e poi alla fine del post non lo mettono, se è analogico non aveva senzo mettere questi define.

quello era il penultimo esempio codice, che non funzionava.
nell'ultimo codice (ultimo post del topic) non vedo quelle linee di codice e navmenu restituisce i codici Menwiz corretti (MW_BTU ecc...)

Ciao Ragazzi, ho avuto il tmepo per fare delle prove con il display e il menu, non avendo display I2C ho usato uno standard seriale che avevo, ma aimè non vedo nulla. La libreria non dovrebbe funzionare lo stesso ? :fearful:

In questo sito: Gioblu.com is for sale | HugeDomains
viene usata la menwiz ma non cn il display i2c e mi da errore lo stesso. :frowning:

spetta spetta ti stai incasinando

LCD_seriale != LCD_I2C != LCD_4bit

spero di essere stato chiaro :slight_smile:

Salve ragazzi,
premetto che mi sto avvicinando da poco ad Arduino lasciando una lunga serie di progetti con i Pic, vi chiedo aiuto perchè sto dando di matto con la libreria MENWIZ.
Sto lavorando ad un progetto per il controllo automatico delle luci dell'acquario, ho seguito vari esempi, la guida della libreria e l'aiuto di un amico con un po più di esperienza ma non riesco a risolvere il problema.

Questo è parte dello sketch:

tree.begin(&lcd,16,2); //declare lcd object and screen size to menwiz lib 
 r=tree.addMenu(MW_ROOT,NULL,F("Menu"));
  s1=tree.addMenu(MW_SUBMENU,r, F("Data/Ora"));
      s2=tree.addMenu(MW_VAR,s1, F("Giorno"));
      s2->addVar(MW_AUTO_INT,&Giorno,1,31,1);
      s2=tree.addMenu(MW_VAR,s1, F("Mese"));
      s2->addVar(MW_AUTO_INT,&Mese,1,12,1);
      s2=tree.addMenu(MW_VAR,s1, F("Anno"));
      s2->addVar(MW_AUTO_INT,&Anno,1900,2050,1);
      s2=tree.addMenu(MW_VAR,s1, F("Ore"));
      s2->addVar(MW_AUTO_INT,&Ore,0,24,1);
      s2=tree.addMenu(MW_VAR,s1, F("Minuti"));
      s2->addVar(MW_AUTO_INT,&Minuti,0,60,1);
      s2=tree.addMenu(MW_VAR,s1, F("Secondi"));
      s2->addVar(MW_AUTO_INT,&Secondi,0,60,1);
      s2=tree.addMenu(MW_VAR,s1, F("Salva Dati"));
      s2->addVar(MW_ACTION,salvaora); //Richiamo alla funzione per aggiorare RTC
  tree.addUsrScreen(SchermataRiepilogo, 5000);

Il problema in se è che le voci "secondi" e "Salva Dati" non mi compaiono nel menù, è come se ci fossero troppe voci, infatti se commento per esempio "Giorni" e "mesi " le ultime due compaiono.
Avete una qualche idea di quale potrebbe essere il problema? Grazie in anticipo!

@rioch87
ti invitiamo a presentarti qui: Re: Presentazioni nuovi iscritti, fatevi conoscere da tutti! (Part 1) - Generale - Arduino Forum
e a leggere il regolamento: [REGOLAMENTO] Come usare questa sezione del forum - Italiano - Arduino Forum

... e dopo esserti presentato controlla il valore di MAX_MENU in MENWIZ.cpp. Dovrebbe essere uguale a 8.
Incrementalo a 10 e poi dimmi.
Inoltre usa per il debug, dopo le chiamate a funzioni menwiz, anche la funzione getErrorMessage(true) e leggi sulla seriale se ti danno qualche errore DIVERSO DA ZERO
Inoltre: che scheda hai e quanta memoria libera (stampa il valore ritornato dalla funzione freeRam();)ti rimane dopo l'ultima istruzione di setup?

brunialti:
... e dopo esserti presentato controlla il valore di MAX_MENU in MENWIZ.cpp. Dovrebbe essere uguale a 8.
Incrementalo a 10 e poi dimmi.
Inoltre usa per il debug, dopo le chiamate a funzioni menwiz, anche la funzione getErrorMessage(true) e leggi sulla seriale se ti danno qualche errore DIVERSO DA ZERO
Inoltre: che scheda hai e quanta memoria libera (stampa il valore ritornato dalla funzione freeRam();)ti rimane dopo l'ultima istruzione di setup?

Chiedo venia, mi sono appena presentato.
Ho dato un'occhiata alla libreria e aumentato i valori che mi hai segnalato. Sto utilizzando la board Arduino UNO infatti il problema più grave che mi ritrovo e proprio la ram. Il menù è più grande di quello che ho postato in precedenza e il programma non gira: noto sul display che scorrono tutte le voci del menù velocemente, in altri casi ili display rimane "pulito". Se commento 2 righe del menù il programma gira e rimangono liberi 168byte(?) di ram. Ho paura che la RAM non basti... :~

Si. Non ti basta. Usa i suggerimenti del capito 1.4 "how to save memory space" del manuale. Non risolve tutto ma ti da un po di respiro. Poi rivolgiti a una mega o al prossimo arduino 0.
Tra le compatibili con grandezza simile alla UNO io trovo ottima la Seeduino Mega (circa 30 euro).
c

brunialti:
Si. Non ti basta. Usa i suggerimenti del capito 1.4 "how to save memory space" del manuale. Non risolve tutto ma ti da un po di respiro. Poi rivolgiti a una mega o al prossimo arduino 0.
Tra le compatibili con grandezza simile alla UNO io trovo ottima la Seeduino Mega (circa 30 euro).
c

Il problema è che la board la userei solo per sviluppo, il progetto finale avrà il suo circuito stampato con l'atmega programmato, quindi prendere una board con il chip SMD non mi aiuta. Grazie comunque, cercherò un'altra soluzione che impieghi meno ram.

Potresti usare comunque un smd e programmarlo direttamente sul pcb oppure passare al mega644 o 1284 in pdip programmandoli sempre su pcb o preventivamente su breadboard