Aiuto per un menu su display i2c

Salve.

è da un mese oramai che mi ritrovo davanti ad un muro apparentemente insormontabile.

Sto cercando di creare uno sketch per gestire un menu attraverso il quale vengono impostate delle variabili che andranno poi inviate attraverso UART ad un modulo RF per impostarne frequenze TX/RX ed altri parametri.

Il mio problema è che la mia abilità di coder non è sufficiente per creare uno sketch simile da zero. Avevo in mente di usare MENWIZ, intuitivo, con una bella documentazione a prova di pivello. Purtroppo il mio arduino UNO non ha abbastanza memoria dinamica per digerire quella libreria (pare).

Mi farebbe comodo se qualcuno avesse uno sketch simile che magari supporti dei sub menu, ben commentato per poterne comprendere il funzionamento e poterlo adattare al mio scopo.

un'altra domanda che mi cruccia: se io ho uno sketch creato nativamente con la libreria liquidcrystal, per farlo funzionare con la Liquidcrystal_I2C, basta modificare ia stringa di setup del display o esiste il problema che i comandi associati ad essa sono differenti?

Grazie in anticipo, e spero che questo post da niubbo non vi faccia storcere troppo il naso.

Lu0z:
Grazie in anticipo, e spero che questo post da niubbo non vi faccia storcere troppo il naso.

... no, questo post in se no, la violazione del regolamento invece SI !

In conformità al REGOLAMENTO, punto 13, il cross-posting è proibito (anche tra lingue diverse) e tu hai già posto la stessa domanda nel thread della MENWIZ in Megatopic.

Quindi, dato che questo mi sembra più completo, provvedo a cancellare quello duplicato e tu continua in questo tuo thread.

Guglielmo

Mi scuso per il cross posting. In realtà la domanda sull'altro thread era riguardante la compatibilità della libreria. Questo l'ho fatto per cercare di trovare un'alternativa siccome non sembra esserci rimedio al problema con menwiz. :slight_smile:

Lu0z:
... in realtà la domanda sull'altro thread era riguardante la compatibilità della libreria.

... anche qui lo chiedi :wink: ...

Lu0z:
... Avevo in mente di usare MENWIZ, intuitivo, con una bella documentazione a prova di pivello. Purtroppo il mio arduino UNO non ha abbastanza memoria dinamica per digerire quella libreria (pare) ...

... Non la conosco, ma ... hai letto bene tutto il thread della MENWIZ ? Magari c'è modo di ridurre l'occupazione ::slight_smile:

Altre librerie così flessibili NON ne conosco ... hai provato a cercare su Google "Arduino creare Menu LCD" ? ... sembra vengano fuori svariati risultati ... se poi la fai in Inglese sicuramente trovi ancora più soluzioni :wink:

Guglielmo

Dunque...

ho trovato una libreria che sembra fare al caso mio.

LINK DOWNLOAD

ho avuto modo di fare dei test di funzionamento con alcuni suoi esempi che ricevono input e inviano output attraverso serial monitor.

tra gli esempi ce n'è una versione che comanda un LCD. ora il mio problema sta nel fatto che usa la libreria Liquidcrystal classica.

se io volessi implementare la versione I2c cosa dovrei andare a modificare?

questo è lo sketch originale

/*
 * lcd_nav.ino - Example code using the menu system library
 *
 * This example shows using the menu system with a 16x2 LCD display
 * (controled over serial).
 *
 * Copyright (c) 2015 arduino-menusystem
 * Licensed under the MIT license (see LICENSE)
 */

#include <MenuSystem.h>
#include <LiquidCrystal.h>

// renderer

// The LCD circuit:
//    * LCD RS pin to digital pin 8
//    * LCD Enable pin to digital pin 9
//    * LCD D4 pin to digital pin 4
//    * LCD D5 pin to digital pin 5
//    * LCD D6 pin to digital pin 6
//    * LCD D7 pin to digital pin 7
//    * LCD R/W pin to ground
LiquidCrystal lcd = LiquidCrystal(8, 9, 4, 5, 6, 7);

