Laufschrift auf OLED

Hi,

ich habe vor auf einem kleinen 0,96"OLED (128x64) eine Laufschrift anzuzeigen.
(Ich nutze die lib von olikraus: u8g2)
Bei kleineren Texten ist das kein Problem, da lasse ich einfach 2 um 128pixel versetze identische Texte anzeigen:

void loop(void){
  u8g2.drawStr(x,64,"Text");  
  u8g2.drawStr(x-127,64,"Text"");  
  x=x-1;
  if (x==0) x=127;
}

Aber bei längeren Texten klappt das dann nicht mehr.
Dafür wäre jetzt mein Denkansatz wie folgt: Das Laufen des Textes nur immer für die Breite eines Buchstabens. Also wenn die Buchsaben des Fonts 20 pixel breit sind, dann einen Zähler von 19-0 laufen lassen, und den Startpunkt des Textes so versetzen. Wenn die Schleife durch ist, wieder von 19 anfangen und dann im String die Zeichen um eins verschieben, wie in einem Ringpuffer.
"Dies ist ein Text " -> "ies ist ein Text D" -> "es ist ein Text Di"

Was haltet ihr davon?
Oder versuche ich wieder was zu erfinden, was es schon gibt? :o

Du könntest die Adafruit-Bibliothek benutzen.
Die hat das nämlich eingebaut....

Aber die lib scrollt doch nur den Inhalt des Displays nach links/rechts oder?

// startscrollright
// Activate a right handed scroll for rows start through stop
// Hint, the display is 16 rows tall. To scroll the whole display, run:
// display.scrollright(0x00, 0x0F)

Ups- das weiss ich nicht.
Benutzt hab ich die Funktion nie, zugegebenermassen. Weiss nur, dass da was im Beispielprogramm war.
Was passiert denn, wenn du nen String schickst, der beim scrollen drüber hinaus geht?
Ich hab momentan keins startklar, kann es nicht versuchen.

In dem Falle wäre dann deine Idee wahrscheinlich nicht die schlechteste.
Eventuell den Text in ein Array packen, das würde das Handling vereinfachen. Wird aber so oder so ein ziemlicher Speicherfresser. Evtl. dann mit progmem arbeiten...

Falls du sowas wirklich brauchst, und nicht nur "herumspielen" willst, dann wäre ein Nextion-Display die bessere Wahl, die Dinger können das nämlich wirklich richtig.
Da die auch über ausreichend eigenen Speicher verfügen, kann man Texte auch direkt im Display ablegen, dann bleibt auf dem Arduino selber noch Luft.

Aber die lib scrollt doch nur den Inhalt des Displays nach links/rechts oder?

-->Leider ja

Ich hatte es so gelöst, wenn auch etwas unelegant: mit Microsoft Word einen entsprechenden Text geschrieben, diesen dann per Snippingtool als Bild gespeichert und dann solange bearbeitet, bis es im Display entsprechend aussieht. Nun kommt das Bild von außen in das Display, rutscht bis zum Ende ganz durch und verschwindet auch wieder...

In diesen beiden Threads (hier und hier) hatten wir das mal diskutiert und gebaut.
Wir haben buchstabenweises Scrollen genutzt.

Gruß Tommy

Rabenauge:
Was passiert denn, wenn du nen String schickst, der beim scrollen drüber hinaus geht?

Das ist das Gute daran, er schneidet einfach ab :slight_smile:

Nextion: Kenne ich, tolle Displays! Aber ist für mich hier voll überdimensioniert.

Meine grundsätzliche Lösung ist jetzt mal so:
Auszug aus Code:

char mystring[] = "abcdefghijklmnopqrstuvwxyz0123456789";
int x = 0;
void loop(void) {
  u8g2.drawStr(x,64,mystring);  
  u8g2.sendBuffer();          // transfer internal memory to the display
  
  x=x-1;
  if (x<-19) {   // Font ist 20 Pixel breit
    x=0;
    leftRotatebyOne(mystring);
  }
  delay(10); 
}

void leftRotatebyOne(char arr[])
{
  int i,n, temp;
  n=strlen(arr);
  temp = arr[0];
  for (i = 0; i < n-1; i++)
     arr[i] = arr[i+1];
  arr[i] = temp;
}

Wobei es evtl. noch schöner wäre, wenn man von mystring nur so viele Zeichen nimmt, wie auf das Display passen. Also bei dem 128er Display bei 20 Pixel Fontbreite dann nur 7 Zeichen anzeigen.

Das klappt mit statischem Text schon mal ganz gut. Allerdings hatte ich vor hier einen dynamischen Text zu verwenden. Also etwa so: "Temp = xy°C" und für xy den aktuellen Wert reinschreiben.
Wird dann wohl auf das raus laufen, dass ich mystring lasse, hier immer die aktuelle Temperatur einsetze, einen Pointer durch den String wandern lasse, und ab dem immer 7 Zeichen für die Ausgabe rauskopiere. Wenn nicht mehr genug Zeichen da sind, dann von vorne auffüllen.

Aber bei längeren Texten klappt das dann nicht mehr.

Das clipping arbeitet "by default" mit 8 Bit. Wenn Du die u8g2 in den 16-Bit mode schaltest (siehe U8g2 FAQ), sollte es auch mit längeren Texte klappen: Je nach Zeichenbreite bis ca. 10000 Zeichen.

Wenn aber von den 10000 Zeichen nur 10 sichtbar sind, ist das natürlich etwas wenig resourcen schonend (sprich u8g2 wird die meiste Zeit damit verbringen Buchstaben NICHT zu zeichnen und wird entsprechend langsam).

Grüße,
Oliver