LCD-Texteingabe - Automatisches Leerzeichen verhindern

Hallo Arduino Community,

ich programmiere gerade ein LCD-Display (Quapass 1602A, 2x16). Ich lese Text aus dem Seriellen Monitor ein und schreibe ihn auf das LCD. Dabei bin ich jetzt soweit, dass ich mit einem Joystick die Cursorposition steuern und an dieser Position weiterschreiben kann.

void joystick(){
  if(analogRead(x_pin)>1000) { spalte+=1;   //Cursor um eine Position nach rechts, wenn Joystick nach rechts gedrückt ist
  if(spalte>=15) spalte=15;                 //allerdings maximal bis Position 15 bzw 16
  }
  else if(analogRead(x_pin)<200) { spalte-=1; //Cursor um eine Position nach links, wenn Joystick nach links gedrückt ist
  if(spalte<=0) spalte=0;                     ////allerdings maximal bis Position 0 bzw 1
  }
  if(analogRead(y_pin)>1000)  { zeile+=1;   //Cursor um eine Zeile nach unten, wenn Joystick nach unten gedrückt ist
  if(zeile>=1) zeile=1;                     //allerdings maximal bis Zeile 1 bzw 2
  }
  else if(analogRead(y_pin)<200) { zeile-=1;  //Cursor um eine Position nach oben, wenn Joystick nach oben gedrückt ist
  if(zeile<=0) zeile=0;                       //allerdings maximal bis Zeile 0 bzw 1
  }
  lcd.setCursor(spalte,zeile);                //Cursor an entsprechende Postition setzen
  delay(250);

  if(Serial.available()){         //Wenn etwas im Serial Port angekommen ist ...
    
    while(Serial.available()>0){    //Solange auslesen, bis  der Serial Buffer leer ist
     buchstabe=Serial.read();
     if(buchstabe=='|'){eingabe=buchstabe;break;} //rausspringen, wenn raus-Zeichen angekommen ist
     lcd.print(buchstabe);            //ansonsten Zeichen auf Display schreiben
     if(spalte<15) spalte+=1;         //Spaltenposition mitregistrieren
    }
  }
}

Mein Problem ist, dass das LCD nach jeder Eingabe auf dem Serial Monitor automatisch ein Leerzeichen an den Text anfügt. Liegt das daran, dass beim Absenden der Serial Monitor einen Zeilensprung oder Ähnliches mitschickt ?

Jedenfalls will ich mit dem Joystick auf jede Cursorposition navigieren und jedes Zeichen einzeln überschreiben können. Man kennt das Problem ja auch von schlechten Texteingabefeldern, wo, wenn man nachträglich ein Wort bzw. Satz hinzufügen will, immer gleich das nächste Zeichen mit überschieben wird, sodass man den ganzen Text nochmal neu schreiben muss.

Wäre cool, wenn mir jemand helfen kann.

Viele Grüße

prüfe dein Zeichen vor Ausgabe auf >=0x32 dann hast nur druckbare Zeichen

ok, funktioniert, danke :smiley:

dann könntest entweder noch die obere Grenze auf 0x7F festlegen, oder du nimmst eine LCD Lib die deutsche Umlaute und weitere Sonderzeichen beherrscht.

Gleich mal ein wenig Werbung für meine Seite drunterstreuen: Arduino: Deutsche Umlaute äöü am LCD (Liquid Crystal I2C)

dann habe ich noch ein anderes Problem. Ich habe mir auf dem LCD die Umlaute AE, UE, OE (jeweils Großbuchstaben) als neue Zeichen definiert. Ich will dann immer wenn ein Ae, Oe, Ue eingegeben wird, diese Buchstabe durch die Umlaute bzw. selbst erstellten Zeichen ersetzen.

Um diese selbst erstellten Zeichen zu printen, kenne ich nur den Befehl.

lcd.write((uint8_t) 0)  //bzw an welchen Speicherplatz das Zeichen steht

bei meinem Programm arbeite ich aber mit Arrays, in denen jeweils alle Elemente der jeweiligen Zeile stehen.
Wie kann ich mit einem Befehl bzw einem Char in meiner Liste das selbst erstellte Zeichen aufrufen bzw printen ?

Ich will dann immer wenn ein Ae, Oe, Ue eingegeben wird, diese Buchstabe durch die Umlaute bzw. selbst erstellten Zeichen ersetzen

Das ist relativ mühsam, da du bei aAOoUu erstmal das nächste Zeichen mit prüfen musst. Per SerialMonitor kannst du ohne weiteres Umlaute eingeben, die du dann leicht erkennen kannst (> 127) und durch die entsprechenden Zeichen deines Spezial-Zeichensatzes ersetzen kannst. Was der SerialMonitor sendet, wenn du ein NichtAscii-Zeichen auf der Tastatur eingibst, wäre zu klären und hängt evtl. auch von deinem Betriebssystem ab? ( ANSI=iso-8859-1 / UTF-8 ? )

a) Eingabe von Ä/Ö/Ü zulassen und speichern
oder
b) beim Auslesen des Arrays festellen, ob A, O, U ist, dann das nächste Zeichen vom Array lesen, wenn das ein e ist, dann halt die Sonderbehandlung

was machst bei ß?

ich würde Umlaute abspeichern und eine Lib verwenden die Umlaute kann :wink:

Das wurde vor einiger Zeit hier im Forum schon diskutiert. Da müsstest Du mal suchen.
Es kommt auch darauf an, ob Dein Text Mehrbyte-Zeichen (UTF-8) enthält.

Wenn ich mich richtig erinnere konnte man den Oktalcode direkt einfügen.

Wenn also das Zeichen an der Position 1 das ä wäre:

char text="K\001se"

Falls meine Erinnerung falsch ist, möge man mich korrigieren.

Gruß Tommy

bei Windows bekommst du für ÄÖÜ im Serial Monitor z.B.:

C3 84 C3 96 C3 9C

also die UTF-8 Codes für Zwei-Byte Zeichen.