• 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
Konwerter LCD HD44780 I2C - Własne znaki.
#1
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.
Jeżeli pomogłem, to poproszę o punkt reputacji Big Grin
 
Odpowiedź
#2
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
 
Odpowiedź
#3
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
 
Odpowiedź
#4
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.
Jeżeli pomogłem, to poproszę o punkt reputacji Big Grin
 
Odpowiedź
#5
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
 
Odpowiedź
#6
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".
 
Odpowiedź
#7
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
 
Odpowiedź
#8
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
Jeżeli pomogłem, to poproszę o punkt reputacji Big Grin
 
Odpowiedź
#9
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".
 
Odpowiedź
#10
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.
Jeżeli pomogłem, to poproszę o punkt reputacji Big Grin
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości