OK

Při poskytování služeb nám pomáhají soubory cookie. Používáním našich služeb vyjadřujete souhlas s naším používáním souborů cookie. Více informací

Úvodní stránka » Projekty » Aplikace dotykového displeje 2.4" s Arduino UNO

Aplikace dotykového displeje 2.4" s Arduino UNO

Na základě dotazů některých čtenářů uvádím příklad aplikace modulu dotykového displeje 2.4", který je dostupný na našem e-shopu. Tento modul je navržen tak, mohl být přímo zasunutý do Arduino UNO kromě 8 datových vstupů ještě využívá dalši 4 vstupy. Pro připojení dalších periférií k Arduino UNO tak zůstává ještě dostatek vstupů/výstupů, zejména zůstává volný UART, tedy piny D0 a D1.

Na následujícím příkladu budu demonstrovat, jak je použití tohoto dotykového modulu jednoduché. Pomocí vhodných a mírně upravených knihoven, které jsou ke stažení zde, uvedu příklad vykreslení dvou tlačítek na displeji a jejich obsluhu dotykovou vrstvou. Při stisknutí tlačítka se pod nimi vypíše text.

Tento mini projekt zvládneme v následujících krocích:

1. Příprava HW

2. Stažení potřebných knihoven - příprava SW

3. Vytvoření aplikace

4. Otestování

 

Příprava HW

Budeme potřebovat Arduino UNO, modul LCD dotykového displeje 2.4". Zasuňte opatrně modul displeje do arduino UNO, zkontrolujte, zda nemáte někde ohnuté piny modulu displeje. Připojte UNO k USB a displej by se měl rozsvítit - obrazovka by měla být celá bílá, pokud tedy v UNO již nemáte nahraný sketch pro obsluhu displeje. Může se také stát, že na displeji se rozsvítí všechny body, ale různými barvami - displej je jako by zazrněný - toto je naprosto v pořádku a je to známka toho, že displej funguje.

 

Příprava SW

Stáhněte si knihovny potřebné pro obsluhu displeje zde. Pro méně zkušené kutily uvádím, že je potřeba tyto knihovny umístit do adresáře, kde se nacházejí uživatelské knihovny (nikoliv knihovny jádra IDE Arduina) a pak teprve spustit prostředí IDE arduina, aby byly tyto knihovny viditelné.

Vytvoření aplikace

V následujícím textu se pokusím krok za krokem rozebrat stavbu skeče pro obsluhu displeje. Nejprve nalinkujeme potřebné knihovny pro obsluhu modulu displeje a nadefinujeme potřebná propojení s HW - zde se definují pouze řídící piny a piny pro dotykovou vrstvu, datové piny pro LCD displej jsou natvrdo definovány v knihovnách a ani není účelem aby bylo cokoliv měněno :



#include <Adafruit_GFX.h>    // Grafické jádro #include <Adafruit_TFTLCD.h> // Knihovna HW #include <TouchScreen.h> //Knihovna dotykové vrstvy // definice řídících pinů displeje #define LCD_CS A3 // Chip Select goes to Analog 3 #define LCD_CD A2 // Command/Data goes to Analog 2 #define LCD_WR A1 // LCD Write goes to Analog 1 #define LCD_RD A0 // LCD Read goes to Analog 0 #define LCD_RESET A4 // Can alternately just connect to Arduino's reset pin

Dále si zdefinujeme barvy tak, abychom nemuseli používat RGB vyjádření pro nejčastěji používané odstíny. Prosím, všimněte si, že místo černé barvy je definovaná spíševelmi tmavě modrá - protože mi prošlo rukama asi 30 těchto displejů pak vím, že některé mají velký problém se zobrazením vyloženě černé barvy RGB = 0,0,0 - z nepochopitelných příčin zobrazují jakési pruhy přes pole s černou barvou. Tento renonc jsem tedy obešel přimixováním modré a vše se jeví být v pořádku

 

// Assign human-readable names to some common 16-bit color values:
#define Black           0x0004      /*   0,   0,   0 */
#define Navy            0x000F      /*   0,   0, 128 */
#define DarkGreen       0x03E0      /*   0, 128,   0 */
#define DarkCyan        0x03EF      /*   0, 128, 128 */
#define Maroon          0x7800      /* 128,   0,   0 */
#define Purple          0x780F      /* 128,   0, 128 */
#define Olive           0x7BE0      /* 128, 128,   0 */
#define LightGrey       0xC618      /* 192, 192, 192 */
#define DarkGrey        0x7BEF      /* 128, 128, 128 */
#define Blue            0x001F      /*   0,   0, 255 */
#define Green           0x07E0      /*   0, 255,   0 */
#define Cyan            0x07FF      /*   0, 255, 255 */
#define Red             0xF800      /* 255,   0,   0 */
#define Magenta         0xF81F      /* 255,   0, 255 */
#define Yellow          0xFFE0      /* 255, 255,   0 */
#define White           0xFFFF      /* 255, 255, 255 */
#define Orange          0xFD20      /* 255, 165,   0 */
#define GreenYellow     0xAFE5      /* 173, 255,  47 */
#define Pink            0xF81F


Následuje definice pro dotykovou vrstvu - piny a někeré parametry potřebné pro obsluhu dotykové vrstvy.


