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ą.
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.
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.
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\
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
#include <SPI.h> #include <Display4Digits.h> #include <Timer.h> Display4Digits wyswietlacz(5, 4, 3, 2, HIGH, 10); //Obiekt obsługujący wyświetlacz int licznik = 0; // Nasz licznik void setup() { wyswietlacz.setDot(2, true); // Włączenie kropki za 3 cyfrą (liczone od 0) wyswietlacz.displayAll0Digits(false); // Nie wyświetlanie niepotrzebnych zer } void loop() { static Timer czas; // Za pomocą tego będziemy sprawdzać czy minął określony czas, aby dodać do licznika if(czas.get() >= 100) // Jesli mineła 1/10 sekundy { ++licznik; // Dodawanie do licznika czas.reset(); // Restart zegara if(licznik > 9999) licznik = 0; // Zerowanie licznika w razie przekroczenia maksymalnej wielkości } wyswietlacz.update(licznik); // Aktualizacja licznika wyswietlacz.display(); // Wyświetlanie } |
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.
Witam! Wszystko cacy :) I fajnie. Mam tylko małą krytykę (mam nadzieję, że konstruktywną :))
Pozdrawiam, Daniel.
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.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 :)
kolega napisał
Witam. Mam 16 lat. Arduino zajmuje się od około miesiąca.
Pięknie że pomagasz daj schemat to na pewno by bardziej pomogło
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.
Ja do wyświetlania temperatury używam takiego kodu: http://wklej.org/id/1610178/ i wyświetlanie jest płynne, nic nie miga.
zwróć uwagę, że masz tam tylko analogRead, czyli natychmiastowy odczyt, jak będziesz czytał z 1-wire (np. ds18b20) lub I2C (np. bmp180) itp to będzie opóźnienie wynikające z protokołu i wówczas będzie migać
panie powiedz mi wyślesz mi kod i schemat podłączenia wyświetlacza segmentowego na temperaturę z rejestrem
Mam właśnie problem który opisałeś odczyt temperatury i migotanie
Możesz mi podpowiedzieć jak powinno to wyglądać żeby efekt nie występował
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 ?
Aktualnie nie mam tego rejestru, więc nie mogę przetestować.
Na pewno użyję, zrób jeszcze sterowanie 7 segmentowym 2 cyfrowym, a będę szczesliwy :-).
Nowa wersja (1.1).
Dodałem możliwość wyłączenia poszczególnych cyfr, tak więc powinno działać z wyświetlaczem 2 i 3 cyfrowym.
Przykład użycia: http://wklej.org/id/1622361/
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 :-).
I tak btw posiadam leonardo, a żeby uzyskać złącze SS potrzebuje je przerabiać, czego nie chcę robić :-(.
http://www.aliexpress.com/item/1pcs-4-Bits-TM1637-Red-Digital-Tube-LED-Display-Module-Clock/2054860365.html?s=p
i tutaj rozwiązanie na zmniejszenie liczby pinów do dwóch…
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ą
Witam.
Wiesz może jak atmegą odczytać kod tego wyświetlacza https://pl.aliexpress.com/item/0-28-Inch-2-5V-30V-Mini-Digital-Voltmeter-Voltage-Tester-Meter-LED-Screen-Electronic-Parts/32745753209.html?ws_ab_test=searchweb0_0,searchweb201602_2_10091_10090_10088_10089,searchweb201603_1&btsid=800db923-c7e2-4055-a865-5702a30d484f aby nie robić woltomierza tylko wpiąć się w linię wyświetlacz i posłużyć jego wskazaniami?
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