MENWIZ: una libreria per creare menu su LCD

Buongiorno a tutti,

Ho scoperto che purtroppo questa bella libreria non ha supporto nativo per i dati di tipo unsigned int.
Non funziona nemmeno il tipo di dati list associato ad una variabile di tipo byte, ma questo è un problema minore per il mio uso.
Ad occhio mi sembra di aver visto che implementare la gestione del tipo unsigned int su addvar non è poi così banale, qualcuno saprebbe indicarmi un possibile workaround ?
Grazie

Sto riscontrando difficoltà ad aggiungere alla UsrScreen la data e l'ora.

Facendo così funziona ma quando le ore, o i minuti sono <10 non ho modo di stampare lo 0.

void msc(){
  DateTime now= RTC.now();
  int hm,tm;
    static  char buf[7];
  strcpy(menu.sbuf,"GrowRoom Controller"); //1st lcd line
  strcat(menu.sbuf,"\n Temperatura: ");strcat(menu.sbuf,itoa((int)(tm),buf,10));strcat(menu.sbuf,"C");//2nd lcd line
  strcat(menu.sbuf,"\n   Umidita' : ");strcat(menu.sbuf,itoa((int)(hm),buf,10));strcat(menu.sbuf,"%");//3rd lcd line
  strcat(menu.sbuf,"\n ");strcat(menu.sbuf,itoa((int)(now.hour()),buf,10));strcat(menu.sbuf,":");strcat(menu.sbuf,itoa((int)(now.minute()),buf,10));strcat(menu.sbuf,"  ");
  strcat(menu.sbuf,itoa((int)(now.day()),buf,10));strcat(menu.sbuf,"/");  strcat(menu.sbuf,itoa((int)(now.month()),buf,10));strcat(menu.sbuf,"/"); strcat(menu.sbuf,itoa((int)(now.year()),buf,10));//4th lcd line 
  menu.drawUsrScreen(menu.sbuf);}

Altri metodi?

Salve a tutti, da come ho capito la libreria liquidcristal i2c permette di gestire anche gli lcd seriali a 4 bit ma non capisco come devo fare per dirgli che non è un i2c, come devo fare?

Non capisco se la domanda è pertinente con la discussione o meno... Hai problemi con la libreria Menwiz oppure non riesci a usare il display?

è possibile usare questa libreria con display 40x4 che ha 2 enable pin?

scusate la domanda?
questa libreria la posso utilizzare anche con lo shield Keypad? nel senso, siccome i tasti sono collegati tutti a A0 con partitori, come gestisce la cosa la libreria?

grazie

ciao
fiodavid

Salve a tutti,

volevo chiedere se è possibile creare le label dei menu in modo dimanico. Sto cercando di fare una cosa del genere:

r = tree.addMenu(MW_ROOT, NULL, F("Menu"));
s1 = tree.addMenu(MW_SUBMENU, r, F("Input"));

for (int i = 1; i < 10; i++)
{
s2 = tree.addMenu(MW_VAR, s1, F("Input "+i));
........
}

e cioè 10 voci di menu con le stesse impostazione. Mi da questo errore di compilazione:

quick_tour.ino: In function 'void setup()':
/home/peppe/Scaricati/Arduino/arduino-1.6.4/hardware/arduino/avr/cores/arduino/WString.h:38:74: error: initializer fails to determine size of '__c'
#define F(string_literal) (reinterpret_cast<const __FlashStringHelper *>(PSTR(string_literal)))
^
quick_tour.ino:69:32: note: in expansion of macro 'F'
/home/peppe/Scaricati/Arduino/arduino-1.6.4/hardware/arduino/avr/cores/arduino/WString.h:38:74: error: array must be initialized with a brace-enclosed initializer
#define F(string_literal) (reinterpret_cast<const __FlashStringHelper *>(PSTR(string_literal)))
^
quick_tour.ino:69:32: note: in expansion of macro 'F'

se provo così :

s2 = tree.addMenu(MW_VAR, s1, F(i));

stesso errore. Compila solo se aggiungo il cast (MW_LABEL) al posto della F(). però poi sul display compaiono caratteri a caso.

