Serwisy partnerskie:
Close icon
Serwisy partnerskie

Kurs Arduino odcinek 27 - polskie znaki w glcdfont.c

W poprzednich dwóch odcinkach zdobyliśmy komplet informacji, potrzebnych do wyświetlenia wszystkich liter polskiego alfabetu. Najpierw zajmiemy się podstawowym fontem o rozmiarach znaku 5×7 pikseli.
Article Image
1. Kurs Arduino: wprowadzenie 2. Kurs Arduino odcinek 1 - co to jest i jak zacząć? (sprzęt, schematy, programowanie) 3. Kurs Arduino odcinek 2 - termometry: 'diodowy', pokojowy oraz 'scalony' analogowy 4. Kurs Arduino odcinek 3 - moduł wyświetlacza LCD (HD44780) 5. Kurs Arduino odcinek 4 - czujnik BME280 (pomiar ciśnienia, wilgotności i temperatury) 6. Kurs Arduino odcinek 5 - biblioteki do trzyfunkcyjnego czujnika BME280 7. Kurs Arduino odcinek 6 - wykorzystanie łącza I2C (TWI) 8. Kurs Arduino odcinek 7 - wykorzystanie łącza SPI (karty pamięci, MAX31865, MAX31855) 9. Kurs Arduino odcinek 8 - wykorzystanie czujnika dwutlenku węgla (MH-Z19) 10. Kurs Arduino odcinek 9 - wykorzystanie modułów do odmierzania czasu 11. Kurs Arduino odcinek 10 - wykorzystanie czujników temperatury (DS18B20) 12. Kurs Arduino odcinek 11 - budowa loggera (rejestratora danych) 13. Kurs Arduino odcinek 12 - rejestracja i prezentacja danych oraz obsługa karty SD 14. Kurs Arduino odcinek 13 - rejestracja danych (wykorzystanie modułu OpenLog) 15. Kurs Arduino odcinek 14 - czym zastąpić płytkę Arduino Uno? 16. Kurs Arduino odcinek 15 - budowa rejestratora (chiński klon Arduino Pro Mini) 17. Kurs Arduino odcinek 16 - problemy z kwadratowym modułem Strong 18. Kurs Arduino odcinek 17 - czujniki do pomiaru wilgotności gleby (instalacja, konfiguracja) 19. Kurs Arduino odcinek 18 - protokół MODBUS i łącze RS-485 20. Kurs Arduino odcinek 19 - wyświetlacze od podstaw (matrycowe, 7-segmentowe, MAX7219) 21. Kurs Arduino odcinek 20a - wyświetlacze matrycowe i biblioteki MD_MAX 22. Kurs Arduino odcinek 20b - przyciski i biblioteki do obsługi wyświetlaczy 23. Kurs Arduino odcinek 20c - biblioteki do obsługi wyświetlaczy graficznych 24. Kurs Arduino odcinek 21 - moduł wyświetlacza OLED 25. Kurs Arduino odcinek 22 - moduł wyświetlacza 1,3 cala 26. Kurs Arduino odcinek 23 - przygotowanie bitmap do wyświetlania 27. Kurs Arduino odcinek 24 - omówienie fontu podstawowego (Adafruit GFX) 28. Kurs Arduino odcinek 25 - font podstawowy biblioteki Adafruit GFX 29. Kurs Arduino odcinek 26 - wykorzystanie bitmapowych fontów GFX 30. Kurs Arduino odcinek 27 - polskie znaki w glcdfont.c 31. Kurs Arduino odcinek 28 - zmiana ulepszonych fontów GFX

Definicje wszystkich znaków ASCII - glcdfont.c

W pliku glcdfont.c mamy definicje wszystkich znaków ASCII oraz innych symboli zgodnie ze stroną kodową CP437. Przypomnijmy, że jest to bardzo stara, wręcz „przedpotopowa“ strona kodowa, wykorzystywana w systemie MS-DOS od roku 1981.

W związku z problemem wyświetlania liter alfabetów wielu języków, już w systemie DOS wprowadzono szereg stron kodowych. Ponieważ w bibliotece Adafruit GFX mamy starą stronę CP437, na pewno powinniśmy zainteresować się też starą stroną systemu DOS, zawierającą polskie znaki. To strona DOS – CP852, której zawartość pokazana jest na rysunku 1.

Rys.1 Strona DOS – CP852

