[Arduino] Sterowanie wyświetlaczem 7 segmentowym 4 cyfrowym z wykorzystaniem rejestru 4094

[Arduino] Sterowanie wyświetlaczem 7 segmentowym 4 cyfrowym z wykorzystaniem rejestru 4094

Witam. Mam 16 lat. Arduino zajmuje się od około miesiąca. Jest to mój pierwszy taki poradnik, tak więc proszę o wyrozumiałość :-)

Od początku przygody z Arduino szukałem jak najlepszego rozwiązania, aby obsłużyć 4 cyfrowy wyświetlacz. Większość stron na ten temat była po angielsku i ciężka do zrozumienia, a tamte rozwiązania mało uniwersalne. W końcu natrafiłem na wpis na tym portalu o wyświetlaczu jednocyfrowym. Nauczyłem się stamtąd sporo o SPI i gdy zrozumiałem na czym to polega, postanowiłem napisać własną klasę do obsługi wyświetlaczy 4 cyfrowych. Klasa obsługuje zarówno wyświetlacze ze wspólną anodą jak i katodą.

 WP_20150123_003

Co potrzebujemy:

  • – 1 rejestr przesuwający 4094. Można go nabyć za grosze na allegro.
  • – Klasa do obsługi wyświetlacza. Do pobrania stąd
  • Wyświetlacz
  • – I oczywiście Arduino. Ja będę wszystko pokazywał na przykładzie klona Arduino Uno
  • – Klasa Timer (też mojego autorstwa) do odliczania czasu bez funkcji delay()

Układ:

Aby nie odsyłać do innego wpisu, krótko opiszę jak podłączyć rejestr.

4094
źródło: http://www.jaycar.com.au/images_uploaded/CD4094BC.PDF

Korzystając ze tej strony wejście STROBE rejestru podłączamy do SS na Arduino (10 w przypadku Uno), DATA do MOSI i CLOCK do SCK.

Do VDD podłączamy zasilanie 5V, a do VSS masę (GND). OUTPUT ENABLE jest włącznikiem rejestru, dlatego można podłączyć go do jakiegoś pinu na Arduino lub po prostu pod 5V, aby był cały czas włączony.

300px-7_segment_display_labeled_svg
źródło: http://pl.wikipedia.org/wiki/Wy%C5%9Bwietlacz_siedmiosegmentowy

Q1-Q8 podłączamy do wyświetlacza według następującej kolejności:

A, B, C, D, E, F, G, DP

Pozostałe wejścia na wyświetlaczu podłączamy do Arduino

Łatwiej będzie odpowiednio dopasować podłączenia pod wgraniu poniższego kodu.

Kod:

Pobrane klasy wraz z całymi folderami wrzucamy do [miejsce instalacji Arduino]\libraries\

 

WP_20150123_004
Parametry przy tworzeniu obiektu do obsługi wyświetlacza:

  • – pierwsze 4 to kolejne piny do których podłączyliśmy wyświetlacz do Arduino
  • – następnie rodzaj wyświetlacza, HIGH – wspólna anoda, LOW – wspólna katoda
  • – pin Slave Select (SS)

Więcej szczegółowych informacji o funkcjach znajduje się w pliku Display4Digits.h

Jak widać całość wymaga 7 pinów na Arduino. W niedalekiej przyszłości planuję modyfikację kodu i dodanie kolejnego rejestru, aby zmniejszyć liczbę pinów do 3.

Dlaczego nie wolno korzystać z delay()?

