• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Przemijanie dlugiego tekstu dla wyswietlacz LCD z konwerterem !2C
#1
Nie wiem jak moge zrobic proste przemijanie teksty na wyswietlaczu LCD 2x16 z konwerterem I2C Huh Huh .
 
Odpowiedź
#2
Nie wiem o co dokładnie chodzi - ale jeśli chodzi o przewijanie napisu to sterownik HD44780, który obsługuje te wyświetlacze posiada tryb w którym adres wpisywania się zwiększa - czyli takie normalne wypisywanie kolejnych znaków, oraz tryb w którym adres wpisywania pozostaje stały, a zawartość wyświetlacza jest przesuwana w bok. Wtedy automagicznie można pisać dowolnie długie teksty, a na wyświetlaczu otrzymujemy przesuwający się tekst.
Oczywiście można też bawić się programowo, ale na pewno będzie gorzej wyglądać (miganie, odrysowania itp).
Nie wiem, czy i ewentualnie która biblioteka to obsługuje.
 
Odpowiedź
#3
Pokaż w jaki sposób wyświetlasz tekst, może wstawiasz sobie w kod delay(1000) i żaden pomysł nie będzie miał sensu.

Nieważne, zobaczyłem Twój kod do LCD w wątku wcześniej. Jest delay 1000, naucz się pisać kod bez delay, używać millis, inaczej to nie będzie miało sensu. Znajdź w moich poprzednich postach funkcję czas(). Uc nie może robić sobie pauz na 1000ms, to może tak wyglądać dla obserwatora z zewnątrz, ale w programie trzeba robić różne rzeczy w odstępach us, inaczej to będzie wyglądało jakby się zawiesił.
W Arduino masz gotowe funkcje do skrolowania, w każdej bibliotece masz przykłady, czasami nie wszystkie funkcje są tu zaprezentowane, trzeba zajrzeć do pliku keywords.txt, do plików c++ i h.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#4
(12-02-2024, 22:51)kaczakat napisał(a): Pokaż w jaki sposób wyświetlasz tekst, może wstawiasz sobie w kod delay(1000) i żaden pomysł nie będzie miał sensu.

Nieważne, zobaczyłem Twój kod do LCD w wątku wcześniej. Jest delay 1000, naucz się pisać kod bez delay, używać millis, inaczej to nie będzie miało sensu. Znajdź w moich poprzednich postach funkcję czas(). Uc nie może robić sobie pauz na 1000ms, to może tak wyglądać dla obserwatora z zewnątrz, ale w programie trzeba robić różne rzeczy w odstępach us, inaczej to będzie wyglądało jakby się zawiesił.
W Arduino masz gotowe funkcje do skrolowania, w każdej bibliotece masz przykłady, czasami nie wszystkie funkcje są tu zaprezentowane, trzeba zajrzeć do pliku keywords.txt, do plików c++ i h.
okej ja początkujacy (9 latek) i korzystam jal marazie z delay a na millis jeszcze przyjdzie czas
 
Odpowiedź
#5
(12-02-2024, 21:42)oscarX napisał(a): Nie wiem o co dokładnie chodzi - ale jeśli chodzi o przewijanie napisu to sterownik HD44780, który obsługuje te wyświetlacze posiada tryb w którym adres wpisywania się zwiększa - czyli takie normalne wypisywanie kolejnych znaków, oraz tryb w którym adres wpisywania pozostaje stały, a zawartość wyświetlacza jest przesuwana w bok. Wtedy automagicznie można pisać dowolnie długie teksty, a na wyświetlaczu otrzymujemy przesuwający się tekst.
Oczywiście można też bawić się programowo, ale na pewno będzie gorzej wyglądać (miganie, odrysowania itp).
Nie wiem, czy i ewentualnie która biblioteka to obsługuje.
no fajnie tylko nie do konca wiem jak to mam zrobic ale bardzo dziekuje za odpoweidz  Big Grin Big Grin Cool
 
