Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Wyświetlanie rdsText na HD44780.

hevet 12 Sty 2019 09:42 231 27
  • #1 12 Sty 2019 09:42
    hevet
    Poziom 10  

    Zrobiłem radio na wyświetlaczu HD44780 20x4 i module SI4703.
    Radio odbiera rdsText, który może mieć do 64 znaków. Na razie mam ustawione do 20 znaków bo tyle jestw jednej linii wyświetlacza. Próby z przewijaniem tekstu zakończyły się niepowodzeniem bo przewija mi wszystkie linie, a nie tylko rdsText. Jak zrobić by przewijało tylko jedną linię, lub druga możliwość by rdsText dzielił się na 2 linie czyli byłoby łącznie 40 znaków? Tylko gdy tak ustawię to tekst dzieli się na 1 i 3 linię, 2 i 4, a chciałbym na 3 i 4. Korzystam z biblioteki liquidCrystall.

    0 27
  • #3 12 Sty 2019 11:18
    LChucki
    Poziom 20  

    hevet napisał:
    Jak zrobić by przewijało tylko jedną linię

    Napisz funkcję, która to zrealizuje. Wystarczy prosta pętla. Niestety będzie to wyglądać bardzo źle (skaczący tekst). Aby przewijanie było płynne musiałbyś użyć wyświetlacza graficznego. Odszedłem od wyświetlaczy tekstowych, na rzecz graficznych. Daje to duże możliwości a cena graficznego nie jest kolosalnie większa niż tekstowego. W starych projektach można zrobić lifting, bo sa LCD graficzne, często OLED, kompatybilne z HD44780 np WEG010016ALPP5N00000.



    hevet napisał:
    by rdsText dzielił się na 2 linie czyli byłoby łącznie 40 znaków

    Użyj komendy ustawiania kursora. HD44780 ma taką.

    0
  • #4 12 Sty 2019 12:00
    hevet
    Poziom 10  

    Mam też graficzny wyświetlacz, ale to na później.
    Pewnie słabo przewija ale mimo wszystko chce spróbować najpierw na nim.

    Dodano po 7 [minuty]:

    Z ustawianiem kursora to chodzi o setCursor?

    0
  • #6 12 Sty 2019 13:09
    hevet
    Poziom 10  

    Tak tylko jak ustawię (0,2) to rds wyświetla się w całej drugiej linii, a dalszy ciąg w pierwszej a nie w trzeciej.

    0
  • #8 12 Sty 2019 13:39
    hevet
    Poziom 10  

    Ale jakie znaki ja mam wpisać jak to jest rdsText, czyli to co odczyta moduł radia?

    0
  • #10 12 Sty 2019 14:19
    kacpo1
    Poziom 31  

    hevet napisał:
    Ale jakie znaki ja mam wpisać jak to jest rdsText, czyli to co odczyta moduł radia?

    Ale gdzieś w mikrokontrolerze ten tekst musi występować, czy to w postaci String czy ciągu Char, pokaz jaki masz kod.
    LChucki napisał:
    Przeczytaj w nocie katalogowej LCD jaka jest organizacja ekranu, dokładniej jak uzyskano 4 wiersze choć sterownik przystosowany jest do dwu.

    Co autorowi da znajomość budowy wyświetlacza bez wiedzy dot. jego obsługi.

    0
  • #13 12 Sty 2019 15:44
    LChucki
    Poziom 20  

    kacpo1 napisał:
    Autor pracuje na gotowej bibliotece, a nie wysyła informacji ręcznie.

    Jaki problem zmodyfikować bibliotekę albo napisać swoją funkcję np ustawiającą kursor tak jak chcę?
    Naturalnie, do tego trzeba przeczytać notę sterownika wyświetlacza i przeanalizować bibliotekę sterująca LCD.

    Prawie nigdy nie znalazłem biblioteki, która w 100% spełniałaby moje wymagania, ot choćby w przypadku LCD alfanumerycznych, znasz taką, która dynamicznie przydziela wzory własnych znaków umożliwiając posiadanie więcej niż 8 własnych znaków? Albo bibliotekę, która potrafi wyświetlać animację składająca się z powiedzmy 20 klatek na jednym własnym znaku?

    W wyżej wymienionych przypadkach, może szukać nie wiadomo ile lub czekać w nieskończoność aż ktoś zrobi stosowną bibliotekę. Jak się pojawi lub znajdziesz, to okaże się, ze nie obsługuje LCD 4x20 :-) Zmodyfikowanie istniejącej biblioteki jest najprostszym i najszybszym rozwiązaniem. Wystarczy znać C++ (jak się pisze programy na Arduino to "oczywista oczywistość", że język się zna) i posiadać notę katalogową LCD. W dobie Internetu to nie jest problemem, prawda?

    0
  • #14 12 Sty 2019 17:18
    hevet
    Poziom 10  

    Kod odpowiedzialny za rdsText

    char rdsText[20];

    void DisplayText(char *text)

    {

      strncpy(rdsText, text, sizeof(rdsText));

      lcd.setCursor(0, 2);

      lcd.print(rdsText);


    }

    0
  • #15 12 Sty 2019 17:22
    LChucki
    Poziom 20  

    Kod umieść w znacznikach SYNTAX!
    Zdefiniowałeś bufor "rdsText" na 19 znaków a wyświetlacz ma 20 kolumn. Dlaczego dałeś tylko 19? Czy w jednej z kolumn wyświetlasz jakieś informacje? Wcześniej pisałeś, że chcesz wyświetlać w wierszu tylko tekst.

    Jak chcesz umieścić tekst w 2 liniach, to zdefiniuj bufor na 40 znaków. W pierwszej linii LCD wyświetl pierwsze 20, w drugiej kolejne 20. Co w tym trudnego?

    0
  • #16 12 Sty 2019 19:16
    hevet
    Poziom 10  

    Nie pisałem o tekście tylko rdsText, pisałem też co będzie jak zrobię bufor 40, podzieli mi na 2 i 1 linię.
    0 i 1 linia jest zajęta przez inne rzeczy.

    0
  • #17 12 Sty 2019 19:29
    LChucki
    Poziom 20  

    hevet napisał:
    pisałem też co będzie jak zrobię bufor 40

    Jak deklarujesz bufor na 40 znaków?

    hevet napisał:
    podzieli mi na 2 i 1 linię.

    Tego nie rozumie. Jak podzieli na dwie i jedna linię? Pokaż przykład.

    hevet napisał:
    0 i 1 linia jest zajęta przez inne rzeczy.

    To ustawiaj kursor tam gdzie chcesz.
    Przyznam, że nie wiem z czym masz problem. Komendę ustawiania kursora masz. Wyświetlania tekstu od określonego miejsca tekstu o określonej długości masz. Co jeszcze jest potrzebne?

    0
  • #18 12 Sty 2019 19:34
    hevet
    Poziom 10  

    Nie wiem jak mam to Tobie jeszcze wytłumaczyć.
    Na drugą i pierwszą linię. Jak zmienię char na 40 wyświetli 20 znaków w drugiej linii, a następne 20 znaków nie na trzeciej a na pierwszej linii, gdzie jest już co innego i robi nakładkę.

    0
  • #19 12 Sty 2019 20:20
    LChucki
    Poziom 20  

    hevet napisał:
    Nie wiem jak mam to Tobie jeszcze wytłumaczyć.

    Narysuj tak jak prosiłem.

    hevet napisał:

    Na drugą i pierwszą linię. Jak zmienię char na 40 wyświetli 20 znaków w drugiej linii, a następne 20 znaków nie na trzeciej a na pierwszej linii

    Nie czytałeś o organizacji wyświetlaczy 4x20. Przeczytaj!

    hevet napisał:

    gdzie jest już co innego i robi nakładkę.

    Hasła na dziś:
    - Organizacja wyświetla (odwzorowanie CGRAM na wyświetlaczu).
    - Ustawianie kursora.
    - Wyświetlanie tekstu od określonego ofsetu.
    - Rezerwacja bufora na tekst (nie napisałeś jak to robisz, zakładam, że źle, skoro dla 20 znaków zrobiłeś źle, to i dla 40 robisz źle).

    0
  • #20 12 Sty 2019 23:42
    emarcus
    Poziom 35  

    hevet napisał:
    Zrobiłem radio na wyświetlaczu HD44780 20x4 i module SI4703.
    Radio odbiera rdsText, który może mieć do 64 znaków. Na razie mam ustawione do 20 znaków bo tyle jestw jednej linii wyświetlacza. Próby z przewijaniem tekstu zakończyły się niepowodzeniem bo przewija mi wszystkie linie, a nie tylko rdsText. Jak zrobić by przewijało tylko jedną linię,

    Tu masz link do przykładu na scrolling tylko jednej linii.
    http://www.arduinotutorialonline.com/2018/01/lcd-scrolling-text-only-single-row.html
    Wytestuj jakie masz ograniczenia w tej metodzie i możliwości zmiany wyświetlanego/scrolowanego stringu podczas 'run' programu.
    Nie mam czasu tego testowac, jednak to byłby punkt wyjścia dla ciebie..., kombinuj!!!
    Długośc stringu może byc dłuższa niz 80 znaków...

    e marcus

    0
  • #21 13 Sty 2019 01:25
    hevet
    Poziom 10  

    Niestety jeszcze długa droga przede mną, by ogarnąć niektóre rzeczy. Kod na przewijanie jednej linii już mam, teraz zabawa by zadziałało to z rdsText-em.

    0
  • #22 13 Sty 2019 23:49
    hevet
    Poziom 10  

    Jak byście chcieli wiedzieć to za cienki jestem w te klocki. Z przewijaniem nie wyszło, nic nie wyświetlało mimo różnych kombinacji.
    Z podziałem na wiersze to wyczytałem tyle, że pierwszy wiersz ma jakby kontynuację w trzecim, a drugi w czwartym dlatego dzieje się tak u mnie jak pisałem. Jak to zmienić nie mam pojęcia. Podane są adresy poszczególnych linii, ale nie oświeciło mnie jeszcze, żeby coś z tym zrobić, gdzie zmienić czy w kodzie coś dopisać, czy w bibliotece zmienić.

    0
  • #23 13 Sty 2019 23:57
    LChucki
    Poziom 20  

    hevet napisał:
    Z przewijaniem nie wyszło, nic nie wyświetlało mimo różnych kombinacji.

    Pokaż te kombinacje.

    hevet napisał:
    Z podziałem na wiersze to wyczytałem tyle, że pierwszy wiersz ma jakby kontynuację w trzecim, a drugi w czwartym

    Dokładnie tak jest.

    hevet napisał:
    Jak to zmienić nie mam pojęcia.

    Po wyświetleniu znaku nr 20 przesuń kursor odpowiednią lokalizację. Wymaga to jednak grzebanie w spier... kodzie drivera LCD (moje tego mankamentu nie mają).
    Jak nie chcesz się babrać w cudzym kodzie, stwórz dwie tablice mieszczące po 20 znaków. Do pierwszej skopiuj pierwsze 20 znaków, do drugiej kolejne 20. Teraz tylko ustaw kursor na linię np 1, kolumnę 0, wyświetl tekst z tablicy 1, następnie linię 2 (czyli 3) i wyświetl tekst z tablicy 2.

    0
  • #24 14 Sty 2019 00:00
    hevet
    Poziom 10  

    Chętnie bym i pokazał, ale wróciłem do działającego kodu sprzed kombinacji.

    0
  • #26 14 Sty 2019 13:36
    hevet
    Poziom 10  

    Jak stworzyć te dwie tablice z podziałem na 20 znaków z rdsText?

    Zostaje char rdsText[40]; ?

    0
  • #27 14 Sty 2019 14:35
    kaczakat
    Poziom 22  

    Robisz sobie tablice (bufor1) na 20 znaków dla 1 linii ekranu, drugi bufor2 na cały tekst RDS. Jak przyleci napis to wrzucasz cały tekst do bufora, potem kopiujesz sobie kawałeczkami kolejne 20 znaków znaków do bufora linii i wyświetlasz całą linię co np. 200ms. Między programem a LCD to tylko cykliczne wyświetlanie linii, a w programie po prostu podmieniasz zawartość tej linii.

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #28 14 Sty 2019 14:47
    LChucki
    Poziom 20  

    Jak już opanujesz metodę z dwoma buforami, to później zrób na jednym (dwa razy mniejsze zużycie RAM przez bufory). Wystarczy, że wyświetlając linie nr 1 ograniczysz długość wyświetlanego tekstu do 20 znaków, a wyświetlając linie nr dwa wskażesz nie "bufor" tylko "bufor + 20" (aby uniknąć problemów "bufor + 20" umieść w nawiasach.

    0