//definice pro touchscreen
#define YP A1  // must be an analog pin, use "An" notation!
#define XM A2  // must be an analog pin, use "An" notation!
#define YM 7   // can be a digital pin
#define XP 6   // can be a digital pin

#define TS_MINX 150
#define TS_MINY 120
#define TS_MAXX 920
#define TS_MAXY 940 

#define MINPRESSURE 10
#define MAXPRESSURE 1000 


Dále je potřeba vytvořit instance displeje a dotykové vrstvy, aby bylo možné v následujícím kódu přistupovat k těmto prostředkům:



TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300); Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET); // If using the shield, all control and data lines are fixed, and // a simpler declaration can optionally be used: // Adafruit_TFTLCD tft;

A zde již začneme se samotným vykreslováním tlačítek .... Pokud otevřete sériový port, pak na rychlosti 9600b/s se zobrazí rozměr displeje v pixelech. K následujícímu kódu asi netřeba nic dlouze vysvětlovat, provede se reset displeje, zaplní se černou barvou a pak se vykreslují obdélníky - tlačítka v určitých souřadnicích.


void setup(void) {
  Serial.begin(9600);
  Serial.print("TFT size is "); Serial.print(tft.width()); Serial.print("x"); 
Serial.println(tft.height());   tft.reset();   uint16_t identifier = 0x9341;   tft.begin(identifier);   tft.fillScreen(Black);   tft.fillRoundRect(10,10,100,80,5,DarkGrey);   tft.fillRoundRect(20,20,80,60,10,Blue);   tft.fillRoundRect(20,120,80,60,5,Blue);   tft.fillRoundRect(120,20,80,60,5,Blue);   tft.fillRoundRect(120,120,80,60,5,Blue);   tft.drawRoundRect(19,19,81,61,10,Yellow);   tft.drawRoundRect(18,18,83,63,10,Yellow);   tft.drawRoundRect(19,119,81,61,5,Yellow);   tft.drawRoundRect(18,118,83,63,5,Yellow);   tft.setCursor(50, 40);   tft.setTextColor(White);  tft.setTextSize(2);   tft.println("AB"); }

Následuje periodická obsluha dotykové vrstvy, kdy se vyhodnocuje tlak na dotykovou vrstvu a pokud tento odpovídá parametrům definovaným výše MINPRESSURE a MAXPRESSURE, pak se snímá, souřadnice, na kterou je právě "tlačeno". Všimněte si, že tuto souřadnici odečítám od 240 na x-ové ose a od 320 na y-ové ose - důvod je prostý - dotyková vrstva je zde totiž nanesena jako by zrcadlově, vzhůru nohama. Dále kód vyhodnocuje, kde že vlastně daný tlak nastal a pokud je to v souřadnicích, kde leží obdéník - tlačítko 1, pak se vypíše text "Button1 pressed", pokud tlak leží v oblasti tlačítka 2, pak se vypíše jiný text a pokud je mimo tuto oblast, vrátí se smyčka na začátek.


void loop(void) 
{
	TSPoint p = ts.getPoint();
	pinMode(XM, OUTPUT);
	pinMode(YP, OUTPUT); 
	if (p.z > MINPRESSURE && p.z < MAXPRESSURE) 
	{
		p.x = 240 - (map(p.x, TS_MINX, TS_MAXX, (tft.width()), 0));
		p.y = 340 - (map(p.y, TS_MINY, TS_MAXY, (tft.height()), 0));

		//test tlacitka 1
		if((p.x>20)&&(p.x<100)&&(p.y>20)&&(p.y<80)) 
		{
			tft.setCursor(20, 200);
			tft.setTextColor(Green);  tft.setTextSize(2);
			tft.println("Button1 pressed!");
			tft.drawRoundRect(19,19,81,61,10,Red);
			tft.drawRoundRect(18,18,83,63,10,Red);
			delay(400);
			tft.drawRoundRect(19,19,81,61,10,Yellow);
			tft.drawRoundRect(18,18,83,63,10,Yellow);
			tft.fillRect(20,200,220,60,Black);
		}
		//test tacitka 2
		if((p.x>20)&&(p.x<100)&&(p.y>120)&&(p.y<180)) 
		{
			tft.setCursor(20, 200);
			tft.setTextColor(Green);  tft.setTextSize(2);
			tft.println("Button2 pressed!");
			tft.drawRoundRect(19,119,81,61,5,Red);
			tft.drawRoundRect(18,118,83,63,5,Red);
			delay(400);
			tft.drawRoundRect(19,119,81,61,5,Yellow);
			tft.drawRoundRect(18,118,83,63,5,Yellow);
			tft.fillRect(20,200,220,60,Black);
		}
	}
}

Doufám, že výše uvedený příklad Vás uvede alespoň orientačně do problematiky obsluhy grafických displejů, dotykového ovládání a použijete tuto kostru pro Vaše reálné projekty. Skeč si můžete stáhnout zde.


TOP produkty

Arduinotech GSM shield

Arduinotech GSM shield
877 Kč s DPH

Arduino DUE

Arduino DUE
696 Kč s DPH

Kontakt

Ing. Petr Foltýn
Kunčice pod Ondřejníkem 814, 73913
TOPlist