Wie bekommt man solch größe Zahlen hin?

Ich beziehe mich auf den Beitrag: 2 LCD Displays am Arduino - #10 by Hobbes_1

Wie bekommt man solch große Zahlen in die 4 Zeilen des Displays? Sind das Grafikzeichen?

1 Like

Wow, das sieht ja cool aus.
Genau wissen, tue ich das natürlich nicht, aber man kann mit der LCD library bis zu 8 eigene Zeichen definieren. LiquidCrystal - createChar() - Arduino Reference

Das folgende sollte reichen:

  • 4 Ecken
  • 2 halbe Zeichen (oben und unten)
  • 1 volles Zeichen ausgefüllt (das könnte auch schon B11111111 sein)

In den Fotos sind zumindest nicht mehr abgedeckt, allerdings sind da nur die Digits 0, 2, 5, 6 und 8 abgedeckt. Wie eine 1 oder 9 aussieht, wissen wir von diesen Fotos nicht.

Muss jetzt leider aufhören und habe auch bisher kaum Erfahrung mit LCDs (Nur das aus dem Arduino Starter Kit. Und das hat ja nur 2 Zeilen).

Aber ich finde das so cool, dass ich mal etwas Code geschrieben habe (total ungetestet und vollständig), der was in die Richtung machen könnte.

Eventuell gibt es ja auch eine Bibliothek dafür, das würde das alles natürlich einfacher machen.
Aber falls nicht, wäre das mal ein Ansatz, mit dem man anfangen könnte.

Muss jetzt leider aufhören, aber vielleicht hilft das ja ein bisschen weiter.

Viel Erfolg!

byte largeLetterPart0[8] = {
  B00000,
  B00000,
  B00000,
  B00000,
  B00001,
  B00111,
  B01111,
  B11111,
};

byte largeLetterPart1[8] = {
  B00000,
  B00000,
  B00000,
  B00000,
  B11111,
  B11111,
  B11111,
  B11111,
};

byte largeLetterPart2[8] = {
  B00000,
  B00000,
  B00000,
  B00000,
  B10000,
  B11100,
  B11110,
  B11111,
};

byte largeLetterPart3[8] = {
  B11111,
  B01111,
  B00111,
  B00001,
  B00000,
  B00000,
  B00000,
  B00000,
};


byte largeLetterPart4[8] = {
  B11111,
  B11111,
  B11111,
  B11111,
  B00000,
  B00000,
  B00000,
  B00000,
};

byte largeLetterPart5[8] = {
  B11111,
  B11110,
  B11100,
  B10000,
  B00000,
  B00000,
  B00000,
  B00000,
};

byte largeLetterPart6[8] = {
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B01111,
  B00111,
  B00001,
};

byte largeLetterPart7[8] = {
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11110,
  B11100,
  B10000,
};


void setup() {
  lcd.createChar(0, largeLetterPart0);
  lcd.createChar(1, largeLetterPart1);
  lcd.createChar(2, largeLetterPart2);
  lcd.createChar(3, largeLetterPart3);
  lcd.createChar(4, largeLetterPart4);
  lcd.createChar(5, largeLetterPart5)
  lcd.createChar(6, largeLetterPart6);
  lcd.createChar(7, largeLetterPart7);
  lcd.begin(16, 4);  
}


void writeLargeDigit0(byte column) {
  lcd.setCursor(column, 0);
  lcd.write(byte(0));
  lcd.write(byte(1));
  lcd.write(byte(2));
  lcd.setCursor(column, 1);
  lcd.write(B11111111);
  lcd.write(' ');
  lcd.write(B11111111);
  lcd.setCursor(column, 2);
  lcd.write(B11111111);
  lcd.write(' ');
  lcd.write(B11111111);
  lcd.setCursor(column, 3);
  lcd.write(byte(3));
  lcd.write(byte(4));
  lcd.write(byte(5));
};

void writeLargeDigit9(byte column) {
  lcd.setCursor(column, 0);
  lcd.write(byte(0));
  lcd.write(byte(1));
  lcd.write(byte(2));
  lcd.setCursor(column, 1);
  lcd.write(byte(6));
  lcd.write(byte(1));
  lcd.write(B11111111);
  lcd.setCursor(column, 2);
  lcd.write(' ');
  lcd.write(' ');
  lcd.write(B11111111);
  lcd.setCursor(column, 3);
  lcd.write(byte(3));
  lcd.write(byte(4));
  lcd.write(byte(5));
};

Ja, das sind wohl (zum Teil) selbst definierte Zeichen.

