S připojováním LCD displeje přes rozhraní I2C se setkáme častěji u Arduina. Asi proto, že programové knihovny usnadňují používání takto připojeného displeje na stejnou úroveň, jako při standardním připojení se čtyřmi nebo osmi datovými vodiči. Výhoda je zřejmá, místo deseti nebo šesti pinů obsadíme jen dva. Dokonce jednou vybudovaná I2C sběrnice nemusí sloužit jen jednomu displeji, ale samozřejmě hned několika i různým zařízením, tím úspora pinů dále vzroste.
Není nutné kupovat displeje, které přímo komunikují přes I2C. V prodeji jsou levné adaptéry, které se připájejí na běžný LCD displej a převedou jej na komunikaci I2C. Cena je opravdu nízká, při koupi pěti kusů vyjde jeden včetně dopravy asi na 0,80 USD. Postup si ukážeme na převodníku, který je v současné době asi nejrozšířenější.
Převodník má po delší straně kontaktní kolíky, které se ve většině případů přímo zasunou a připájí do otvorů v desce LCD displeje. Vývody I2C konektoru jsou názorně popsané, vývody k displeji nejsou popsané, jen pin 1 (blízko konektoru I2C) je nenápadně zvýrazněný bílým rámečkem. Standardní pořadí od pinu 1 do pinu 16 je toto, raději zkontrolujeme, jestli se shoduje s displejem:
Vss, Vdd, Vo, RS, RW, E, D0, D1, D2, D3, D4, D5, D6, D7, A, K
Na desce je LED kontrolka napájení a trimr, jímž se nastaví optimální kontrast displeje.
I2C zařízení má přiřazenou adresu, tu potřebujeme znát. Tyto adaptéry v současném (novějším) provedení mají standardní adresu 0x3F (63 dekadicky), nicméně na desce jsou připraveny tři dvojice pájecích plošek popsaných A0, A1 a A2, jimiž lze příslušný bit adresy uvést do stavu L (bez propojení jsou ve stavu H). Daný modul tedy můžeme nastavit na osm adres (nula značí spoj, tečka rozpojené plošky):
A2 A1 A0 adresa HEX / DEC . . . 0x3F / 63 . . 0 0x3E / 62 . 0 . 0x3D / 61 . 0 0 0x3C / 60 0 . . 0x3B / 59 0 . 0 0x3A / 58 0 0 . 0x39 / 57 0 0 0 0x38 / 56
Základní zapojení I2C je velmi jednoduché, spojíme +5V, zem, SCL signál na A5 a SDA na A4 (tyto dva piny Arduina budeme brát jako pevně dané). Pull UP rezistory nejsou v tomto konkrétním případě nutné. Ještě než začneme využívat displej, můžeme si ověřit I2C adresu zařízení krátkým programem, který ji vypíše přes sériový monitor. Tento postup je velmi vhodný zejména v případě, když typ adaptéru nesouhlasí úplně přesně s úvodní fotografií, starší verze mívají jiné adresy.// vypis adresy pripojeneho I2C zarizeni #include <Wire.h> // standardni knihovna I2C
void setup() { Serial.begin (115200); // nastavit seriovy terminal na 115200 Bd while (!Serial) {} Serial.println (); Serial.println ("Hledam I2C ....."); Wire.begin(); for (byte i = 1; i < 120; i++) { Wire.beginTransmission (i); if (Wire.endTransmission () == 0) { Serial.print ("Nalezena adresa: "); Serial.print (i, DEC); Serial.print (" (0x"); Serial.print (i, HEX); Serial.println (")"); delay (1); } } Serial.println ("Hotovo"); }
void loop() {}
Program vypíše adresu připojeného I2C zařízení (všech nalezených zařízení). Jako ukázka je uveden výsledek, když byly k Arduinu připojeny dva I2C displeje, s nimiž se budeme zabývat později:
Takže známe spolehlivě adresu svého zařízení. Potom z adresy https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads stáhneme a naintalujeme knihovnu pro obsluhu LCD. Ostatní knihovny pro LCD umístíme do jinak pojmenovaného adresáře nebo smažeme, tato je zastoupí i při standardním (paralelním) připojení LCD. V souboru DOCs jsou uvedeny dostupné příkazy.
Jakmile je knihovna nainstalovaná, můžeme vyzkoušet následující program, který jednou vypíše na displej na první (respektive nultý) řádek displeje text „Arduino I2C LCD“. Program je nastaven pro displej 16×2, nicméně bude chodit i na jiných s alespoň 16 znaky na řádku. Při inicializaci zadáváme polohu všech signálů (kromě napájení LED), takže převodník se případně umí přizpůsobit i jiným nestandardním displejům.
#include <Wire.h> #include <LiquidCrystal_I2C.h> // nastavena adresa 0x3F a poradi pinu displeje na prevodniku: // en,rw,rs,d4,d5,d6,d7,bl,blpol LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); void setup() { lcd.begin(16, 2); // displej 16x2 lcd.backlight(); // zapnout podsviceni kdyby nebylo lcd.print("Arduino I2C LCD"); } void loop() {}
Pokud máme více zařízení na I2C sběrnici, třeba dva LCD displeje, je obsluha podobně jednoduchá. Nejprve zapojení:
A nyní program, který na oba displeje do prvního řádku vypíše text stejný jako v předchozím případě, na druhý řádek pak na první displej s sdresou 0x3F vypíše text „Ja jsem prvni“ a na druhý s adresou 0xFE analogicky „Ja jsem druhy“. Samozřejmě podle nastavení každý z displejů může mít různý počet znaků i různé zapojení pinů.
#include <Wire.h> #include <LiquidCrystal_I2C.h> // adresa,en,rw,rs,d4,d5,d6,d7,bl,blpol LiquidCrystal_I2C lcd1(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); LiquidCrystal_I2C lcd2(0x3E, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); void setup() { lcd1.begin(20, 4); // displej1 20x4 lcd2.begin(16, 2); // displej2 16x2 lcd1.print("Arduino I2C LCD"); // prvni radky lcd2.print("Arduino I2C LCD"); lcd1.setCursor(0, 1); // nastavit druhy radek lcd2.setCursor(0, 1); lcd1.print("Ja jsem prvni"); // napisy druhy radek lcd2.print("Ja jsem druhy"); } void loop() {}