Quer fazer menus mais
personalizados? E melhores interfaces homem/máquina? Para tais projetos você
pode utilizar um Arduino e um Display Touch Screen. Gostou da ideia? Então,
acompanhe o vídeo de hoje, no qual vou te mostrar uma montagem com um Arduino
Mega e um Display Touch Screen. Você vai ver como fazer os desenhos que desejar
na tela e ainda como determinar a região desta tela a ser tocada para ativar um
determinado comando. Destaco que optei por utilizar o Arduino Mega em função da
quantidade de pinos que ele possui.
Então, hoje, vou te apresentar
o display Touch Screen, suas funções gráficas e como pegar o ponto do toque na
tela. Vamos também criar um exemplo contendo todos os elementos, como
posicionamento, escrita, desenho de formas, cores e toque.
Arduino Mega 2560
TFT LCD Shield 2.4”
Este display que usamos no
nosso projeto tem uma particularidade interessante: possui um cartão SD. No
entanto, como fazer gravação e leitura neste será mostrado em um outro vídeo,
que ainda pretendo produzir. Nesta aula de hoje o objetivo é tratar
especificamente sobre as características gráficas e de touch screen deste
display.
- Dimensão tela: 2,4 polegadas
- Slot para cartão MicroSD
- Cor LCD: 65K
- Controlador: ILI9325
- Resolução: 240 x 320
- Touchscreen: 4 fios resistivos touchscreen
- Interface: 8 bit dados, mais 4 linhas de controle
- Tensão de operação: 3,3-5V
- Dimensões: 71 x 52 x 7mm
Bibliotecas
Adicione as bibliotecas:
- “Adafruit_GFX”
- “SWTFT”
- “TouchScreen”
Clique nos links e faça os
downloads das bibliotecas.
Descompacte o arquivo e cole
na pasta de bibliotecas da IDE do arduino.
C:/Program Files
(x86)/Arduino/libraries
Observação:
Antes de iniciarmos o nosso
programa, vamos fazer algo importante: a calibração do TOUCH.
Utilizando um programa simples
para pegar os pontos de toque no display, guarde o valor dos pontos (x,y) em
cada uma das extremidades (destacados em amarelo na figura abaixo). Esses
valores são importantes para mapear o touch aos pontos gráficos na tela.
#include <TouchScreen.h> //Portas de leitura das coordenadas do touchvoid #define YP A1 // Y+ is on Analog1 #define XM A2 // X- is on Analog2 #define YM 7 // Y- is on Digital7 #define XP 6 // X+ is on Digital6 //objeto para manipulacao dos eventos de toque na tela TouchScreen ts = TouchScreen(XP, YP, XM, YM); void setup() { Serial.begin(9600); } void loop() { TSPoint touchPoint = ts.getPoint();//pega o touch (x,y,z=pressao) Serial.print("X: "); Serial.println(touchPoint.x); Serial.print("Y: "); Serial.println(touchPoint.y); delay(1000); }
Funções
Agora vamos dar uma olhada em
algumas funções gráficas que as bibliotecas nos oferecem.
1. drawPixel
A função drawPixel é
responsável por pintar um único ponto na tela no ponto dado.
void drawPixel(int16_t x, int16_t y, uint16_t color)
2. drawLine
A função drawLine é responsável
por desenhar uma linha a partir de dois pontos.
void drawLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1, uint16_t color);
3. drawFastVLine
A função drawFastVLine é
responsável por desenhar uma linha vertical a partir de um ponto e uma altura.
void drawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color);
4. drawFastHLine
A função drawFastHLine é
responsável por desenhar uma linha horizontal a partir de um ponto e uma largura.
void drawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color);
5. drawRect
A função drawRect é
responsável por desenhar um retângulo na tela, passando um ponto de origem, sua
altura e largura.
void drawRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color);
6. fillRect
A função fillRect é a mesma
que drawRect, porém, o retângulo será preenchido com a cor dada.
void fillRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color);
7. drawRoundRect
A função drawRoundRect é a
mesma que drawRect, porém, o retângulo terá as bordas arredondadas.
void drawRoundRect(int16_t x0, int16_t y0, int16_t w, int16_t h,int16_t radius, uint16_t color);
8. fillRoundRect
A função fillRoundRect é a
mesma que drawRoundRect, porém, o retângulo será preenchido com a cor dada.
void fillRoundRect(int16_t x0, int16_t y0, int16_t w, int16_t h,int16_t radius, uint16_t color);
9. drawTriangle
A função drawTriangle é
responsável por desenhar um triângulo na tela, passando o ponto dos 3 vértices.
void drawTriangle(int16_t x0, int16_t y0, int16_t x1, int16_t y1, int16_t x2, int16_t y2, uint16_t color);
10. fillTriangle
A função fillTriangle é a
mesma que drawTriangle, porém, o triângulo será preenchido com a cor dada.
void fillTriangle(int16_t x0, int16_t y0, int16_t x1, int16_t y1, int16_t x2, int16_t y2, uint16_t color);
11. drawCircle
A função drawCircle é
responsável por desenhar um círculo a partir de um ponto origem e um raio.
void drawCircle(int16_t x0, int16_t y0, int16_t r, uint16_t color);
12. fillCircle
A função fillCircle é a mesma
que drawCircle, porém, o círculo será preenchido com a cor dada.
void fillCircle(int16_t x0, int16_t y0, int16_t r, uint16_t color)
13. fillScreen
A função fillScreen é
responsável por preencher a tela de uma única cor.
void fillScreen(uint16_t color);
14. setCursor
A função setCursor é
responsável por posicionar o cursor para escrita em um ponto dado.
void setCursor(int16_t x, int16_t y);
15. setTextColor
A função setTextColor é
responsável por atribuir uma cor ao texto que será escrito. Temos duas maneiras
de utilizá-la:
void setTextColor(uint16_t c); //configura a cor apenas da escrita void setTextColor(uint16_t c, uint16_t bg); //configura a cor da escrita e a cor do fundo
16. setTextSize
A função setTextSize é
responsável por atribuir um tamanho para o texto que será escrito.
void setTextSize(uint8_t s);
17. setTextWrap
A função setTextWrap é
responsável por quebrar a linha caso chega ao limite da tela.
void setTextWrap(boolean w);
18. setRotation
A função setRotation é
responsável por rotacionar a tela (landscape, portrait).
void setRotation(uint8_t r); //0 (padrão),1,2,3
Exemplo
Criaremos um programa no qual
utilizaremos a maior parte dos recursos que o display nos proporciona.
Vamos escrever algumas strings
em diferentes tamanhos, criar três figuras geométricas e pegar o evento de
toque sobre elas, a cada vez que tocarmos em uma das figuras, teremos o
feedback do nome da figura logo abaixo delas.
Bibliotecas
Primeiramente vamos definir as
bibliotecas que utilizaremos.
#include <SWTFT.h> //responsável pela parte gráfica #include <TouchScreen.h> //responsável por pegar os toques na tela #include <SPI.h> //comunicação com o display #include <Wire.h> //comunicação com o display #include "math.h" //calcular potencia
Defines
Definiremos algumas macros
para os pinos e valores importantes que utilizaremos.
//Portas de leitura das coordenadas do touch #define YP A1 // Y+ #define XM A2 // X- #define YM 7 // Y- #define XP 6 // X+ //valores encontrados através da calibração do touch //faça um código simples para imprimir os valores (x,y) a cada toque //então encontre os valores nas extremidades max/min (x,y) #define TS_MINX 130 #define TS_MINY 80 #define TS_MAXX 900 #define TS_MAXY 900 //tamanho dos textos #define TEXT_SIZE_L 3 #define TEXT_SIZE_M 2 #define TEXT_SIZE_S 1 //posicionamento dos textos de feedback #define FEEDBACK_LABEL_X 10 #define FEEDBACK_LABEL_Y 200 #define FEEDBACK_TOUCH_X 120 #define FEEDBACK_TOUCH_Y 200 //valores para detectar a pressão do toque #define MINPRESSURE 10 #define MAXPRESSURE 1000
Prosseguimos com a definição
de algumas macros.
//Associa o nome das cores aos valores correspondentes #define BLACK 0x0000 #define RED 0xF800 #define GREEN 0x07E0 #define CYAN 0x07FF #define YELLOW 0xFFE0 #define WHITE 0xFFFF //dados de criação do circulo const int circle_radius = 30; const int circle_x = 240; const int circle_y = 125; //objeto para manipulacao dos eventos de toque na tela TouchScreen ts = TouchScreen(XP, YP, XM, YM); //objeto para manipulacao da parte grafica SWTFT tft;
Setup
No setup, vamos inicializar
nosso objeto de controle gráfico e fazer as primeiras configurações.
void setup() { Serial.begin(9600); //reseta o objeto da lib grafica tft.reset(); //inicializa objeto controlador da lib grafica tft.begin(); delay(500); //rotaciona a tela para landscape tft.setRotation(1); //pinta a tela toda de preto tft.fillScreen(BLACK); //chama a função para iniciar nossas configurações initialSettings(); }
Loop
No loop, vamos pegar o ponto
no qual tocamos a tela e verificamos se o toque ocorreu em uma das figuras.
void loop() { TSPoint touchPoint = ts.getPoint();//pega o touch (x,y,z=pressao) pinMode(XM, OUTPUT); pinMode(YP, OUTPUT); //mapeia o ponto de touch para o (x,y) grafico // o fato de termos rotacionado a tela para landscape implica no X receber o mapeamento de Y TSPoint p; p.x = map(touchPoint.y, TS_MINY, TS_MAXY, 0, 320); p.y = map(touchPoint.x, TS_MINX, TS_MAXX, 240, 0); //verifica se a pressão no toque foi suficiente if (touchPoint.z > MINPRESSURE && touchPoint.z < MAXPRESSURE) { //verifica se tocou no retangulo if(pointInRect(p)) { writeShape("Rect"); } //verifica se tocou no triangulo else if(pointInsideTriangle(TSPoint(110,150,0), TSPoint(150,100,0), TSPoint(190,150,0), p)) { writeShape("Triangle"); } //verifica se tocou no circulo else if(pointInCircle(p)) { writeShape("Circle"); } } }
Verificação se tocamos no círculo
Nesta etapa tratamos da
inicialização de tela e definimos as cores dos textos a serem exibidos no
display.
/* Desenha na tela os elementos */ void initialSettings() { tft.setTextColor(WHITE); tft.setTextSize(TEXT_SIZE_S); tft.println("ACESSE"); tft.setTextColor(YELLOW); tft.setTextSize(TEXT_SIZE_M); tft.println("MEU BLOG"); tft.setTextColor(GREEN); tft.setTextSize(TEXT_SIZE_L); tft.println("FERNANDOK.COM"); createRect(); createTriangle(); createCircle(); tft.setCursor(FEEDBACK_LABEL_X, FEEDBACK_LABEL_Y); tft.setTextColor(CYAN); tft.setTextSize(TEXT_SIZE_L); tft.println("SHAPE: "); }
Funções de criação das formas geométricas
Criamos um retângulo, um
triângulo e um círculo com as origens que determinarmos.
//cria um retangulo com origem (x,y) = (10,100) //width = 80 e height = 50 void createRect() { tft.fillRect(10, 100, 80, 50, RED); tft.drawRect(10, 100, 80, 50, WHITE); } //cria um triangulo com os vertices: //A = (110,150) ; B = (150,100) ; C = (190,150) void createTriangle() { tft.fillTriangle(110, 150, 150, 100, 190, 150, YELLOW); tft.drawTriangle(110, 150, 150, 100, 190, 150, WHITE); } //cria um circulo com origem no ponto (x,y) = (240,125) e raio = 30 void createCircle() { tft.fillCircle(240, 125, 30, GREEN); tft.drawCircle(240, 125, 30, WHITE); }
Verificação se tocamos no retângulo
Esta função verifica se o
ponto está dentro do retângulo.
//Função que verifica se o ponto está dentro do retângulo bool pointInRect(TSPoint p) { //max/min X do retangulo if( p.x >= 10 && p.x <= 90) { //max/min Y do retangulo if( p.y <= 150 && p.y >= 100) { return true; } } return false; }
Verificação se tocamos no círculo
O mesmo em relação ao círculo.
//distancia entre pontos D = raiz( (xb-xa)^2 + (yb-ya)^2 ) //vefifica se o ponto está dentro do circulo //se a distancia do ponto pra origem do circulo for menor ou igual ao raio, ele está dentro bool pointInCircle(TSPoint p) { float distance = sqrt( pow(p.x - circle_x,2) + pow(p.y - circle_y,2)); if(distance <= circle_radius) { return true; } return false; }
Verificação se tocamos no triângulo
A mesma verificação em relação
ao ponto também ocorre dentro do triângulo.
// Função que verifica se o ponto p esta dentro do triangulo ABC // Se estiver dentro retorna TRUE senão retorna FALSE bool pointInsideTriangle(TSPoint a, TSPoint b, TSPoint c, TSPoint p){ float ABC = triangleArea(a, b, c); float ACP = triangleArea(a, c, p); float ABP = triangleArea(a, b, p); float CPB = triangleArea(c, p, b); if(ABC == ACP+ABP+CPB){ return true; } return false; } // Função que calcula a area de um triangulo com base nos pontos x,y float triangleArea(TSPoint a, TSPoint b, TSPoint c){ return fabs(((b.x - a.x)*(c.y - a.y) - (c.x - a.x) * (b.y - a.y))/2); }
Função para imprimir o nome do objeto tocado
Aqui escrevemos na tela o nome
da figura geométrica que for tocada.
//escreve na tela o nome da figura geométrica que foi tocada void writeShape(String shape) { tft.fillRect(FEEDBACK_TOUCH_X, FEEDBACK_TOUCH_Y, 170, 30, BLACK); tft.setCursor(FEEDBACK_TOUCH_X, FEEDBACK_TOUCH_Y); tft.setTextSize(TEXT_SIZE_G); tft.setTextColor(WHITE); tft.println(shape); }
Faça o download dos arquivos:
12 Comentários
//ESP..ero 32 vezes mais que os outros que minha mensagem seja a vencedora.
ResponderExcluir/**************************************************************************
* MENSAGEM TABELA ASKII
**************************************************************************/
void setup(){
int msgASK [22] = {81,117,101,114,111,32,103,97,110,104,97,114,32,117,109,32,69,83,80,51,50,33};
char msg [22] = {""};
void loop(){
for(cont=0; cont<22;cont++) {
msg[cont] = FuncConverteAskToChar(msgASK[cont]);
lcd.print (msg[cont]);
}
}
}
Bom
ResponderExcluirQuero ligar esse display num NodeMCU-32S.
ResponderExcluirAlguém pode me ajudar com a pinagem?
Obrigado!
Olá, Gilberto. Caso não tenha conseguido ligar o ESP32 nesse display, tenho um código recém postado que é justamente pra essa ocasião. Qualquer coisa deixe um comentário que eu respondo lá mesmo.
Excluirhttps://gist.github.com/danliberato/22c3fa69d4b01209e68e5f6b32b05294
Gostaria de ligar este display (TFT shield do Arduino ) no ESP32, usando as funções de toque inclusive.
ResponderExcluirComo ficaria as ligações ? É possível ?
Olá, Eu Estou Tendo O Seguinte Problema.
ResponderExcluir'TEXT_SIZE_G' was not declared in this scope
tft.setTextSize(TEXT_SIZE_G);
exit status 1
'TEXT_SIZE_G' was not declared in this scope
Olá,
ResponderExcluirColoco as bibliotecas nos locais indicados, mas meu display só liga os LED's da tela. Alguém tem alguma sugestão?
Estou com estes Erros:
ExcluirBiblioteca inválida encontrada em C:\Program Files (x86)\Arduino\libraries\Adafruit-GFX-Library-master: no headers files (.h) found in C:\Program Files (x86)\Arduino\libraries\Adafruit-GFX-Library-master
Biblioteca inválida encontrada em C:\Program Files (x86)\Arduino\libraries\SWTFT-Shield: no headers files (.h) found in C:\Program Files (x86)\Arduino\libraries\SWTFT-Shield
Biblioteca inválida encontrada em C:\Program Files (x86)\Arduino\libraries\Touch-Screen-Library-master: no headers files (.h) found in C:\Program Files (x86)\Arduino\libraries\Touch-Screen-Library-master
(x,y,z=pressao) esse trecho dá erro, não sei se alguém teve o mesmo problema.
ResponderExcluirA linha é para estar assim:
ExcluirTSPoint touchPoint = ts.getPoint();//pega o touch (x,y,z=pressao)
Ou seja: "(x,y,z=pressao)"
É para estar após //
É para ser ignorado como um comentário.
Ficando:
//pega o touch (x,y,z=pressao)
Ao copiar o código, acaba que "(x,y,z=pressao)" vai sem querer para a próxima linha, onde ele deixa de ser ignorado, e não é compreendido pelo compilador.
tenho um display tft 3.5 para arduino uno, ja testei codigo exemplo e funciona bem no arduino UNO. quero usar arduino mega 2560 para um projeto (tem mais memoria), só que não estou conseguindo fazer funcionar com exemplos das bibliotecas, o display fica com a tela em branco. você tem bibliotecas para display 3.5 tft? o display que estou usando-->
ResponderExcluirhttps://www.sluuf.com/lang_pt/buy/107424/35-inch-TFT-LCD-Display-Arduino-Touch-Screen-Module-UNO-R3-B.html
verificando, ele tem os mesmos pinos que o display 2.4 tft do exemplo de fernando, diferencia na resolução.
ola quando carrego o codigo para calibrar o touch aparece a mensagem abaixo o que pode ser?
ResponderExcluirno matching function for call to 'TouchScreen::TouchScreen(int, const uint8_t&, const uint8_t&, int)'
Biblioteca inválida encontrada em C:\Users\Josiran\Documents\Arduino\libraries\tools: no headers files (.h) found in C:\Users\Josiran\Documents\Arduino\libraries\tool