Skocz do zawartości

Obsługa wyświetlacza ciekłokrystalicznego HD44780, 2x16 po magistrali I2C


Gość

Pomocna odpowiedź

Witam wszystkich

Dziś w ramach ćwiczeń postanowiłem uruchomić standardowy wyświetlacz ciekłokrystaliczny 2x16 znaków po magistrali I2C. Oczywiście jest jeszcze opcja bezpośredniego podłączenia do pingów Arduino, ale ja od razu zrobiłem to za pomocą githuba. 

Co się okazało. Niby wszystko pięknie ładnie, ale jak w przypadku czujników DS18B20 już na start przygody pojawiły się schody.

wygląda to następująco;

 1.thumb.jpg.082c24766e11de43a6326dd64d48cc58.jpg

poniżej kod do tego;

#include <Bonezegei_LCD1602_I2C.h>

Bonezegei_LCD1602_I2C lcd(0x27);

void setup() {
  lcd.begin();
 
}

void loop() {
  lcd.setPosition(4, 0);
  lcd.print("#Test#");
  lcd.setBacklight(1); // jak zmienić nazwę na lcd.LED ???
  lcd.setPosition(0, 1); // jak zmienić nazwę na lcd.setCursor ???
  
  delay(10000);
/* Jak wyłączyć migający kursor */

  lcd.setBacklight(0);
  
  delay(1000);
}

 Jak widać wyświetlacz działa, da się sterować podświetlaniem po I2C, ale co jest nie tak? 

1) nie da się wyłączyć migającego kursora. (przynajmniej nie ma tego w przykładach dostarczonych przez autora biblioteki) 

2) nie da się edytować własnych znaków tj. w sterownikach PLC (przykład niżej)

2x16.thumb.png.1d2ccaeb428d4cc5e2180c237da06ee6.png

Nie da się edytować zmiennych prywatnych. W sterownikach PLC wszystkie zmienne mogę nazwać w sposób wygodny do zapamiętania. A w przypadku Arduino co biblioteka, to inne nazewnictwo zmiennych pod ten sam wyświetlacz. 

Co z tym da się więcej zrobić? Ma ktoś pomysł?

 

P.S.

Kupując tego typu gadżety zawsze sprawdzajcie poprawność lutowania. U mnie piny LED podświetlania na githubie  były zwarte cyną. Taka wada może spowodować zadziałanie ograniczenia prądowego portu USB, albo uszkodzenie tranzystora sterującego na PCB githuba.

Edytowano przez rafal220
Link do komentarza
Share on other sites

Pomijając pozostałe bzdury - zmienne prywatne dlatego nazywają sie prywatne bo są prywatne i nikt tam nie będzie pchał brudnych paluchów. Oprócz tego są jeszcze zmienne publiczne (gdzie każdy brudne paluchy może wepchać) i protected (gdzie nie każdy).

Tak z ciekawości: ile razy jeszcze wystawisz się na pośmiewisko pisząc o jakichś wadach języka o ktorym nie masz zielonego pojęcia? To już przestaje być śmieszne, staje się żałosne.

Link do komentarza
Share on other sites

(edytowany)

Twój znak może mieć wymiary 5*7 pikseli...5 młodszych bitów określa piksele 

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 16, 2);

byte smiley[8] = {
  B00000,
  B10001,
  B00000,
  B00000,
  B10001,
  B01110,
  B00000,
  B00000
};

void setup() {
  lcd.init();
  lcd.backlight();
  delay(1000);
  lcd.createChar(0, smiley);
  lcd.setCursor(0, 0); 
  lcd.write(byte(0));
}

void loop() {}

 

Edytowano przez farmaceuta
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

Gość
26 minut temu, ethanak napisał:

ile razy jeszcze wystawisz się na pośmiewisko pisząc o jakichś wadach języka o ktorym nie masz zielonego pojęcia?

W którym miejscu pisałem o wadach? Napisałem tylko że coś nie działa z moimi oczekiwaniami podając przykładowy wzór.

29 minut temu, ethanak napisał:

Oprócz tego są jeszcze zmienne publiczne

Co z tego że są, jak nie wiem jak zmienić ich nazwy tak aby we wszystkich bibliotekach np. do wyświetlacza  miały taką samą nazwę do tej samej funkcji którą realizują.

11 minut temu, farmaceuta napisał:

Twój znak może mieć wymiary 5*7 pikseli...5 młodszych bitów określa piksele

Zainstalowałem bibliotekę, ale ten kod coś nie nie chce kompilować.

mam taki błąd;

C:\Users\RK8B87~1\AppData\Local\Temp\ccjsl6fE.ltrans0.ltrans.o: In function `main':
C:\Users\R K\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.6\cores\arduino/main.cpp:46: undefined reference to `loop'
collect2.exe: error: ld returned 1 exit status

exit status 1

Compilation error: exit status 1

Link do komentarza
Share on other sites

Gość
3 minuty temu, farmaceuta napisał:

skopiuj sobie jeszcze raz, poprawiłem bo błąd zrobiłem 

Tym razem nie ma błędów, ale wyświetlacz jest pusty. Działa tylko podświetlanie.

