Fyzikální kabinet FyzKAB

Články Moduly ESP32 a ESP32-CAM ESP32 – čidla a periférie Rozhraní I²C a displej LCD s ESP32

Rozhraní I²C 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 I²C 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. 😏

I²C sběrnice

Nejdříve se podíváme, co to ta sběrnice I²C vlastně je. Označení pochází z názvu „Inter-Integrated Circuit“ a tajemnou značku I²C č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 I²C, kterou vyvinula firma Philips. Sběrnice je sériová a umožňuje propojení až 128 různých zařízení jen 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 I²C 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 I²C sběrnici

Obrázek č. 1 zachycuje princip komunikace na sběrnici I²C. 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 modře) 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 I²C 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 I²C řadičem

Máme-li alespoň drobné povědomí o sběrnici I²C, 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 I²C nepodporuje.

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

Displej však lze doplnit I²C převodníkem (viz obr. 3; cena asi 30 Kč), který převádí I²C sběrnici přímo na signály ovládající displej, takže nám rázem vznikne I²C displej (viz obr. 4). 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 I²C 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 I²C řadičem: Takže ti, kteří se nechtějí zdržovat pájením, si mohou koupit (cena asi 80 Kč) už hotový I²C LCD displej (viz obr. 4).

I2C LCD
Obrázek 4 – převodník I²C 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 I²C ř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 I²C.

Propojení I²C LCD s ESP32

Nyní se podívejme, jak propojit tento I²C 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 I²C displejem potřebujeme použít pouze dva GPIO piny vývojové desky ESP32. Na desce ESP32 je pro komunikaci I²C 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 I²C 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 I²C vodiče jsou přes pull-up rezistory (2,4 kΩ) připojeny na napětí 3,3 V. Naopak I²C 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 I²C 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 I²C 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 rezistory (4,7 kΩ) k napětí UCC, za které se (dle datového listu I²C převodníku) předpokládá napětí 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 I²C 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č I²C 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 modulu ESP32 na tuto informaci je však silně odmítavá, neboť to, že modul dále pracuje, není známkou jeho 5 V tolerance. Naopak to může znamenat, že došlo jen k částečnému poškození, kdy modul ESP32 pracuje dále, ale daný vstup je již nevratně 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 I²C komunikace. Ukázalo se však, že v tomto případě displej nic nezobrazuje. Zkusili jsme i zapojení s 5 V (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 I²C převodníku

Pokud se tedy rozhodneme problém řešit, měli bychom začít na straně 5 V – tedy na I²C 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 I²C 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 I²C linku požadované napětí 3,3 V. To obnáší připájet na konec pull-up rezistoru, na kterém je linka I²C (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 I²C 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 I²C 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!

I²C 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 I²C převodníku, bude lepší použít I²C obousměrný převodník logické úrovně.

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

Tento převodník se prodává 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 I²C 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 I²C 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 I²C napěťového převodníku.

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

Použití I²C 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.

pouziti 5V-3,3V prevodniku - fotografie
Obrázek 11 – použití obousměrného převodníku logické úrovně pro korektní připojení I²C LCD
(Nenechte se oklamat tím, že zrovna tento převodník není červený 😉)

Konec drátování, jdeme programovat!

Kód v prostředí Arduino IDE pro I²C LCD a ESP32

Pro komunikaci I²C 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 12 – Otevření Správce knihoven v prostředí Arduino IDE

V okně Správce knihoven do vyhledávacího pole napášeme výraz I²C LCD. Po chvíli se nám zobrazí seznam všech knihoven, které splňují zadané klíčové slovo. K dispozici je mnoho I²C 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 13 – 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 14 – 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 I²C komunikaci. Využijeme ji hned při hledání adresy připojených I²C periférií.

Získání adresy I²C 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 I²C, 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í I²C knihovnu Wire.

Tato knihovna se inicializujete I²C 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 I²C senzory používáte nějaké podpůrné knihovny, které si komunikaci I²C ř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 I²C.


Jak bylo ve specifikaci sběrnice I²C ř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á I²C převodník, který je připojený k LCD displeji. Pro mnoho převodníků I²C 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 I²C řadiče (pájecí plošky A0, A1 a A2 zadní straně I²C řadiče – viz obrázek 15. 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 I²C řadič se neodvíjí od základní adresy 0x27, ale od adresy 0x3F (viz tabulka na obr. 15).

adresa I2C
Obrázek 15 – Základní adresa I²C ř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 I²C displeje, použijeme následující kód, který zjistí adresy všech zařízení, které jsou připojena k I²C 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: (I²C 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 I²C 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 I²C LCD, můžeme se konečně pustit do vypsání textu na displeji.

Zobrazení textu na I²C 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í I²C, 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 16 – Výstup textu na I²C 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í I²C 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 I²C modulu ESP32, kterou jsme využili pro ovládání dvouřádkového LCD. Při vědomí toho, že pro ovládání I²C 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í I²C napěťového převodníku při připojování pětivoltového I²C LCD k třívoltovému modulu ESP32 „skutečně“ nutná!

Reklama:
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!