Jako další ze základních prvků při programování mikrokontrolérů obecně považuji důležitý grafický výstup. U Arduina se používají často alfanumerické displeje s rozlišením 8x1 až třeba 40x4 znaky. Já v tomto návodu použiji dva displeje, 16x2 a 20x4 znaky.

LCD displej 20x4 znaky

Pro připojení displeje k Arduinu máme dvě základní možnosti - buď ho připojit přímo pomocí 16 pinového hřebínku a v tomto případě bude nutno zapojit minimálně 10 vodičů, resp. 6 datových vodičů do Arduina. Anebo lze využít obvodu PCF8574, který funguje jako 8 bitový převodník na I2C sběrnici. Tímto způsobem tedy bude stačit připojit displej pouze pomocí 4 vodičů - Vcc, SDA, SCL a GND. Také je důležité myslet na nastavení kontrastu displeje, protože ve většině případů po prvním nahrání programu nemusí být text na displeji čitelný. Pokud využíváme přímé propojení, řídíme kontrast odporem umístěným mezi pin V0 a zem - první nastavení se obvykle provádí pomocí 10k ohm potenciometru. Po nalezení optimálního kontrastu je pak vhodné změřit aktuální odpor potenciometru a k displeji pak už jen připojit odpor změřené hodnoty. Při využití hotového modulu s PCF8574 je pak většinou na přímo na modulu umístěn trimr pro přesné nastavení kontrastu.

LCD-I2C převodník

Já ve svých zapojeních využívám kvůli úspoře vodičů připojení přes I2C sběrnici. Pro úplnost ale uvedu obě možnosti. Jako první je zde méně úsporné zapojení.K tomuto zapojení je nutné propojit celkem 10 vývodů z displeje, jejichž názvy jsou uvedeny níže ve ukázkovém kódu. Potřebná knihovna LiquidCrystal je již přítomna v nových verzích Arduina (testováno na 1.6.7). V ukázkovém kódu je tedy nejprve displej nainicializován, v sekci setup() nastavena jeho velikost a rovnou proveden první tisk. V nekonečné smyčce loop() je pak pouze zařazeno tisknutí počtu sekund od posledního resetu na druhý řádek.

// LCD displej
// navody.dratek.cz
/*
 * LCD RS pin na digital pin 12
 * LCD Enable pin na digital pin 11
 * LCD D4 pin na digital pin 5
 * LCD D5 pin na digital pin 4
 * LCD D6 pin na digital pin 3
 * LCD D7 pin na digital pin 2
 * LCD R/W pin na GND
 * LCD VSS pin na GND
 * LCD VCC pin na 5V
 * LCD V0 pin přes odpor na zem
 *  (kontrast)
 */

// knihovna pro LCD displej
#include <LiquidCrystal.h>

// inicializace pinu, lze vyměnit za jiné volné
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup() {
  // nastavení počtu znaků a řádků LCD, zde 16x2
  lcd.begin(16, 2);
  // vytisknutí hlášky na první řádek
  lcd.print("dratek.cz");
  // nastavení kurzoru na první znak, druhý řádek
  // veškeré číslování je od nuly, poslední znak je tedy 15, 1
  lcd.setCursor ( 0, 1 );
  lcd.print("---------------!");
  delay(2000);
}

void loop() {
  // nastaveni kurzoru na osmý znak, druhý řádek
  lcd.setCursor(7, 1);
  // vytisknutí počtu sekund od začátku programu
  lcd.print(millis() / 1000);
}

Druhý způsob využívá připojení přes I2C převodník. Pro zjednodušenou práci s obvodem PCF8574 využívám knihovnu LiquidCrystal_I2C. Postup pro zprovoznění libovolné knihovny je jednoduchý a pokusím se ho zde popsat. Jako první si zde Arduino-LiquidCrystal-I2C-library stáhnete zabalený soubor s knihovnou, který následně rozbalíte. Složku s knihovnou poté nakopírujete do podsložky libraries, která se nachází tam, kde jsou vaše Arduino Sketche (standardně v Dokumentech). Poté si můžete po spuštění vývojového prostředí zkontrolovat přítomnost knihovny tak, že otevřete nabídku File - Examples a název knihovny, zde se u většiny knihoven nachází ukázkové programy. Druhý úkázkový program pro LCD přes I2C je velice podobný předchozímu a vše je okomentováno.