Znalazłem też inna bibliotekę (naprawdę trudno się zdecydować na autora bo jest ich 10 albo i lepiej) 

/*
*	Custom_Chars.ino
*
*	Author: Frank Häfele
*	Date:	01.12.2023
*
*	Object: Print User defined characters on LCD Display
*/

#include <LCD-I2C.h>

// Default address of most PCF8574 modules, change according

LCD_I2C lcd(0x27, 16, 2);

uint8_t happy[8] =
{
    0b00000,
    0b10001,
    0b00000,
    0b00000,
    0b10001,
    0b01110,
    0b00000,
    0b00000,
};

uint8_t wow[8] =
{
    0b00000,
    0b10001,
    0b00000,
    0b01110,
    0b10001,
    0b01110,
    0b00000,
    0b00000,
};

uint8_t anchor[8] =
{
    0b01110,
    0b01010,
    0b01110,
    0b00100,
    0b10101,
    0b10101,
    0b01110,
    0b00100
};

uint8_t snow[8] =
{
    0b01000,
    0b11101,
    0b01011,
    0b00001,
    0b00100,
    0b01110,
    0b00100,
    0b10000
};

void setup()
{
    lcd.begin();
    lcd.display();
    lcd.backlight();

    lcd.createChar(0, happy);
    lcd.createChar(1, wow);
    lcd.createChar(2, anchor);
    lcd.createChar(3, snow);


    lcd.write(0);
    lcd.write(1);
    lcd.write(2);
    lcd.write(3);
}

void loop()
{
}

Ta działa prawidłowo, ale jej nie ogarniam. Niby znak łatwo jest zrobić, ale jak go wcisnąć w określone miejsce na wyświetlaczu? Trochę skomplikowana ta biblioteka. Do tego muszę przeanalizować jak pisać tekst, albo sterować podświetlaniem.  

Link do komentarza
Share on other sites

Gość

P.S.

Ta biblioteka też wyświetla wszystkie 8 linii. Tylko trzeba ogarnąć obsługę.

Link do komentarza
Share on other sites

Gość
13 minut temu, rafal220 napisał:

Ta biblioteka też wyświetla wszystkie 8 linii. Tylko trzeba ogarnąć obsługę.

Tylko że wyświetlacz jest pusty. Odpalę któryś z przykładów autora może będzie lepiej.

Na razie jestem skupiony na tej co działa. W innych przykładach autora jest przedstawione jak sterować podświetlaniem, włączanie/ wyłączanie migającego kursora oraz robienie pływających napisów po ekranie. Tyle że z tymi pływającymi napisami (rzecz jasna) lepszy efekt można uzyskać na wyświetlaczu OLED.  

/*
*	Functions.ino
*
*	Author: Frank Häfele
*	Date:	01.12.2023
*
*	Object: Print User defined characters on LCD Display
*/

#include <LCD-I2C.h>

// Default address of most PCF8574 modules, change according

LCD_I2C lcd(0x27, 16, 2);

/*
* When using lcd.print() (and almost everywhere you use string literals),
* is a good idea to use the macro F(String literal).
* This tells the compiler to store the string array in the flash memory
* instead of the ram memory. Usually you have more spare flash than ram.
* More info: https://www.arduino.cc/reference/en/language/variables/utilities/progmem/
*/

void setup() {
    lcd.begin();
    lcd.display();
    lcd.backlight();
}

void loop()
{
    //Autoscroll
    lcd.setCursor(5, 0);
    lcd.print(F("Autoscrolling"));
    lcd.setCursor(10, 1);
    lcd.autoscroll();

    for (int i = 0; i < 10; i++)
    {
        lcd.print(i);
        delay(200);
    }

    lcd.autoscrollOff();
    lcd.clear();

    // Scroll left and right
    lcd.setCursor(10, 0);
    lcd.print(F("To the left!"));
    for (int i = 0; i < 10; i++)
    {
        lcd.scrollDisplayLeft();
        delay(200);
    }
    lcd.clear();
    lcd.print(F("To the right!"));
    for (int i = 0; i < 10; i++)
    {
        lcd.scrollDisplayRight();
        delay(200);
    }
    lcd.clear();

    //Cursor
    lcd.setCursor(0, 0);
    lcd.cursor();
    lcd.print(F("Cursor"));
    delay(3000);
    lcd.clear();

    //Cursor blink
    lcd.setCursor(0, 0);
    lcd.blink();
    lcd.print(F("Cursor blink"));
    delay(3000);
    lcd.clear();

    //Blink without cursor
    lcd.setCursor(0, 0);
    lcd.cursorOff();
    lcd.print(F("Just blink"));
    delay(3000);
    lcd.blinkOff();
    lcd.clear();
}

Brakuje mi tylko jednego, bo tego nie widzę w przykładach. Mianowicie jak zaimplementować zrobione własne znaki z innymi napisami?   

 

Link do komentarza
Share on other sites

Gość
46 minut temu, farmaceuta napisał:

korzystaj z tej biblioteki bo jest najpopularniejsza

ok, zaraz ją przetestuje, tylko powiedz co w tej bibliotece trzeba zrobić aby przesunąć w inne miejsce tą kratkę na wyświetlaczu;