Odpowiedź
#6
Akurat millis jest łatwiejsze od tego przewijania tekstu na ekranie, zresztą jest to wstęp by w ogóle robić takie rzeczy.
Jako 9-latek tym łatwiej przejdziesz na millis, zamień ten delay (1000) na tysiąc delay(1), zlicz te 1ms pauzy i jak jest tysiąc to wyzeruj licznik, zacznij od nowa, dodaj logikę, że jak zerujesz to wykonujesz te swoje czynności co 1000ms. Z millis jest tylko ta różnica, że zamiast zatrzymywać program na 1000ms pomijasz robienie czynności, dopóki nie zliczysz kolejnych 1000ms, loop sobie zaczyna się wykonywać, sprawdza warunek czy aktualna wartość millis jest większa od poprzednio zapisanej o 1000, jeśli nie to pomija środek { rzeczy do zrobienia co 1000ms } i zaczyna kolejny loop.
Różnica jest taka, że możesz też wstawić kolejny if z rzeczami do zrobienia co 10ms, co 50ms i one się będą wykonywać niezależnie od rzeczy do zrobienia co 1000ms, każdy gdy przyjdzie jego pora, minie ten czas ustalony w konkretnym ifie.
Jak wstawisz delay(1000) to już nic nie wykona się częściej.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#7
(12-02-2024, 11:29)SpalonaATmega napisał(a): Nie wiem jak moge zrobic proste przemijanie teksty na wyswietlaczu LCD 2x16 z konwerterem I2C Huh Huh .
masz młody, baw się :-)

Kod:
#include <LiquidCrystal_I2C.h>

int totalColumns = 16;
int totalRows = 2;

LiquidCrystal_I2C lcd(0x27, totalColumns, totalRows); 

String staticMessage = "I2C LCD";
String scrollingMessage = "Scrollowany napis dowolnej wielkosci";

void scrollMessage(int row, String message, int delayTime, int totalColumns)
{
  for (int i=0; i < totalColumns; i++)
  {
    message = " " + message; 
  }
  message = message + " ";
 
  for (int position = 0; position < message.length(); position++)
  {
    lcd.setCursor(0, row);
    lcd.print(message.substring(position, position + totalColumns));
    delay(delayTime);
  }
}

void setup()
{
  lcd.init();                   
  lcd.backlight();
}

void loop()
{
  lcd.setCursor(0, 0);
  lcd.print(staticMessage);
  scrollMessage(1, scrollingMessage, 250, totalColumns);
}
 
Odpowiedź
#8
(14-02-2024, 07:49)powerTGS napisał(a):
(12-02-2024, 11:29)SpalonaATmega napisał(a): Nie wiem jak moge zrobic proste przemijanie teksty na wyswietlaczu LCD 2x16 z konwerterem I2C Huh Huh .
masz młody, baw się :-)

Kod:
#include <LiquidCrystal_I2C.h>

int totalColumns = 16;
int totalRows = 2;

LiquidCrystal_I2C lcd(0x27, totalColumns, totalRows); 

String staticMessage = "I2C LCD";
String scrollingMessage = "Scrollowany napis dowolnej wielkosci";

void scrollMessage(int row, String message, int delayTime, int totalColumns)
{
  for (int i=0; i < totalColumns; i++)
  {
    message = " " + message; 
  }
  message = message + " ";
 
  for (int position = 0; position < message.length(); position++)
  {
    lcd.setCursor(0, row);
    lcd.print(message.substring(position, position + totalColumns));
    delay(delayTime);
  }
}

void setup()
{
  lcd.init();                   
  lcd.backlight();
}

void loop()
{
  lcd.setCursor(0, 0);
  lcd.print(staticMessage);
  scrollMessage(1, scrollingMessage, 250, totalColumns);
}
Dziekuje ci bardzo i calej reszcie co odpowiedziala  Big Grin Big Grin
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości