Pages: [1]   Go Down
Author Topic: Modificare Testo stampato su LCD  (Read 527 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 39
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
  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
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 21619
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Logged


Offline Offline
Newbie
*
Karma: 0
Posts: 39
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 21619
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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ì.
Logged


Offline Offline
Newbie
*
Karma: 0
Posts: 39
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Code:
    #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:
int Preset01 = Primo Preset    //Testo standard

e poi richiamarlo dal loop alla pressione del button relativo.

Code:
  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:
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?
 
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 39
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
#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?
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 21619
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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


Offline Offline
Newbie
*
Karma: 0
Posts: 39
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
#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);
}
     
 
 
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 21619
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged


Pages: [1]   Go Up
Jump to: