Skocz do zawartości

Kurs Arduino - #7 - Wyświetlacz tekstowy, LCD 2x16


Komentator

Pomocna odpowiedź

Matheu, super, cieszę się, że udało Ci się dostosować inny wyświetlacz 😉 Warto jednak też zastanowić się, czy dodawanie sobie takich "przeszkód" na początku drogi z Arduino ma większy sens, bo w przyszłości i tak pewnie nie trafisz na identyczny LCD. Oczywiście nie odbieraj tego jako krytyki, bardziej chodzi mi o sam fakt, że nie zawsze warto na siłę "reanimować nietypowe starocie". Czasami lepiej wydać te XX zł i mieć od razu działające rozwiązanie. Dla Ciebie duży plus, że eksperyment zakończył się sukcesem. Wielu początkujących jednak przy takich próbach nie odnotowuje większych sukcesów, a wtedy łatwo się zrazić do dalszej nauki 😉

Link do komentarza
Share on other sites

Treker:

1. Dzięki za uznanie!

Po prostu wtedy nie miałem dostępu do żadnego innego wyświetlacza.

A bardzo zależało mi żeby sprawdzić działanie programu z LCD (to naprawdę jest mój pierwszy), - więc poszukiwałem rozwiązań - przekopałem kawałek neta, (ciężko było znaleźć, tym bardziej, że nie byłem pewny, gdzie szukać, a dane były niepełne/ porozrzucane), dokumentacja wyświetlacza, sterownika, całkiem sporo datesheet'ów z różnymi typami (żaden dokładnie nie odpowiadał mojemu LCD), sprawdziłem, że są realne szanse - i spróbowałem, DZIAŁA! 😃😃

Swoją drogą - to forum to dla mnie wielkie wsparcie, czasem możliwość podejrzenia - jak to robią inni, bardziej doświadczeni; czasem - możliwość zadania pytania, a czasem - pochwalenia się, że coś się udało (i przekazania- w jaki sposób do tego dojść). Współ-praca - to bardzo motywuje!

2. A opisując już efekty swojej pracy - trochę jako ciekawostkę dla innych, a trochę jako przykład, że czasem - warto się nie poddawać (zbyt szybko) - miałem też nadzieję, że tak już nie będziemy o suchym pysku gadali 😉

  • Lubię! 1
Link do komentarza
Share on other sites

Twój wyświetlacz wygląda na supertypowy. Kod ..FBLY-H.. na naklejce mówi, że jest to

- transflective,
- bottom view,
- LED backlight,
- yellow-green,
a to oznacza, że powinien być czytelny bez podświetlenia (bo pracuje zarówno ze światłem padającym z zewnątrz jak i wychodzącym od spodu), najlepiej widać go od dołu (tj. z kierunku godziny 6), ma poświetlenie LEDowe i rozszerzony zakres temperatur pracy.

Takie maluchy nigdy CCFL na miały, bo nie ma tam miejsca na lampę i dyfuzor do niej. Dobrze sprawdzają się folie EL, ale wymagają niestety niewygodnego zasilania HVAC. I nie, ani EL ani CCFL to nie Nixie.

Tak więc bierzesz opornik 5-10Ω (dla bezpieczeństwa), podłączasz placek oznaczony "A" do Vcc (+5V), drugi oznaczony "K" do GND i powinno zaświecić. Dobierasz opornik by jasność była wystarczająca i tyle.

Jest jeszcze sprawa tego kontrastu. Jak zasilasz wyprowadzenie Vee? Podłączyłeś potencjometr? Zmierzyłeś tam napięcie? Zwykle tego typu wyświetlacze wymagają od minus kilku do kilkunastu woltów względem ich dodatniego zasilania. Jeżeli wepniesz potencjometr między GND a +5V a suwak zapodasz na Vee, to masz takie źródło. Ustaw na potencjometrze 0.5-1V względem masy lub w najprostszym przypadku zewrzyj Vee do GND a kontrast powinien się pojawić. Jeśli przesadzisz (Vee za niskie względem masy czyli za duże napięcie ujemne względem +5V) to wszystko zrobi się czarne.

http://www.datavision.com.tw/en/lcm_01_1.php?P_Id=6

http://www.datavision.com.tw/en/code.php

  • Lubię! 1
Link do komentarza
Share on other sites

Mam problem z zad. 7.4 (stoper)

Spróbowałem swoich sił z pętlą for i napotkałem pewien problem. Poniższy kod cały czas zapętla się wokół pętli for związanej z sekundami (jednościami), nie chce przejść do dalszej części programu. Jak to naprawić żeby wszystko działo się jednocześnie?