class MyRenderer : public MenuComponentRenderer
{
public:
    virtual void render(Menu const& menu) const
    {
        lcd.clear();
        lcd.setCursor(0,0);
        lcd.print(menu.get_name());
        lcd.setCursor(0,1);
        menu.get_current_component()->render(*this);
    }

    virtual void render_menu_item(MenuItem const& menu_item) const
    {
        lcd.print(menu_item.get_name());
    }

    virtual void render_back_menu_item(BackMenuItem const& menu_item) const
    {
        lcd.print(menu_item.get_name());
    }

    virtual void render_numeric_menu_item(NumericMenuItem const& menu_item) const
    {
        lcd.print(menu_item.get_name());
    }

    virtual void render_menu(Menu const& menu) const
    {
        lcd.print(menu.get_name());
    }
};
MyRenderer my_renderer;

// Forward declarations

void on_item1_selected(MenuItem* p_menu_item);
void on_item2_selected(MenuItem* p_menu_item);
void on_item3_selected(MenuItem* p_menu_item);

// Menu variables

MenuSystem ms(my_renderer);
MenuItem mm_mi1("Level 1 - Item 1 (Item)", &on_item1_selected);
MenuItem mm_mi2("Level 1 - Item 2 (Item)", &on_item2_selected);
Menu mu1("Level 1 - Item 3 (Menu)");
MenuItem mu1_mi1("Level 2 - Item 1 (Item)", on_item3_selected);

// Menu callback function

void on_item1_selected(MenuItem* p_menu_item)
{
  lcd.setCursor(0,1);
  lcd.print("Item1 Selected  ");
  delay(1500); // so we can look the result on the LCD
}

void on_item2_selected(MenuItem* p_menu_item)
{
  lcd.setCursor(0,1);
  lcd.print("Item2 Selected  ");
  delay(1500); // so we can look the result on the LCD
}

void on_item3_selected(MenuItem* p_menu_item)
{
  lcd.setCursor(0,1);
  lcd.print("Item3 Selected  ");
  delay(1500); // so we can look the result on the LCD
}

void serialPrintHelp() {
  Serial.println("***************");
  Serial.println("w: go to previus item (up)");
  Serial.println("s: go to next item (down)");
  Serial.println("a: go back (right)");
  Serial.println("d: select \"selected\" item");
  Serial.println("?: print this help");
  Serial.println("h: print this help");
  Serial.println("***************");
}

void serialHandler() {
  char inChar;
  if((inChar = Serial.read())>0) {
    switch (inChar) {
    case 'w': // Previus item
      ms.prev();
      ms.display();
      break;
    case 's': // Next item
      ms.next();
      ms.display();
      break;
    case 'a': // Back presed
      ms.back();
      ms.display();
      break;
    case 'd': // Select presed
      ms.select();
      ms.display();
      break;
    case '?':
    case 'h': // Display help
      serialPrintHelp();
      break;
    default:
      break;
    }
  }
}

// Standard arduino functions

void setup()
{
  Serial.begin(9600);
  lcd.begin(16, 2);

  serialPrintHelp();

  ms.get_root_menu().add_item(&mm_mi1);
  ms.get_root_menu().add_item(&mm_mi2);
  ms.get_root_menu().add_menu(&mu1);
  mu1.add_item(&mu1_mi1);

  ms.display();
}

void loop()
{
  serialHandler();
}

Ho tentato di modificare il codice per farlo funzionare con la i2c ma sembra che non invii dati al display più precisamente ho modificato le librerie ed ho sotituito l'addressing. l'indirizzo 0x27 è corretto, ho gia testato l'lcd con deglisketch di prova stile "hello world"

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

--- Devi usare i tag CODE non quelli per le tabelle ... quelli che, in fase di edit, ti inserisce il bottone </> . Per questa volta ho corretto io, ma presta più attenzione, Grazie.- gpb01