Moin!
Ich suche einen passenden Font für die Displays, die oben gelb und unten
blau sind. Da ich einen 32 Bitter nutze sind die bestehenden als 16 Bit
Werte hinterlegt, 8 Bit nützt mir also leider wenig, das wäre zu viel
Tipparbeit.
Problem beim bestehenden ist, dass bei manchen Buchstaben g,j, etc unten
ein paar Pixel blau sind. Da die Hersteller sicher für mich keine extra
gelben Zeilen einfügen bleibt nur der Font Wechsel.
Hat da vielleicht jemand einen? 11x18 sollte es aber sein, für den
drunter braucht man schon ne Lupe.
u8g2 schrieb:> u8g2 hat viele fonts
Ja, da habe ich auch schon dran gedacht, die habe ich im Arduino
irgendwo gesehen.
Ok, ich dachte jemand hätte das zufällig schon mal gehabt. Der gelbe
Rand misst 10 Pixel glaube ich. Genau weiss ich das nicht.
Christian J. schrieb:
Da ich einen 32 Bitter nutze sind die bestehenden als 16 Bit
> Werte hinterlegt
das verstehe ich nicht, was hat die Wortbreite des Prozessors mit den
Fonts zu tun? Ob ein Font als Bit-, Byte oder 16/32 Bit breites Wort
abgelegt ist, das interessiert doch nur die Routine die Zeichen vom
Fontspeicher in den Grafikspeicher überträgt. Und da gibt es viele
verschiedene Formate und Speichermöglichkeiten.
Und ich habe eine Fontdefinition auch noch nie abgetippt, vorhandene
kann man kopieren oder lässt einen Fontgenerator das include erzeugen.
Ein guter Ansatz ist in der Adafruit GFX Library, da können alternativ
zu den fixed size auch custom fonts benutzt werden. Da werden GNU Free
Type Fonts genutzt, von denen es jede Menge gibt.
https://learn.adafruit.com/adafruit-gfx-graphics-library/using-fonts
Ein Generator wird mitgeliefert, es gibt aber auch einen netten Online
Generator:
http://oleddisplay.squix.ch/#/home
Diese Fonts sollten aber in einem Buffer generiert werden und dann am
Stück zum Display geschickt werden. Kostet etwas mehr Speicher, sollte
für deine 32 Bitter aber kein Problem sein.
Johannes S. schrieb:> Ein Generator wird mitgeliefert, es gibt aber auch einen netten Online> Generator:> http://oleddisplay.squix.ch/#/home
Das ist ja ein nettes Teil! Da muss ich aber meine Pixelroutine
umschreiben. Ist ein anderes Prinzip. Und halt etwas mehr Denkarbeit..
Johannes S. schrieb:> das verstehe ich nicht, was hat die Wortbreite des Prozessors mit den> Fonts zu tun?
Er ist zu bequem, jedesmal 0x hinzuschreiben, das will er auf die Hälfte
reduzieren.
Abgesehen davon gibt es hier im Forum bereits ausreichend an Software
dafür, so daß man sich das manuelle Schreiben der Glyphen als Quelltext
ersparen kann. Siehe z.B. FM.EXE
W.S.
Christian J. schrieb:> Da muss ich aber meine Pixelroutine> umschreiben.
Wenn man die Adafruit GFX nicht komplett nutzen will, dann kann man den
Part mit dem Zeichen Ausgeben schon rausoperieren, das hat nicht viele
Abhängigkeiten.
Die Lib ist C++, Vorteile sind das diese damit für viele verschiedene
Displays incl. LED Matrizen verwendet werden kann und auch mehrere
Displays sind einfach mehrere Instanzen.
Johannes S. schrieb:> das verstehe ich nicht, was hat die Wortbreite des Prozessors mit den> Fonts zu tun? Ob ein Font als Bit-, Byte oder 16/32 Bit breites Wort> abgelegt ist, das interessiert doch nur die Routine die Zeichen vom> Fontspeicher in den Grafikspeicher überträgt.
Jojo,
kläre mich doch mal auf. Dieser Font Generator erzeugt ja allerhand
kryptisches Zeugs.
Meine Lösung, irgendwo abgeschrieben: Die Fonts werden stur pixelweise
kodiert, pfeif auf Platz, davon habe ich 512kb. Die Routine zieht sich
Breite unf Höhe und liest einfach soviel Bytes, wie ein Buchstabe hat.
Bei diesem Generator aber steckt mehr Hirnschmalz drin, da wird wohl
optimiert und damit wird das Ganze komplizierter. Ich nutze weder
Arduino, noch irgendwas aus diesem Universum, auch kein C++, nur die
Standard C Libs.
Mehr ist das nicht. Schaue ich mir eben die GFX Ada LIb an sprengt der
Source Code ja schon alle Grenzen.....
das PROGMEM ist für die Kompatibilität mit AVR und dem getrennten
Adressraum für RAM und Flash, kann man per define als nichts wegmachen.
Die Fonts können Ligaturen und die Zeichen sind nicht alle gleich breit,
damit die Beschreibung eines Zeichens aufwändiger. Das macht eben das
Löschen eines Zeichens schwieriger, man kann keine Dummyfläche löschen
bzw. muss Wissen wie groß das Zeichen war das da Stand. Und durch die
Ligaturen (übergreifende Zeichen) kann man das vorhergehende Zeichen
teilweise kaputtschreiben.
Deshalb ist einfacher in einen Buffer zu rendern und den dann am Block
an das Display zu schicken. Was bei den OLED mit SSD1306 und seinen max.
1 kB ja nicht weh tut. Adafruit unterstützt das mit den 'Canvas', also
eine Leinwand auf die erst gemalt wird und diese wird dann übertragen.
Das kann auch ein Teilausschnitt wie der gelbe Bereich im Display sein.
ein paar defines die man häufig braucht um AVR/Arduino portabel zu
machen:
Christian J. schrieb:> if (!gfxFont) { // 'Classic' built-in font
das ist allerdings noch die einfache Zeichenroutine für die groben
Fonts, für die Free Type ist es noch etwas aufwändiger.
Grr..igitt. Viel zu viele Parameter für ein Grafik-Charout. Eigentlich
wären hier nur die ersten 3 Parameter erforderlich, der Rest sollte zum
Teil im Font stecken (size_x und size_y) und zum anderen Teil in einem
Grafik-Device-Kontext (Textcolor und Background-Color).
W.S.
W.S. schrieb:> Grr..igitt. Viel zu viele Parameter für ein Grafik-Charout.
tja, wenn man Quelltext nicht lesen kann und sogar die Kommentare
ignoriert. Gründe warum ich niemals Quelltext von dir benutzen werde,
andere haben es einfach wesentlich besser drauf.
PS:
in der einfachen Form reicht sogar ein 'uint8_t c' als Argument für
write() und damit eine Streamausgabe direkt auf das Display arbeiten.
PSS:
backcolor und forecolor sind auch etwas tricky: wenn gleich, dann ist
der Hintergrund transparent (wird nicht gezeichnet). Das sieht man nicht
sofort weil das default ist und die Zeichen dann erstmal übereinander
liegen. Wenn die Zeichen den Hintergrund löschen sollen, dann muss den
entsprechend setzen.
Christian J. schrieb:> Ich suche einen passenden Font für die Displays, die oben gelb und unten> blau sind. Da ich einen 32 Bitter nutze sind die bestehenden als 16 Bit> Werte hinterlegt, 8 Bit nützt mir also leider wenig, das wäre zu viel> Tipparbeit
Warum kaufst Du Dir so etwas?