logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

RaspberryPi 2 + LCD16x2 - wyświetlanie zawartości pliku /tmp/plik.txt

TomaszGazda 13 Gru 2017 20:06 975 21
  • #1 16888454
    TomaszGazda
    Poziom 7  
    Posty: 8
    Witam
    Mam ogromną prośbę. Chciałbym wyświetlić zawartość pliku na wyświetlaczu LCD16x2, w tym że jestem na razie totalnie zielony w temacie i dopiero się uczę.
    Mam początkowy skrypt który wyświetla napis "Hallo world" na LCD ale zamiast tego chciałbym aby wyświetlił zawartość pliku który znajduje się w katalogu /tmp/plik.txt (zawortość pliku 1:22,22#2:33,33#3:44,44#4:55,55 itd. Ile śię zmieści na wyświetlaczu w dwóch liniach).
    Skrypt w C z ustawionymi pinami.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Z góry bardzo dziękuję za pomoc i za wyrozumiałość.
    Pozdrawiam
  • #3 16888732
    TomaszGazda
    Poziom 7  
    Posty: 8
    Bardzo dziękuję za odpowiedź. Staram się to rozkminić ale trochę mi to nie wychodzi. W tych kodach nie widzę jak wysłać tą zawartość do LCD.

    Dodano po 3 [godziny] 48 [minuty]:

    Udało mi się sklecić coś takiego. Jeszcze nie jest to o co mi chodziło ale postęp jest.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Teraz mam kolejne pytanie. Jak zrobić aby wartości z pliku test.txt były pobierane w pętli cały czas. Chodzi o to, że plik test.txt będzie aktualizowany co 2sekundy (z automatu będą podmieniane wartości).
  • #4 16889140
    dedito
    Poziom 39  
    Posty: 4770
    Pomógł: 527
    Ocena: 595
    Jak udaje się otworzyć plik i wysłać zawartość na ekran, to wysłanie tego na LCD nie wiele się różni od wysłania na ekran.
  • #5 16890836
    TomaszGazda
    Poziom 7  
    Posty: 8
    Ja wysyłam to od razu na LCD. Chodzi mi o to jak to zapętlić aby otwieało plik wysyłało do LCD i zamykało plik - i tak w kółko powiedzmy co 3 sekundy.
  • #6 16890915
    dedito
    Poziom 39  
    Posty: 4770
    Pomógł: 527
    Ocena: 595
    Zainteresuj się funkcją millis.
  • #7 16890984
    TomaszGazda
    Poziom 7  
    Posty: 8
    Ale jesteś tajemniczy :) Tak czytam ale nie bardzo wiem jak to zastosować. Proszę podpowiedz mi jak to zastosować na przykładzie mojego wcześniejszego kodu. Z góry bardzo dziękuję.
  • #8 16891859
    dedito
    Poziom 39  
    Posty: 4770
    Pomógł: 527
    Ocena: 595
    Czemu tajemniczy? Przykład jest na samej stronie arduino.
  • #9 16892456
    TomaszGazda
    Poziom 7  
    Posty: 8
    Jak już wcześniej pisałem jestem w tym zielony i nie wiem jak to zastosować. Jeżeli mógłbyś jakoś mnie nakierować w odniesieniu do mojego wcześniejszego kodu byłoby super. Próbuję to sam jakoś sklecić ale nie wychodzi :( .
    Dziękuję i pozdrawiam
  • #10 16892513
    JacekCz
    Poziom 42  
    Posty: 8670
    Pomógł: 760
    Ocena: 1464
    wytłumaczcie mi, jak blondynce, o czym wy mówicie? O raspbeerry? Arduino?
  • #11 16892574
    dedito
    Poziom 39  
    Posty: 4770
    Pomógł: 527
    Ocena: 595
    Pomieszały mi się wątki, mowa oczywiście o Raspberry.
    Trzeba zapomnieć o funkcji millis.
  • #12 16892616
    TomaszGazda
    Poziom 7  
    Posty: 8
    A to dlatego nic mi nie chciało z tego wyjść :)

    Dodano po 31 [minuty]:

    Zastanawia mnie jedno - dlaczego tak jest, że na forum jest tyle osób znających temat, i nie chcą pomóc zwykłemu laikowi który sam dla siebie coś chce zrobić . Naprawdę jestem zielony i nie mogę sobie z tym poradzić, a walczę z tym cały czas. To nie jest tak, że oczekuję gotowego kodu (a gdyby się tak stało to strasznie byłbym wdzięczny), ale staram się sam coś zrobić. Mimo wszystko dziękuję i pozdrawiam.
  • #13 16893435
    namok
    Poziom 25  
    Posty: 529
    Pomógł: 91
    Ocena: 74
    dedito napisał:
    Pomieszały mi się wątki, mowa oczywiście o Raspberry.
    Trzeba zapomnieć o funkcji millis.

    A niby dlaczego: https://projects.drogon.net/raspberry-pi/wiringpi/functions/

    @TomaszGazda tu: https://www.arduino.cc/en/tutorial/BlinkWithoutDelay masz przykład wykorzystania millis() do migania diodą. Łatwo zaadoptujesz to do obsługi pliku co określony czas.
  • #14 16894442
    dedito
    Poziom 39  
    Posty: 4770
    Pomógł: 527
    Ocena: 595
    No nawet nie wiedziałem, że jest biblioteka dla malinki.
    Autor nie powinien mieć to najpierw zainstalowane, ma już to dostępne w systemie?

    TomaszGazda napisał:
    Zastanawia mnie jedno - dlaczego tak jest, że na forum jest tyle osób znających temat, i nie chcą pomóc zwykłemu laikowi który sam dla siebie coś chce zrobić .
    Bo rzeczy o które pytasz są ogólnie dostępne, niestety wymaga to czasu i poświęcenia.
    Większość z nas zaczynała od podstaw programowania, potem od prostych przykładów i z czasem robiła większe rzeczy. Ty chcesz przeskoczyć co najmniej jeden krok.
    TomaszGazda napisał:
    To nie jest tak, że oczekuję gotowego kodu (a gdyby się tak stało to strasznie byłbym wdzięczny)
    No i fajnie, dostałeś już wskazówki więc czas je wdrożyć w życie.

    Proponuję zrobić najpierw prostą rzecz: wylistować zawartość pliku na ekran.

    Poniżej masz przykład gdzie użyto odpowiednika funkcji millis oraz wyświetlania zawartości pliku.
    http://ozzmaker.com/interface-16x2-lcd-with-the-raspberry-pi/
  • #15 16896325
    JacekCz
    Poziom 42  
    Posty: 8670
    Pomógł: 760
    Ocena: 1464
    dedito napisał:

    Poniżej masz przykład gdzie użyto odpowiednika funkcji millis oraz wyświetlania zawartości pliku.
    http://ozzmaker.com/interface-16x2-lcd-with-the-raspberry-pi/


    Platformy raspeberry i arduino mają jedno wspólne: dźwięczną nazwę.
    Nie da się przenieść filozofii "bare-metal" na mikrokomputer posiadający system operacyjny. W jak tutaj mówimy o czasie, to w systemie nie będącym systemu rzeczywistego mocno inaczej się zachowuje.

    W podanym linku implementacja arduinpowej filozofii millis() na gruncie raspberry jest po pierwsze błędna, po drugie niewydajna.

    Po trzecie, kod jest fatalnie zaplanowany, funkcje które mają zakłamane nazwy, jadą na efektach globalnych, gdzie należało by użyć argumentów itd... anty-wzorzec jak to należy robić. Odczuwam, ze ten pisał ktoś usilnie próbujący przekopiować maksimum doświadczeń z bare-metal., nie rozumiejący 'signal()' itd ...

    Z każdym takim kodem utwierdzam się: nie widzę statystycznej możliwości dobrze nauczyć się C zaczynając C+uP
  • #16 16896335
    dedito
    Poziom 39  
    Posty: 4770
    Pomógł: 527
    Ocena: 595
    JacekCz napisał:
    Po trzecie, kod jest fatalnie zaplanowany, funkcje które mają zakłamane nazwy, jadą na efektach globalnych, gdzie należało by użyć argumentów itd... anty-wzorzec jak to należy robić. Odczuwam, ze ten pisał ktoś usilnie próbujący przekopiować maksimum doświadczeń z bare-metal., nie rozumiejący 'signal()' itd ...
    Proszę w takim razie pokazać jak to poprawnie zrobić.
  • #17 16896490
    JacekCz
    Poziom 42  
    Posty: 8670
    Pomógł: 760
    Ocena: 1464
    dedito napisał:
    JacekCz napisał:
    Po trzecie, kod jest fatalnie zaplanowany, funkcje które mają zakłamane nazwy, jadą na efektach globalnych, gdzie należało by użyć argumentów itd... anty-wzorzec jak to należy robić. Odczuwam, ze ten pisał ktoś usilnie próbujący przekopiować maksimum doświadczeń z bare-metal., nie rozumiejący 'signal()' itd ...
    Proszę w takim razie pokazać jak to poprawnie zrobić.


    1. sam napisałeś:
    dedito napisał:

    Proponuję zrobić najpierw prostą rzecz: wylistować zawartość pliku na ekran.


    A ja się to robi?
    Używa funkcji o nazwie oddającej czynność, mającej jeden efekt, a nie kilka. Oddziela się zakresy odpowiedzialności. Nie ma funkcji void(void).
    Zwraca wynik (handler pliku), lub podaje argumenty, a nie robi na globalach.
    Jak już aplikacja musi zrobić dwa w jednym, nie pisze się 'uptime()', najwyżej print_uptime(); Taka nazwa jest dla mnie dopuszczalna w kodzie aplikacyjnym (choć nie w bibliotece).

    Ja konkretnie bym LCD wyraził w klasie C++ i pewnie zrobił to implementujące stream.

    2. Systemy operacyjne ogólnego użytku, w tym linux/raspbian mają problem nie tylko z koncepcją milisekundy (jest to przestrzeń matematycznie nieciągła, na pecetach sławne 17ms), i/oraz z realizacją (opóźnienia). Tam gdzie odmierzanie ms jest naprawdę ważne, wydziela się na "bare metal" (choćby attiny85 - realny projekt krótkofalarski)

    W podanym fragmencie getttimeofday() ma wyraźnie podkreślone w dokumentacji, żeby tak nie używać, jak jest użyte. Warto postudiować man'uale do grupy funkcji czasowych (z grupy (2) dla programistów) , np crontab dla adminów.

    Z cytowanych w wątku rozwiązań, bardziej wierzę z nieprzenośnie Wiring pracujące z GPIO. Zakładam, ze czas stamtąd zczytany ma odpowiednią rozdzielczość, choć nie ma gwarancji, że opóźnienie nie zajdzie (bo się OS akurat "uwidzi" coś robić)
  • #18 16896508
    dedito
    Poziom 39  
    Posty: 4770
    Pomógł: 527
    Ocena: 595
    Autor raczej nie oczekuje wzorca czasowego.
  • #19 16896575
    JacekCz
    Poziom 42  
    Posty: 8670
    Pomógł: 760
    Ocena: 1464
    dedito napisał:
    Autor raczej nie oczekuje wzorca czasowego.


    a czy to ja zaproponowałem millis() ?
    Mówi o 3 sekundach, co jest w pełni osiągalne w świecie linux-a (choć nie zastanawiajmy się, że będzie to astronomiczne 3 miliony mikrosekund).

    Pojawiające się już man odsyła do tej grupy:
    http://man7.org/linux/man-pages/man2/clock_gettime.2.html


    PS. byłem łaskaw dłużej poczytać źródła WiringPi. Utwierdziłem się, to zła robota: emulowanie szybkiego i efektywnego na arduino "digitalWrite()" na kosztowną (z natury - i czułą na prawa) operację plikową systemu operacyjnego, tylko dlatego, aby zachować chore nawyki programistów arduino (dla mnie: równanie w dół). Biblioteka, która ze swojego wnętrza wykonuje exit() ... rasowy programista linuxowy tego nie wymyślił.
    Szanuję robotę "drajwerową" w tym projekcie *), ale koncepcja projektowa WiringPi ma moim zdaniem wiele chorych elementów

    Powtórzę: arduino i raspberry to głęboko różne rzeczy.


    *) na marginesie: są na twardo wbudowane listy płyt RP, więc na klonie to może chodzić lub nie. Po raz kolejny: jako klasa C++ by się to wyraziło dużo lepiej.
  • #21 16897406
    TomaszGazda
    Poziom 7  
    Posty: 8
    Witam. Dziękuję za wypowiedzi, ale jak to teraz czytam, to kompletnie nie wiem co mam dalej robić, a już nie wspomnę o moim kodzie (skopany kompletnie). Mimo wielu walk jak narazie jeszcze mi się nie udało osiągnąć mojego zamierzonego celu. Nadal walczę ale pomału zaczynam się zastanawiać czy w ogóle mi to wyjdzie.
    Z wyrazami podziwu i szacunku dla poprzedników.
    Tomek
  • #22 16929386
    TomaszGazda
    Poziom 7  
    Posty: 8
    Witam . Po chwilowej przerwie postanowiłem wrócić do tematu.
    Udało mi się zrobić po części to co zamierzałem z małym wyjątkiem a mianowicie:
    W pliku test.txt jest ciąg znaków, a które się nie mieszczą na wyświetlaczu LCD 2x16. Jak zrobić aby np najpierw wyświetliło na LCD część znaków a po chwili następną i następną aż wyświetli wszystko, i tak w ciągłej pętli. Proszę pomóżcie mi to ogarąć bo już zaczynam siwieć.
    Zawartość pliku test.txt
    Cytat:
    t1=22,2 t2=33,4 t3=25,2 t4=34,2 t5=22,3 t6=33,3 t7=22,3 t8=23,2

    Przypomnę że te wrtości będą się zmieniać oprócz t1, t2,t3,t4,t5,t6,t7,t6 - to będzie stałe.

    Kod który do tej pory udoło mi się zrobić.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Jeszcze raz bardzo proszę o pomoc i z góry dziękuję.

Podsumowanie tematu

LABEL_AI_GENERATED
Użytkownik poszukuje pomocy w wyświetlaniu zawartości pliku tekstowego na wyświetlaczu LCD16x2 przy użyciu Raspberry Pi 2. Początkowo miał skrypt wyświetlający "Hello, world!", ale chciałby, aby zamiast tego wyświetlał dane z pliku /tmp/plik.txt. W odpowiedziach podano różne wskazówki dotyczące otwierania plików w C oraz przesyłania ich zawartości na LCD. Użytkownik zmaga się z implementacją pętli, która co kilka sekund odświeża wyświetlane dane. Wskazówki obejmują użycie funkcji millis oraz przykłady kodu, ale użytkownik nadal ma trudności z ich zastosowaniem. W końcu użytkownik chce, aby tekst był wyświetlany w częściach, aby zmieścić się w ograniczeniach wyświetlacza.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA