Wyświetlacz LED z TM1637 – uruchomienie

W swoich konstrukcjach często stosuję taki wyświetlacz:

led_02Sterowanie 4-ma cyframi na 7-segmentowym wyświetlaczu LED było dotychczas lekkim koszmarem. Oznaczało mnóstwo połączeń, rezystorów podciągających i wielo-nóżkowych sterowników. A tu, jaka miła niespodzianka: tylko 4 piny!

Budowa

Wyświetlacz składa się z 4 kostek LED przedzielonych znakiem „:”. Każda z kostek składa się z 7 segmentów układających się w liczbę „8”. Wyświetlacz ma rozmiar około 42x24x11mm
led_00Wyświetlacz sterowany jest przez kontroler TM1637.

led_04Dzięki TM1637 do podłączenia wystarczą tylko 4 piny, w tym:

  • CLK: wyjście zegarowe,
  • DIO: dane,
  • VCC: zasilanie,
  • GND: masa

Wyświetlacz może być zasilany napięciem 3-5v. Musicie jednak zwrócić uwagę na pobór prądu. Niektóre strony w Sieci mówią, że pobiera nawet 250mA! To stosunkowo dużo, przyjrzymy się tej wartości w szczegółach.

Podłączenie wyświetlacza

Dzięki wbudowanemu TM1637, podłączenie wyświetlacza jest bardzo proste:

  • Pin Vcc podłączamy do 5V Arduino,
  • Pin GND podłączamy do GND Arduino,
  • Pin CLK podłączamy do pinu cyfrowego Arduino, np D4,
  • Pin DIO podłączamy do pinu cyfrowego Arduino, np D3.

led_02

Instalacja biblioteki

Do obsługi wyświetlacza wykorzystałem bibliotekę avishop. Pobierzcie ją i rozpakujcie do podkatalogu ./libraries wskazanego przez ustawienia Arduino IDE – u mnie „/home/arek/sketchbook/libraries”. Katalog ten możecie odczytać w okienku File/Preferences (Plik/Preferencje):

IR_01Po tym jak rozpakujecie pliki, zamknijcie Arduino IDE. Po jego ponownym otwarciu bibliotekę znajdziecie w „Sketch/Include libraries” („Szkic/Dołącz bibliotekę”) pod nazwą „TM1637”.

Uruchamianie biblioteki

Otwórzcie teraz nowy szkic. Użyjcie menu „Sketch/Include libraries/TM1637” („Szkic/Dołącz bibliotekę/TM1637”). W Waszym szkicu pojawi się nagłówek biblioteki:


Bibliotekę tą musicie dodać przez menu. „Ręczne” wpisanie linii:

…nie zadziała i skończy się błędami przy kompilacji szkicu!

Teraz trzeba stworzyć obiekt klasy TM1637Display, np:

Dodałem tutaj dwie instrukcje #define CLK 4 oraz #define DIO 5. Definicje te odnoszą się do portów Arduino, do których podłączyłem piny CLK i DIO wyświetlacza – w tym przypadku cyfrowe D4 i D3. Jeżeli podłączycie wyświetlacz do innych portów Arduino, będzie musieli linijki te odpowiednio zmienić.

Kolejna linia: TM1637Display display(CLK, DIO); deklaruje zmienną display, która jest obiektem klasy wyświetlacza. To do jej metod będę się odwoływał w moim programie.

Interfejs biblioteki składa się z kilku funkcji:

Metoda Opis
setBrightness(
brightness)

Ustawia jasność brightness wyświetlacza. W praktyce istnieje pewna wartość progowa, powyżej której na wyświetlaczu pojawią się znaki.

Warto umieścić tą funkcję w „setup()”

showNumberDec(
num,
leading_zero,
length,
pos);

Wyświetla na ekranie numer num. Parametr leading_zero może przyjmować wartość false lub true; jeżeli true: liczba num jest dopełniana zerami do ilości length. pos oznacza pozycję, od której wyświetlana jest num (0: lewy segment wyświetlacza, tutaj: 3: najbardziej prawy).

UWAGA: czyści wyświetlacz tylko pod odświeżanymi cyframi!

setSegments(
segments[],
length,
pos);
Wyświetla kombinację określoną przez segments od pozycji pos. Tabela segments ma length elementów.
encodeDigit(
digit);
Zamienia podaną liczbę digit (0-15) na wartość odpowiadającą kodom segmentów; liczby powyżej 9 traktowane są jako heksadecymalne (A, B, C, D, E, F); zwróconą wartość możecie użyć z funkcją setSegmants().

Więcej o metodzie setBrightness()

Metoda setBrightness() służy do ustawienia jasności wyświetlacza. W praktyce działa ona od pewnej wartości progowej, poniżej której wyświetlacz jest całkowicie ciemny, a powyżej – zaczyna świecić. Im większą liczbę podacie jako parametr tej metody, tym wyświetlacz będzie jaśniej świecił.

Wywołanie setBrightness() jest absolutnie konieczne, żeby coś pojawiło się na Waszym wyświetlaczu!

Najlepiej umieścić wywołanie tej metody w funkcji setup(), o tak:

Mój wyświetlacz działa od display.setBrightness(0x08);. Maksymalną jasność uzyskuję display.setBrightness(0x0F);.


W powyższych przykładach użyłem liczb szesnastkowych: 0x08, 0x0F. przedrostek „0x” oznacza liczbę szesnastkową. System szesnastkowy (heksadecymalny) jest trochę inny niż używany przez Was na co dzień system dziesiątkowy. Oprócz liczb 0-9 wykorzystuje A, B, C, D, F. Szesnastkowe 0x0F to dziesiętne 15.

Wiecej o metodzie showNumberDec()

Metoda showNumberDec() pozwala na wyświetlenie na zadanej pozycji na ekranie liczby dziesiętnej oraz dopełnienie jej zerami.

Metoda ta przyjmuje 4 parametry:

  • num: cyfra, która ma być wyświetlona,
  • leading_zero, może przyjmować wartość false lub true; jeżeli true: liczba num jest dopełniana zerami do ilości length.
  • length: długość liczby, np. „1”: długość 1, „10”: długość 2, ale możecie również podać dla „1” długość 3 – i w ten sposób dopełniając zerami (leading_zero=true”) uzyskać „001”,
  • pos”: pozycja, od której wyświetlana jest num (0: lewy segment wyświetlacza, tutaj: 3: najbardziej prawy).

Kilka przykładów użycia:

  • Wyświetl ‚0002’:
  • Wyświetl: ‚_05_’ (‚_’:puste miejsce):
  • Wyświetl ‚_ _ 10’:

    Ale uwaga: ‚_ _ _ 1’:
  • Podobnie: ’15_ _’:

    Ale: ‚5 _ _ _’
  • Wyświetl: ‚0123’

    Ale: ‚123_ ‚

Więcej o metodzie setSegments()

Metoda setSegments() pozwala na wyświetlenie dowolnego kształtu zbudowanego z segmentów wyświetlacza.
Przykładowo, setSegments() może posłużyć np. do wyczyszczenia wyświetlacza. Zadeklarujemy tablicę 4-ro elementową clearMe wypełnioną zerami:

W ten sposób Wasz wyświetlacz zostanie wyczyszczony.

Biblioteka TM1637 definiuje stałe SEG_A… SEG_G. Odpowiadają one segmentom kostki wyświetlacza:

tm1637_0
Spróbujmy: napis „GO”:

tm1637_1goMe wypełnimy segmentami dla 2 klocków wyświetlacza:

A może tak napis stop?

tm1637_2
Wyświetli go taki kawałek kodu:

led_01

I jeszcze o poborze prądu…

Do napisania tego paragrafu zmobilizował mnie opis tego modułu zamieszczony na stronie jednego sklepu elektronicznego:

led_05Wychodzi z niego, że wyświetlacz pobiera 0.25A, czyli 250mA prądu! Podobną informację znalazłem na popularnym portalu aukcyjnym…

led_06Cóż, trochę mi się to nie zgadzało:) Tyle prądu to silnik pobiera… Jak jest w rzeczywistości? Zmierzyłem maksymalny pobór natężenia prądu dla różnych jasności wyświetlacza (metoda setBrightness(x)) pokazującego „8888”:

Janość (8888) Natężenie (max)
0x0F 49 mA
0x0E 45 mA
0x0D 42 mA
0x0C 39 mA
0x0B 36 mA
0x0A 15 mA
0x09 8 mA
0x08 4 mA
0x07 0.1 mA – zgasł!

Zauważcie, że na pełnej jasności moduł pobiera prawie 50mA!

led_07Daleko mu do tych 250mA, ale 50mA to też nie jest aż tak mało. Z drugiej strony, między setBrightness(0x0B) i setBrightness(0x0A) spadek poboru prądu jest bardzo znaczący (połowa!). Różnica w jasności jest widoczna, ale też przy 0x0A wyświetlacz pozostaje czytelny.

Podsumowanie

Wyświetlacz jest bardzo prosty w użyciu – tak od strony podłączenia, jak i oprogramowania. Do jego minusów mogę zaliczyć stosunkowo duży pobór prądu. Można sobie jednak z tym poradzić ograniczając jasność wyświetlacza (setBrightness(0x0A)).

Minusem użytej biblioteki jest to, że nie potrafi ona zapalać środkowego dwukropka. Jej plusem jest za to bardzo niewielki rozmiar. Cały kod użyty do tego ćwiczenia nie zajął więcej niż 1.5 kB.

Źródło

3 komentarze do “Wyświetlacz LED z TM1637 – uruchomienie”

  1. Ktoś namieszał w bibliotece https://github.com/avishorp/TM1637 .
    W jednym miejscu jest TM1637 a w innym TM1637Display .
    Trzeba podłubać w plikach i zmienić wszędzie na tak samo, inaczej użycie menu „Sketch/Include libraries/TM1637” („Szkic/Dołącz bibliotekę/TM1637”) nie przyniesie spodziewanego efektu.
    Z dobrych wiadomości to jest dodana funkcja wyświetlania kropek dziesiętnych i dwukropka.
    Zasadniczo są to najbardziej znaczące bity poszczególnych cyfr.
    Dla takiego wyświetlacza jak w opisie mamy następująco :
    Używając metody setSegments()
    uint8_t colon[]={0,128,0,0};
    display.setSegments(colon, 4, 0);
    albo ogólnie do wartości drugiej cyfry dodać 128 (0x80).
    Używając metody showNumberDec() należy skorzystać z nowej funkcji showNumberDecEx().
    Przykładowo :
    display.showNumberDecEx(1111,64,false,4,0); // displays 11:11
    Drugi parametr określa pozycję, tutaj 64 czyli druga cyfra od lewej (0x40) czyli (0b01000000).

Dodaj komentarz