In folgendem Beitrag wurde das mit einem LCD mit 16 Zeichen und 2 Zeilen gemacht:

Das ist zwar schon einige Zeit her, aber ich habe so ein LCD noch immer erfolgreich im Einsatz :slight_smile: . Die großen Zahlen lassen sich gut auch aus größerer Entfernung ablesen.

Für ein 20 x 4 LCD müsste es entsprechend angepasst werden.

Eine Bibliothek:

1 Like

Cool, der Code in dem darin erwähnten Repo (A set of custom made large numbers for a 16x2 LCD HD44780 Arduino Library · GitHub) sieht meinem ja relativ ähnlich.

Leider habe ich kein 4 Zeilen Display und mein 2 Zeilen Display muss ich irgendwo rauskramen. Zudem habe ich gerade nicht zu viel Zeit, da ich gerade ein anderes Projekt verfolge.
Allerdings habe ich auch voll Bock, mein Beispiel zum Laufen zu bekommen.

Mal sehen, wann ich dazu komme, und dann sehe ich nur die obere Hälfte der Buchstaben, aber das ist ja schonmal ein Anfang.

Wenn den Code vorstellst, wird sich schon jemand finden, der das auf einem 2004a mal zum laufen bekommt. :slight_smile:

Ja, ich hab auch gerade kein 20 x 4 LCD zur Hand. Aber in solchen Fällen kann ein Simulator helfen. :slight_smile:
Hab grad mal deinen Code aus #3 so ausprobiert:

und es funktioniert.

1 Like

Ich definitiv. Habe alles da.

Das gefällt mir. Da muss ich mal bischen testen. Ich arbeite ja eigentlich laufend auf den 2004 LCD´s Da muss ich mir mal einen Schriftsatz zusammenstellen.

Franz

Die Simulation sieht ja klasse aus.
Ich habe heute Abend noch ein bisschen Zeit, dann spiele ich damit rum. Muss jetzt leider offline.

Hui, das wäre geschafft.

Ich habe mal ein wenig mit dem Simulator rumgespielt. Vielen Dank für den Hinweis.
Das vollständige Programm findet ihr hier:

Hier sind die Zahlen, wenn sie gerendert werden. Sie sehen nicht ganz genau so aus, wie in den obigen Beispiel, aber jeder kann das ja an seinen Geschmack anpassen.
Es spricht ja auch nichts dagegen, das digitData mehrfach zu definieren, und dann mal eine '0' mit und ohne durchgezogene Linie zu haben, eine breitere 1, ...

image

image

Der Code darf natürlich auch nicht fehlen:

#include <LCD_I2C.h>
LCD_I2C lcd(0x27,20,4);

// siehe: https://forum.arduino.cc/t/wie-bekommt-man-solch-grosse-zahlen-hin/986148/3


byte largeLetterPart0[8] = {
  B00000,
  B00000,
  B00000,
  B00000,
  B00001,
  B00111,
  B01111,
  B11111,
};

byte largeLetterPart1[8] = {
  B00000,
  B00000,
  B00000,
  B00000,
  B11111,
  B11111,
  B11111,
  B11111,
};

byte largeLetterPart2[8] = {
  B00000,
  B00000,
  B00000,
  B00000,
  B10000,
  B11100,
  B11110,
  B11111,
};

byte largeLetterPart3[8] = {
  B11111,
  B01111,
  B00111,
  B00001,
  B00000,
  B00000,
  B00000,
  B00000,
};


byte largeLetterPart4[8] = {
  B11111,
  B11111,
  B11111,
  B11111,
  B00000,
  B00000,
  B00000,
  B00000,
};

byte largeLetterPart5[8] = {
  B11111,
  B11110,
  B11100,
  B10000,
  B00000,
  B00000,
  B00000,
  B00000,
};

byte largeLetterPart6[8] = {
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B01111,
  B00111,
  B00001,
};

byte largeLetterPart7[8] = {
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11110,
  B11100,
  B10000,
};


