Fyzikální kabinet FyzKAB

Články Moduly ESP32 a ESP32-CAM Rozhraní I2C a displej LCD s ESP32

Rozhraní I2C a displej LCD s ESP32

V článku o možnostech a nastavení pinů vývojových desek s modulem ESP jsme se zmínili, že se postupně podíváme na jednotlivé komunikační protokoly, které modul ESP32 podporuje. Tím dnešním bude sběrnice I2C a jako ukázku užití si ukážeme připojení LCD displeje s řadičem této sériové sběrnice.

Nechceme však zde jen přejímat informace, které se již jinde objevily na internetu, podat Vám je stylem: „Takhle to je a hotovo!“, ale chceme se na tyto informace podívat i z pohledu fyziky a elektroniky. Díky tomu se toto původně jednoduché téma (oproti jiným článkům s tématem připojení LCD a ESP32) trochu zkomplikuje. 😏

I2C sběrnice

Nejdříve se podíváme, co to ta sběrnice I2C vlastně je. Označení pochází z názvu „Inter-Integrated Circuit“ a tajemnou značku I2C čteme: „I-squared-C“. Mimochodem, prakticky identická sběrnice se skrývá i pod zkratkou TWI (Two Wire Interface – dvoudrátové rozhraní), kterou používá firma Atmel a další výrobci namísto chráněné značky I2C, kterou vyvinula firma Philips. Sběrnice je sériová a umožňuje propojení až 128 různých zařízení je pomocí dvou obousměrných vodičů. Jeden tvoří hodinový signál SCL (Synchronous Clock) a druhý datový kanál SDA (Synchronous Data). Zařízení připojené na sběrnici se rozdělují na řídicí (tzv. master – zahajuje a ukončuje komunikaci; generuje hodinový signál SCL) a řízené (tzv. slave – zařízení adresované masterem).

Z elektrického hlediska jsou kanály SCL a SDA zapojeny jako otevřený kolektor. Každý tento vodič musí být připojen jedním pull-up rezistorem ke kladnému napětí, což zajistí vysokou úroveň (HIGH) v klidovém stavu sběrnice. Typické hodnoty pull-up rezistorů jsou 4,7 kΩ pro zařízení napájené 5 V a 2,4 kΩ pro zařízení napájené 3,3 V. Při probíhajícím přenosu jsou na SDA vysílány jednotlivé datové bity, přičemž platí pravidlo, že logická úroveň na SDA se smí měnit pouze, je-li SCL v úrovni LOW. Toto pravidlo je porušeno ve dvou speciálních případech – při vysílání podmínek START a STOP, které se používají k zahájení komunikace a k ukončení přenosu.

POZNÁMKA:
Na některých zařízeních s rozhraním I2C se můžeme též setkat s označením vodičů: SDI místo SDA a SCK místo SCL. Nic se však neděje, jedná se o totéž!

Časový diagram:

I2C komunikace
Obrázek 1 – Diagram komunikace na I2C sběrnici

Obrázek č. 1 zachycuje princip komunikace na sběrnici I2C. Přenos dat se zahajuje START bitem (S), když je SDA na nízké úrovni, zatímco SCL zůstává na vysoké úrovni. Pak SDA nastaví přenášený bit, zatímco SCL je na nízké úrovni (vyznačeno modrá) a jsou odebrány vzorky dat (přijaté) při vysoké úrovni SCL (znázorněno zelená). Když je přenos dokončen, je poslaný STOP bit (P) pro uvolnění datové linky, změnou SDA na vysokou, zatímco SCL má trvale vysoký stav.

Během vysílání musí periférie neustále porovnávat vysílané bity se skutečným stavem SDA. Vzhledem k charakteru sběrnice (otevřené kolektory) může dojít k situaci, že určitá stanice vysílá úroveň H, zatímco jiná stanice vysílá úroveň L. Stanice, která na lince zjistí úroveň L zatímco sama vysílá H musí vysílání okamžitě ukončit. Tím je zabráněno kolizím na této sériové lince.

Sběrnice I2C neumožňuje duplexní přenos, v jednom okamžiku vysílá jen jedno zařízení. Všechna zařízení připojená na sběrnici musí mít individuální adresu o délce 7 nebo 10 bitů a implementovaný mechanizmus komunikace pomocí I²C sběrnice.

LCD displej s I2C řadičem

Máme-li alespoň drobné povědomí o sběrnici I2C, můžeme ji využít pro připojení LCD displeje k desce ESP32. Využijeme levný monochromatický displej LCD1602A (cena asi 50 Kč), který může zobrazovat dva řádky, každý o 16 znacích. Displej se ovládá pomocí 16 pinů (viz obr 2), protože sám sběrnici I2C nepodporuje.

LCD 16x2
Obrázek 2 – Displej LCD1602A, 16x2 znaků

Displej však lze doplnit I2C převodníkem (viz obr. 3; cena asi 30 Kč), který převádí I2C sběrnici přímo na signály ovládající displej, takže nám rázem vznikne I2C displej (viz obr. 3). Na zadní straně tohoto řadiče LCD displeje vidíme proměnný rezistor (trimr). Tento proměnný rezistor se používá k úpravě jasu podsvícení LCD. To se hodí, pokud používáte LCD displej za různých světelných podmínek. Převodník, stejně jako displej, pracuje na klasické TTL logice, tedy napěťových úrovních 0 a 5 V.

I2C prevodnik
Obrázek 3 – převodník I2C pro displej LCD1602

Protože jde o velmi běžnou a praktickou věc, displej LCD1602A se dnes může koupit jako jeden blok přímo s připájeným I2C řadičem: Takže ti, kteří se nechtějí zdržovat pájením, si mohou koupit (cena asi 80 Kč) už hotový I2C LCD displej (viz obr. 4).

I2C LCD
Obrázek 4 – převodník I2C připájený na zadní straně displej LCD1602 (zadní strana)

Jak z obrázku 4 vidíme, původně 16 pinový displej má díky I2C řadiči piny jen 4. Dva slouží pro napájení (Vcc a GND) a dva zbylé (SDA a SCL) jsou právě vodiče sběrnice I2C.

Propojení I2C LCD s ESP32

Nyní se podívejme, jak propojit tento I2C LCD s vývojovou deskou ESP32. Následující schéma, které je uvedeno hned v několika článcích, ukazuje, že je toto zapojení velmi jednoduché. Jak bylo řečeno, s I2C displejem potřebujeme použít pouze dva GPIO piny vývojové desky ESP32. Na desce ESP32 je pro komunikaci I2C výchozím pinem SCL pin GPIO 22 a pin GPIO 21 je výchozím pinem SDA. Tak hurá do toho!

I2C LCD schema zapojeni
Obrázek 5 – propojení vývojové desky ESP32-DevKitC s převodníkem I2C displeje LCD1602
(obě varianty schéma lze najít na internetu, uváděno v několika článcích)

Musíte propojit pin GPIO 22 modulu ESP32 s SCL pinem převodníku displeje a pin GPIO 21 s pinem SDA. Problém však nastává s napájecím napětím. Někde se uvádí propojení UCC s  napětím 3,3 V, ale i s  Vin modulu ESP32. Pokud vývojovou desku s modulem ESP32 napájíme přes USB port, má vývod Vin napětí 5 V.

Tak jaké je to správné zapojení? Zde si můžeme zadělat na problém! Pozorný čtenář už asi tuší. Problém je v napěťových úrovních!

A máme tu zase tu fyziku!

Modul ESP32 pracuje na logických úrovních 3,3 V, takže I2C vodiče jsou přes pull-up rezistory (2,4 kΩ) připojeny na napětí 3,3 V. Naopak I2C převodník LCD pracuje na logice 5 V. Samotné napájecí napětí 5 V ale ještě nemusí znamenat, že převodník bude komunikovat na 5 V logice. Existují moduly a senzory, které obsahují 3,3 V stabilizátor, tedy napájeny jsou 5 V, ale komunikují na logice 3,3 . To nám musí vždy ukázat elektronické schéma daného zapojení. Obrázek č. 6 znázorňuje elektronické schéma I2C převodníku pro LCD, zaměřme se na zapojení pull-up rezistorů (červeně vyznačeno).

I2C prevodnik - schema
Obrázek 6 – elektronické schéma I2C převodníku pro LCD

Na obrázku č. 6 vidíme, že komunikační vodiče SDA a SCL jsou připojeny přes pull-up (4,7 kΩ) k napětí UCC, které máme připojené na 5 V. Je tedy jasné, že tyto vodiče budou na straně převodníku drženy na napětí 5 V. Na straně modulu ESP32 však budou tyto vodiče drženy na 3,3 V. Celou situaci nám ukazuje následující obrázek 7.

3,3V vs 5V I2C - schema
Obrázek 7 – situace na I2C sběrnici spojující zařízení s 3,3 V a 5 V logikou

Z místa s vyšším potenciálem (5 V) bude protékat elektrický proud Ipar do místa s potenciálem nižším (3,3 V). Velikost tohoto proudu bude určena rozdílem těchto potenciálů a součtem obou pull-up rezistorů, které jsou v tomto případě zapojeny sériově.

Ipar  5 V – 3,3 V  ≐ 240 μA

4,7 kΩ + 2,4 kΩ

Vodič I2C linky, který se nachází mezi pull-up rezistory, bude mít potenciál daný poměrem velikostí rezistorů (princip děliče napětí). S ohledem na velikosti proudu Ipar a pull-up rezistoru na straně 3,3 V, by vodič měl být na napěťové úrovni Usk:

Usk= 3,3 V + 2,4 kΩ · Ipar = 3,3 V + 0,575 V = 3,875 V

Do pinů modulu ESP32 bude tedy vstupovat napětí asi 3,9 V, místo požadovaných 3,3 V!
A to je trochu malér!

Hledáme řešení

Nejdříve se podíváme, co na to výrobce modulu ESP32. Podle datového listu je maximální povolené napětí na pinech stanoveno na hranici 3,6 V. Podle zjištění některých odvážných „bastlířů“ dokáží piny modulu ESP32 vydržet i vyšší napětí. Oficiální reakce výrobce na tuto informaci je však silně odmítavá, neboť může dojít jen k částečnému poškození, kdy modul ESP32 pracuje dále, ale daný vstup je již poškozen.

Podíváme se, co na to vývojáři, kteří tento problém řešili před námi. Je zajímavé, že v některých článcích je displej připojen na pin 3,3 V (jako by se jednalo o 3,3 V displej), jinde je napájením připojen na 5 V. Dokonce jsme našli článek, kde na schéma byl displej zapojen k 3,3 V, ale dle tabulky zapojených pinů byl zapojen k 5 V. Už samotný rozdíl v těchto zapojeních stejného displeje je dosti matoucí!

Pochopitelně nám to nedalo a provedli jsme několik zkušebních zapojení. Při napájení displeje napětím 3,3 V jsme očekávali, že asi toto napětí bude pro provoz stačit a tím bude vyřešen i problém I2C komunikace. Ukázalo se však, že v tomto případě displej nic nezobrazuje. Zkusili jsme i zapojení s 5 V (a s obavami o modul ESP32), tedy zapojení které odpovídá schématu na obrázku č. 5. Musíme říci, že funguje a modul ESP32 to (asi) přežil bez úhony. Každopádně se ale pohybujme za hranicí povolenou výrobcem! Tento způsob s charakteristickým heslem: „Funguje to – prodáme to!“ asi rozhodně není tím správným řešením a nikdy bychom ho neměli používat v projektu, jako trvalé řešení.

Úprava I2C převodníku

Pokud se tedy rozhodneme problém řešit, měli bychom začít na straně 5 V – tedy na I2C převodníku. Alespoň takový názor jsme objevili mezi některými „bastlíři“, které problém této napěťové nekompatibility trápil. Na různých fórech jsou v podstatě navrhována tři řešení a všechny jsou založeny na zásahu do pětivoltových pull-up rezistorů (viz obr.  8).

I2C-prevodnik pull_up rezistory
Obrázek 8 – umístění pull-up rezistorů na I2C převodníku a vyznačení vývodů rezistorů s  UCC

  1. změna velikosti pull-up rezistorů vychází z myšlenky snížit proud Ipar a tím i napětí Usk pod hranici 3,6 V. Tomu odpovídá hodnota nový pull-up rezistorů asi 15 kΩ nebo vyšší.
     
  2. vytvoření děliče napětí, který přivede na I2C linku požadované napětí 3,3 V. To obnáší připájet na konec pull-up rezistoru, na kterém je linka I2C (tj. opačný konec než je UCC) rezistor 9,1 kΩ proti zemi tak, aby se vytvořil potřebný dělič napětí. Pak bude i na této straně linka držena na napětí 3,3 V.
     
  3. úplné vyndání pull-up rezistorů zapříčiní, že se I2C linka odpojí od „závadných“ 5 V. Roli pull-up rezistorů převezmou pull-up rezistory na straně modulu ESP32 a ty budou držet linku na 3,3 V.
     

Co na to asi pozorný čtenář… Jsou toto opravdu dobré nápady? A bude vůbec I2C převodník úroveň HIGH v podání pouhých 3,3 V místo požadovaných 5 V respektovat? Je to opravdu řešení, které je určeno do spolehlivého projektu?

Upřímně řečeno: Jde to i lépe!

I2C obousměrný převodník logické úrovně (5 V a 3,3 V)

Někdy bývá lepší se trochu porozhlédnout, dříve než vezmeme do ruky kleště nebo páječku. Problém setkání dvou napěťových úrovní je přece standardní věc a nejsme první, kdo to řeší. Než se pouštět do riskantního propojení dvou úrovní nebo začít vrtat do I2C převodníku, bude lepší použít I2C obousměrný převodník logické úrovně.

I2C prevodnik 3,3 V vs 5 V
Obrázek 9 – zapojení I2C obousměrného převodníku logických úrovní mezi I2C LCD (5 V) a modul ESP32 (3,3 V)

Tento převodník se prodá v různých verzích, např. pro 2 linky (17 Kč) nebo pro 4 linky (19 Kč). My zde na obrázku 9 máme verzi pro 4 linky, takže si můžeme vybrat, které dva vývody z možné čtveřice použijeme (na obr. 9 jsme kupříkladu použili kanál 1 a 2). Kromě signálových linek sběrnice I2C musíme připojit i napětí 3,3 V a 5 V (a příslušné země GND).


   Poznámka:
Při výběru převodníku je potřeba si dát pozor na dvě věci – aby skutečně šlo o převodník pro I2C sběrnici (jsou i jiné 3,3 V/5 V převodníky) a aby byly signály GND obou napěťových úrovní propojené (popřípadě je dodatečně propojit).
 

Obrázek 10 ukazuje opravené zapojení z obrázku 5, nyní doplněné použitím I2C napěťového převodníku.

schema zapojeni - upravene
Obrázek 10 – naše upravené propojení desky ESP32-DevKitC s převodník I2C displeje LCD1602
(zapojení s obousměrným napěťovým převodníkem log. úrovní nebylo zatím nikde publikováno)

Použití I2C obousměrného převodníku logické úrovně je skutečně tou správnou cestou, která by měla být použita v projektu, který je použit pro trvalý a spolehlivý provoz. Vše bude pracovat na předepsaných napěťových úrovních a nebude docházet k přetěžování některých částí obvodu.

Konec drátování, jdeme programovat!

Kód v prostředí Arduino IDE pro I2C LCD a ESP32

Pro komunikaci I2C využijeme knihovny Wire a LiquidCrystal_I2C, které musíme přidat do prostředí Arduino IDE. Knihovnu můžeme přidat buď pomocí správce knihoven, nebo z externího souboru. Následující postupy popisují tři různé cesty, jak lze do prostředí Arduino IDE přidat externí knihovnu. Osobně doporučujeme používat (standardní) první způsob, zbylé způsoby spíše, pokud nastanou nějaké problémy.

1. Přidání knihovny LiquidCrystal_I2C pomocí „Správce knihoven“ v prostředí Arduino IDE

V prostředí Arduino IDE v menu vybereme položky Projekt > Přidat knihovny… Tím spustíme Správce knihoven.

Sprava knihoven
Obrázek 11 – Otevření Správce knihoven v prostředí Arduino IDE

V okně Správce knihoven do vyhledávacího pole napášeme výraz I2C LCD. Po chvíli se nám zobrazí seznam všech knihoven, které splňují zadané klíčové slovo. K dispozici je mnoho I2C LCD knihoven. Pokud chcete, můžete použít různou knihovnu, my budeme nadále používat knihovnu vývojáře Marca Schwartze.

manazer knihoven
Obrázek 12 – Výběr knihovny LiquidCrystal_I2C od vývojáře Marco Schwartz

2. Přidání knihovny ze ZIP souboru pomocí prostředí Arduino IDE

Druhým způsobem přidání externí knihovny je využití ZIP souboru, který si stáhnete ze stránek vývojáře této knihovny. Toto lze kupříkladu využít při instalaci starších knihoven, které nejsou ve Správci knihoven zobrazovány. V našem případě by se mohlo jednat o knihovnu LiquidCrystal_I2C od vývojáře Johna Rickmana.

  1. Stáhněte si ZIP soubor ze stánek vývojáře – např. LiquidCrystal od John Rickman
  2. V menu Projekt > Přidat knihovny… vyberte možnost Přidat .ZIP knihovnu
Sprava knihoven
Obrázek 13 – Instalace knihovny do prostředí Arduino IDE pomocí stažené ZIP knihovny

  1. Vybereme stažený ZIP soubor, který se do prostředí Arduino IDE nainstaluje.

3. Přidání knihovny přímého nakopírování pomocí ZIP souboru

Poslední možností obdoba předchozího postupu, jen místo instalace ZIP souboru pomocí prostředí Arduino IDE učiníme potřebné kroky sami.

  1. Zavřeme prostředí Arduino IDE a otevřeme webový prohlížeč na stránce vývojáře, kde stáhneme ZIP soubor s požadovanou knihovnou.
  2. Stažený ZIP soubor rozbalíme na dočasné místo na disku, tím získáme složku se jménem LiquidCrystal_I2C-master.
  3. Ve složce knihoven prostředí Arduino IDE (zpravidla Dokumenty\Arduino\libraries\) vytvoříme složku jménem LiquidCrystal_I2C.
  4. Zkopírujeme obsah dočasné složky LiquidCrystal_I2C-master do právě vytvořené složky LiquidCrystal_I2C. (Po dokončení můžeme stažený ZIP soubor i dočasnou složku LiquidCrystal_I2C-master smazat)
  5. Spustíme prostředí Arduino IDE, které zaznamená ve svém adresáři knihoven přidanou knihovnu. Máme hotovo!

Obdobně předchozímu postupu přidáme do prostředí Arduino IDE i knihovnu Wire, která slouží pro I2C komunikaci. Využijeme ji hned při hledání adresy připojených I2C periférií.

Získání adresy I2C LCD

   Ještě než začneme programovat:   

Zde si jen připomeňme, že nastavení pinů GPIO 21 a 22 jsou pouze výchozím nastavením. Modul ESP32 může nastavit téměř jakýkoli pin, aby měl schopnosti I2C, stačí to nastavit v kódu. Při použití ESP32 s prostředím Arduino IDE použijeme pro komunikaci se zařízeními pomocí I2C knihovnu Wire.

Tato knihovna se inicializujete I2C následujícím způsobem:

Wire.begin()

Pokud však tomuto příkazu přidáme dvojici argumentů, které udávají čísla pinů v  rolích I2C_SDA a I2C_SCL, např.:

Wire.begin(22, 21);   // pin 22 ma funkci SDA, pin 22 je SCL (tedy prohozene funkce)

můžeme vodiče SDA a SCL ovládat zadaný GPIO piny.

Je zde však jedno úskalí: Pokud ke komunikaci s I2C senzory používáte nějaké podpůrné knihovny, které si komunikaci I2C řeší samy nebo volají knihovnu Wire dle svých parametrů, nemusí být výběr svých pinů umožněn. V takových případech se musíte blíže podívat na soubory knihovny (soubor s příponou .cpp) a zjistit, jak předávají nastavení GPIO pinů.

Z tohoto důvodu se budeme nadále držet standardního nastavení GPIO pinů pro I2C.


