Jak zrobić znak specjalny HD44780 w Arduino

znaki specjalneTutaj przedstawię w jaki sposób zrobić znaczek specjalny na wyświetlaczu opartym o sterownik HD44780 w Arduino. Zapraszam

 

 

 

 

Jako, że wcześniej programowałem w Bascomie to środowisko miało wbudowany generator znaków specjalnych i nie było problemu ze zrobieniem takiego. Natomiast w Arduino IDE próżno szukać takiego generatora bo go najzwyczajniej nie ma.
Czasem znak który potrzebujemy znajduje się już w pamięci wyświetlacza, oto lista tych znaków:

charset

Jak widać, te symbole mają swoje „numery”. Znak wykrzyknika posiada numer 00100001, a znak plusa 00101011. Lecz Arduino nie rozszyfruje sobie tych numerów, ponieważ są w zapisie binarnym, a my możemy tylko wpisać numer znaku w systemie dziesiętnym. Zatem mamy trzy wyjścia, albo poszukać w internecie konwertera bin – dec, samemu przeliczyć albo użyć kalkulatora jeżeli mamy system Windows 7  wzwyż.
Dla kalkulatora Windows:

  1. Zmieniamy na tryb Programisty (Widok > Programista)
  2. Zmieniamy system na Bin
  3. Wpisujemy liczbę
  4. Przechodzimy na Dec i otrzymujemy naszą liczbę zwrotną

kalkulator
Ale co jeśli chcę użyć innego znak niż z tej tablicy ?
No cóż… możesz sobie taki zrobić ;) Do tego celu służy ta strona:

http://omerk.github.io/lcdchargen/

klikając w zielone piksele tworzymy własny symbol. Po skończeniu kopiujemy Output:

Jak widać tworzenie własnego znaku jest proste. 1 oznacza zapalony piksel bloku. Tak stworzony znak wklejamy do naszego programu poza pętlę loop() i setup(). Następnie z takiego zlepka danych musimy stworzyć znak. Z pomocą przychodzi nam funkcja lcd.createChar():

Pamięć wyświetlacza pozwala nam na używanie w jednym programie maksymalnie 8 znaków (patrz tabela wyżej- kolumna CG RAM). Jak dla mnie jest to wystarczająca ilość, ale każdy ma różne projekty i zapotrzebowanie znaków do nich.
Zatem jak już to mamy to wystarczy teraz ten znak wyświetlić. Jest to ostatnia funkcja dla tego poradnika i jest nią lcd.print((char))

Dosyć teorii, czas na praktykę !
Znak który wcześniej stworzyliśmy to znak stopni, który posłuży do termometru, w dalszej części Kursu Arduino ;)

Jak wcześniej opisywałem. Najpierw wstawiamy konfigurację naszego znaku poza loop() i setup(). Następnie w funkcji setup() tworzymy znak z wcześniej zrobionej konfiguracji i przypisujemy mu numer 0. Na końcu w pętli loop() wyświetlamy ten znak. Powinniśmy otrzymać efekt jak na zdjęciu niżej:

CAM00060

A jeżeli dopiszemy do tego programu obsługę termometru to efekt będzie taki:

CAM00061


Jeżeli chcesz być informowany na bieżąco o nowych częściach kursu to kliknij „Lubię to!” bądź subskrybuj naszą stronę, aby otrzymywać na adres e-mail nowości ze strony. Jeżeli masz jakieś pytania to śmiało zadawaj je na forum ; )

  • Daniel Dudziński

    Witam. Pisze Pan ,że można utworzyć do 16 własnych znaków w pamięci wyświetlacza.Ja próbowałem i za każdym razem druga ósemka nadpisuje Mi tą pierwszą ! Co Robię nie tak?
    Pozdrawiam

    • zipp

      kolega Paweł Gałaś się pomylił, można stworzyć tylko 8 znaków – ograniczenie sprzętowe HD44780

      za http://www.arduino.cc/en/Reference

      Syntax
      lcd.createChar(num, data)
      Parameters
      lcd: a variable of type LiquidCrystal
      num: which character to create (0 to 7)
      data: the character’s pixel data

  • zipp

    w podanym przykładzie jest błąd, a przynajmniej występuje gdy komunikacja z LCD realizowana jest przez i2c.

    Chodzi o kolejność działań:

    najpierw trzeba zainicjować lcd a dopiero następnie stworzyć znak/znaki..

    tak jest źle:

    lcd.createChar(0, stopnie); //stwórz znak o nazwie stopnie i przypisz jej numer 0
    lcd.begin(20,4); //ustaw rozdzielczość ekranu 20×4…

    a tak jest OK:

    lcd.begin(20,4); //ustaw rozdzielczość ekranu 20×4 lcd.createChar(0, stopnie); //stwórz znak o nazwie stopnie i przypisz jej numer 0…

    pozdr.

  • zipp

    przemiły diskkus uznał mój pierwszy komentarz za spam (rofl) więc napiszę jeszcze raz krótko by oszczędzić następnym frustracji:

    w podanym przykładzie jest błąd, a przynajmniej występuje gdy komunikacja z LCD realizowana jest przez i2c.
    Chodzi o kolejność instrukcji:
    najpierw trzeba zainicjować lcd a dopiero następnie stworzyć znak/znaki.(max. 8 sztuk:-)
    czyli powinno być tak:

    lcd.begin(20,4);
    lcd.createChar(0, stopnie);

    • Nie nazwałbym tego błędem bo inaczej obsługuję się LCD po i2C, a inaczej w trybie 4bitowym :)

      • zipp

        Dzięki za odpowiedź:-) Chciałem zostawić informację o tym fakcie dla innych rozmawiających z lcd po i2c, ze względu na powszechność i wygodę tego interfejsu. To drobny strzegół a może napsuć krwi;-)

        Czy masz obecnie możliwość sprawdzenia zapisu do LCD w trybie 4bitowym wedł. podanego przeze mnie przykładu(najpierw inicjalizacja lcd, następnie tworzenie znaków)?
        Jestem ciekaw czy w trybie 4bitowym działają obie wersje…