Później, w systemie Windows wykorzystywano inne strony kodowe, gdzie oczywiście podstawowe kody ASCII pozostawały bez mian, a inne były znaki o kodach powyżej 127 i ewentualnie poniżej 32. Rysunek 2 pokazuje zawartość strony kodowej Windows-1250, która też zawiera litery polskiego alfabetu, ale rozmieszczone inaczej niż w CP852.

Rys.2 Zawartość strony kodowej Windows-1250

Z czasem dla rozwiązania problemów z kompatybilnością różnych systemów operacyjnych wprowadzono jeszcze inne strony kodowe według międzynarodowego standardu ISO. Rysunek 3 pokazuje zawartość strony kodowej ISO/IEC 8859-2 w wersji z roku 1999. Rozmieszczenie polskich liter jest jeszcze inne, choć trochę podobne jak w Windows-1250. Wprowadzenie stron kodowych ISO nie do końca rozwiązało problemy. Usunięto je dopiero, wprowadzając Unikod i sposób kodowania UTF-8, co omawialiśmy dość dokładnie w cyklu „Wokół ArduinoV”.

Rys.3 Zawartość strony kodowej ISO-IEC 8859-2 w wersji z roku 1999

My takich problemów nie mamy, bo chcemy jedynie na wyświetlaczach graficznych sterowanych przez Arduino zobrazować wszystkie litery polskiego alfabetu. Na pewno w grę wchodzą co najmniej trzy właśnie przypomniane stare strony kodowe, ale jak wiadomo (Wiki), istniało też wiele innych sposobów, szereg stron kodowych używanych w Polsce. Moglibyśmy wykorzystać jedną z trzech przedstawionych stron kodowych, a dokładniej biorąc, wystarczyłoby w stronie CP437 podmienić tylko te definicje znaków, które mają kodować polskie litery „z ogonkami” według którejś z omówionych stron.

Której?

W przypadku Arduino jest to w zasadzie obojętne! Możemy zachować zgodność z którąkolwiek z tych trzech stron. Ale możemy też zrobić własną, prywatną stronę kodową. W każdym razie na pewno w bibliotece Adafruit GFX zmienimy zawartość pliku glcdfont.c, by wstawić tam brakujące polskie litery „z ogonkami” . Ściślej biorąc, nie dodamy, tylko podmienimy, bo maksymalna liczba symboli – znaków nie może przekroczyć 256.

Gdy już zmodyfikujemy bibliotekę glcdfont, polskie litery „z ogonkami” zapewne i tak będziemy wyświetlać za pomocą prymitywnej metody .write(), podając kod – numer znaku według użytej strony kodowej. Zależnie od tego, jaką stronę kodową wykorzystamy, będziemy po prostu podawać inne numery – kody. ArduinoIDE wykorzystuje UTF-8.

Można byłoby się zastanawiać, czy zastosowanie w miarę nowoczesnej strony kodowej ISO/IEC 8859-2 nie pozwoliłoby wprowadzać do szkicu Arduino napisów zawierających litery „z ogonkami” za pomocą klawiatury, bez wykorzystywania metody .write(). Być może jest to możliwe przy wykorzystaniu wstępnej konwersji numerów kodów, bo w sumie chodzi o to, żeby w szkicu .ino pojawiły się odpowiednie numery – kody. Jednak uzyskanie tego wiązałoby się z poważnymi kłopotami i wymagałoby dużej wiedzy o komputerach, systemach operacyjnych i czcionkach.

Dlatego lepiej, bezpieczniej pozostać przy prymitywnej, ale prostej w działaniu metodzie .write(). Wracamy do meritum: w języku polskim mamy 18 liter „z ogonkami”, a mianowicie:

Ą, Ć, Ę, Ł, Ń, Ó, Ś, Ż, Ź,
ą, ć, ę, ł, ń, ó, ś, ż, ź.

Niektórzy rezygnują z definiowania wielkich liter Ą, Ę, Ń. Uznają je za niepotrzebne, ponieważ żaden polski wyraz nie zaczyna się od którejkolwiek z tych liter. To prawda, ale czasem chcemy coś napisać WIELKIMI LITERAMI i wtedy i one mogą być potrzebne. Dlatego należałoby raczej zdefiniować wszystkie 18 symboli.

Możemy to zrobić „na piechotę”, o czym za chwilę. Ale oczywiście ktoś zrobił już za nas całą czarną robotę i w Internecie przy niewielkim wysiłku można znaleźć przygotowany plik glcdfont.c z kompletem liter polskiego alfabetu.

I w opisanych wcześniej stronach kodowych, i w większości samodzielnie „polonizowanych” stron kodowych, polskie litery „z ogonkami” są umieszczone w rozszerzonej części zbioru, czyli mają kody powyżej 127.

Dobrze, ale tak być nie musi! Wróćmy do oryginalnego pliku glcdfont.c i strony kodowej 437. Jeszcze raz na fotografii 4 pokazane są dostępne tam znaki o kodach 0...127. Zakresu drukowalnych kodów ASCII, czyli 32...127, nie możemy zmieniać, bo spowodujemy poważny bałagan. Możemy natomiast podmienić znaki o kodach mniejszych od 32. Tak, ale pamiętamy, że nie możemy wykorzystać kodów 10 (LF) oraz 13 (CR), które są kodami sterującymi.

Fot.4 Znaki o kodach 0...127

Tak się ładnie składa, że pomiędzy kodem 13 (CR) a kodem 32 (spacja) mamy 18 miejsc – dokładnie tyle, ile nam potrzeba. Możemy dowolnym kodom 14...31 przypisać dowolne polskie litery. Na przykład przyporządkowanie może być następujące:

kod – litera
14 – Ą,
15 – Ć,
16 – Ę,
17 – Ł,
18 – Ń,
19 – Ó,
20 – Ś,
21 – Ż,
22 – Ź,
23 – ą,
24 – ć,
25 – ę,
26 – ł,
27 – ń,
28 – ó,
29 – ś,
30 – ż,
31 – ź.

Czyli na przykład aby wyświetlić na ekranie małą literkę ć, w szkicu umieścimy instrukcję: .write(24);

Przyznam, że do pierwszych prób wykorzystałem plik znaleziony gdzieś w Internecie. Oczywiście definicje polskich liter znajdowały się tam w rozszerzonej części kodów powyżej 127, więc przeniosłem je „niżej”, w miejsca definiowane przez kody 14...31. Ściślej biorąc, oryginalnych definicji kodów 14...31 nie kasowałem, tylko wyłączyłem znakami komentarza /* */

Zmieniłem zawartość oryginalnego, bibliotecznego pliku glcdfont.c i po prostu go zapisałem.

Następnie wykorzystałem wcześniejszy program A2302.ino (omawiany w poprzednim odcinku kursu, dostępny w Elportalu). Bez żadnych mian skompilowałem go jeszcze raz, by skorzystał z fontu z mojego zmodyfikowanego pliku glcdfont.c. Uzyskałem na ekranie obraz, pokazany na fotografii 5.

Fot.5 A2302.ino po zmodyfikowaniu pliku glcdfont.c

Zadanie zostało zrealizowane! Jednak nie wszystkie kształty liter podobały mi się. Wprawdzie matryca 5×8 nie powoli wyświetlić ładnych liter, jednak uznałem, że znaki reprezentujące wielkie litery Ć, Ó, Ś, Ź, Ż trzeba zmienić.

Jest to bardzo łatwe i można to zrobić ręcznie dosłownie w ciągu kilku, maksymalnie kilkunastu minut. Mianowicie najpierw trzeba na siatce 5×8 narysować symbole o potrzebnym kształcie. W przypadku liter dolna linia wskazana na rysunku 6 czerwoną strzałką ma być pusta, a każda litera ma mieć wielkość 5×7 pikseli.

Rys.6 Wzór do tworzenia znaków

Przy takim projektowaniu pomocny będzie rysunek 7. Najpierw trzeba na takich matrycach zaprojektować wygląd litery, wypełniając jakimś kolorem poszczególne piksele. Na tak projektowany na kartce symbol trzeba spojrzeć z daleka, z odległości kilku metrów.

Rys.7 Pomoc do projektowania znaków

W przypadku znaku składającego się z 35 pikseli (5×7) nie ma wprawdzie żadnych szans na uzyskanie ładnego wyglądu pięciu wspomnianych liter: Ć, Ó, Ś, Ź, Ż, jednak uznałem, że w ich przypadku trzeba zmniejszyć wysokość litery podstawowej o jeden piksel, żeby zrobić miejsce na górną kropkę czy kreskę.

Najpierw czerwonym flamastrem w matrycach 5×8 zaznaczyłem aktywne piksele. Potem w tych kratkach wpisałem jedynki. Pozostałe kratki wypełniłem zerami. I w ten bardzo prosty sposób, bez żadnego przeliczania, miałem gotowe bajty w postaci ośmiobitowych liczb dwójkowych. Pokazane to jest wyraźnie na fotografii 8.

Fot.8 Dostosowanie poszczególnych liter