void loop() {
 if (digitalRead(9) == LOW) {
   statusStopera = 1;
 }
 if (digitalRead(9) == HIGH) {
   statusStopera = 0;
 }


 if (statusStopera == 1) {

   for (int i = 0; i <= 9; i++) { //na sekundy
     lcd.setCursor(7, 1);
     lcd.print(sekundy);
     delay(1000);
     sekundy ++;
     if (sekundy == 9) {
       lcd.setCursor(7, 1);
       lcd.print(sekundy);
       delay(1000);
       sekundy = 0;
       i = 0;
     }
   }

       for (int d = 0; d <= 6; d++) { //na minuty
     lcd.setCursor(6, 1);
     lcd.print(sekundydziesietne);
     delay(10000);
     sekundydziesietne ++;
     if (sekundydziesietne == 6) {
       sekundydziesietne = 0;
       d = 0;
     }
   }
 }
}
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

thequeash, w programie nie ma zbyt dużo komentarzy, więc ciężko dokładnie rozgryźć jakie były Twoje zamiary. Zwracam więc tylko uwagę na linię "delay(10000);" w tym momencie zatrzymujesz cały program na 10 sekund, więc nic się nie będzie działo (sekundy się nie będą zmieniać). Jeśli chcesz zliczać sekundy, to lepiej posługiwać się "delay(1000);" i co sekundę zwiększać wartość jakiejś zmiennej (jej wartość będzie wskazywała ile sekund minęło). Wtedy na LCD wystarczy wyświetlić wartość tej zmiennej.

Link do komentarza
Share on other sites

zad 7.2:

Program bez przeróbki:

Usunięte opóźnienie delay(250)

Zmierzone zmiany napięcia są niewielkie, tu zmienia się tylko ostatnia cyfra. (gołym okiem też widać jak na ostatniej pozycji cyfry "nakładają się na siebie"). Wydaje mi się, że tu akurat chodzi o czas reakcji ciekłych kryształów(??)

Prawie wszystko przesunięte do pętli głównej:

- polecenie lcd.clear()

- wszytkie polecenia ustawiania kursora lcd.setCursor(x.x) i wyświetlania tekstu lcd.print()

- !!! usunięte opóźnienie delay(250), bez tego sterownik LCD by się wyrobił w czasie i cały tekst na ekranie byłby przez dłuższy czas widoczny.

Po przesunięciu całej obsługi LCD - jego sterownik nie nadąża:

W efekcie - widoczność tekstu zanika. Prawdopodobnie - poszczególne znaki wyświetlane są od lewej strony, więc te z lewej są wyświetlane przez najdłuższy czas (zanim zawartość ekranu zostanie wyczyszczona) -->> czyli są najbardziej widoczne.

Jeśli coś mi się (pokiełbasiło) / błędne wnioski - bardzo proszę o sprostowanie

pozdrawiam

Maciek

  • Lubię! 1
Link do komentarza
Share on other sites

Matheu, tak, dokładnie dlatego obraz "zanika". Wniosek jaki należy z tego wyciągnąć: nie nadpisujemy tekstów, gdy nie jest to konieczne. Lepiej za pomocą lcd.setCursor(x.x) udać się w odpowiednie miejsce i nadpisać tylko te znaki, które się zmieniły. W tym wypadku byłaby to tylko wartość odczytanego zasilania.

Link do komentarza
Share on other sites

Zadanie 7.4

Stoper- Filmik (22,4MB) -> Pobierz -> Bezpośrednie pobieranie

//LCD4x20, stoper
#include <LiquidCrystal.h>      //Dołączenie biblioteki
LiquidCrystal lcd(2, 3, 4, 5, 6, 7);  //Informacja o pinach Arduino do podłączenia wyświetlacza

void setup() {
 pinMode(8, INPUT_PULLUP);  //Przycisk jako wejście
 pinMode(9, INPUT_PULLUP);  //Przycisk jako wejście
 lcd.begin(20, 4);          //Deklaracja typu/rozmiaru wyswietlacza;
//  lcd.clear();             //tu jest niepotrzebne, bo LCD czyścimy wewnątrz pętli głównej programu
 lcd.setCursor(0, 0);       //Ustawienie kursora
 lcd.print("STOPER");
 lcd.setCursor(6, 2);
 lcd.print("PRZYCISKI");         //menu ekranowe  ;))) 
 lcd.setCursor(0, 3);
 lcd.print("Start           Stop");
}

int ileSekund;                           //zmienne
boolean wcisnietyStart, wcisnietyStop;

void loop()
{
 if (digitalRead(8) == LOW) {     //Jeśli wciśnięty przycisk "Start"
   lcd.clear();
   wcisnietyStart = 1;            //zapamiętaj jego wcisnięcie (Start)
   wcisnietyStop = 0;             //zresetuj pamięć o wciśniętym Stopie
   ileSekund = 0;}                //zerowanie licznika

 if (wcisnietyStart==1) {         //obsługa zliczania
   lcd.setCursor(0, 1);
   lcd.print("Minelo sekund:");
   lcd.setCursor(16, 1);
   lcd.print(ileSekund);
   delay(1000);
   ileSekund=ileSekund+1;  }      //zwiększenie wartości licznika

 if (digitalRead(9) == LOW) {     //Jeśli wciśnięty przycisk "Stop"
   wcisnietyStop = 1;             //zapamiętaj jego wcisnięcie (Stop)
   wcisnietyStart = 0;            //zresetuj pamięć o wciśniętym Starcie
   lcd.setCursor(16, 1);
   lcd.print(ileSekund);  }
}

Przycisk START - reakcja programu natychmiastowa

Przycisk STOP - aby mieć pewność, że program w ogóle wykryje wciśnięcie - należy trzymać dłużej niż wartość opóźnienia delay(1000), bez tego - reakcja przypadkowa (zależy w którym miejscu opóźnienia delay wciśniemy przycisk).

Widzę tu dwa rozwiązania:

- skrócenie pętli opóźniającej

- obsługa przycisku na przerwaniach (???)

  • Lubię! 1
Link do komentarza
Share on other sites

To w takim razie mam parę pytań dotyczących wyświetlaczy:

a) LCD 4x20 z podświetleniem o małym poborze prądu (ten mój ma niby 240..360mA), lub jakikolwiek wyświetlacz 4x40 - ktoś używał???

b) Wyświetlacz graficzny 64x128 - jakie sterowniki są OK (żeby typ był popularny i miał fajne biblioteki do Arduino), a może ktoś poleciłby jakiś konkretny model LCD?

Link do komentarza
Share on other sites

Dobry wieczór

Mam problem z "Hello World".

Cały czas wyświetlają mi się prostokąty. Na początku myślałem, że to kontrast. Zmieniłem potencjometr z 500k na 5k. Nic, kręcę w jedną i drugą stronę nic nie działa. Miałem podobny drugi wyświetlacz też nic. IDE zaktualizowałem do najnowszej wersji. Sprawdzałem też wersje biblioteki (też aktualna).

Próbowałem nawet użyć innych funkcji

clear()

noDisplay()

display()

Na żadną z nich wyświetlacz nie reagował.

Przed każdą z wyżej wymienionych prób sprawdzałem czy na pewno mam dobrze wszystko połączone i czy może nie w kodzie czegoś nie pominąłem.

Wrzuciłem drukowanie tekstu do UART w setup i loop. Wszystko ok.

Jakieś pomysły?

Link do komentarza
Share on other sites

Co to znaczy "nic nie działa"? Czy prostokąty pojawiają się i znikają przy kręceniu potencjometrem? Jeżeli nie, to zacznij od tego, bo tu już jest coś źle. Zmierz napięcie na pinie podłączonym do potencjometru.

A poza tym, skoro na dwuliniowym wyświetlaczu masz tylko jeden rządek prostokątów (widzę na zdjęciu) to znaczy, że nic do wyświetlacza nie dotarło i nie udała się jego inicjalizacja. Scalak który jest wyświetlaczu tak startuje i dopiero poprawne zapisy kilku instrukcji przełączają go do do pokazywania 2 linii tekstu.

Masz coś skopane w połączeniach, może płytkę stykową trafił szlag a może któryś kabelek nie łączy. Niestety nic bardziej szczegółowego nie można powiedzieć. Przepiszcz miernikiem wszystkie połączenia od pinów Arduino do pinów wyświetlacza. Łącznie z masą.

Link do komentarza
Share on other sites

Co to znaczy "nic nie działa"? Czy prostokąty pojawiają się i znikają przy kręceniu potencjometrem? Jeżeli nie, to zacznij od tego, bo tu już jest coś źle. Zmierz napięcie na pinie podłączonym do potencjometru.

Pojawiają się i znikają.

A poza tym, skoro na dwuliniowym wyświetlaczu masz tylko jeden rządek prostokątów (widzę na zdjęciu) to znaczy, że nic do wyświetlacza nie dotarło i nie udała się jego inicjalizacja. Scalak który jest wyświetlaczu tak startuje i dopiero poprawne zapisy kilku instrukcji przełączają go do do pokazywania 2 linii tekstu.

Z tym startem lcd dziękuje za info. Z arduino jestem świerzy jest w IDE debugger którym mogę sprawdzić co się dzieje?

Co do sprawdzenia połączeń dzięki za poradę.

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.