Dotykový displej o velikosti 2,4 palce s rozlišením 240x320 pixelů je zajímavý zobrazovací modul. Kromě zmíněného barevného displeje totiž obsahuje také rezistivní dotykovou plochu. Jak displej, tak dotyková vrstva komunikuje pomocí protokolu SPI, jen je zde rozdíl v napěťových úrovních. Proto je tedy nutné použít pro připojení displeje buď další obvod pro převod logických úrovní anebo lze použít odporový dělič, přičemž tento návod obsahuje zmíněný dělič na šesti propojovacích vodičích.

Dotykový displej

Pro propojení LCD dotykového displeje s Arduino deskou je nutné využít 13 pinů z celkových 14 na modulu displeje a celkem 10 pinů na Arduinu. Pro použití dotykové vrstvy propojíme T_DO s pinem D12, T_DIN s pinem D11, T_CS s pinem D7 a T_CLK s pinem D13. Pro použití displeje propojíme SDO přes dělič s pinem D12, LED s pinem +3V3, SCK přes dělič s pinem D13, SDI přes dělič s pinem D11, DC přes dělič s pinem D9, RESET přes dělič s pinem D8, CS přes dělič s pinem D10, GND se zemí Arduina a VCC s pinem +5V. Zapojení přes dělič je zobrazeno na schématu níže, přičemž já jsem volil hodnoty odporů 220 a 470 ohmů. Je možné využít i jiné hodnoty odporů, jen musí splnit dělící poměr pro dosažení napětí okolo 3,3V [(5V*470ohm)/(220+470ohm)=3,4V]. Jako vždy je možné využít i jiné datové piny u všech pinů kromě MISO, MOSI a SCK, které patří SPI rozhraní. Pokud by jste chtěli využít například Arduino Mega, je nutné si zjistit příslušné piny pro rozhraní SPI.

Schéma zapojení dotykového displeje

Pro správné přeložení a nahrání uvedeného ukázkového kódu je nutné stáhnout a naimportovat knihovnu LCD_ILI9340, návod jak na to je uveden zde. Ukázkový kód obsahuje na svém začátku připojení knihoven pro displej a dotykovou vrstvu a dále nastavení propojovacích pinů. Následuje inicializace LCD displeje z knihovny ILI9340 a také dotykové vrstvy z knihovny XPT2046. V podprogramu setup jako první zahájíme komunikaci s displejem a dotykovou vrstvou a dále nastavíme chování displeje. Jako první můžeme nastavit rotaci displeje v rozmezí 0-3, kde tyto hodnoty odpovídají otočení o 0, 90, 180 a 270 stupňů. Dále příkazem fillScreen vyplníme celý displej barvu v závorce (zde černá) a následně si nastavíme kurzor do levého horního rohu (souřadnice 0,0). Následují příkazy pro nastavení barvy a velikosti textu a ukázky tisknutí textu na displej v různých velikostech. V nekonečné smyčce loop je na začátku uvedena if smyčka, která kontroluje, jestli nebyl detekován dotek a v případě splnění této podmínky provede následující příkazy. Jako první se do proměnné dotyk načtou údaje z dotykové vrstvy o posledním doteku. Dále následují ukázky různých funkcí, jako první vykreslení plného obdélníku na místo výpisu údajů o souřadnicích doteku, aby bylo toto místo na displeji vždy vymazáno před vytištěním údajů. Jako další se vykreslí červeně obrys obdélníka níže pro simulaci tlačítka a poté následují funkce pro kreslení vodorovných a svislých čar. Po těchto krocích jsou na displej vytištěny údaje o poslední doteku a pro zprovoznění tlačítka je uvedena if funkce, která v podmínkách obsahuje rozsah souřadnic x a y. Tyto čísla byly zjištěny jednoduchým způsobem, kdy stačí na displeji vykreslit vlastní obrazec, poté zjistit dotykem údaje o levém horním a pravém dolním rohu a tyto hodnoty zapsat do podmínek if funkce. Když je pak detekován dotyk v tomto obrazci, je pro ukázku vypsána informace o stisku uvnitř objektu a v opačném případě se vyplní obrazec opět černou barvou. Na konci programu se nachází už jen krátké zpoždění pro optimální funkci displeje.

// Displej dotykový 240x320px

// připojení knihoven
#include "SPI.h"
#include "Adafruit_ILI9340.h"
#include "XPT2046_Touchscreen.h"

// nastavení propojovacích pinů
#define LCD_cs 10
#define LCD_dc 9
#define LCD_rst 8
#define DOTYK_cs  7

// inicializace LCD displeje z knihovny
Adafruit_ILI9340 displej = Adafruit_ILI9340(LCD_cs, LCD_dc, LCD_rst);
// inicializace řadiče dotykové vrstvy z knihovny
XPT2046_Touchscreen dotyk(DOTYK_cs);

void setup() {
  // zahájení komunikace s displejem a dotykovou vrstvou
  displej.begin();
  dotyk.begin();
  // pro otočení displeje stačí změnit číslo
  // v závorce v rozmezí 0-3
  displej.setRotation(0);
  // vyplnění displeje černou barvou
  displej.fillScreen(ILI9340_BLACK);
  // nastavení kurzoru na souřadnice x, y
  displej.setCursor(0, 0);
  displej.setTextColor(ILI9340_WHITE);
  // velikost textu lze nastavit změnou čísla v závorce
  displej.setTextSize(1);
  // funkce pro výpis textu na displej,
  // print tiskne na řádek stále za sebou,
  // println na konci textu přeskočí na nový řádek
  displej.println("Dotykovy displej");
  displej.setTextSize(3);
  displej.println("2.4 TFT LCD");
  displej.setTextSize(2);
  displej.println("navody.");
  displej.println("dratek.cz");
}

void loop() {
  // pokud je detekován dotyk na displeji,
  // proveď následující
  if (dotyk.touched()) {
    // načti do proměnné bod souřadnice dotyku
    TS_Point bod = dotyk.getPoint();
    // funkce pro vykreslení plného obdélníku,
    // zadání (výchozí bod x, výchozí bod y,
    // velikost hrany na ose x, velikost hrany na ose y,
    // barva obdélníku) 
    displej.fillRect(115, 100, 100, 50, ILI9340_BLACK);
    // funkce pro vykreslení obrysu obdélníku,
    // zadání (výchozí bod x, výchozí bod y,
    // velikost hrany na ose x, velikost hrany na ose y,
    // barva obsysu obdélníku)
    displej.drawRect(20, 200, 100, 100, ILI9340_RED);
    // funkce pro vykreslení vodorovné čáry,
    // zadání (výchozí bod x, výchozí bod y,
    // délka čáry, barva čáry)
    displej.drawFastHLine(10, 90, 220, ILI9340_BLUE);
    // funkce pro vykreslení svislé čáry,
    // zadání (výchozí bod x, výchozí bod y,
    // délka čáry, barva čáry)
    displej.drawFastVLine(110, 90, 100, ILI9340_GREEN);
    displej.setCursor(0, 100);
    displej.setTextColor(ILI9340_WHITE);
    displej.setTextSize(2);
    // vypsání informací o souřadnicích posledního dotyku
    // včetně tlaku dotyku - tlak není přiliš přesný
    displej.print("   Tlak = ");
    displej.print(bod.z);
    displej.println(",");
    displej.print("Sour. x = ");
    displej.print(bod.x);
    displej.println(",");
    displej.print("Sour. y = ");
    displej.print(bod.y);
    displej.println();
    // pokud je detekován stisk uvnitř červeného obdélníku,
    // vypiš do obdélníku text Stisk!,
    // jinak vyplň obdélník černou barvou
    if (bod.x > 580 & bod.x < 1660 & bod.y > 2100 & bod.y < 3500 ) {
      displej.setCursor(35, 240);
      displej.print("Stisk!");
    } else {
      displej.fillRect(35, 210, 80, 80, ILI9340_BLACK);
    }
  }
  delay(1);

}

Po nahrání programu do Arduino desky s připojeným LCD displejem uvidíme například takovýto výpis:

Ukázka použití dotykového displeje

Dotykový displej 2,4 palce s Arduinem lze použít v různých zařízeních, kde by jsme chtěli informovat uživatele o různých informacích pomocí barevného displeje a zároveň mu můžeme umožnit ovládat zařízení dotykem. Díky použití rezistivní dotykové vrstvy je ale nutné podotknout, že displej zvládne pouze jeden dotyk a pro tento je vhodné používat přiložený stylus. Displej s použitím pokročilejších knihoven umožňuje vypisovat také grafické obrázky, které lze načítat například z paměťových karet z čtečky umístěné na modulu, ale tato funkce bude vysvětlena v jiném článku.

 

Seznam použitých komponent:

http://dratek.cz/arduino/909-arduino-display-dotykovy-240x320px--1420987998.html

http://dratek.cz/arduino/974-arduino-uno-r3-atmega328p-1424115860.html

http://dratek.cz/arduino/1227-7-ks-mini-nepajive-pole-25-kontaktu-1458405292.html

http://dratek.cz/arduino-kabelaz-propoje-rozsireni/1214-arduino-vodice-samice-samice-40-kusu-1457705007.html

FB tw

Další podobné články