[RISOLTO] A capo su lcd con Serial.Write

Buongiorno a tutti,

sto cercando di visualizzare dei testi su un display lcd 16x2 tramite Serial.
Io degli input MIDI, in particolare dei SysEx Message, che vengono letti dall’Arduino tramite la porta seriale.
Questi SysEx sono composti da 39 byte, di cui io ne estraggo esattamente 32 per inviarli al display. Inoltre divido già questi 32 byte in due parti, in modo da dividere le due righe.

Questo il codice che sto utilizzando:

#include <MIDI.h> //activate MIDI
MIDI_CREATE_INSTANCE(HardwareSerial, Serial1,     midiA); //Set Midi In to RX1 on Arduino MEGA

#include <LiquidCrystal.h>
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);

void setup() {
  Serial.begin(9600); // activate USB on RX/TX0
  // Initiate MIDI communications, listen to all channels
  midiA.begin(MIDI_CHANNEL_OMNI);
  //read SysEx
  midiA.setHandleSystemExclusive(handle_sysex);

  //set LCD
  lcd.begin(16, 2);
}

void loop() {
  // Call MIDI.read the fastest you can for real-time performance.
  midiA.read();
}

//SysEx:
void handle_sysex(byte* a, unsigned sizeofsysex) {
  //Print Sysex on lcd and Serial:
  lcd.clear();
  for (int n = 6; n < 22; n++) {
    lcd.write(a[n]);
    Serial.write(a[n]);
  }
  for (int n = 22; n < sizeofsysex - 1; n++) {
    lcd.setCursor(0, 1);
    lcd.write(a[n]);
    Serial.write(a[n]);
  }
  Serial.print("\n");
}

Il mio problema è che la prima riga viene letta correttamente, mentre la seconda non riesco a farla vedere in nessun modo.
Nel codice ho inserito anche i Serial.write con cui verifico che i messaggi arrivano correttamente. Il problema è lcd che non mi scrive la seconda riga.

Qualcuno ha idea di dove sia il problema?
Spero di essermi spiegato

Grazie!

Lcd.setCursor (0,1) ti parte dal carattere 0 (x) e dalla riga 1 (y). E la riga 0,0 ?

Poi dimmi che LCD usi, se è I2C oppure se usi tutti quei pin.

La riga 0,0 non l'ho specificata perchè di default già parte da quella, infatti la prima riga me la scrive correttamente.

Uso un LCD LCM1602A

Ma hai provato a usare lcd.print ?

non posso usare lcd.print, altrimenti i byte non mi vengono convertiti in lettere e numeri col codice ASCII

Ma se nel secondo for stampi sempre su stessa posizione vedrai un solo carattere

for ... {
lcd.setCursor(0, 1);     // sempre stessa posizione
lcd.write(a[n]);

Prova

lcd.setCursor(0, 1);
for (int n = 22; n < sizeofsysex - 1; n++) 
{  lcd.write(a[n]);
    Serial.write(a[n]);
}

Poi…
Per la println o print(’\n’) mica è obbligatorio usare sempre print; se stampi nel for con write e poi dopo fai print(’\n’) va bene lo stesso (p.s. meglio ‘\n’ singolo char invece di “\n” array di 2 char (c’e’ fine stringa)

nid69ita, grazie mille, sono cascato su un errore banale XD

ora funziona benissimo.

Il print("\n") l'avevo messo al volo senza pensarci molto giusto per testare il tutto, di fatto non mi interessa stampare sul seriale. Però, visto che ne parliamo, non ho capito la differenza tra '\n' e "\n".
Grazie mille!!

'A' = singolo carattere ... nell'esempio 0x41

"A" = char array (stringa si caratteri standard del 'C') e quindi DUE bytes, il primo vale sempre 0x41 ed il secondo vale 0x00 per indicare il fine stringa.

Guglielmo