Do rejestru dane wysyłane są 4 seriami, oddzielnie dla każdej cyfry (ograniczenie wyświetlacza wielo-cyfrowego. Każda cyfra jest zapalona przez 1/1000 sekundy i tak wszystkie po kolei. Nie widać tego gołym okiem. Stosując funkcję delay() wyświetlacz będzie robił przerwy w wyświetlaniu, zatrzymując cały program. Klasa Timer zapobiega takim problemom.

Jak widać wykorzystanie mojej klasy jest bardzo wygodne. Zmiana wyświetlanej liczby wymaga tylko użycia funkcji update(int). Funkcja obsługuje liczby z zakresu -999 do 9999.

Ocena: 4.49/5 (głosów: 51)

Podobne posty

19 komentarzy do “[Arduino] Sterowanie wyświetlaczem 7 segmentowym 4 cyfrowym z wykorzystaniem rejestru 4094

  • Witam! Wszystko cacy :) I fajnie. Mam tylko małą krytykę (mam nadzieję, że konstruktywną :))

    1. Zastosuj rezystory (R330) przy każdym segmencie, by ograniczyć prąd dla każdej diody (segmentu). Dla zasilania 5V i standardowej czerwonej diody jest to 10mA. Dlatego taki rezystor. Dzięki temu wydłużysz żywotność diody.
    2. Następne piny tworzą multiplekser. Znaczy się, zależnie czy jest to wspólna katoda czy anoda. PIN z arduino zasila cały wyświetlacz lub odbiera z niego energię. Przy zapalonych 8 segmentach jest to prąd 80mA. U Ciebie może być nawet większy ponieważ nie ograniczasz prądu dla diod. A obciążenie jednego PINu w arduino to max 20mA. Przy jednoczesnym ograniczeniu całkowitego obciążenia do 200mA (takie obciążenie wytrzymują piny zasilające). Także aby tutaj nie nadwyrężać pinów zasilających powinieneś zastosować tranzystory. Przy kluczowaniu tranzystorem NPN ze wzmocnieniem w stanie nasycenia żędu x10 powinien to być rezystor ok. R500. Schemat takiego połączenia powinien wyglądać jak na załączniku.

    Pozdrawiam, Daniel.

    Odpowiedz
    • 1)Brak załącznika
      2)Przy kluczowaniu tranzystorem NPN ze wzmocnieniem w stanie nasycenia żędu x10 powinien to być rezystor ok. R500. Schemat takiego połączenia powinien wyglądać jak na załączniku. ale skąd kolega wie jakiego tranzystora użył by autor że tak wyliczył te 500Ohm. Co jeżeli zdecydował by się na układ darlingtona? Te 500Ohm nie ma raczej wtedy sensu.

      Odpowiedz
      • Dlatego napisałem, że przy tranzystorze ze wzmocnieniem x10, to znaczy takim dla którego w datasheet na wykresach podane jest x10 :) Chodzi o skalar prądu bazy i prądu emitera. A 500 wzięło mi się stąd, że właśnie zakończyłem zegarek dla kolegi i z obliczeń dla tranzystorów, które użyłem było to 577OHm, wiadomo, nie ma takich w szeregu dlatego należy przyjąć trochę mniejszy rezystor by prąd bazy był większy niż graniczne 80mA przy wszystkich zapalonych segmentach :) A załącznika niestety mi nie załączyło, mimo iż dodałem :P To chyba informacja dla szanownego kolegi Łukasza Więcka :)

        Odpowiedz
  • Program działa, wyświetlacz pokazuje, jest fajnie. Ale spróbuj podłączyć chociażby termometr ds18b20 lub coś innego i pokazywać odczyty na tym wyświetlaczu. Podpowiem, że będzie migać ponieważ odczyt będziesz musiał dodać do tej pętli i wyswietlacz.display() będzie się wykonywać rzadziej o czas odczytu.
    Do aktualizacji wyświetlacza najlepiej wykorzystać przerwanie timera. Wtedy biblioteka będzie nadawała się do użytku w innych projektach niż pokazywanie licznika.

    Odpowiedz
  • Uważam, że projekt fajny. Nigdy nie lubiałem multiplexingu, ale ta biblioteka mnie do niego zachęciła. Tylko mam takie pytanie. Czy działa ta biblioteka z rejestrem 84hc595, czy musi być ten i tylko ten ?

    Odpowiedz
  • Dzisiaj mam czas na zabawę z arduino,jednak dlaczego nie ma tu schematu? Z opisu można się dowiedzieć, ale łatwiej jest patrzeć na fritzingowy schemat :-).

    Odpowiedz
  • Jakiś pomysł na podłączenie 2 takich wyświetlaczy?
    Męczę się z tym od jakiegoś już czasu i nic…

    Display4Digits wyswietlacz(5, 4, 3, 2, HIGH, 10);
    Display4Digits wyswietlacz2(9, 8, 7, 6, HIGH, 10);

    Rozwiązanie powyżej nie działa, na każdym wyświetlaczu wyświetlają się po 3 pierwsze cyfry, a na ostaniej pozycji zawsze zapalona jest cyfra ‘8’ wraz z kropką

    Odpowiedz
  • Witam.
    A może koledzy pomogli by nowicjuszowi? Mam kod sterujący zmiana kanałów w efekcie…i chce dołożyć wyświetlacz 2 cyfrowy 7seg ;) Czy tez muszę go sterować rejestrem? czy da się to obejść…i sterować go biblioteką sevenseg.h? ;)
    Chodzi mi oczywiście o jak najmniejszą ilość pinów…7 będzie ok…góra 9…bo dwa mam zarezerwowane na przyciski… ::) Nigdzie nie mogę znaleźć tutoriala…na taki wyświetlacz…pomocny też będzie jakiś szkic, schemat podłączenia ;)
    Z góry dzieki ;)
    Dla chcących pomóc; active.man.on@gmail.com

    Odpowiedz

Odpowiedz

anuluj

Masz uwagi?