Premetto che l'esempio funziona con i valori statici, ( se metto s2 = tree.addMenu(MW_VAR, s1, F("Input"));

C'è qualche soluzione?

Peppe

Buongiorno a tutti esiste un modo di usare la libreria PCF con questa libreria?

Ho provato a caricare il file su Arduino ma da questo errore:

menu:15: error: 'menuChangeEvent' was not declared in this scope

MenuBackend menu = MenuBackend(menuUseEvent,menuChangeEvent);

^

exit status 1
'menuUseEvent' was not declared in this scope

Trovata libreria non valida in C:\Program Files (x86)\Arduino\libraries\MenuBackend_1-0: C:\Program Files (x86)\Arduino\libraries\MenuBackend_1-0
Trovata libreria non valida in C:\Program Files (x86)\Arduino\libraries\MenuBackend_1-0: C:\Program Files (x86)\Arduino\libraries\MenuBackend_1-0

Premetto che ho installato la libreria nella cartella come ho fatto per tante altre librerie aggiuntive.

Come risolvo? Grazie

salve ragazzi sono due giorni che cerco di integrare questo menu' al mio scketc senza ottenere risultati solo tantissimi errori mi aiutate?

#include <LiquidCrystal.h>



#define STEP_PIN   54
#define DIR_PIN    55
#define ENABLE_PIN  38
#define X_MIN 3 // finecorsa giu D3
#define X_MAX 2 // finecorsa su D2
#define pulsante_azzeramento 14 // pin Y_MIN 
#define pulsante_start 15 // pin Y_MAX 
#define pulsante_reset 18 // pin Z_MIN
#define led 13 // pin LED
#define Relay 24

int ritardo_veloce = 360 ;
int velocita = 0 ;
unsigned int distanza = 0;



LiquidCrystal lcd(46, 48, 56, 60, 61, 62);

void setup() {
  

lcd.begin(16,2);

 lcd.setCursor(0,0); // vai alla posizione 0,0 dell'LCD... 
lcd.print("  Carlotta ");
lcd.setCursor(0,1); // vai alla posizione 0,1 dell'LCD...
lcd.print("  Valente");
delay(2000);
lcd.clear();

lcd.setCursor(0,0); // vai alla posizione 0,0 dell'LCD... 
lcd.print("   ATTENZIONE");
lcd.setCursor(0,1); // vai alla posizione 0,0 dell'LCD... 
lcd.print(" AZZERARE ASSE");
delay(4000);
lcd.clear();

 
 
  
  pinMode(STEP_PIN, OUTPUT);
  pinMode(DIR_PIN, OUTPUT);
  pinMode(ENABLE_PIN, OUTPUT);
  pinMode(X_MIN, INPUT_PULLUP);
  pinMode(X_MAX, INPUT);
  pinMode(pulsante_azzeramento, INPUT_PULLUP);
  pinMode(pulsante_start , INPUT_PULLUP);
  pinMode(pulsante_reset, INPUT_PULLUP);
 pinMode(Relay, OUTPUT);
  digitalWrite(ENABLE_PIN, HIGH );
// attachInterrupt(digitalPinToInterrupt(X_MIN), err_finecorsa, LOW); // Interrupt per finecorsa basso
  pinMode(led, OUTPUT);
  digitalWrite(Relay, LOW );
}

void loop()
{
lcd.setCursor(0,1); // vai alla posizione 0,1 dell'LCD... 
lcd.print("ASSE X 0,");
  if (digitalRead (pulsante_reset) == 0 ) {

//AZZERAMENTO
    
    pos_iniziale() ; // esegue procedura di posizionamento iniziale al fine corsa
   
     digitalWrite(Relay, LOW );
    delay(1000);
    step(STEP_PIN, 7166, DIR_PIN, true, velocita); //esegue 7166 passi in avanti veloce
 
  attachInterrupt(digitalPinToInterrupt(X_MIN), err_finecorsa, LOW); // riabilita interrupt basso
   digitalWrite(ENABLE_PIN, HIGH ); //disabilita ENABLE_PIN

lcd.setCursor(0,0); // vai alla posizione 0,0 dell'LCD... casomai cambia riga e colonna se serve
lcd.print("ASSE AZZERATO");


}
  if (digitalRead (X_MAX ) == 0 ) {
    // azzera l'asse sul display
 
  step(STEP_PIN, 7168, DIR_PIN, false, velocita); //esegue 10000 INDIETRO 
  attachInterrupt(digitalPinToInterrupt(X_MIN), err_finecorsa, LOW); // riabilita interrupt basso
  lcd.setCursor(0,0); // vai alla posizione 0,0 dell'LCD... casomai cambia riga e colonna se serve
lcd.print("ERRORE ASSE");
  
  }

//LAVORO
  
  if (digitalRead (pulsante_start ) == 0 ) {
   delay (1000);
    // esegue ciclo
  digitalWrite(Relay, LOW );
delay(2000);
    step(STEP_PIN, 1133, DIR_PIN, true, 360); //esegue 1133 passi in avanti veloce
    step(STEP_PIN, 303, DIR_PIN, true, 1250); //esegue 303 passi in avanti lento
    step(STEP_PIN, 1436, DIR_PIN, false, velocita); //esegue 1436 passi in avanti
    delayMicroseconds(5);
    
    digitalWrite(ENABLE_PIN, HIGH ); //abilita ENABLE_PIN

digitalWrite(Relay, HIGH );
 delay(500);
 
   lcd.setCursor(0,0); // vai alla posizione 0,0 dell'LCD... 
lcd.print("CICLO ESEGUITO");
delay(600);
  }
}

void step(int stepperPin, int steps, int dirPin, boolean dir, int velocita) {
  digitalWrite(dirPin, dir);
  delay(10);
  for (int i = 0; i < steps; i++) {
    digitalWrite(stepperPin, HIGH);
    delayMicroseconds(velocita);
    digitalWrite(stepperPin, LOW);
    delayMicroseconds(velocita);
     digitalWrite(ENABLE_PIN, LOW );  //abilita ENABLE_PIN

 distanza = i / 4 * 1.5 ; // calcoli la distanza in mm
lcd.setCursor(9,1); // vai alla posizione 9,1 dell'LCD... 
lcd.print(distanza);
}
}

void pos_iniziale() {
  detachInterrupt(digitalPinToInterrupt(X_MIN)); // disabilita Interrupt basso
  digitalWrite(DIR_PIN, 0 );
  delay(10);
  while (digitalRead (X_MIN) == HIGH ) { // gira indietro fino al fine corsa
    digitalWrite(STEP_PIN, HIGH);

 delayMicroseconds(ritardo_veloce);
    digitalWrite(STEP_PIN, LOW);
   
 delayMicroseconds(ritardo_veloce);
     digitalWrite(ENABLE_PIN, LOW ); //abilita ENABLE_PIN
  }
}
void err_finecorsa() {
 



}

io dovrei cambiare i valori di numero di step e velocita' a queste tre righe

@carlotta, purtroppo non conosco la libreria.
Mi pare tu hai nel codice di adesso una serie di pulsanti che dovrebbero fare quello invece vorresti fare con il menu ?
Io ti consiglio di NON partire a spron battuto cercando di mettere il tuo programma con il menu tutto in uno sketch.
Prova a fare un altro sketch con LCD e un menu base preso dai demo della libreria.
Secondo me vedendo un esempio semplice con dei menu dei demo riesci poi a capire dove mettere i pezzi di codice che ti servono per variare velocità e step

P.S. i menu devono essere pilotati da almeno 4 bottoni, mi pare (su,giu,dx,sx). Li hai previsti ?

una donna sul forum ?
scusa l'OT ma e' una rarita'.
Benvenuta :smiley:

mmmmmmmm..... e strano?

dai ragazzi qualcuno puo' darmi una mano? :cry:

Non posso che quotare quanto già suggeritoti da nid69

buongiorno ragazzi non riesco a superare questo scoglio

Documents\Arduino\libraries\MENWIZ\MENWIZ.cpp:720:12: warning: case label value exceeds maximum value for type [enabled by default]

case 900: Serial.println(F("E900-Out of memory"));break;