3.thumb.jpg.95583a826075a74072db080a9bc5287f.jpg

tutaj kod;

#include <LCD-I2C.h>

LCD_I2C lcd(0x27, 16, 2);

uint8_t sym1[8] =
{
    0b11111,
    0b11111,
    0b11111,
    0b11111,
    0b11111,
    0b11111,
    0b11111,
    0b11111,
};

void setup() {
lcd.begin();
    lcd.display();
    lcd.backlight();


lcd.createChar(0, sym1);
lcd.write(0);

lcd.setCursor(5, 0);
lcd.print("#Test#");
}

void loop() {
}

 

Link do komentarza
Share on other sites

@rafal220 trzeba by zajrzeć do biblioteki jak to wyłączyć...to jest chyba kursor i powinna być funkcja od jego wyłączenia...ale tak jak mówię, używaj tej biblioteki którą podałem bo 99% przykładów w necie będzie właśnie z nią...

Link do komentarza
Share on other sites

Gość
2 minuty temu, farmaceuta napisał:

trzeba by zajrzeć do biblioteki jak to wyłączyć..

Słuchaj. Ale numer. Zrobiłem to o czym ty wcześniej zapomniałeś i jest ok. Sam zobacz;

#include <LCD-I2C.h>

LCD_I2C lcd(0x27, 16, 2);

uint8_t sym1[8] =
{
    0b11111,
    0b11111,
    0b11111,
    0b11111,
    0b11111,
    0b11111,
    0b11111,
    0b11111,
};

void setup() {
lcd.begin();
    lcd.display();
    lcd.backlight();


lcd.createChar(0, sym1);

lcd.setCursor(16, 1);
lcd.write(0);

lcd.setCursor(5, 0);
lcd.print("#Test#");
}

void loop() {
}

Dodałem kursor i mam kratkę na końcu tak jak powinno być.

 

5 minut temu, farmaceuta napisał:

używaj tej biblioteki którą podałem bo 99% przykładów w necie będzie właśnie z nią...

No rozumiem. Ale w samej bibliotece nie ma żadnych przykładów. Nie wiadomo np. jak zrobić pływający napis po ekranie, a w tej którą podałem robisz wszystko co chcesz. Ponadto jak zauważyłem składnia kodu jest trochę prostsza. 

Link do komentarza
Share on other sites

(edytowany)
28 minut temu, rafal220 napisał:

Ponadto jak zauważyłem składnia kodu jest trochę prostsza. 

Zapraszam do mojego świata "prostej składni" (przykład w C#):

[Obsolete] [BackwardCompatibility(nameof(CheckDynamicCollisionsForUnit))]
public static bool ScanForUnit<T0, TCurrent>([NotNull] TCurrent currentUnit, Vector3 atPosition)
	where TCurrent : Unit
	where T0 : Unit => 
	CheckDynamicCollisionsForUnit<T0, TCurrent>(currentUnit, atPosition);

A to i tak dość prosta składnia...

28 minut temu, rafal220 napisał:

Nie wiadomo np. jak zrobić pływający napis po ekranie

Bardzo prosto: co pewien czas odświeżasz ekran - czyścisz go, przesuwasz startową pozycję kursora w prawo/lewo o jedno pole i wyświetlasz ten sam tekst co wcześniej.

_ TEKST _ _ _ _ _
_ _ TEKST _ _ _ _
_ _ _ TEKST _ _ _
_ _ _ _ TEKST _ _
_ _ _ _ _ TEKST _
_ _ _ _ _ _ TEKST
T_ _ _ _ _ _ TEKS
ST_ _ _ _ _ _ TEK
KST_ _ _ _ _ _ TE
EKST_ _ _ _ _ _ T
TEKST _ _ _ _ _ _ 
_ TEKST _ _ _ _ _

Mniej więcej tak (przykład dla 11 pól). Oczywiście musisz uwzględnić edge case, gdy tekst przekroczy kraniec ekranu (w Twoim przypadku osiągnie pozycję 16 lub większą)... Zwykła pętla ze zmieniającą się wartością początkową i stałą długością równą ilości znaków tekstu wywołująca funkcję [która robi wrap pozycji do tego, by zmieściła się na wyświetlaczu, a następnie wywołuje funkcję wyświetlenia znaku na ekranie].

W przypadku napisu typowo pływającego po losowych miejscach: czyścisz ekran, wybierasz pseudolosowo pozycję startową, która spowoduje, że tekst nie wyjedzie poza ekran i go wyświetlasz w danej pozycji.

Ktoś chyba musi nadrobić algorytmikę 😉 

Edytowano przez H1M4W4R1
Link do komentarza
Share on other sites

@rafal220 to nie działa tak że masz wszystkie możliwe przykłady do każdej biblioteki, bo tych przykładów musiało być milion do każdego libsa😉 w tej "mojej" bibliotece są chyba funkcje odpowiedzialne za przesuwanie tekstu lewo/prawo/migający kursor/ etc...no taki urok że musisz albo szybko naliczyć się czytać biblioteki, albo szukać przykładów w sieci 

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.