Arduino dotykový LCD display o velikosti 3,2" obsahuje TFT LCD modul s dotykovou obrazovkou a SD slotem. Tento LCD displej je řízen řadičem ILI9341 s 16 bitovým módem, umožňuje zobrazit až 262 tisíc barev a komunikuje po rozhraní SPI. Samotný displej pak disponuje rozlišením 240 x 320 pixelů. Pro detekci dotyku je použita rezistivní dotyková vrstva, která umožňuje detekovat najednou pouze jeden stisk, přičemž je doporučeno používat přibalený stylus pro přesnější dotyk. Dotyková vrstva pak stejně jako displej komunikuje po rozhraní SPI. Celý displej je možné napájet pouze napětím o velikosti 3,3 Voltů a proto je vhodné použít TFT Shield pro desku Arduino Mega 2560.

Arduino dotykový LCD display 3,2

Arduino TFT LCD Shield Mega

Pro úspěšné propojení dotykového displeje s Arduinem tedy stačí do desky Arduino Mega zapojit Arduino Mega TFT LCD shield a do něj poté zapojit samotný dotykový LCD displej. Druhá možnost zapojení je využití odporových děličů obdobně jako v tomto návodu, ale u displeje 3,2" bychom museli zapojit více než 20 datových vodičů pomocí jednotlivých děličů nebo využít specializované obvody pro převod napěťových úrovní, přičemž tyto obvody jsou přítomny právě v použitém TFT Shieldu.

Schéma zapojení Arduino dotykového LCD displeje 3,2

Pro správnou funkci uvedeného ukázkového kódu je nutné stáhnout a naimportovat knihovny UTFT a TFT_Touch, návod jak na to je uveden zde. Ukázkový kód obsahuje na svém začátku připojení potřebných knihoven a deklaraci fontů pro použitá písma. Poté následuje vytvoření proměnných pro nastavení dotykového displeje a inicializace displeje s dotykovou vrstvou z příslušných knihoven. V podprogramu setup jako první provedeme kalibraci dotykové vrstvy a zahájíme komunikaci s displejem. Dále se v programu nachází vyčištění obrazovky a poté ukázka různých nastavení displeje a tisk různých typů dat. Nejprve je uvedena ukázka nastavení barvy pro kreslení pomocí RGB složek (R-červená, G-zelená, B-modrá), po které následuje nakreslení dvou plných obdélníků různých barev na daných souřadnicích. Dále pokračuje společně s nastavením barvy pozadí ukázka tisknutí textu na střed souřadnic osy X a danou souřadnici 1 osy Y. Zbytek podprogramu setup tedy ve zkratce vykoná prvotní tisk obrazovky jako přípravu na samotný běh nekonečné smyčky, protože pokud bychom tiskli všechny údaje každý běh loop smyčky, trval by tisk všech údajů zbytečně dlouho a zpožďoval nám program. Tisk různých tvarů a barev je důkladně popsán pomocí komentářů v kódu, můžeme se tedy přesunout na nekonečnou smyčku loop. V této smyčce probíhá detekce dotyku na displeji. Tato detekce pod podmínkou if obsahuje vytvoření proměnných pro uložení souřadnic stisku, do kterých jsou po jejich vytvoření ihned uloženy výsledky. Poté proběhne nastavení barvy a velikosti písma pro tisk výsledků a následně nejprve vymažeme předchozí výsledek pomocí vytištění mezer a poté na stejné souřadnice vytiskneme získané souřadnice stisku X a Y. Na konci této detekce pak ještě ověříme, zda nebyl detekován stisk ve vytvořeném obdélníku. Pokud je detekován stisk uvnitř, vypíšeme do obdélníka text, v opačném případě opět vyplníme místo mezerami. Pro získání detekčního rozsahu pro osu X a Y stačí „vyměřit“ obdélník pomocí stisku krajních bodů, kdy zjistíme krajové hodnoty a tyto zapíšeme do podmínky if (dotykX..). Na konci programu se nachází už jen pauza po dobu 20 milisekund, která slouží hlavně pro novou detekci stisku na displeji.

// Arduino dotykový LCD display 3,2" ILI9341

// připojení potřebných knihoven
#include <UTFT.h>
#include <TFT_Touch.h>

// deklarace fontů pro použitá písma
extern uint8_t SmallFont[];
extern uint8_t BigFont[];
extern uint8_t SevenSegNumFont[];

// vytvoření proměnných pro nastavení dotykového displeje
#define HMIN 0    // minimum pro souřadnici X
#define HMAX 4095 // maximum pro souřadnici X
#define VMIN 0    // minimum pro souřadnici Y
#define VMAX 4095 // maximum pro souřadnici Y
#define XYSWAP 1  // nastavení pro správnou orientaci os X a Y
// nastavení velikosti displeje pro správnou detekci dotyku
#define HRES 320  // počet pixelů na ose X
#define VRES 240  // počet pixelů na ose Y

// inicializace LCD displeje z knihovny
UTFT displej(ILI9341_16, 38, 39, 40, 41);
// inicializace řadiče dotykové vrstvy z knihovny
TFT_Touch dotyk = TFT_Touch(5, 6, 4, 3);

void setup() {
  // kalibrace dotykové vrstvy
  dotyk.setCal(HMIN, HMAX, VMIN, VMAX, HRES, VRES, XYSWAP);
  // zahájení komunikace s displejem a vyčištění obrazovky
  displej.InitLCD();
  displej.clrScr();
  // nastavení barvy - R, G, B (červená, zelená, modrá)
  // každá barva má rozsah 0 až 255, v tomto případě tedy
  // budeme používat červenou
  displej.setColor(255, 0, 0);
  // nakreslení plného obdélníka, souřadnice ve tvaru [X, Y]
  // souřadnice krajních bodů [0, 0] a [319, 13]
  displej.fillRect(0, 0, 319, 13);
  // nastavení bílé barvy
  displej.setColor(255, 255, 255);
  // nakreslení plného obdélníka,
  // souřadnice krajních bodů [0, 226] a [319, 239]
  displej.fillRect(0, 226, 319, 239);
  // nastavení nejmenšího písma
  displej.setFont(SmallFont);
  // nastavení barvy pozadí na červenou
  displej.setBackColor(255, 0, 0);
  // vytištění textu na střed osy X a první pixel osy Y
  displej.print("* Navody.dratek.cz *", CENTER, 1);
  // nastavení světle šedé barvy na pozadí
  displej.setBackColor(64, 64, 64);
  // nastavení modré barvy
  displej.setColor(0, 0, 255);
  // nakreslení obrysu obdélníka na zadané souřadnice
  displej.drawRect(0, 14, 319, 225);
  // nastavení bílé barvy
  displej.setColor(255, 255, 255);
  // vytištění textu na střed osy X a 20. pixel osy Y
  displej.print("Arduino dotykovy LCD display 3,2\"", CENTER, 20);
  // nastavení písma ve stylu sedmisegmentového displeje
  displej.setFont(SevenSegNumFont);
  // vytištění čísla 123 na souřadnice [90, 110]
  displej.printNumI(123, 90, 110);
  // nastavení velkého písma
  displej.setFont(BigFont);
  // vytištění textu na střed osy X a zadané souřadnice osy Y
  displej.print("x:", CENTER, 40);
  displej.print("y:", CENTER, 80);
  // nakreslení čáry, spojení souřadnic [50, 100] a [150, 200]
  displej.drawLine(50, 100, 150, 200);
  // nakreslení obdélníkového tlačítka zelenou čárou,
  // souřadnice krajních bodů [20, 150] do [90, 210]
  displej.setColor(0, 255, 0);
  displej.drawRect(20, 150, 90, 210);
  // nakreslení plného červeného kruhu,
  // střed na souřadnici [250, 180], poloměr 20
  displej.setColor(255, 0, 0);
  displej.fillCircle(250, 180, 20);
  // nakreslení obrysu žlutého kruhu,
  // střed na souřadnici [250, 180], poloměr 40
  displej.setColor(255, 255, 0);
  displej.drawCircle(250, 180, 40);
}
void loop() {
  // pokud je detekován dotyk na displeji, provedeme následující příkazy
  if (dotyk.Pressed())
  {
    // vytvoření proměnných pro uložení souřadnic stisku
    unsigned int dotykX;
    unsigned int dotykY;
    // načtení souřadnice X a Y dotyku do proměnných
    dotykX = dotyk.RawX();
    dotykY = dotyk.RawY();
    // nastavení bílé barvy písma a černé na pozadí
    displej.setColor(255, 255, 255);
    displej.setBackColor(0, 0, 0);
    // nastavení velkého písma
    displej.setFont(BigFont);
    // vymazání předchozího tisku pomocí vytištění mezer
    displej.print("     ", 180, 40);
    displej.print("     ", 180, 80);
    // vytištění souřadnic dotyku na zadané souřadnice displeje
    displej.printNumI(dotykX, 180, 40);
    displej.printNumI(dotykY, 180, 80);
    // nastavení malého písma
    displej.setFont(SmallFont);
    // pokud je detekován stisk uvnitř zeleného obdélníka,
    // vypíšeme do obdélníka text Stisk!,
    // jinak nahradíme nápis mezerami
    if (dotykX > 670 & dotykX < 1400 & dotykY > 740 & dotykY < 1500 ) {
      displej.print("Stisk!", 35, 175);
    } else {
      displej.print("      ", 35, 175);
    }
  }
  // pauza před další detekcí dotyku
  delay(20);
}

Po nahrání ukázkového kódu do Arduino desky s připojeným LCD displejem 3,2" dostaneme například tento výsledek:

Ukázka funkce Arduino dotykového LCD displeje 3,2

Arduino dotykový LCD display o velikosti 3,2" je velice šikovným zobrazovacím prvkem pro Arduino, který lze využít pro zobrazení nejrůznějších údajů. Lze ho tedy použít jako ovládací prvek, vlastní hodiny či třeba jako základ pro displej meteostanice. Je však nutné zdůraznit, že je doporučeno využít ho v kombinaci se zmíněným TFT Shieldem pro Arduino Mega a deskou Arduino Mega 2560. Shield je důležitý hlavně pro splnění napájení napětím 3,3 V a Arduino Mega deska pak kvůli obsazení většího počtu pinů a velikosti kódu. Pokud budete chtít využít také SD kartu, lze s ní pracovat obdobně jako v tomto návodu, stačí pouze změnit datový pin sd_CS na pin 53.

 

Seznam použitých komponent:

http://dratek.cz/arduino/989-arduino-dotykovy-lcd-display-3-2-1427736404.html

http://dratek.cz/arduino/988-arduino-mega-tft-lcd-shield-1427735951.html

http://dratek.cz/arduino/946-arduino-atmega2560-kabel-1423598706.html

FB tw

Další podobné články