LCD + ékezetes karakterek

Szinte minden megjelenítőnél abba a problémába ütközünk, hogy nincsenek ékezetes karakterek. Nem is értem, hogy egy olyan világnyelv, mint a magyar, miért nem szerepel alapból például egy LCD modul karakterkészletében 🙂

A viccet félre téve: ebben a cikkben a LiquidCrystal_I2C lib által I2C modullal hajtott LCD kijelzőkre varázsolunk ékezetet. A howto egyaránt alkalmazható Arduino és ESP8266 alapon.

Ezeknek a moduloknak általában van egy karakter táblájuk amit a standard ASCII karakterkódokból állítanak össze. Ezen a linken láthatjátok, hogy egy ilyen modul milyen karaktereket képes önmagától kezelni:
https://learn.robotgeek.com/getting-started/59-lcd-special-characters.html

Látványosan karcsú a fontkészlet a magyar ékezetek szempontjából. Viszont, látható az is, hogy az első 8 karakterhely le van foglalva custom, azaz egyedi karaktereknek. Ezt fogjuk kihasználni ahhoz, hogy az ékezeteinket meg tudjuk jeleníteni. Egyedi karakter rajzoláshoz az alábbi online tool ad segítséget:https://maxpromer.github.io/LCD-Character-Creator/

Az Arduino IDE jelenleg UTF-8 karakter kódolással menti el a projekteket, így bármilyen stringet amit a kódba gépelünk UTF-8 kódolással menti el. Az LCD kijelzőnk viszont ASCII karaktereket vár tőlünk. Az ASCII karakter táblát decimális értékként reprezentálva 32 és 127 értékek között tárol megjeleníthető karaktereket. (32 alatt speciális karakterek vannak, mint a null byte, a tab, vagy a sortörés).
127 felett pedig az úgynevezett kiterjesztett ASCII kódok foglalnak helyet egészen 255-ig. De ez még mind kevés, ebbe nagyon sok karakter nem fér bele. Ezért alkották meg az UTF-8 kódolást (is). Ez a kódolás az összes nyelv speciális betűit tartalmazza, így minden nyelven használható. (ASCII karaktertábla: https://www.ascii-code.com/)

Az UTF-8 alapból az ASCII -ra épül; 32-127 között megegyezik az ASCII táblával, ezért előnyös a használata. Az összes többi speciális nyelv szerinti karaktert pedig több byte-on tárol. Ezt úgy teszi meg, hogy egy vezérlő karakter után (pld.: 0xC2 vagy 0xC3) további byte-okon (akár 4-en is) tárol adatot.

Tehát, ha az Arduino IDE-ben egy sztringnek az alábbi értéket adod:

String akarmi = "Eső";

az valójában nem 3 byte-on tárolódik, hanem 4 byteon, mivel (decimális értékekként kifejezve)
E = 69  |  s = 115 | ő = 197 145

Látható, hogy az UTF-8 kódolásnál az ő karakter 2 byte-on tárolódik: az első (197) a vezérlő karakter, ez után pedig (145) magát a karaktert határozza meg.

Tehát ahhoz, hogy az LCD kijelzőnkön UTF-8 karaktereket jelenítsünk meg, fel kell tudni ismerni őket. Ezután pedig csak annyi a dolgunk, hogy a felismert UTF-8 karakter vizuális megfelelőjét betöltjük egyedi karakternek a 0-7 között terjedő helyekre az LCD kijelzőnkön.

Viszont ezzel nektek már nem kell bajlódnotok, megírtuk a libet amivel már könnyedén tudtok kiíratni UTF-8 kódolású magyar ékezetes karaktereket: https://github.com/TechFactoryHU/LCDCharConverter
Az egész logikáját azért írtam le, hogy ha esetleg más speciális karakterrel szertétek bővíteni a megjelenítő listát, akkor az általunk készített lib átírásával egyszerűen meg tudjátok tenni.
Igyekeztünk mindenhol magyarul kommentelni, csak a példa fájlokban vannak angol kommentek -csak hogy ők se érezzék annyira, hogy le vannak szarva-. Kérdés esetén nyugodtan keressetek minket.

TechFactory.hu
Németh Misi

 

(Statisztika: 469 megtekintés)

Egyes szám: Egy gondolat “LCD + ékezetes karakterek

  1. Teleki Kornél

    Tisztelt Misi!
    Nano-n próbálom futtatni a programot, de sajna a “converter” nem hajlandó működni.
    Az ékezetes betűk helyén nem jelenik meg betű, csak kettő db sötét mező.
    Kérem, ha tud segíteni úgy tegye meg.

    Üdvözlettel: Teleki Kornél

Vélemény, hozzászólás?

Az email címet nem tesszük közzé.