byte digitData[4][30] = {
  // 0           1               2            3          4              5             6             7              8              9
  {0,   1,   2, ' ',   0,   1,   0,   1,   2, 0, 1,   2,   0, ' ',   1, 1,   1,   1,   0,   1,   2,   1,   1,   1,   0,   1,   2,   0,   1,   2},
  {255, 0, 255, ' ',   5, 255,   4,   0,   7, 4, 0,   7, 255, ' ', 255, 6,   1,   2, 255,   1,   2, ' ',   0,   7,   6,   1,   7,   6,   1, 255},
  {255, 5, 255, ' ', ' ', 255, 255,   5, ' ', 1, 3, 255,   4,   4, 255, 1, ' ', 255, 255, ' ', 255, 255,   5, ' ', 255, ' ', 255, ' ', ' ', 255},
  {3,   4,   5, ' ', ' ',   4,    4,   4,  4, 3, 4,   5, ' ', ' ',   4, 3,   4,   5,   3,   4,   5,   4, ' ', ' ',   3,   4,   5,   3,   4,   5},
};

void writeLargeDigit(byte column, byte digit) {
  byte index = (digit % 10) * 3;
  for (byte row = 0; row < 4; row++) {
    lcd.setCursor(column, row);
    for (byte i = 0; i < 3; i++) {
      lcd.write(digitData[row][index + i]);
    }
  }
};


void setup() {
  lcd.begin();                      // initialize the lcd 
  lcd.backlight();
  lcd.createChar(0, largeLetterPart0);
  lcd.createChar(1, largeLetterPart1);
  lcd.createChar(2, largeLetterPart2);
  lcd.createChar(3, largeLetterPart3);
  lcd.createChar(4, largeLetterPart4);
  lcd.createChar(5, largeLetterPart5);
  lcd.createChar(6, largeLetterPart6);
  lcd.createChar(7, largeLetterPart7);

  lcd.print("Hallo");
  
}

void loop() {
  
  delay(2000);
  lcd.clear();
  writeLargeDigit(0, 0);
  writeLargeDigit(4, 1);
  writeLargeDigit(8, 2);
  writeLargeDigit(12, 3);
  writeLargeDigit(16, 4);

  delay(2000);
  lcd.clear();
  writeLargeDigit(0, 5); 
  writeLargeDigit(4, 6);
  writeLargeDigit(8, 7);
  writeLargeDigit(12, 8);
  writeLargeDigit(16, 9);
}

Hallo,

dafür gabs vor langer Zeit LCD Code Generatoren. Sollte für jeden etwas dabei sein. :wink: Man muss sich nur Gedanken machen wie man mit 8 Zeichen zeitgleich auskommt, denn man kann diese jederzeit umladen. Dann sind auch auf einem Charakter Display paar Effekte möglich.

1 Like

Hallo und danke für den coolen Thread.
Da habt ihr euch ja einen krassen Battle gegeben. Ist super, was bei sowas rauskommen kann.
Ich finde vor Allem die Idee mit dem ändern der Chars während der Laufzeit interessant.
Da kommen einem gleich Ideen. Erinnert an die alte NES und Gameboy Zeiten, in der ganze Spiele mit einer limitierten Anzahl aus Tiles gemacht wurden.
Vielleicht kann man aus einem 4 Zeilen Display ein 8 Spalten Tetris machen :smiley:

Ich habe das jetzt noch nicht alles durchgearbeitet, aber sind da auch Sachen für mehrzeilige Digits?
Die Bitmasken waren für mich eine geringere Herausforderung. Was fordernd war, war das Auswählen der 8 Spezialzeichen und das Zusammensetzen zu fertigen Ziffern.

Da gibt es auch viele Möglichkeiten, die Zahlen etwas anders zu gestalten. Vielleicht probiere ich auch mal ein anderes Muster aus. Die 3, 7 un 8 gefallen mir nicht so sehr. Aber eine richtig gute Idee fehlt mir noch.

Gibt es eigentlich einen hier einen Ort, wo man solche Snippets sammeln kann. Das sind ja wirklich viele Beiträge zu netten Display-Sachen, die man ja mal sortieren und allen zu Verfügung stellen kann.

BIG FONT (4-line) LCD CHARACTERS, Adrian Jones, February 2015

1 Like

Hallo,

man kann auch für mehrzeilige Schriften nur Pattern von 5x8 Pixel verwenden. Große Schriften sind letztlich zusammengesetzt. Ein Pattern kann nur 5x8 Pixel groß sein. Für eigene große Zahlen muss man sich vorher die Zusammensetzung der Pattern überlegen damit das ein großes Ganzes ergibt.

Wir sind nur 7 Jahre zu spät. Das war aber knapp :smile:

Naja, habe mir schon fast gedacht, dass es sowas schon gibt. Egal! Hat Spaß gemacht zu coden.

Ich fand's hilfreich und vielleicht werde ich mir ja in ferner Zukunft auch ein 20x4 Display zulegen und dann wird sowas mal in Echt umgesetzt.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.