Jak pamiętamy, w bibliotecznym pliku glcdfont.c bajty przedstawione są w postaci dwucyfrowych liczb szesnastkowych (HEX). Ale my wcale nie musimy zamieniać liczb dwójkowych (BIN) na postać szesnastkową (HEX). Możemy do pliku glcdfont.c śmiało wpisać uzyskane z ręcznego kodowania liczby dwójkowe, stawiając tylko przed nimi 0b (b – binary).

Fragment zmodyfikowanego pliku glcdfont.c pokazany jest w szkicu 1. Zielonym kolorem wyróżniony jest fragment nieczynny, zakomentowany, zawierający definicje znaków CP437. Warto go zachować na wszelki wypadek. Czerwonym kolorem wyróżnione są nieskasowane wcześniejsze definicje dużych liter Ć, Ó, Ś, Ź, Ż, które mi się nie podobały i które widać na fotografii 5. Kody 32 i wyższe nie są zmienione.

Tak zmodyfikowany plik o nazwie glcdfont_pl_14_31.c dostępny jest w Elportalu wśród materiałów dodatkowych do tego numeru. Gdy w bibliotece Adafruit GFX podmienisz oryginalny plik gldcfont.c i wykorzystasz szkic A2302.ino albo A2501.ino, zapewne i Ty na ekranie modułu ze sterownikiem SH1106 zobaczysz widok jak na fotografii 8.

I tak oto mamy zmodyfikowany podstawowy font 5×7 ze wszystkimi literami polskiego alfabetu. Liter „z ogonkami” nie możemy w prosty sposób wykorzystać przy wyświetlaniu napisów za pomocą jakże pożytecznej metody .print(), gdzie tekst do wyświetlenia po prostu bierzemy w podwójne cudzysłowy "". Nie przekażemy ich także do metody print(), która drukuje pojedyncze znaki w pojedynczych cudzysłowach.

Fot.9 Tekst wyświetlany (szkic 2) 

Wprawdzie opisywane tu wyświetlanie na ekranie liter „z ogonkami” nie jest wygodne, bo trzeba korzystać z metody .write() i podawać jako argument nasz prywatny numer kodu, jak na razie w zakresie 14...31. Niemniej cieszymy się, bo skutecznie spolonizowaliśmy podstawowy font 5×7 Adafruit GFX. Możemy teraz prawidłowo wypisywać na ekranie dowolne polskie teksty, w tym chyba najbardziej popularny testowy: „Zażółć gęślą jaźń”. Kod samego wypisywania tekstu pokazany jest w szkicu 2 (dostępny także w Elportalu jako A2502.ino), a efekt widać na fotografii 9.

Ulepszonymi fontami GFX zajmiemy się w następnym odcinku i wtedy okaże się, że jest to zadanie znacznie trudniejsze i znacznie bardziej pracochłonne, niż polonizowanie fontu podstawowego 5×7. Na razie nie będziemy wchodzić w szczegóły, ale by zachować ten sam sposób wprowadzania polskich liter i w nowszych fontach GFX, i w starym klasycznym 5×7, przenieś samodzielnie w pliku glcdfont.c polskie litery z zakresu kodów 14...31 do zakresu 128...145. Tego wyższego zakresu celowo nie wybraliśmy od razu, by pokazać, że „polonizowanie” można przeprowadzić na wiele sposobów.

Fot.10 Znaki o kodach 32...159

Teraz po prostu przenosimy definicje 18 polskich liter tuż powyżej zakresu ASCII. Oryginalne kody 128...145 strony CP437 zamieniamy na polskie litery. Tak zmodyfikowany plik dostępny jest w Elportalu, ma nazwę glcdfont_pl_128_145.c i można go po prostu umieścić w bibliotece zamiast oryginalnego, oczywiście po zmianie nazwy.

Rys.11 Tabelka z kodami do metody .write()

Tak, ale proponuję, żebyś taką przeróbkę pliku glcdfont.c przeprowadził samodzielnie. Dostępny w Elportalu szkic A2503.ino z użyciem tak zmodyfikowanego pliku glcdfont.c wyświetla znaki o kodach 32...159 – efekt na fotografii 10. Teraz po zmianie na stronie kodowej miejsca wstawienia zestawu polskich liter, do metody .write() musimy podawać inne numery – kody. Przydatna będzie do tego tabelka, pokazana na rysunku 11.