Jak bylo ve specifikaci sběrnice I2C řečeno, každé připojené zařízení musí mít svou pevně danou adresu, aby bylo jasné, komu je informace běžící po sériové sběrnici určena. Musíme tedy zjistit, jakou adresu má I2C převodník, který je připojený k LCD displeji. Pro mnoho převodníků I2C LCD je výchozí adresa 0x27 (kde „0x“ odkazuje na hexadecimální formát čísel). V některých případech se ale adresa může lišit. Tato adresa závisí na konfiguraci adresních spojek I2C řadiče (pájecí plošky A0, A1 a A2 zadní straně I2C řadiče – viz obrázek 14. Jak vidíte na tomto obrázku, máme tři pájecí plošky, jejichž spojením nebo rozpojením můžeme vytvořit 8 různých hodnot adresy. A aby situace byla ještě komplikovanější, může se stát, že adresa I2C řadič se neodvíjí od základní adresy 0x27, ale od adresy 0x3F (viz tabulka na obr. 14).

adresa I2C
Obrázek 14 – Základní adresa I2C řadiče se liší dle použitého čipu,
další volba lze ovlivnit propojením adresních pájecích bodů

Abychom měli jistotu, jaké je skutečná adresa našeho I2C displeje, použijeme následující kód, který zjistí adresy všech zařízení, které jsou připojena k I2C sběrnici. Tento kód vyhledá zařízení spojená na piny GPIO 22 a 21 a zobrazí výsledek na sériovém monitoru. Pokud Bude k modulu ESP32 připojen náš jen displej, získáme jeho adresu (princip kódy je popsán v komentářích)

Kód: (I2C Skener)

/* I2C Skener */

#include <Wire.h>   // Tato knihovna obsahuje komunikacni funkce I2C

// funkce SETUP se spusti jednou pri stisknuti tlacitka reset nebo pri zapnuti desky.
void setup() {
  Wire.begin();   // inicializace I2C komunikace
  Serial.begin(115200);   // prenosova rychlost serioveho vystupu
  Serial.println("ESP32 hleda I2C zarizeni");   // vypis uvodni hlasky na Serial Monitor
}

// funkce LOOP bezi stale dokola.
void loop() {
  byte error_i2c, address_i2c; // promenne pro adresu a navrat chyby
  int I2C_Devices; // promena pro pocet nalezenych zarizeni
  Serial.println("Hledani zapocalo"); // vypis hlasky na Serial Monitor
  I2C_Devices = 0; // pocatecni stav nalezenych zarizeni je 0
  for(address_i2c = 1; address_i2c < 127; address_i2c++ ) { // prochazi se adresy od 0 do 127
    Wire.beginTransmission(address_i2c); // pokus o prenos do zarizeni zadane adresy
    error_i2c = Wire.endTransmission(); // navrat stavove hodnoty I2C prenosu
    if (error_i2c == 0) { // pokud je navratova hodnota 0, je to OK, zarizeni existuje
    Serial.print("I2C zarizeni nalezeno na adrese: 0x"); // vypis hlasky na Serial Monitor
  if (address_i2c<16) { // pokud je adresa mensi nez 16, bude hex adresa jednociferna
      Serial.print("0");
    }
    Serial.println(address_i2c,HEX); // vypsani adresy nalezeneho zarizeni v hex formatu
    I2C_Devices++; // naslo se zarizeni, tak zvys počet o 1
    } else if (error_i2c==4) { // zarizeni tam je, ale nastala nejaka chyba
      Serial.print("Neznama chyba na adrese: 0x"); // vypis hlasky na Serial Monitor
      if (address_i2c<16) { // opet reseni formatu vypisu adresy mensi nez 16
        Serial.print("0");
      }
      Serial.println(address_i2c,HEX);
    }
  } // probehlo se všech 128 adres, tak se vypise zaver
  if (I2C_Devices == 0) { // nic se nenaslo
    Serial.println("Není pripojeno zadne I2C zarizeni");
  } else { // nejake zarizeni se nasla a byla vypsana
    Serial.println("Konec I2C seznamu ");
  }
  delay(2000);
}


Po zkompilování programu a nahrátí do modulu ESP32 si v prostředí Arduino IDE otevřeme Serial Monitor, ve kterém uvidíme vypsaný seznam nalezených zařízení s jejich adresami.

V případě připojeného I2C LCD to asi bude:

ESP32 hleda I2C zarizeni
Hledani zapocalo
I2C zarizeni nalezeno na adrese: 0x27
Konec I2C seznamu.


Víme-li správnou adresu našeho I2C LCD, můžeme se konečně pustit do vypsání textu na displeji.

Zobrazení textu na I2C LCD

Místo předchozí knihovny Wire, přidáme do kódu, knihovnu LiquidCrystal_I2C.h, kterou jsme si dle předchozího postupu přidali do prostředí Arduino IDE. Následují kód nejdříve vypíše na první řádku text „Fyzikalni kabinet“ a na druhou řádku text „FyzKAB“. Po dvou vteřinách se displej smaže a vypíše se text: „Trocha fyziky“ a za další vteřinu se na druhou řádku doplní „nikoho nezabije!“. Po dalších dvou vteřinách se vše znova opakuje.

Princip kódu je opět vysvětlen v komentářích:

Kód: (výpis statického textu)

/* I2C LCD ukazka statickeho textu */

#include <LiquidCrystal_I2C.h>   // Tato knihovna obsahuje komunikacni s I2C LCD

LiquidCrystal_I2C lcd(0x27, 16, 2);   // vytvoreni objektu lcd(adresa, sloupce, radky)

// funkce SETUP se spusti jednou pri stisknuti tlacitka reset nebo pri zapnuti desky.
void setup(){
  lcd.init();   // inicializace objektu lcd
  lcd.backlight();   // zapnuti podsviceni displeje
}

// funkce LOOP bezi stale dokola.
void loop() {
  lcd.setCursor(0, 0);   // nastavit kurzor na 1. radek a 1.znak
  lcd.print("Fyzikalni kabinet");   // vypis zadany text
  lcd.setCursor(0,1);   // nastavit kurzor na 2. radek a 1. znak
  lcd.print("FyzKAB");   // vypis zadany text
  delay(2000);   // cekani 2s
  lcd.clear();   // smazani LCD
  lcd.setCursor(0, 0);   // nastavit kurzor na 1. radek a 1.znak

  lcd.print("Trocha fyziky");   // vypis zadany text
  delay(1000);   // cekani 1s
  lcd.setCursor(0,1);   // nastavit kurzor na 2. radek a 1. znak

  lcd.print("nikoho nezabije!");   // vypis zadany text
  delay(2000);   // cekani 2s
  lcd.clear();   // smazani LCD
}


Při přeložení kódu se mám může zobrazit následující varování (záleží na nastavení „výřečnosti“ kompilátoru v prostředí Arduino IDE):

VAROVÁNÍ: knihovna LiquidCrystal_I2C-1.1.2 je určena pro běh na architektuře avr a může být nekompatibilní s Vaší vývojovou deskou, která má architekturu esp32.

Tato hláška upozorňuje, že knihovna byla původně napsána pro vývojové desky Arduino, které mají zcela jinou architekturu procesoru, ale nemusíme propadat panice, díky tomu, že pracuje se sběrnicí I2C, jejíž funkčnost je procesorově nezávislá, bude náš kód fungovat i pro vývojové desky ESP32

Po spuštění kódu bychom tedy měli vidět následující situaci:

ESP32-LCD vystup
Obrázek 15 – Výstup textu na I2C displeji.

A máme hotovo!

Na obrázku vidíme, že text „Fyzikalni kabinet“ je delší než 16 znaků, proto se na displej nevešel celý. Takže kdybychom to celé chtěli ještě dotáhnout k dokonalosti, čekalo by nás ještě trochu práce.

Případné zájemce o podrobnější informace o připojení I2C LCD k vývojové desce s ESP32, doporučujeme se podívat na článek: How to Use I2C LCD with ESP32 on Arduino IDE (ESP8266 compatible), který sice nenabízí elektricky korektní připojení LCD k ESP32, ale po programové stránce mu není co vytknout – kupříkladu nabízí možný návrh procedury pro rolování textu delšího než 16 znaků, nebo je tam i zmíněna funkce lcd.createChar(0, heart), pomocí které lze definovat pro displej vlastní znak – například znak s diakritikou nebo roztomilé srdíčko – obojí se jistě občas hodí!

Závěr:

Dnes jsme si představili sběrnici I2C modulu ESP32, kterou jsme využili pro ovládání dvouřádkového LCD. Při vědomí toho, že pro ovládání I2C displeje potřebujeme jen dva datové vodiče, řízení této periférie je díky připravené knihovně velice intuitivní a cena displeje se pohybuje okolo osmdesáti korun, je možné říci, že se jedná o zajímavé řešení textového výstupu některého z Vašich budoucích projektů.

Původně jednoduchý úkol se nám při analýze elektrického hlediska dostupných návrhů z internetu docela zkomplikoval. Bohužel i to k programování mikrokontrolérů patří. Stále musíme mít na paměti, že se pohybujeme na poli elektronických obvodů, kde platí Ohmův zákon, Kirchhoffovy zákony a všechno ostatní, co je potřeba respektovat (včetně parametrů a doporučení od výrobců jednotlivých komponent). Dočasná funkčnost daného řešení postavená na tom, že něco v rámci určité tolerance „chvíli“ vydrží fungovat, nemá v návrhu trvalého a udržitelného řešení co dělat. A nezvykejme si na to! Takových zařízení se na nás poslední dobou valí plné kontejnery. Znakem bohaté společnosti by neměla být možnost neomezeného nákupu velkého množství nekvalitních řešení, ale naopak možnost investovat prostředky do tvorby toho kvalitního.

Vzpomeňte si na to, až se budete rozmýšlet, zda je dvacetikorunová investice do použití I2C napěťového převodníku při připojování pětivoltového I2C LCD k třívoltovému modulu ESP32 „skutečně“ nutná!

UPOZORNĚNÍ:
Nesouhlasíme s vyřazením Newtonových zákonů, Ohmova zákona a zákona zachování energie z učiva fyziky základních škol v České republice!