Arduino Polska Forum

Pełna wersja: Konwerter LCD HD44780 I2C - Własne znaki.
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
Witam,

Tak jak w temacie chciałem wyświetlić własny znak na wyświetlaczu znakowym LCD 2x16.
Przy korzystaniu z podłączenia wyświetlacza bez konwertera nie było żadnych problemów.
Wielkie moje zdziwienie nastąpiło gdy chciałem to uczynić właśnie na LCD podłączonym przez konwerter I2C.

Oto kod:

Kod:
//Konwerter LCD HD44780 I2C - Własne znaki.

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

LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

byte ZNAK[8] =
{              
 B00000,
 B01110,
 B10001,
 B10001,
 B10001,
 B01010,
 B11011,
 B00000
};

void setup()
{
 lcd.createChar(0, ZNAK);    
 lcd.begin(16,2);              
 lcd.clear();      
 lcd.home ();

 lcd.print ("ZNAK: ");  
 lcd.print ((char)0);  
}

void loop()
{
}

Zamiast zdefiniowanego znaku omegi otrzymuje krzaczki.
Jest jakieś na to rozwiązanie?

Pzdr.
A czy to ten sam wyświetlacz co poprzednio czy inny egzemplarz z konwerterem? I czy normalne znaki pokazuje prawidłowo? Mi coś brakuje w tym kodzie tak optycznie, bo kod działający na I2C mam w domu

Wysłane z mojego GT-I9195 przy użyciu Tapatalka
Witam
A ja proponuję najpierw sprawdzić czy kod prawidłowo kompiluje się ze starszą wersją IDE Arduino (np. 1.5xx).
Jeśli używasz najnowszej wersji IDE, to mogą być problemy z LiquidCrystal_I2C właśnie.
W sumie tak do końca nie wiadomo, czy to kwestia biblioteki czy najnowsze IDE potrzebuje poprawki.
Pozdrawiam
Na tym samym wyświetlaczu bez konwertera wyświetlałem z tym kodem bez problemu znaki graficzne.
Oczywiście na innej bibliotece bez obsługi I2C.

Z konwerterem natomiast LCD wyświetla mi wszystkie napisy w porządku,
a jedynie te moje własne zdefiniowane mi źle wyświetla.

Korzystam ze starej wersji Arduino 1.0.5-r2.

Być może musi być coś innego w kodzie.
Ten co podałem w pierszym poście jest zaciągnięty z neta więc mimo,
że wszystko się wyświetla to jednak może coś z nim jest nie tak jak zasugerował Maciek_M.
Witam
Jeśli podejrzewasz sam kod, to dlaczego nie sprawdzisz LCD na innym przykładzie?
W bibliotece LiquidCrystal_I2C masz przecież katalog examples i tam znajdziesz przykładowy kod w pliku na przykład: CustomChars.pde
Załaduj to na swoje Arduino i będziesz wiedział :-)
Pozdrawiam
Dziwne, wypróbowałem ten kod u siebie, próbowałem go przerabiać bo nie działał, aż w końcu wróciłem do pierwotnej wersji i o dziwo znak omegi się pokazał, ale po odłączeniu zasilania i ponownym podłączeniu znów są "krzaczki".
Coś sobie przypomniałem w związku z róznymi wersjami biblioteki LiquidCrystal_I2C
może zamiast:
 lcd.print ((char)0);  
spróbuj uzyć:
lcd.write(0); 
Jeśli kompilator wywali błąd, to będzie oznaczać, że nie ma tam takiej metody - write()
Pozdrawiam
Przy instrukcji: lcd.write(0); kompilator wywala błąd.

Próbowałem również zamiast zapisu: lcd.print ((char)0); podać instrukcję: lcd.print (char(0));
ale niestety również nie działa ale za to kompiluje się Smile

I co teraz dalej?
Szkoda gdyby nie można było tworzyć własnych znaków przez ten konwerter I2C dla LCD Sad
Wydaje mi się, że to nie wina podłączenia przez I2C. Poniżej widać, że własne znaki działają bez zarzutu i także wywala mi błąd po zmianie na "write".
Panowie i Panie Smile

Problem rozwiązany!

Oto przykładowy kod wyświetlający naprzemiennie znak omegi i błyskawicy.

Kod:
//Konwerter LCD HD44780 I2C - Własne znaki.

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

LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

byte ZNAK1[8] =
{              
  B00000,
  B01110,
  B10001,
  B10001,
  B10001,
  B01010,
  B11011,
  B00000
};

byte ZNAK2[8] =
{
  B00010,
  B00100,
  B01000,
  B00100,
  B00010,
  B10100,
  B11000,
  B11100
};

void setup()
{
  lcd.begin(16,2);
  lcd.createChar(0, ZNAK1);  
  lcd.createChar(1, ZNAK2);  
  lcd.clear();      
  lcd.home ();
  lcd.print ("ZNAK: ");  
}

void loop()
{
  lcd.setCursor (6, 0);
  lcd.print ((char)0);  //Działa zamiennie również: lcd.print (char(0)); lub: lcd.write (byte(0));
  delay (1000);
  lcd.setCursor (6, 0);
  lcd.print ((char)1);
  delay (1000);
}

Problemem była ta sekwencja kodu:

Kod:
lcd.createChar(0, ZNAK);    
  lcd.begin(16,2);              
  lcd.clear();

a musi być:

Kod:
lcd.begin(16,2);
  lcd.createChar(0, ZNAK1);  
  lcd.createChar(1, ZNAK2);  
  lcd.clear();

Ponadto sprawdziłem, że instrukcja: lcd.print ((char)0); może działać zamiennie z instrukcją: lcd.print (char(0)); lub: lcd.write (byte(0));

Pzdr.