Go Down

Topic: Modificare Testo stampato su LCD (Read 778 times) previous topic - next topic

Biagetti

Salve, è da un pò che cerco di trovare il modo di modificare il testo su LCD tramite button e salvarlo su Eeprom, ma non ho ancora trovato nulla che possa fare al caso mio.

Mi spiego meglio, stò cercando di creare una Pedaliera Midi che cambi i preset di un multieffetto a Rack, sono riuscito a ottenere il risultato voluto salvo la possibilità di editare i Preset, ovvero funziona tutto ma si programma solo dall'IDE di Arduino.

Ora stò cercando di capire come modificare il Parametri tramite LCD e button dedicati, up,down,left,right,escape,confirm.

vi metto una parte di codice relativa al preset2, in totale sono 16.

Code: [Select]

  if (debounce(mcp01_b2))
  {
    mcp02.digitalWrite(mcp02_L2, HIGH);
    // questo è il segnale Midi che può essere modificato tramite LCD ed il valore è il 2 che può variare da 0-127 o 1-128.
    MIDI.send(ProgramChange,10,0,2); 
    lcd.clear();
    lcd.setCursor(0, 0);
    // questo è il testo che può essere modificato tramite LCD.
    lcd.print("Preset 02");


Il primo Dato che stò provando a modificare è il Testo che stampo su LCD ogni volta che premo il button relativo, poi passerò al segnale Midi.

Qualcuno di voi potrebbe cortesemente indicarmi la soluzione migliore su cui focalizzare la mia attenzione.

Grazie

leo72

Per leggere/salvare dati in EEPROM c'è una libreria apposita:
http://arduino.cc/en/Reference/EEPROM


Biagetti

Per quanto riguarda modificare il testo, quale è la soluzione migliore?

Mi spiego meglio, nell'esempio postato una volta premuto il button 2 e inviato il segnale MIDI, su LCD stampo "Preset 02" con lcd.print, ora premendo un button dedicato devo entrare in modalità programmazione e modificare il Testo e il segnale MIDI.

Per quanto riguarda il Testo mi immagino il Cursore che lampeggia su ogni singola Lettera del Testo programmato precedentemente es. "Preset 02" e tramite i button up\down navigo tra i caratteri (a>b>c>d>e se premo up, e<d<c<b<a se premo down) e passo alle lettere successive tramite right\left alla fine premo confirm e passo a modificare i dati MIDI e una volta modificati premendo confirm salvo i dati su eeprom.

Come posso fare, l'unica cosa che mi viene in mente è un array, ma non ne sono per niente sicuro, magari cè una libreria forse?

Saluti

leo72

NOn esiste il concetto di editor a schermo come c'è sul PC in un display LCD.
Il cursore visibile va attivato e poi spostato manualmente, ossia tramite codice.
Devi poi farti tutta la parte di acquisizione del carattere (userai una tastierina, immagino) e di stampa a video con avanzamento del cursore.

Sì, per memorizzare il testo devi usare un array di caratteri, che poi trasferisci da e per l'EEPROM carattere per carattere. Esiste anche una libreria per la gestione avanzata dei dati su EEPROM:
http://forum.arduino.cc/index.php?topic=115587.0
Guarda se tratta anche gli array, ma credo proprio di sì.

Biagetti

Ho trovato in rete un codice che potrebbe fare al caso mio, ve lo cito:

Code: [Select]

    #include <LiquidCrystal.h>
    int in=8; //AVANTI
    int in2=7; //CAMBIO LETTERA


    int a = 0;
    int b = 0;
    int c= 0;
    int avanti = 0;
    int cambio = 0;
    LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

    void setup() {
      pinMode(in,INPUT);
      pinMode(13,OUTPUT);
      digitalWrite(13,HIGH);
      lcd.begin(16, 2);
      lcd.print(" www.linuxmx.it ");
      delay(3000); lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Mi chiamo:");
       
    }

    void loop() {
      avanti = digitalRead(in);
      cambio = digitalRead(in2);
     
      if (cambio == 1){
      b=b +1;

     
      lcd.setCursor(a, 1);
     
      if (b == 1){lcd.print("a");  }
      if (b == 2){lcd.print("b");  }
      if (b == 3){lcd.print("c");  }
      if (b == 4){lcd.print("d"); }
      if (b == 5){lcd.print("e"); }
      if (b == 6){lcd.print("f");  }
      if (b == 7){lcd.print("g");  }
      if (b == 8){lcd.print("h");  }
      if (b == 9){lcd.print("i");  }
      if (b == 10){lcd.print("l");  }
      if (b == 11){lcd.print("m");}
      if (b == 12){lcd.print("n");  }
      if (b == 13){lcd.print("o");  }
      if (b == 14){lcd.print("p"); }
      if (b == 15){lcd.print("q");  }
      if (b == 16){lcd.print("r"); }
      if (b == 17){lcd.print("s");  }
      if (b == 18){lcd.print("t");}
      if (b == 19){lcd.print("u");  }
      if (b == 20){lcd.print("v");  }
      if (b == 21){lcd.print("z"); }
      if (b > 21){b=0;  }

      }
     
      if (avanti == 1){
        a = a + 1;
        b=0;
        delay(250);
      }
    delay(150);
     
    }


Sicuramente si potrebbe gestire meglio con un Array, solo che non ho idea di come fare per salvare alla fine il testo scritto, su eeprom.

La mia idea era di dichiarare una variabile contenente il testo standard esempio:
Code: [Select]
int Preset01 = Primo Preset    //Testo standard

e poi richiamarlo dal loop alla pressione del button relativo.

Code: [Select]

  if (debounce(mcp01_b2))
  {
    mcp02.digitalWrite(mcp02_L2, HIGH);
    // questo è il segnale Midi che può essere modificato tramite LCD ed il valore è il 2 che può variare da 0-127 o 1-128.
    MIDI.send(ProgramChange,10,0,2); 
    lcd.clear();
    lcd.setCursor(0, 0);
    // questo è il testo che può essere modificato tramite LCD.
    lcd.print(Preset01);   // Su LCD viene stampato il Testo presente dentro la Variabile Preset01


Se non sbaglio dovrei annidare dentro "if (debounce(mcp01_b2))" un if che gestisce la Programazione esempio:
Code: [Select]

if (debounce(mcp01_b2))
  {
    mcp02.digitalWrite(mcp02_L2, HIGH);
    // questo è il segnale Midi che può essere modificato tramite LCD ed il valore è il 2 che può variare da 0-127 o 1-128.
    MIDI.send(ProgramChange,10,0,2); 
    lcd.clear();
    lcd.setCursor(0, 0);
    // questo è il testo che può essere modificato tramite LCD.
    lcd.print(Preset01);   // Su LCD viene stampato il Testo presente dentro la Variabile Preset01
          if (debounce(ProgramButton));
          {
          // qui metto tutta la parte che gestisce i caratteri e salva su eeprom, riguardante il preset01.
}


Come logica potrebbe funzionare?

Biagetti

Questo pomeriggio ho provato a creare un array di char contenente caratteri minuscoli, maiuscoli e numeri, però mi sono arenato nel punto lcd.print e non capisco come fare.

Vi metto il codice:

Code: [Select]

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

char el_caratteri[] = {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','y','z','1','2','3','4','5','6','7','8','9','0','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','Y','Z'};  //58 Caratteri

// dichiaro le costanti relative ai Pin dove sono collegati i pulsanti di navigazione
const int up = 2;
const int down = 3;
const int left = 4;
const int right = 5;
const int confirm_button = 6;
const int esc_button = 7;

// dichiaro le variabili e gli assegno un valore 0
int a = 0;
int b = 0;
int c= 0;
int  lettera_up = 0;
int  lettera_down = 0;
int  colonna_left = 0;
int  colonna_right = 0;
int  esc = 0;
int confirm =0;

// LCD
LiquidCrystal_I2C lcd(0x38,16,2);  // set the LCD address to 0x20 for a 16 chars and 2 line display


void setup()
{
  pinMode(up,INPUT);
  pinMode(down,INPUT);
  pinMode(left,INPUT);
  pinMode(right,INPUT);
  pinMode(confirm_button,INPUT);
  pinMode(esc_button,INPUT);
 
// LCD   
  lcd.init();                      // initialize the lcd
  lcd.backlight();
  lcd.print("Biagetti Custom");
  delay(3000);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Preset 01:");
}

void loop()
{
  for(int caratteri = 0; caratteri < 58; caratteri++)
  {
    int lettera_up = digitalRead(up);
    if (lettera_up == HIGH);
    {
      b=b +1;
      lcd.setCursor(a, 1);
      lcd.print(el_caratteri);  // qui non riesco a capire come impostare il ciclo for
    }
  }
}


Non riesco a capire come impostare il ciclo for per far si che ogni volta che premo il button "up" incrementi il carattere successivo.

Come posso fare?

leo72

NOn gli devi passare tutto il vettore ma solo l'elemento in questione:
Quote
lcd.print(el_caratteri[caratteri]);

Biagetti

Sono quasi riuscito ad ottenere quello che voglio solo che i caratteri si incrementano in continuazione, ho provato ad implementare anche un debounce ma senza successo.

Code: [Select]

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

char el_caratteri[] = {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','y','z','1','2','3','4','5','6','7','8','9','0','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','Y','Z'};  //58 Caratteri

// dichiaro le costanti relative ai Pin dove sono collegati i pulsanti di navigazione
const int up = 2;
const int down = 3;
const int left = 4;
const int right = 5;
const int confirm_button = 6;
const int esc_button = 7;

// dichiaro le variabili e gli assegno un valore 0
int a = 0;
int b = 0;
int c= 0;
int  lettera_up = 0;
int  lettera_down = 0;
int  colonna_left = 0;
int  colonna_right = 0;
int  esc = 0;
int confirm =0;

// LCD
LiquidCrystal_I2C lcd(0x38,16,2);  // set the LCD address to 0x20 for a 16 chars and 2 line display

//Debounce
const int debounceDelay = 10;  // milliseconds to wait until stable
boolean debounce(int pin)
{
  boolean state;
  boolean previousState;
  previousState = digitalRead(pin);          // store switch state
  for(int counter=0; counter < debounceDelay; counter++)
  {
      delay(1);                  // wait for 1 millisecond
      state = digitalRead(pin);  // read the pin
      if( state != previousState)
      {
         counter = 0; // reset the counter if the state changes
         previousState = state;  // and save the current state
      }
  }
  return state;
}

void setup()
{
  pinMode(up,INPUT);
  pinMode(down,INPUT);
  pinMode(left,INPUT);
  pinMode(right,INPUT);
  pinMode(confirm_button,INPUT);
  pinMode(esc_button,INPUT);
 
// LCD   
  lcd.init();                      // initialize the lcd
  lcd.backlight();
  lcd.print("Biagetti Custom");
  delay(3000);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Preset 01:");
}

void loop()
{
  colonna_right = digitalRead(right);
  colonna_left = digitalRead(left);
  for(int caratteri = 0; caratteri < 58; caratteri++)
  {
    if (debounce(up));
    {
      lcd.setCursor(a, 1);
      lcd.print(el_caratteri[caratteri]);
    }
  }
    if (colonna_right == 1){
        a = a + 1;
        b=0;
        delay(250);
      }
    delay(150);
    if (colonna_left == 1){
        a = a - 1;
        b=0;
        delay(250);
      }
    delay(150);
}
     
 
 

leo72

Il tuo codice fa proprio quello, d'altronde lo hai messo in un ciclo for per cui conta da 0 a 58.

Togli il for e fai un incremento del puntatore all'elemento del vettore quando premi il pulsante "up" ed un decremento quando premi il pulsante "down".
Controlla di non andare fuori dal vettore, ossia se sei a 0 e decrementi, devi tornare a 58, se sei a 58 ed incrementi devi ripartire da 0.

Go Up