^
AppData\Local\Temp\arduino_modified_sketch_246494\Test_all_var_types.ino:7:0:
Documents\Arduino\libraries\MENWIZ/MENWIZ.h:32:17: fatal error: LCD.h: No such file or directory

#include <LCD.h>

exit status 1
Errore durante la compilazione per la scheda Arduino/Genuino Mega or Mega 2560.

@nid69 utilizzo un keypad con 6 tasti collegati in analogico display 16x2

Quale LCD, questo

si esatto... collegato ai pin 46, 48, 56, 60, 61, 62 della ramp 1.4 i tasti al pin 13 che corrisponde ad un pin analogico

ti rispondo nel tuo topic, non inquiniamo questo

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

Ciao a tutti, vorrei realizzare un menù sul LCD che controlla una centralina per un miscelatore che sto realizzando.
Ho trovato questa libreria ma non riesco a far funzionare nemmeno un esempio...

Il problema è proprio alla base il collegamento con LCD.
Ho aggiunto le librerie extra che richiede, quelle che si trovano nello zip REQUIRED_LIBRARIES.zip ma anche con quelle nulla da fare.

Prima avevo un errore sul file I2CIO.cpp che cercava #include <../Wire/Wire.h> corretto in wire.h compila correttamente ma se carico su Arduino LCD inizia a flashare e non scrive nulla.

LCD che vorrei usare è questo LCD 20x4 con controller PCF8574AT

Questo il codice che riesco a compilare ma che manda in crisi l'LCD....

#include <FastIO.h>
#include <I2CIO.h>
#include <LCD.h>
#include <LiquidCrystal.h>
#include <LiquidCrystal_I2C.h>
#include <LiquidCrystal_SR.h>
#include <LiquidCrystal_SR2W.h>
#include <LiquidCrystal_SR3W.h>

#define BACKLIGHT_PIN     13

LiquidCrystal_I2C lcd(0x3F);  // Set the LCD I2C address

//LiquidCrystal_I2C lcd(0x38, BACKLIGHT_PIN, POSITIVE);  // Set the LCD I2C address


// Creat a set of new characters
const uint8_t charBitmap[][8] = {
   { 0xc, 0x12, 0x12, 0xc, 0, 0, 0, 0 },
   { 0x6, 0x9, 0x9, 0x6, 0, 0, 0, 0 },
   { 0x0, 0x6, 0x9, 0x9, 0x6, 0, 0, 0x0 },
   { 0x0, 0xc, 0x12, 0x12, 0xc, 0, 0, 0x0 },
   { 0x0, 0x0, 0xc, 0x12, 0x12, 0xc, 0, 0x0 },
   { 0x0, 0x0, 0x6, 0x9, 0x9, 0x6, 0, 0x0 },
   { 0x0, 0x0, 0x0, 0x6, 0x9, 0x9, 0x6, 0x0 },
   { 0x0, 0x0, 0x0, 0xc, 0x12, 0x12, 0xc, 0x0 }
   
};

void setup()
{
   int charBitmapSize = (sizeof(charBitmap ) / sizeof (charBitmap[0]));

  // Switch on the backlight
  pinMode ( BACKLIGHT_PIN, OUTPUT );
  digitalWrite ( BACKLIGHT_PIN, HIGH );
  
  lcd.begin(20,4);               // initialize the lcd 

   for ( int i = 0; i < charBitmapSize; i++ )
   {
      lcd.createChar ( i, (uint8_t *)charBitmap[i] );
   }

  lcd.home ();                   // go home
  lcd.print("Hello, ARDUINO ");  
  lcd.setCursor ( 0, 1 );        // go to the next line
  lcd.print (" FORUM - fm   ");
  delay ( 1000 );
}

void loop()
{
   lcd.home ();
   // Do a little animation by writing to the same location
   for ( int i = 0; i < 2; i++ )
   {
      for ( int j = 0; j < 16; j++ )
      {
         lcd.print (char(random(7)));
      }
      lcd.setCursor ( 0, 1 );
   }
   delay (200);
}

Qualcuno ha qualche idee su come posso risolvere???

Grazieeeeee