0

Znakový displej s převodníkem na I2C

Zde si ukážeme, jak zprovoznit znakové displeje (16×2, 20×4) s řadičem kompatibilním s HD44780 a převodníkem na I2C rozhraní (PCF8574(T)/PCF8574A(T)). Výhoda těchto modulů s I2C rozhraním je fakt, že nám na připojení displeje k Arduinu stačí pouze dva vodiče (pro připojení „normálního“ displeje by bylo potřeba použít 6 či více vodičů). Nevýhoda těchto modulů je o něco nižší rychlost, ale to je ve velkém množství případů zanedbatelné.

Displej 20×4 v provozu:

i2c hd44780 bezici

Displej 16×2 v provozu – ukázka definice vlastního znaku:

I2C HD44780 small

Zapojení modulu k Arduinu je následující:
Pin (Arduino): pin (modul): funkce
GND: GND: společná zem/-
5V: VCC: +5V napájení
SDA (A4): SDA: datový vodič
SCL (A5): SCL: takt
Dále je potřeba nastavit kontrast displeje – to je popsáno na konci článku

i2c hd44780 zapojeni

Na sběrnici I2C by měly být pull-up rezistory, ovšem ty už jsou zde zabudované přímo v modulu převodníku, takže je není nutné připojovat externě)

Budeme zde používat knihovnu LiquidCrystal_I2C. Tu stáhneme zde (Clone or download -> Download ZIP) následně importujeme do Arduino IDE (Sketch -> Include library -> Add ZIP library)

První ukázka kódu – pro displej 16×2 (pomalejší):

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

#define lcd_adresa 0x3f
#define lcd_sloupce 16
#define lcd_radky 2

LiquidCrystal_I2C lcd(lcd_adresa, lcd_sloupce, lcd_radky);

void setup()
{
 lcd.begin(); // inicializace LCD
 lcd.print("Ahoj svete!");
 delay(2000);
}

uint16_t vteriny, vteriny2, fps;

void loop()
{
 
 lcd.setCursor(0,0); // sloupec, radek
 lcd.print("Zapnuto: ");
 vteriny = millis()/1000;
 lcd.print(vteriny);
 lcd.print("s");
 if (vteriny2==vteriny)
 {
  fps++;
 }
 else
 {
  lcd.setCursor(0,1);
  lcd.print("FPS: ");
  lcd.print(fps);
  fps=0;
  vteriny2=vteriny; 
 }
 
}

Druhá ukázka kódu – pro displej 16×2 (rychlejší – >100 FPS se zadanou ukázkou, přepisuje se jen malá část displeje):

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

#define lcd_adresa 0x3f
#define lcd_sloupce 16
#define lcd_radky 2

LiquidCrystal_I2C lcd(lcd_adresa, lcd_sloupce, lcd_radky);

void setup()
{
 lcd.begin(); // inicializace LCD
 lcd.print("Ahoj svete!");
 delay(2000);
 lcd.setCursor(0,0);
 lcd.print("Zapnuto: ");
}

uint16_t vteriny, vteriny2, fps;

void loop()
{
 
 lcd.setCursor(9,0); // sloupec, radek
 vteriny = millis()/1000;
 lcd.print(vteriny);
 lcd.print("s");
 if (vteriny2==vteriny)
 {
  fps++;
 }
 else
 {
  lcd.setCursor(0,1);
  lcd.print("FPS: ");
  lcd.print(fps);
  fps=0;
  vteriny2=vteriny; 
 }
 
}

Třetí ukázka kódu pro displej 16×2 – přidaná definice vlastních znaků (lze jich nadefinovat až 8)

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

#define lcd_adresa 0x3f
#define lcd_sloupce 20
#define lcd_radky 4

uint8_t smile[8] =
{ 0b00000,
 0b01010,
 0b00000,
 0b00100,
 0b10001,
 0b01110,
 0b00000,
 0b00000};


LiquidCrystal_I2C lcd(lcd_adresa, lcd_sloupce, lcd_radky);

void setup()
{
 lcd.begin(); // inicializace LCD

 lcd.createChar(0, smile);


 lcd.print("Ahoj svete!");
 delay(2000);
 lcd.setCursor(0,0);
 lcd.print("Zapnuto: ");
 lcd.setCursor(14, 1);
 lcd.write(0);
}

uint16_t vteriny, vteriny2, fps;

void loop()
{
 
 lcd.setCursor(9,0); // sloupec, radek
 vteriny = millis()/1000;
 lcd.print(vteriny);
 lcd.print("s");
 if (vteriny2==vteriny)
 {
  fps++;
 }
 else
 {
  lcd.setCursor(0,1);
  lcd.print("FPS: ");
  lcd.print(fps);
  fps=0;
  vteriny2=vteriny; 
 }
 
}

Na trhu se pohybují různé typy těchto modulů s různými PCF8574 (existuje verze PCF8574 a PCF8574A – resp PCF8574T a PCF8574AT, každá má jinou adresu – adresa nejčastěji bývá 0x3F nebo 0x27. Na zadní straně modulu jsou ještě propojky A0, A1, A2, kterými jde upravit měnit adresa modulu – viz. datasheet PCF8574). Stejně tak je potřeba upravit počet řádků a sloupců v programu tak, aby odpovídal konkrétnímu displeji. Mnou testovaný 16×2 displej měl adresu 0x3f a 20×4 displej měl 0x27, ale záleží na použitém převodníku PCF8574x.

Pro zprovoznění modulu je ještě potřeba nastavit jeho kontrast, to se dělá trimrem na zadní straně. Neinicializovaný displej (pokud není do Arduina nahraný správný kód či je zadaná špatná adresa) ukáže displej jeden řádek (16×2 displej) či 2 řádky (20×4 displej) černých obdélníčků. Pokud displej neukazuje nic, ukazuje špatně čitelné znaky či ukazuje samé čtverečky, je pravděpodobně špatně nastavený jeho kontrast.

i2c hd44780 trimr

Displeje a další věci k Arduinu můžete zakoupit zde.

Arduino Uno, Mega, Senzory, Moduly za

VÝHODNOU CENU

Saksun

Napsat komentář

Vaše emailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *