É possível fazer projetos com Arduino utilizando Display LCD TFT !? Sim! E para este post, vamos conectar o Display LCD TFT em um Arduino MEGA.

O Display LCD TFT é sensível ao toque e tem uma dimensão de 2.4 polegadas e resolução de 240 x 320 pixels.
Conectando o Display LCD TFT ao Arduino MEGA



Programa
Neste programa vamos criar uma interface gráfica, com um botão para acender e apagar uma lâmpada. Também será escrito no display touch screen ‘’BAU DA ELETRONICA’’.
Inicialmente teremos o botão amarelo escrito ‘’ACENDE’’ em preto. Quando este botão for pressionado, o botão mudará de cor para preto e a palavra mudará para ‘’APAGA’’ escrito em amarelo.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 | //Projeto: Funcionamento do Display Touch em um Arduino MEGA // Autor: Baú da Eletrônica (www.baudaeletronica.com.br) #include <Adafruit_GFX.h> // Core graphics library #include <Adafruit_TFTLCD.h> // Hardware-specific library #include <TouchScreen.h> #define YP A1 // Y+ is on Analog1 (use A3 para o 9341) #define XM A2 // X- is on Analog2 (use A2 para o 9341) #define YM 7 // Y- is on Digital7 (use 9 para o 9341) #define XP 6 // X+ is on Digital6 (use 8 para o 9341) #define TS_MINX 170 // Use 150 para o 9341 #define TS_MINY 165 // Use 120 para o 9341 #define TS_MAXX 920 #define TS_MAXY 940 TouchScreen ts = TouchScreen(XP, YP, XM, YM, 100); //Definicao de cores #define BLACK 0x0000 #define YELLOW 0xFFE0 //PP_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET); Adafruit_TFTLCD tft(A3, A2, A1, A0, A4); // Armazena o estado dos botões bool valor_botao1 = 0; void setup(void) { Serial.begin(9600); Serial.println("TFT Test"); tft.reset(); delay(500); tft.begin(0x9325); tft.fillScreen(YELLOW); tft.setRotation(1); // Texto e Botão tft.drawRoundRect(5,15, 312,50, 5, BLACK); tft.setTextColor(BLACK); tft.setTextSize(3); tft.setCursor(10, 30); tft.println("BAU DA ELETRONICA"); //Preenchimento ACENDE tft.drawRoundRect(100,100,135,63, 2, BLACK); tft.setTextColor(BLACK); tft.setCursor(115, 123); tft.println("ACENDE"); } void loop() { TSPoint p = ts.getPoint(); pinMode(XM, OUTPUT); digitalWrite(XM, LOW); pinMode(YP, OUTPUT); digitalWrite(YP, HIGH); pinMode(YM, OUTPUT); digitalWrite(YM, LOW); pinMode(XP, OUTPUT); digitalWrite(XP, HIGH); if (p.z > ts.pressureThreshhold) { p.x = tft.width() - (map(p.x, TS_MINX, TS_MAXX, tft.width(), 0)); p.y = tft.height() - (map(p.y, TS_MINY, TS_MAXY, tft.height(),0)); if (p.y > 90 && p.y < 135) { Serial.print("py: "); Serial.print(p.y); Serial.print(" px: "); Serial.print(p.x); //Testa Botão if (p.x > 95 && p.x < 232) { if (valor_botao1 == 0) { tft.fillRoundRect(100, 101, 135, 60, 5, BLACK); mostra_apaga(106,120); valor_botao1 = !valor_botao1; } else { tft.fillRoundRect(101,101, 133,60, 5, YELLOW); mostra_acende(106,120); valor_botao1 = !valor_botao1; } } } } } void mostra_acende(int x, int y) { tft.setTextColor(BLACK); tft.setCursor(x, y); tft.println("ACENDE"); delay(100); } void mostra_apaga(int x, int y) { tft.setTextColor(YELLOW); tft.setCursor(x, y); tft.println(" APAGA"); delay(100); } |
Explicando o Programa
1 2 3 4 5 6 7 8 9 10 11 12 13 | #include <Adafruit_GFX.h> // Core graphics library #include <Adafruit_TFTLCD.h> // Hardware-specific library #include <TouchScreen.h> #define YP A1 // Y+ is on Analog1 (use A3 para o 9341) #define XM A2 // X- is on Analog2 (use A2 para o 9341) #define YM 7 // Y- is on Digital7 (use 9 para o 9341) #define XP 6 // X+ is on Digital6 (use 8 para o 9341) #define TS_MINX 170 // Use 150 para o 9341 #define TS_MINY 165 // Use 120 para o 9341 #define TS_MAXX 920 #define TS_MAXY 940 |
Primeiramente o programa apresenta suas bibliotecas, logo em seguida foram declarados os pinos analógicos e digitais em que foram ligados o Arduino ao Display LCD TFT. Conforme podemos ver abaixo (podemos ver essa ligação através da tabela X):
1 2 3 4 | #define YP A1 // Y+ is on Analog1 (use A3 para o 9341) #define XM A2 // X- is on Analog2 (use A2 para o 9341) #define YM 7 // Y- is on Digital7 (use 9 para o 9341) #define XP 6 // X+ is on Digital6 (use 8 para o 9341) |
Foram determinados valores máximos e mínimos dos eixos X e Y:
1 2 3 4 | #define TS_MINX 170 // Use 150 para o 9341 #define TS_MINY 165 // Use 120 para o 9341 #define TS_MAXX 920 #define TS_MAXY 940 |
1 2 3 4 5 6 7 8 9 10 11 | TouchScreen ts = TouchScreen(XP, YP, XM, YM, 100); //Definicao de cores #define BLACK 0x0000 #define YELLOW 0xFFE0 //PP_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET); Adafruit_TFTLCD tft(A3, A2, A1, A0, A4); // Armazena o estado do botão bool valor_botao1 = 0; |
Podemos ver no trecho acima que foi criado um objeto TouchScreen TouchScreen ts = TouchScreen(XP, YP, XM, YM, 100). Foram criadas também as opções de cores como podemos ver abaixo:
1 2 | #define BLACK 0x0000 #define YELLOW 0xFFE0 |
Em seguida foi criada a variável para armazenar o estado do botão utilizado no sistema bool valor_botao1 = 0
1 2 3 4 | Serial.begin(9600); Serial.println("TFT Test"); tft.reset(); delay(500); |
O trecho acima foi configurado para enviar a mensagem ‘’TFT Test’’ para o monitor serial, com sua configuração de taxa de comunicação serial Serial.begin(9600) e a mensagem correspondente Serial.println(“TFT Test”)
1 2 3 4 5 6 7 8 9 10 | tft.begin(0x9325); tft.fillScreen(YELLOW); tft.setRotation(1); // Texto e Botão tft.drawRoundRect(5,15, 312,50, 5, BLACK); tft.setTextColor(BLACK); tft.setTextSize(3); tft.setCursor(10, 30); tft.println("BAU DA ELETRONICA"); |
O programa inicia o controlador 9325 do display touch tft.begin(0x9325) e logo em seguida preenche a tela do display com a cor amarela tft.fillScreen(YELLOW) e rotaciona o display para a posição 1 tft.setRotation(1).
Logo em seguida o retângulo onde estará escrito ‘’BAU DA ELETRONICA’’ é desenhado com a função tft.drawRoundRect(5,15, 312,50, 5, BLACK),os valores correspondem a coluna inicial, linha inicial, comprimento, altura e cor.
O texto foi escrito respectivamente com as definições de cor, tamanho e posição, como podemos ver nas funções abaixo:
1 2 3 4 | tft.setTextColor(BLACK); tft.setTextSize(3); tft.setCursor(10, 30); tft.println("BAU DA ELETRONICA"); |
1 2 3 4 | tft.drawRoundRect(100,100,135,63, 2, BLACK); tft.setTextColor(BLACK); tft.setCursor(115, 123); tft.println("ACENDE"); |
Acima foi desenhado o contorno do botão ACENDE com a sua coluna inicial, linha inicial, comprimento, altura e cor e o seu nome com a cor, posição e texto.
1 2 3 4 5 6 7 8 9 | TSPoint p = ts.getPoint(); pinMode(XM, OUTPUT); digitalWrite(XM, LOW); pinMode(YP, OUTPUT); digitalWrite(YP, HIGH); pinMode(YM, OUTPUT); digitalWrite(YM, LOW); pinMode(XP, OUTPUT); digitalWrite(XP, HIGH); |
Acima podemos ver a função que detecta o ponto em que a tela foi tocada e envia para a variável TSPoint p TSPoint p = ts.getPoint(),as variáveis XM, YP, YM e XP foram definidas como saída, foram enviados níveis lógicos altos e baixos para estes pinos:
1 2 3 4 5 6 7 8 | pinMode(XM, OUTPUT); digitalWrite(XM, LOW); pinMode(YP, OUTPUT); digitalWrite(YP, HIGH); pinMode(YM, OUTPUT); digitalWrite(YM, LOW); pinMode(XP, OUTPUT); digitalWrite(XP, HIGH); |
1 2 3 4 5 6 7 8 9 10 11 | if (p.z > ts.pressureThreshhold) { p.x = tft.width() - (map(p.x, TS_MINX, TS_MAXX, tft.width(), 0)); p.y = tft.height() - (map(p.y, TS_MINY, TS_MAXY, tft.height(),0)); if (p.y > 90 && p.y < 135) { Serial.print("py: "); Serial.print(p.y); Serial.print(" px: "); Serial.print(p.x); |
Verifica se houve pressão suficiente na tela para ser considerado como um toque if (p.z > ts.pressureThreshhold),em seguida o ponto tocado é mapeado nos eixos x e y e enviado para p.x e p.y p.x = tft.width() – (map(p.x, TS_MINX, TS_MAXX, tft.width(), 0)) e p.y = tft.height() – (map(p.y, TS_MINY, TS_MAXY, tft.height(), 0)) Se a área do botão for tocada entre os limites das coordenadas selecionadas do eixo y if (p.y > 90 && p.y < 135 ) as coordenadas são apresentadas no monitor serial:
1 2 3 4 | Serial.print("py: "); Serial.print(p.y); Serial.print(" px: "); Serial.print(p.x); |
1 2 3 4 5 6 7 8 9 | if (p.x > 95 && p.x < 232) { if (valor_botao1 == 0) { tft.fillRoundRect(100, 101, 135, 60, 5, BLACK); mostra_apaga(106,120); valor_botao1 = !valor_botao1; } |
Se a área do botão for tocada entre os limites das coordenadas do eixo x if (p.x > 95 && p.x < 232)
e se o valor da variável do botão for igual a zero (inicialmente sim), a área deste botão é preenchida na cor preta e em seguida vai para a sub rotina mostra_apaga(106,120),que irá mostrar a palavra APAGA em amarelo. Logo em seguida é enviado nível lógico 1 para a variável botão valor_botao1 = !valor_botao1
Quando o botão ACENDE for pressionado, o botão ficará preto com a palavra APAGA em amarelo. Como a variável botão estará com valor igual a 1 a função else executará a sua função da seguinte forma:
1 2 3 4 5 6 7 | else { tft.fillRoundRect(101,101, 133,60, 5, YELLOW); mostra_acende(106,120); valor_botao1 = !valor_botao1; } |
A área do botão será preenchida de amarelo e logo em seguida vai para a sub rotina mostra_acende(106,120)que irá mostrar a palavra ACENDE em preto. Logo em seguida será enviado nível lógico 0 para a variável do botão valor_botao1 = !valor_botao1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | void mostra_acende(int x, int y) { tft.setTextColor(BLACK); tft.setCursor(x, y); tft.println("ACENDE"); delay(100); } void mostra_apaga(int x, int y) { tft.setTextColor(YELLOW); tft.setCursor(x, y); tft.println(" APAGA"); delay(100); } |
As sub-rotinas void mostra_acende(int x, int y)e void mostra_apaga(int x, int y) mostram a palavra acende e apaga nas suas respectivas coordenadas mostra_apaga(106,120) e mostra_acende(106,120).
Controlando Lâmpada através da Interface

Materiais Utilizados:
– Display LCD TFT 2.4″
– Arduino MEGA
– Módulo relé 5V
– Jumpers (macho – fêmea)
Programa
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 | //Projeto: Acionando uma lâmpada através do display touch screen // Autor: Baú da Eletrônica (www.baudaeletronica.com.br) #include <Adafruit_GFX.h> // Core graphics library #include <Adafruit_TFTLCD.h> // Hardware-specific library #include <TouchScreen.h> #define YP A1 // Y+ is on Analog1 (use A3 para o 9341) #define XM A2 // X- is on Analog2 (use A2 para o 9341) #define YM 7 // Y- is on Digital7 (use 9 para o 9341) #define XP 6 // X+ is on Digital6 (use 8 para o 9341) #define TS_MINX 170 // Use 150 para o 9341 #define TS_MINY 165 // Use 120 para o 9341 #define TS_MAXX 920 #define TS_MAXY 940 TouchScreen ts = TouchScreen(XP, YP, XM, YM, 100); //Definicao de cores #define BLACK 0x0000 #define YELLOW 0xFFE0 //PP_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET); Adafruit_TFTLCD tft(A3, A2, A1, A0, A4); // Armazena o estado dos botões bool valor_botao1 = 0; void setup(void) { pinMode (52,OUTPUT); digitalWrite (52,HIGH); Serial.begin(9600); Serial.println("TFT Test"); tft.reset(); delay(500); tft.begin(0x9325); tft.fillScreen(YELLOW); tft.setRotation(1); // Texto e Botão tft.drawRoundRect(5,15, 312,50, 5, BLACK); tft.setTextColor(BLACK); tft.setTextSize(3); tft.setCursor(10, 30); tft.println("BAU DA ELETRONICA"); //Preenchimento ACENDE tft.drawRoundRect(100,100,135,63, 2, BLACK); tft.setTextColor(BLACK); tft.setCursor(115, 123); tft.println("ACENDE"); } void loop() { TSPoint p = ts.getPoint(); pinMode(XM, OUTPUT); digitalWrite(XM, LOW); pinMode(YP, OUTPUT); digitalWrite(YP, HIGH); pinMode(YM, OUTPUT); digitalWrite(YM, LOW); pinMode(XP, OUTPUT); digitalWrite(XP, HIGH); if (p.z > ts.pressureThreshhold) { p.x = tft.width() - (map(p.x, TS_MINX, TS_MAXX, tft.width(), 0)); p.y = tft.height() - (map(p.y, TS_MINY, TS_MAXY, tft.height(), 0)); if (p.y > 90 && p.y < 135) { Serial.print("py: "); Serial.print(p.y); Serial.print(" px: "); Serial.print(p.x); //Testa Botão if (p.x > 95 && p.x < 232) { if (valor_botao1 == 0) { tft.fillRoundRect(100, 101, 135, 60, 5, BLACK); mostra_apaga(106,120); digitalWrite (52,LOW); valor_botao1 = !valor_botao1; } else { tft.fillRoundRect(101,101, 133,60, 5, YELLOW); mostra_acende(106,120); digitalWrite (52,HIGH); valor_botao1 = !valor_botao1; } } } } } void mostra_acende(int x, int y) { tft.setTextColor(BLACK); tft.setCursor(x, y); tft.println("ACENDE"); delay(100); } void mostra_apaga(int x, int y) { tft.setTextColor(YELLOW); tft.setCursor(x, y); tft.println(" APAGA"); delay(100); } |
Explicando o Programa
A diferença deste programa para o anterior é que foi acrescentado o comando pinMode (52,OUTPUT)que vai definir o pino 52 como saída. Este pino está ligado no pino IN do módulo relé de 5V (para saber mais sobre o módulo relé acesse aqui o post: Sistema de Trava Elétrica com RFID e Arduino). Também temos o comando digitalWrite (52,HIGH) que vai manter inicialmente a saída na posição normal fechado, mantendo a lâmpada apagada. Veja abaixo este trecho do programa:
1 2 3 4 5 6 7 8 9 | void setup(void) { pinMode (52,OUTPUT); digitalWrite (52,HIGH); Serial.begin(9600); Serial.println("TFT Test"); //identifier == 0x9325; tft.reset(); delay(500); |
Outra diferença deste programa ao anterior, é que ao pressionarmos o botão ACENDE, será enviado nível lógico baixo para o pino 52 digitalWrite (52,LOW) e consequentemente para o pino IN do módulo relé. Mudando o contato de saída de normal fechado para normal aberto, a lâmpada se acenderá, como podemos ver a seguir:
1 2 3 4 5 6 7 8 | if (p.x > 95 && p.x < 232) { if (valor_botao1 == 0) { tft.fillRoundRect(100, 101, 135, 60, 5, BLACK); mostra_apaga(106,120); digitalWrite (52,LOW); valor_botao1 = !valor_botao1; |
Quando pressionarmos novamente o botão (APAGA), o pino 52 enviará nível lógico alto para o pino IN do relé digitalWrite (52,HIGH).
Desta forma, mudando o contato de normal aberto para normal fechado, que por sua vez apagará a lâmpada.
1 2 3 4 5 6 | else { tft.fillRoundRect(101,101, 133,60, 5, YELLOW); mostra_acende(106,120); digitalWrite (52,HIGH); valor_botao1 = !valor_botao1; |
Para dúvidas e sugestões, deixe um comentário abaixo!
Envie seu projeto para nós usando a #ProjetoComBau e visite nossa loja: www.baudaeletronica.com.br