LCD Format

Hallo zusammen,

ich hab mir mit dem Arduino Uno einen Midicontroller gebaut der mir mit einem Poti Midi CC Signale generiert,- das funktionert auch soweit.

Die Daten werden in der Hairless MidiBridge zB so angezeigt: +17.849 - Serial In: Ch 1: Controller 21 value 27

Wie kann ich die Daten auf dem LCD im Format "Ch 1; Controller 21; CC 27" jeweils Zeilenweise anzeigen lassen?

VG stingray05

welches LCD Link Datenblatt welche Library? Link

Oh Sorry-

16 x 2 Display, I2C - auf der Platine steht hinten noch Qapass drauf

libarys:
LiquidCrystal_I2C
Wire

Sketch:

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

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


int controlChange = 176;// Midikanal 1
int controllerNummer = 21;
int controllerWert = 0;
int controllerWertAlt = 0;
int potiWert = 0;

void setup() {
 Serial.begin(9600);

 // initialize the LCD
 lcd.begin();

 // Turn on the blacklight and print a message.
 lcd.backlight();
// lcd.print("MidiController");//

}

void loop() {
 potiWert = analogRead(A0);
 controllerWert = map(potiWert, 0, 1023, 0, 127);

 if (controllerWert != controllerWertAlt) {
   Serial.write(controlChange) ;
   Serial.write(controllerNummer);
   Serial.write(controllerWert);

 if (controllerWert != controllerWertAlt)
   lcd.setCursor(0,0);
   lcd.print("Ch " );
   lcd.print(controlChange);
   
   lcd.setCursor(8,0);
   lcd.print("Ctrl ");
   lcd.print(controllerNummer);
   
   lcd.setCursor(0,1); 
   lcd.print("     cc "      );
   lcd.print(controllerWert);
     
 }
 controllerWertAlt = controllerWert; 
}

stingray05: Wie kann ich die Daten auf dem LCD im Format "Ch 1; Controller 21; CC 27" jeweils Zeilenweise anzeigen lassen?

Mit dem Code verstehe ich deine Frage nicht. Du gibst die Information auf den zwei Zeilen zur Verfügung stehenden LCD Zeilen aus - was willst du da jetzt Zeilenweise ausgeben?

Das nicht alles auf 16 Stellen passt hast ja schon festgestellt, also was willst du erreichen?

0123456789012345
Ch 1       Ctrl 21
     cc 27

Meine Kristallkugel klemmt heute morgen. @stingray05: Lıes dır doch mal bitte die Signatur von @noisca durch und versetze uns in die Lage dir zu helfen, ohne Kristallkugeln zu befragen oder deine Problemstellung nanoweise aus der Nase zu ziehen.

Vielleicht willst du ja deinen Text jeweils in den beiden Zeilen scrollen, um alle Zeichen je Zeile anzuzeigen? Ist aber nur geraten, da die Kugel nach wie vor klemmt.

Sollte das zutreffen, dann suche mal nach „scrollDisplayLeft“ oder „autoscroll“ als keywords in deiner benutzten library. Sollte diese diese Befehle nicht kennen, dann lies dich mal in BPerryBap‘s lcd library „hd44780“ ein, die imho zur Zeit die beste lcd lib ist und dir viel Arbeit beim Anschließen, Adresseinstellung, Constructorbildung etc. abnimmt.

rpt007:
Meine Kristallkugel klemmt heute morgen.

Ich habe keine, Uwe wollte mir noch nicht mal eine gebrauchte zugestehen :frowning:

@stingray05: Möglicherweise geht es ja um die rechtsbündige Ausgabe mehrstelliger Zahlen:

...
    lcd.setCursor(0, 1);
    lcd.print("     cc ");
    lcd.setCursor(8, 1);
    ausgabe(controllerWert);
...
void ausgabe (int wert) {
  if (wert < 100) lcd.print(' ');
  if (wert < 10) lcd.print(' ');
  lcd.print(wert);
}

noiasca:
Mit dem Code verstehe ich deine Frage nicht. Du gibst die Information auf den zwei Zeilen zur Verfügung stehenden LCD Zeilen aus - was willst du da jetzt Zeilenweise ausgeben?

Das nicht alles auf 16 Stellen passt hast ja schon festgestellt, also was willst du erreichen?

0123456789012345

Ch 1      Ctrl 21
    cc 27

ups stimmt sorry, und danke für Eure Hilfe !

hatte da gestern noch etwas länger dran rumgeschraubt- geht soweit, aber:

Die CC Nummern werden falsch angezeigt (oder im Display nicht richtig überschrieben)… Beim Drehen am Poti sollten die Werte als 001 bis 127 angezeigt werden.

Wenn eine cc 1 im seriell Monitor angezeigt wird hab ich auf dem Display 100… Bei einer 2 dann 200 usw.
Das Display fängt also mit der ersten Stelle Links an, - richtig wäre in dem Fall 2 führenden Nullen vornedran, - solange bis der cc Wert 3 stellig wird.

Ab cc 100 passt die Anzeige dann wieder…

Wenn das mal jemand nachgebaut hat:
Vergleicht bitte mal die Anzeige vom Seriell Monitor mit der Ausgabe des Displays, - denke dann wird klar was ich meine ?!

VG
stingray05

Hi

Wenn Du nur eine 9 zur Anzeige schickst, werden die dahinter stehenden Zeichen NICHT überschrieben.
So wird aus Deiner 10 eine 90, da die 0 stehen geblieben ist.
Auf 100 wird 990, 980, 970, … 100, 900,800,700,…,100,255,254,253,…

Entweder schreibst Du führende Nullen (ggf. auch als Leerzeichen), damit Deine Einer-Stelle an der 3.ten Stelle bleibt, oder Du füllst mit Leerzeichen auf, daß die alten Zeichen überschrieben/gelöscht werden.

Wenn Deine Zahl <100 ist, kannst Du für die 100er Stelle ein Leerzeichen ausgeben
Wenn Deine Zahl <10 ist, kannst Du für die 10er Stelle ein Leerzeichen ausgeben
Nun gibst Du Deine Zahl aus, durch die ggf. zuvor ausgegebenen Leerzeichen beginnt die Zahl ‘so weit rechts verschoben’, daß das Ende der Zahl immer an der 3.ten Stelle bleibt.

MfG

stingray05: - richtig wäre in dem Fall 2 führenden Nullen vornedran, -

Wenn Du in meinem Codeschnipsel ' ' durch '0' ersetzt, hast Du, was Du möchtest.

agmue:
Wenn Du in meinem Codeschnipsel ’ ’ durch ‘0’ ersetzt, hast Du, was Du möchtest.

Hallo agmue,

ich hab jetzt alle varianten ausprobiert: nur leerzeichen, Leerzeichen mit einer oder mehreren führenden Nullen, Nullen ohne Leerzeichen, Ergebnis:

Wenn ich das Poti beim ersten Versuch von 0 an hochdrehe werden die einstelligen, zwei- und dreistelligen Zahlen alle richtig angezeigt.

Drehe ich von 127 wieder zurück, wird mir von 100 abwärts alles dreitstellig in dem Fall alls 990 usw angezeigt.
Als kleinster cc Wert kommt dann statt 1 => 010 im Display…
Drehe ich das Poti nochmal von min bis max bleiben alle Werte Dreistellig, mit teilweis falschen Werten…

Aktueller Sketch:

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

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


int controlChange = 176;// Midikanal 1
int controllerNummer = 21;
int controllerWert = 0;
int controllerWertAlt = 0;
int potiWert = 0;

void setup() {
Serial.begin(9600);

// initialize the LCD
lcd.begin();

// Turn on the blacklight and print a message.
lcd.backlight();
lcd.print("MidiController");

}

void loop() {
  potiWert = analogRead(A0);
  controllerWert = map(potiWert, 0, 1023, 0, 128);

  if (controllerWert != controllerWertAlt) {
    Serial.write(controlChange) ;
    Serial.write(controllerNummer);
    Serial.write(controllerWert);

  if (controllerWert != controllerWertAlt)
    lcd.setCursor(0, 0);
    lcd.print("Ch " );
    lcd.print(controlChange);

    lcd.setCursor(8, 0);
    lcd.print("Ctrl ");
    lcd.print(controllerNummer);

    lcd.setCursor(0, 1);
    lcd.print("     cc "      );
    lcd.print(controllerWert);

}
controllerWertAlt = controllerWert;
}

void ausgabe (int wert) {
if (wert < 100) lcd.print(0);
if (wert < 10) lcd.print(0);
lcd.print(wert);
}

bin etwas ratlos…

VG
stingray05

also aufrufen musst du die ausgabe(int wert) schon auch!

also nicht lcd.print(controllerWert);

sondern

ausgabe(controllerWert);

noiasca:
also aufrufen musst du die ausgabe(int wert) schon auch!

also nicht
lcd.print(controllerWert);

sondern

ausgabe(controllerWert);

kaum macht mans richtig - schon klappts…Vielen Dank für Eure Hilfe !

Anbei mal der fertige Code (zumindest was die gewünschte Anzeige auf dem Display angeht). Auskommentiert ist zZ mal noch die möglichkeit den Midi Kanal und den Controller per zusätzlichen Poti frei einzustellen.
Beim Controller Wert geht das.

Bei der Controller Nr gehts allerdings statt bei 1 teilweise erst bei 4, 5 oder 7 los, endet teilweise bei 123 oder 124.
Die Werte zwischen Hairless und Display Anzeige sind dabei identisch. Denkbar das das Poti nicht ganz sauber regelt…

Die Hairless Midi Bridge zeigt beim Midikanal noch
Midifehler => zB +4.803 - Error: got unexpected data byte 0x1…

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

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

int controlChange = 176;// Midikanal 1
int controllerNummer = 21;
int controllerWert = 0;
int controllerWertAlt = 0;
int potiWert = 0;

void setup() {
Serial.begin(9600);

// initialize the LCD
lcd.begin();

// Turn on the blacklight and print a message.
lcd.backlight();
lcd.print("MidiController");

}

void loop() {
//potiWert = analogRead(A2);
//controlChange = map(potiWert, 0,1023, 1,16); // Midikanal
//potiWert = analogRead(A1);
//controllerNummer = map(potiWert, 0,1023, 0,127);//Controller Nummer
potiWert = analogRead(A0);
controllerWert = map(potiWert, 0,1023, 0,127);//Midi CC


 if (controllerWert != controllerWertAlt) {
   Serial.write(controlChange) ;
   Serial.write(controllerNummer);
   Serial.write(controllerWert);

 if (controllerWert != controllerWertAlt)
   lcd.setCursor(0, 0);
   lcd.print("Midi Kanal   ");
   ausgabe(controlChange);

   lcd.setCursor(0, 1);
   lcd.print("Ctrl ");
   ausgabe(controllerNummer);

   lcd.setCursor(8, 1);
   lcd.print(" |""cc ");
   ausgabe(controllerWert);

}
controllerWertAlt = controllerWert;
}

void ausgabe (int wert) {
if (wert < 100) lcd.print(00);
if (wert < 10) lcd.print(0);
lcd.print(wert);
}

VG
stingray05