W ramach ćwiczeń domowych samodzielnie zmodyfikuj szkic A2502.ino, nazwij go A2504.ino, żeby wyświetlić napis, a raczej napisy zażółć gęślą jaźń tak, jak na fotografii 9. Ja przy okazji realizacji szkicu 3, gdzie dwukrotne przejście do nowej linii realizują dwa inne polecenia, leciutko poprawiłem też w pliku glcdfont.c definicję dużej litery Ź, co widać na fotografii 12.

Jeżeli chcesz, możesz oczywiście eksperymentować, do czego zresztą zachęcam. Możesz umieścić polskie litery w innych miejscach tabeli kodowej, niekoniecznie w proponowanej kolejności i niekoniecznie w jednym bloku, tylko zastępując dowolnie wybrane, zupełnie nieprzydatne, dziwne symbole.

Fot.12 Poprawiona definicja dużej litery Ź

Koniecznie jednak poćwicz wykorzystanie kodów 128...145, ponieważ w następnej kolejności podejmiemy próbę spolonizowania ulepszonych fontów GFX. A wtedy z pewnych względów, które dokładniej omówimy w najbliższym odcinku, wygodne okaże się właśnie wykorzystanie obok klasycznych kodów ASCII (32...127), także kodów po nich następujących.

Do pobrania
Download icon Materiały do: Kurs Arduino odcinek 27 - polskie znaki w glcdfont.c
1. Kurs Arduino: wprowadzenie 2. Kurs Arduino odcinek 1 - co to jest i jak zacząć? (sprzęt, schematy, programowanie) 3. Kurs Arduino odcinek 2 - termometry: 'diodowy', pokojowy oraz 'scalony' analogowy 4. Kurs Arduino odcinek 3 - moduł wyświetlacza LCD (HD44780) 5. Kurs Arduino odcinek 4 - czujnik BME280 (pomiar ciśnienia, wilgotności i temperatury) 6. Kurs Arduino odcinek 5 - biblioteki do trzyfunkcyjnego czujnika BME280 7. Kurs Arduino odcinek 6 - wykorzystanie łącza I2C (TWI) 8. Kurs Arduino odcinek 7 - wykorzystanie łącza SPI (karty pamięci, MAX31865, MAX31855) 9. Kurs Arduino odcinek 8 - wykorzystanie czujnika dwutlenku węgla (MH-Z19) 10. Kurs Arduino odcinek 9 - wykorzystanie modułów do odmierzania czasu 11. Kurs Arduino odcinek 10 - wykorzystanie czujników temperatury (DS18B20) 12. Kurs Arduino odcinek 11 - budowa loggera (rejestratora danych) 13. Kurs Arduino odcinek 12 - rejestracja i prezentacja danych oraz obsługa karty SD 14. Kurs Arduino odcinek 13 - rejestracja danych (wykorzystanie modułu OpenLog) 15. Kurs Arduino odcinek 14 - czym zastąpić płytkę Arduino Uno? 16. Kurs Arduino odcinek 15 - budowa rejestratora (chiński klon Arduino Pro Mini) 17. Kurs Arduino odcinek 16 - problemy z kwadratowym modułem Strong 18. Kurs Arduino odcinek 17 - czujniki do pomiaru wilgotności gleby (instalacja, konfiguracja) 19. Kurs Arduino odcinek 18 - protokół MODBUS i łącze RS-485 20. Kurs Arduino odcinek 19 - wyświetlacze od podstaw (matrycowe, 7-segmentowe, MAX7219) 21. Kurs Arduino odcinek 20a - wyświetlacze matrycowe i biblioteki MD_MAX 22. Kurs Arduino odcinek 20b - przyciski i biblioteki do obsługi wyświetlaczy 23. Kurs Arduino odcinek 20c - biblioteki do obsługi wyświetlaczy graficznych 24. Kurs Arduino odcinek 21 - moduł wyświetlacza OLED 25. Kurs Arduino odcinek 22 - moduł wyświetlacza 1,3 cala 26. Kurs Arduino odcinek 23 - przygotowanie bitmap do wyświetlania 27. Kurs Arduino odcinek 24 - omówienie fontu podstawowego (Adafruit GFX) 28. Kurs Arduino odcinek 25 - font podstawowy biblioteki Adafruit GFX 29. Kurs Arduino odcinek 26 - wykorzystanie bitmapowych fontów GFX 30. Kurs Arduino odcinek 27 - polskie znaki w glcdfont.c 31. Kurs Arduino odcinek 28 - zmiana ulepszonych fontów GFX
Tematyka materiału: znaki ASCII, wyświetlacze graficzne
AUTOR
Źródło
Elektronika dla Wszystkich wrzesień 2020
Udostępnij
UK Logo