// LCD displej pres I2C
// navody.dratek.cz

// knihovny pro LCD přes I2C
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

// nastavení adresy I2C (0x27 v mém případě),
// a dále počtu znaků a řádků LCD, zde 20x4
LiquidCrystal_I2C lcd(0x27, 20, 4);

void setup()
{
  // inicializace LCD
  lcd.begin();
  // zapnutí podsvícení
  lcd.backlight();
  // vytisknutí hlášky na první řádek
  lcd.print("->dratek.cz<-");
  // nastavení kurzoru na první znak, druhý řádek
  // veškeré číslování je od nuly, poslední znak je tedy 19, 3
  lcd.setCursor ( 0, 1 );
  lcd.print("--------------------");
  lcd.setCursor ( 0, 2);
  lcd.print(" Test LCD pres I2C");
  lcd.setCursor ( 19, 3);
  lcd.print("!");
  delay(2000);
}

void loop()
{
  // nastavení kurzoru na devátý znak, druhý řádek
  lcd.setCursor(8, 1);
  // vytisknutí počtu sekund od začátku programu
  lcd.print(millis() / 1000);
}

K jednomu Arduinu je však samozřejmě možné připojit větší množství displejů. Je možné využít i více zařízení na jedné sběrnici I2C, přičemž jednotlivá zařízení odlišíme adresou. Na použitém modulu PCF8574 se nachází 3 drátové propojky, kterými můžeme měnit adresu na 8 kombinací v rozsahu 0x20-0x27. Já jsem tedy ještě pokusně spojil oba programy dohromady a zapojil k Arduinu oba displeje najednou. Níže vidíte upravený kód a obrázek z testování.

// 2x LCD displej
// navody.dratek.cz

// knihovna pro LCD
#include <LiquidCrystal.h>
// knihovny pro LCD přes I2C
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

// nastavení adresy I2C (0x27 v mém případě),
// a dále počtu znaků a řádků LCD, zde 20x4
LiquidCrystal_I2C lcdI2C(0x27, 20, 4);
// inicializace pinů, lze vyměnit za jiné volné
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup()
{
  // inicializace LCD
  lcdI2C.begin();
  // zapnutí podsvícení
  lcdI2C.backlight();
  // vytisknutí hlášky na první řádek
  lcdI2C.print(" ->dratek.cz<-");
// nastavení kurzoru na první znak, druhý řádek
// veškeré číslování je od nuly, poslední znak je tedy 19, 3
lcdI2C.setCursor ( 0, 1 );
lcdI2C.print("--------------------");
lcdI2C.setCursor ( 0, 2);
lcdI2C.print(" Test LCD pres I2C");
lcdI2C.setCursor ( 19, 3);
lcdI2C.print("!");
// nastavení počtu znaků a řádků LCD, zde 16x2
lcd.begin(16, 2);
// vytisknutí hlášky na první řádek
lcd.print("dratek.cz"); // nastavení kurzoru na první znak, druhý řádek // veškeré číslování je od nuly, poslední znak je tedy 15, 1 lcd.setCursor ( 0, 1 ); lcd.print("---------------!"); delay(2000); } void loop() { // nastavení kurzoru na devátý znak, druhý řádek lcdI2C.setCursor(8, 1); // vytisknutí počtu sekund od začátku programu lcdI2C.print(millis() / 1000); // nastavení kurzoru na osmý znak, druhý řádek lcd.setCursor(7, 1); // vytisknutí počtu sekund od začátku programu lcd.print(millis() / 1000); }

Displeje a převodník použité v tomto návodu lze nakoupit na internetovém obchodu dratek.cz

Arduino display žlutý 16x2 znaků

Arduino display modrý 20x4 znaků HD44780

LCD Sériové rozhraní IIC/I2C/TWI/SP 1602

FB tw

Další podobné články