Skocz do zawartości

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


Komentator

Pomocna odpowiedź

szady, jeśli regulacja kontrastu działa, to pozostaje tylko sprawdzenie połączeń Arduino wyświetlacz. W kwestii tego LCD nic się nie zmieniało, więc programy opisane w kursie muszą działać poprawnie 🙂 Może gdzieś zamieniłeś dwa przewody lub "przesunąłeś" połączenia o jedno "oczko" płytki stykowej?

Link do komentarza
Share on other sites

Generalnie

Sprawdzam już możliwe połączenia w jedną i w drugą stronę. (mam dwa wyświetlacze na obu ta sama sprawa). Też sprawdzałem czy kolejność nie jest przesunięta. Nawet przekładałem kable na inne wejścia robiąc stosowne zmiany w kodzie. Plus generalne poruszanie kablami.

Mam pytanie czy w arduino jest jakiś debbuger? Lub czy jest sposób na sprawdzenie czy obiekt w ogóle został zainicjalizowany, lub bardziej dogłębne sprawdzenie komunikacji?

Póki co pomysły mi się kończą.

Też próbowałem miernikiem, ale na wejściach cyfrowych nie piszczał.

Link do komentarza
Share on other sites

szady, nie mam pomysłu, co w takim razie może być źle. Czy przypadkiem nie zmieniłeś definicji ponów w programie? Np. podłączyłeś zgodnie z kursem, ale załadowałeś z rozpędu pogram z innej strony, który miał inną deklarację pinów? Pytam, ponieważ zdarzały się już takie przypadki 😉 Który dokładnie program masz wgrany?

Link do komentarza
Share on other sites

"..ale na wejściach cyfrowych nie piszczał"

Co to znaczy?

Połączenia sprawdzasz przy wyłączonym zasilaniu. Miernik ustawiony na test przewodzenia (gdzie zwarcie sond powoduje pisk) powinien piszczeć przy każdym sprawdzanym połączeniu. Jedną sondę przykładasz do LCD, drugą do odpowiedniego pinu Arduino. W ten sposób sprawdzasz poprawność wszystkich kabelków. Żadnego nie powinno brakować i żadnego nie powinno być za dużo, a te które są mają być między odpowiednimi szpilkami. Czy tak jest i miernik potwierdza to na 100%?

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

Więc po kolei.

Wczoraj wieczorem próbowałem przełączyłem pozycje podłączenia do masy Arduino. Moim oczom ukazał się taki widok.

Coś jakby odżyło ale tylko na chwilę, gdyż po tym sytuacja wróciła do stanu poprzedniego. Próbowałem przepinać kable na inne numery, zmieniać ich kolejność. W kodzie robiłem też eksperymenty z połączeniami.

#include <LiquidCrystal.h> //Dołączenie bilbioteki
//LiquidCrystal lcd(12, 11, 4, 5, 6, 7); //Informacja o podłączeniu nowego wyświetlacza
//LiquidCrystal lcd(12, 11, 7, 6, 5, 4); //Informacja o podłączeniu nowego wyświetlacza
//LiquidCrystal lcd(11, 12, 7, 6, 5, 4); //Informacja o podłączeniu nowego wyświetlacza
LiquidCrystal lcd(2, 3, 4, 5, 6, 7); //Informacja o podłączeniu nowego wyświetlacza
//LiquidCrystal lcd(2, 3, 7, 6, 5, 4); //Informacja o podłączeniu nowego wyświetlacza
int globalVar = 0;

void setup() {
 Serial.begin(9600); //Uruchamiamy transmisję
 lcd.begin(16, 2); //Deklaracja typu
 lcd.clear();
 lcd.setCursor(0, 0); //Ustawienie kursora
 lcd.print("Kurs Arduino"); //Wyświetlenie tekstu
 lcd.setCursor(0, 1); //Ustawienie kursora
 lcd.print("Na Forbocie!"); //Wyświetlenie tekstu
 lcd.cursor(); //Włącznie kursora
 Serial.println("Zakończony Init");
}

void loop() {
 if (globalVar == 0) {
   Serial.println("Program dziala");
   globalVar = 1;
 } else if (globalVar == 1) {
   Serial.println("Program dziala2");
   globalVar = 2;
 }
  //lcd.noDisplay(); //Wyłącz i poczekaj
 delay(500);

 //lcd.display(); //Włącz i poczekaj
 delay(500);
}

Nic to też nie dawało. Szukałem nawet czy obiekt się utworzył ale też nie potrafiłem znaleźć jak to się robi w Arduino. Chodziło coś na wzór.

if (lcd == NULL) {
Serial.println("Ni dy rydy");
}

Chyba jednak nie ma takiej możliwości lub ja takiej w necie nie znalazłem. Więc podarowałem sobie.

Dnia dzisiejszego rozebrałem wszystkie kable. Sprawdziłem każdy kabel miernikiem czy nie ma problemów. I znalazłem głównego winowajce.

Miernik nie piszczał tylko na tym kablu.

Co ciekawe był świeży z górnego zestawu. Wymieniłem ten kabel i oto się ukazał upragniony efekt. 😅

Dopiszcie do artykułu punkt 4 aby sprawdzić kable przed połączeniem.

Dziękuje za pomoc i sugestie sprawdzenia miernikiem.

Link do komentarza
Share on other sites

szady, super, że udało się rozwiązać problem! Miałeś niezłego pecha (lub szczęście, zwał jak zwał). Trafić na taki uszkodzony kabel, nie jest tak łatwo 😉 W tej konkretnej wersji przewodów jeszcze nigdy nie zdarzyło mi się, aby były z nimi problemy...

Link do komentarza
Share on other sites

Czy ktoś mi pomoże w użyciu funkcji scroll display(wiem, że nie ma takiej konkretnej funkcji, chodzi mi ogólnie o przewijanie 🙂) Jak ją zaimplementować np. do takiego kodu 😅 :

#include <LiquidCrystal.h> //Dołączenie bilbioteki
LiquidCrystal lcd(2, 3, 4, 5, 6, 7); //Informacja o podłączeniu nowego wyświetlacza

void setup() {
 lcd.begin(16, 2); //Deklaracja typu
 lcd.setCursor(0, 0); //Ustawienie kursora
 lcd.print("Czesc szwagier"); //Wyświetlenie tekstu
 lcd.setCursor(0, 1); //Ustawienie kursora
 lcd.print("co porabiasz?"); //Wyświetlenie tekstu
}

void loop() {}

Kombinowałem z przykładowym programem ale nic nie wykombinowałem.

Link do komentarza
Share on other sites

Jak mamy pomóc skoro nie wiemy co tam sobie wymyśliłeś? Pokazałeś kawałek kodu, który wyświetla dwie linijki tekstu. Gdzie tu miejsce na tę nową funkcję? Opisz własnymi słowami co miałaby robić.

A wcześniej zastanów się dobrze, czy ona naprawdę jest potrzebna. Bo jeśli dobrze podejrzewam, to chcesz wypisywać teksty na 2-linijkowym LCD jak na monitorze. Czyli np. zawsze nowy napis w dolnej linii a reszta przewija się w górę, czy tak? To ładnie wygląda na konsoli mającej kilkadziesiąt linii tekstu, bo mózg z łatwością "rozumie" zachowanie się zawartości ekranu jako przesuwanie pewnego bloku w górę. Przy jednej linii znikającej i jednej nowej nie ma takiej spójności obrazu i całość wygląda jak skaczące napisy. Dla LCD 4x20 to już ma sens i oczywiście dla graficznego już od 128x64 także, bo możesz na nim pokazać nawet 8 linii tekstu.

Link do komentarza
Share on other sites

Nie, chcę by mój tekst przewijał się od prawej do lewej,
później będę chciał się nauczyć wyświetlania i przewijania różnych tekstów i danych,

zależy mi na efekcie jak w tablicach ledowych...

wyświetla temp, przewija, potem, wilgotność, przewija, potem cześć MAREK1707 i przewija potem się zatrzymuje na jakiejś wartości na chwilę i znów przewija zawartość....

Link do komentarza
Share on other sites

OK, nie zgadłem kierunku 🙂 Pewnie jak zwykle w takich (w sumie prostych) przypadkach istnieje do tego jakaś gotowa biblioteka, ale jak rozumiem nie oczekujesz efektu tylko próbujesz samodzielnie rozwiązać problem.

Wyświetlacze znakowe - wszystko jedno czy 1x8 czy 2x16 czy 4x20 - pokazują na swoich ekranach zawartość własnej pamięci RAM. Składują tam jednak nie obrazki, a jedynie kody znaków w postaci 8-bitowych bajtów. Posiadają też tzw. generator znaków a więc pamięć stałą (ROM) zawierającą "wygląd" każdego możliwego znaku. Jeśli producent robi wyświetlacz na rynek np. rosyjski, pakuje tam cyrylicę, gdy na europejski - znaki alfabetu łacińskiego. Ponieważ możliwych kodów 8-bitowych jest aż 256, zwykle mieści się na raz cały "nasz" alfabet, plus różne ogonki (niestety raczej nie wszystkie polskie) plus jakaś uproszczona chińszczyzno-japońszczyzna lub właśnie cyrylica:

http://www.martyncurrey.com/wp-content/uploads/2017/03/LCDs_12_CharSet_01.jpg

Kolejne obrazki które widzisz na szkle wyświetlacza odpowiadają więc kolejnym bajtom kodów w pamięci RAM. Lewy górny róg to znaczek, którego kod jest pod adresem 0, kolejny pod adresem 1 itd.. O ile pamiętam, jeżeli wyświetlacz ma drugą linię, zaczyna się ona zwykle od adresu 64 czyli szesnastkowo 0x40. Mając więc organizację 2x16 korzystasz (oglądasz na ekraniku) tak naprawdę znaki z dwóch obszarów pamięci RAM wyświetlacza: 0..15 i 64..79:

https://embeddedcenter.files.wordpress.com/2013/11/address-lcd_2.jpg

Dlaczego o tym piszę? Bo teraz łatwo już sobie wyobrazić jak zrobić przesuwanie napisów. Po pierwsze nigdy nie będzie to płynne jak w tablicach LED, bo kwantem jest tu znak a nie pixel. Nie możesz przesunąć ekranu o 1 punkt w lewo lub prawo, musisz o cały znak. Po drugie żeby znaki się przesuwały wystarczy przesuwać zawartość pamięci wyświetlacza.

Niestety, zwykle nasze LCD (z oszczędności kabelków i prostoty kodu) podłączamy w ten sposób, że procesor nie może odczytać zawartości pamięci LCD - może tam tylko pisać. Dlatego musisz trzymać w procesorze ortogonalny jej obraz i to na nim manipulować a potem wysyłać go w całości.

Przykładowo robiąc tablicę znaków o długości 8, 16 lub 20 (jedna linia LCD) możesz w prostej pętli for{} przesunąć wszystkie kody o jedną pozycję w dół lub w górę dopisując nowy znak odpowiednio: na samym końcu lub na początku tablicy. Jeżeli całą tablicę będziesz po każdej takiej modyfikacji wysyłał do LCD (i czekał chwilę żaby ktoś to zobaczył), uzyskasz efekt przesuwania napisu 🙂

Czy to jest jakieś światełko?

Link do komentarza
Share on other sites

Światełko Tak, bo w przykładach biblioteki LCD było to właśnie robione na pętli for. Ale tam były cyfry i mi działało, nie znam jeszcze obsługi tablic i nie umiem zrobić tego na tekście...

Link do komentarza
Share on other sites

To nie ma znaczenia. Kody znaków LCD są liczbami typu uint8_t. Pętla będzie zawsze poprawnie przesuwać. Ważne, by tablica była odpowiedniego typu.

EDIT: W każdym razie sporo przed Tobą. Na to, że czegoś nie umiesz to już nic nie poradzę. Próbuj pisać programy, ale jednocześnie czytaj opis języka.

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

Jasne...przy montażu wózków RP pamietaj by koła prowadzące były na pierwszym i ostatnim torze reszta wolne. Chyba że to Nike to pamiętaj o przełożeniu na łańcuch, antywywrotach i nitowanych ceownikach. Nie zapomnij o napedowkach z podwójnym przełożeniem... jasne?

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

Chcąc zrobić scrolling w poziomie po prostu wrzucasz co jakiś czas na wyświetlacz ileś tam znaków, zaczynając kolejno od pierwszego, dalej od drugiego, trzeciego... Dalej mi się nie chce cyferek wymieniać.

Coś w stylu write(text+n, 16) albo jakoś tak...

Przy okazji: jesteś na 100% pewien, że na tym forum nikt się nie zna na widłakach? Uważaj, bo się możesz zdziwić.

Radzę Ci zapoznać się z jakimś najprostszym podręcznikiem do C (niekoniecznie C++). Nie powiem z jakim - ja zaczynałem od K&R, ale to już prehistoria i jest parę lepszych. Bez tego cały czas będziesz zadawał pytania typu "czemu to nie działa" do momentu, aż wszyscy będą mieli dość i pozostaną Ci dyskusje z różnymi niedoinżynierami o tym, jak to forum nie jest pomocne i jacy wredni ludzie tu siedzą...

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • 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.