sábado, 22 de outubro de 2016

Display Touch TFT 2.4"

Display LCD touch Arduino

O display TFT 2.4" LCD shield é a solução para quem procura uma alternativa com tela touch para seus projetos com Arduino.
Com uma resolução de 320 x 240 px , esquema de cores de 18 bits e exibição de até 262k tonalidades diferentes, além de um slot para cartão de memória SD e tela touch resistiva. 
Outro ponto favorável para essa telinha LCD é o baixo custo e é claro, sua plicação deixa qualquer projeto mais bonito e interessante.


fonte: próprio autor

A shield LCD Touch fica com um design  bonito em qualquer escolha de Arduino Uno ou Mega, eu particularmente prefiro quando acoplado junto ao Mega devido a sua maior quantidade de I/Os.

Conectando LCD ao Arduino


Na tabela abaixo segue uma descrição da pinagem da ligação do LCD ao Arduino, lembrando que essa montagem foi testada em dois modelos de placas microcontroladas, Arduino Uno e Arduino Mega.


fonte: próprio autor

A facilidade do projeto permite que a LCD seja conectada diretamente nos pinos do Arduino, mas muita ATENÇÃO, na parte traseira do Shield existe um capacitor SMD, que deve ser cuidadosamnte isolado para evitar acidentes com seu hardware.




fonte: próprio autor

Código fonte teste 

/**Teste LCD Touch
//** Elaborado por Tony Marim
//** Baseado no código original de FILIPEFLOP
/** mecatronizei@gmail.com **/
 
#include <Adafruit_GFX.h>    // Core graphics library
#include <Adafruit_TFTLCD.h> // Hardware-specific library
 
//Definicao de cores
#define BLACK           0x0000
#define BLUE            0x001F
#define RED             0xF800
#define GREEN           0x07E0
#define CYAN            0x07FF
#define MAGENTA         0xF81F
#define YELLOW          0xFFE0
#define WHITE           0xFFFF
 
//CS, CD, WR, RD, RESET
Adafruit_TFTLCD tft(A3, A2, A1, A0, A4);
 
void setup(void) 
{
  Serial.begin(9600);
  Serial.println("Teste de LCD 8 Bits");
  tft.reset();
  delay(500);
  tft.begin(0x9341);
}
 
void loop()
{
  tft.setRotation(3);
  teste_texto(RED); 
  delay(5000);
  tft.setRotation(0);
  teste_linhas(GREEN);
  delay(50);
  teste_retangulo_cheio(BLUE, RED);
  delay(50);
  tft.fillScreen(BLACK);
  teste_circulos(10, YELLOW);
  delay(50);
  teste_triangulos();
  delay(500);
  teste_retangulos();
  delay(500);
}
  
void teste_texto(uint16_t color)
{
  tft.fillScreen(BLACK);
  tft.setTextColor(WHITE);
  tft.setTextSize(3);
  tft.setCursor(0, 20);
  tft.println("MECATRONIZANDO");
  tft.setTextColor(RED);
  tft.setCursor(0, 50);
  tft.println("Curta");
  tft.setTextColor(BLUE);
  tft.setCursor(0, 80);
  tft.println("Compartilhe");
  tft.setTextColor(GREEN);
  tft.setCursor(0, 110);
  tft.println("Inscreva-se");
  tft.setTextColor(GREEN);
  tft.setCursor(0, 150);
  tft.println("mecatronizar.blog");
  delay(2000);
}
  
void teste_linhas(uint16_t color)
{
  tft.fillScreen(BLACK);
  for (uint16_t x = 0; x < tft.width(); x += 6)
  {
    tft.drawLine(0, 0, x, tft.height() - 1, color);
  }
  for (uint16_t y = 0; y < tft.height(); y += 6)
  {
    tft.drawLine(0, 0, tft.width() - 1, y, color);
  }
}
  
void teste_retangulo_cheio(uint16_t color1, uint16_t color2)
{
  tft.fillScreen(BLACK);
  for (uint16_t x = tft.width() - 1; x > 6; x -= 6)
  {
    tft.fillRect(tft.width() / 2 - x / 2, tft.height() / 2 - x / 2 , x, x, color1);
    tft.drawRect(tft.width() / 2 - x / 2, tft.height() / 2 - x / 2 , x, x, color2);
  }
}
  
void teste_circulos(uint8_t radius, uint16_t color)
{
  for (uint16_t x = radius; x < tft.width(); x += radius * 2)
  {
    for (uint16_t y = radius; y < tft.height(); y += radius * 2) {
      tft.fillCircle(x, y, radius, YELLOW);
    }
  }
  for (uint16_t x = 0; x < tft.width() + radius; x += radius * 2)
  {
    for (uint16_t y = 0; y < tft.height() + radius; y += radius * 2)
    {
      tft.drawCircle(x, y, radius, GREEN);
    }
  }
}
  
void teste_triangulos()
{
  tft.fillScreen(BLACK);
  for (uint16_t i = 0; i < tft.width() / 2; i += 5)
  {
    tft.drawTriangle(tft.width() / 2, tft.height() / 2 - i,
                     tft.width() / 2 - i, tft.height() / 2 + i,
                     tft.width() / 2 + i, tft.height() / 2 + i, tft.Color565(0, 0, i));
  }
}
  
void teste_retangulos()
{
  tft.fillScreen(BLACK);
  for (uint16_t x = tft.width(); x > 20 ; x -= 6)
  {
    tft.fillRoundRect(tft.width() / 2 - x / 2, tft.height() / 2 - x / 2 , x, x, x / 8,  tft.Color565(0, x, 0));
  }
}

Para esse código foram utilizadas bibliotecas que você pode baixar ao final do post com todos os arquivos do projeto.
Diversas imagens são apresentadas na tela e imprime algumas strings.


fonte:próprio autor

Acionando Leds por touch

No próximo código uma tela com algumas opções são apresentadas ao usuário, que pode fazer uso das opções para acionamentos diversos, e como dizemos, "onde eu aciono um led, eu aciono quase tudo!"

Para a execução desse projeto você deve ter à disponibilidade:
1 Arduino (de preferência Mega)
1 LCD Touch FTF
4 resistores 220ohms
4 leds de cores variadas
1 m
1 matriz de contatos
cabos jumpers


O código fonte - acionamento dos leds

/** Acionamento de leds via LCD TouchScreen
//** Elaborado por Tony Marim
//** Baseado no código original de FILIPEFLOP
/** mecatronizei@gmail.com **/
  
#include <Adafruit_GFX.h>    // Core graphics library
#include <Adafruit_TFTLCD.h> // Hardware-specific library
#include <TouchScreen.h>
  
#define YP A3 // Y+ is on Analog1
#define XM A2 // X- is on Analog2
#define YM 9 // Y- is on Digital7
#define XP 8 // X+ is on Digital6
  
#define TS_MINX 150
#define TS_MINY 120
#define TS_MAXX 920
#define TS_MAXY 940
  
TouchScreen ts = TouchScreen(XP, YP, XM, YM, 100);
 
//Definicao de cores
#define BLACK           0x0000
#define BLUE            0x001F
#define RED             0xF800
#define GREEN           0x07E0
#define CYAN            0x07FF
#define MAGENTA         0xF81F
#define YELLOW          0xFFE0
#define WHITE           0xFFFF
  
//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;
bool valor_botao2 = 0;
bool valor_botao3 = 0;
bool valor_botao4 = 0;

const int led_amarelo = 31;
const int led_verde = 33;
const int led_azul = 35;
const int led_vermelho = 37;
  
#define MINPRESSURE 10
#define MAXPRESSURE 1000
  
void setup(void) 
{
  Serial.begin(9600);
  Serial.println("TFT Test");
  //identifier == 0x9341;
  tft.reset();
  delay(500);
  //uint16_t identifier = tft.readRegister(0x0);
  //Serial.print("Driver encontrado: ");
  //Serial.println(identifier, HEX);
  pinMode (led_amarelo, OUTPUT);
  pinMode (led_verde, OUTPUT);
  pinMode (led_azul, OUTPUT);
  pinMode (led_vermelho, OUTPUT);
  
 tft.begin(0x9341);
  //tft.initDisplay();
  tft.fillScreen(BLACK);
  tft.setRotation(3);
  
  // Inicio - Texto e botoes
  tft.drawRoundRect(5, 15, 312, 50, 5, WHITE);
  tft.drawRoundRect(255, 15, 62, 50, 5, WHITE);
  tft.setTextColor(YELLOW);
  tft.setTextSize(3);
  tft.setCursor(15, 30);
  tft.println("Led Amarelo");
  
  tft.drawRoundRect(5, 70, 312, 50, 5, WHITE);
  tft.drawRoundRect(255, 70, 62, 50, 5, WHITE);
  tft.setTextColor(GREEN);
  tft.setTextSize(3);
  tft.setCursor(15, 85);
  tft.println("Led Verde");
  
  tft.drawRoundRect(5, 125, 312, 50, 5, WHITE);
  tft.drawRoundRect(255, 125, 62, 50, 5, WHITE);
  tft.setTextColor(BLUE);
  tft.setTextSize(3);
  tft.setCursor(15, 140);
  tft.println("Led Azul");
  
  tft.drawRoundRect(5, 180, 312, 50, 5, WHITE);
  tft.drawRoundRect(255, 180, 62, 50, 5, WHITE);
  tft.setTextColor(RED);
  tft.setTextSize(3);
  tft.setCursor(15, 195);
  tft.println("Led Vermelho");
  
  //Preenchimento OFF
  tft.setTextColor(WHITE);
  tft.setCursor(260, 30);
  tft.println("OFF");
  tft.setCursor(260, 85);
  tft.println("OFF");
  tft.setCursor(260, 140);
  tft.println("OFF");
  tft.setCursor(260, 195);
  tft.println("OFF");
}
  
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 > MINPRESSURE && p.z < MAXPRESSURE)
  {
    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 > 200)
    {
      Serial.print("py: ");
      Serial.print(p.y);
      Serial.print(" px: ");
      Serial.print(p.x);
  
      //Testa botao amarelo
      if (p.x > 235 & p.x < 295)
      {
        if (valor_botao1 == 0)
        {
          tft.fillRoundRect(256, 16, 60, 48, 5, YELLOW);
          mostra_on(269, 30);
          valor_botao1 = !valor_botao1;
          digitalWrite(led_amarelo, HIGH);
        }
        else
        {
          tft.fillRoundRect(256, 16, 60, 48, 5, BLACK);
          mostra_off(260, 30);
          valor_botao1 = !valor_botao1;
          digitalWrite(led_amarelo, LOW);
        }
      }
  
      //Testa botao verde
      if (p.x > 160 & p.x < 198)
      {
        if (valor_botao2 == 0)
        {
          tft.fillRoundRect(256, 71, 60, 48, 5, GREEN);
          mostra_on(269, 85);
          valor_botao2 = !valor_botao2;
          digitalWrite(led_verde, HIGH);
        }
        else
        {
          tft.fillRoundRect(256, 71, 60, 48, 5,  BLACK);
          mostra_off(260, 85);
          valor_botao2 = !valor_botao2;
          digitalWrite(led_verde, LOW);
        }
      }
  
      //Testa botao azul
      if (p.x > 65 & p.x < 126)
      {
        if (valor_botao3 == 0)
        {
          tft.fillRoundRect(256, 126, 60, 48, 5, BLUE);
          mostra_on(269, 140);
          valor_botao3 = !valor_botao3;
          digitalWrite(led_azul, HIGH);
        }
        else
        {
          tft.fillRoundRect(256, 126, 60, 48, 5,  BLACK);
          mostra_off(260, 140);
          valor_botao3 = !valor_botao3;
          digitalWrite(led_azul, LOW);
        }
      }
  
      //Testa botao vermelho
      if (p.x > 0 & p.x < 58)
      {
        if (valor_botao4 == 0)
        {
          tft.fillRoundRect(256, 181, 60, 48, 5, RED);
          mostra_on(269,195);
          valor_botao4 = !valor_botao4;
          digitalWrite(led_vermelho, HIGH);
        }
        else
        {
          tft.fillRoundRect(256, 181, 60, 48, 5,  BLACK);
          mostra_off(260,195);
          valor_botao4 = !valor_botao4;
          digitalWrite(led_vermelho, LOW);
        }
      }
    }
  }
}
  
void mostra_on(int x, int y)
{
  tft.setTextColor(BLACK);
  tft.setCursor(x, y);
  tft.println("ON");
  delay(100);
}
  
void mostra_off(int x, int y)
{
  tft.setTextColor(WHITE);
  tft.setCursor(x, y);
  tft.println("OFF");
  delay(100);
}


fonte: próprio autor*

* o modelo do LCD apresentado no esquema se difere do apresentado em vídeo devido a sua falta no software Fritzing*

Nesse programa, saídas digitais são acionadas quando o comando é dado via touch na tela de 2.4'', fazendo com que os leds acendam na ordem que o usuário desejar.
Assim como em diversos projetos demonstrados em posts anteriores, uma eletrônica de potência pode ser capaz de fazer acionamentos com tensões maiores, tornando a aplicação mais interessante para acionamentos em automações residenciais ou industriais.
 Uma aplicação desse tipo vai ser apresentado a seguir.

Acionando dispositivos

Vamos fazer dois acionamentos distintos com potências diferentes para demonstrar o funcionamento do circuito.
Você precisa ter em mãos além do Arduino e do LDC TFT 2.4":
1 Lâmpada com soquete
1 trava elétrica de portas (automóveis)
1 módulo com drive ponte H
1 fonte externa
1 módulo rele
protoboard
cabos jumpers


fonte: próprio autor

fonte: próprio autor


O código fonte - acionamento com potências

/** Acionamento de leds via LCD TouchScreen
//** Elaborado por Tony Marim
/** mecatronizei@gmail.com **/
  
#include <Adafruit_GFX.h>    // Core graphics library
#include <Adafruit_TFTLCD.h> // Hardware-specific library
#include <TouchScreen.h>
  
#define YP A3 // Y+ is on Analog1
#define XM A2 // X- is on Analog2
#define YM 9 // Y- is on Digital7
#define XP 8 // X+ is on Digital6
  
#define TS_MINX 150
#define TS_MINY 120
#define TS_MAXX 920
#define TS_MAXY 940
  
TouchScreen ts = TouchScreen(XP, YP, XM, YM, 100);
 
//Definicao de cores
#define BLACK           0x0000
#define BLUE            0x001F
#define RED             0xF800
#define GREEN           0x07E0
#define CYAN            0x07FF
#define MAGENTA         0xF81F
#define YELLOW          0xFFE0
#define WHITE           0xFFFF
  
//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_botao3 = 0;
bool valor_botao4 = 0;


const int trava1 = 35;
const int trava2 = 36;
const int iluminacao = 37;
  
#define MINPRESSURE 10
#define MAXPRESSURE 1000
  
void setup(void) 
{
  Serial.begin(9600);
  Serial.println("TFT Test");
  tft.reset();
  delay(500);
  pinMode (iluminacao, OUTPUT);
  pinMode (trava1, OUTPUT);
  pinMode (trava2, OUTPUT);
  
  tft.begin(0x9341);
  tft.fillScreen(BLACK);
  tft.setRotation(3);

  tft.fillScreen(BLACK);
  tft.setTextColor(BLUE);
  tft.setTextSize(3);
  tft.setCursor(0, 40);
  tft.println("MECATRONIZANDO");
  tft.setTextColor(RED);
  tft.setTextSize(1);
  tft.setCursor(0, 70);
  tft.println("http://www.mecatronizar.blogspot.com.br");
  delay(2000);
  
  // Inicio - Texto e botoes
  
  tft.drawRoundRect(5, 125, 312, 50, 5, CYAN);
  tft.drawRoundRect(255, 125, 62, 50, 5, CYAN);
  tft.setTextColor(YELLOW);
  tft.setTextSize(3);
  tft.setCursor(15, 140);
  tft.println("Luz da sala");
  
  tft.drawRoundRect(5, 180, 312, 50, 5, CYAN);
  tft.drawRoundRect(255, 180, 62, 50, 5, CYAN);
  tft.setTextColor(GREEN);
  tft.setTextSize(3);
  tft.setCursor(15, 195);
  tft.println("Trava");
  
  //Preenchimento OFF
  tft.setTextColor(CYAN);
  tft.setCursor(260, 140);
  tft.println("OFF");
  tft.setTextColor(CYAN);
  tft.setCursor(260, 195);
  tft.println("OFF");
}
  
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 > MINPRESSURE && p.z < MAXPRESSURE)
  {
    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 > 200)
    {
      Serial.print("py: ");
      Serial.print(p.y);
      Serial.print(" px: ");
      Serial.print(p.x);
  
  
      //Testa botao Iluminação
      if (p.x > 65 & p.x < 126)
      {
        if (valor_botao3 == 0)
        {
          tft.fillRoundRect(256, 126, 60, 48, 5, CYAN);
          mostra_on(269, 140);
          valor_botao3 = !valor_botao3;
          digitalWrite(iluminacao, LOW);
        }
        else
        {
          tft.fillRoundRect(256, 126, 60, 48, 5,  BLACK);
          mostra_off(260, 140);
          valor_botao3 = !valor_botao3;
          digitalWrite(iluminacao, HIGHQ1);
        }
      }
  
      //Testa botao Trava
      if (p.x > 0 & p.x < 58)
      {
        if (valor_botao4 == 0)
        {
          tft.fillRoundRect(256, 181, 60, 48, 5, CYAN);
          mostra_on(269,195);
          valor_botao4 = !valor_botao4;
          digitalWrite(trava1, HIGH);
          digitalWrite(trava2, LOW);
        }
        else
        {
          tft.fillRoundRect(256, 181, 60, 48, 5,  BLACK);
          mostra_off(260,195);
          valor_botao4 = !valor_botao4;
          digitalWrite(trava1, LOW);
          digitalWrite(trava2, HIGH);
        }
      }
    }
  }
}
  
void mostra_on(int x, int y)
{
  tft.setTextColor(BLACK);
  tft.setCursor(x, y);
  tft.println("ON");
  delay(100);
}
  
void mostra_off(int x, int y)
{
  tft.setTextColor(CYAN);
  tft.setCursor(x, y);
  tft.println("OFF");
  delay(100);
}




No vídeo é demonstrado o funcionamento de dispositivos distintos que fazem uso de potências distintas, o acionamento da lâmpada ocorre por meio de contato "seco" pelo módulo relé, enquanto a trava faz usos da capacidade de inversão de sentido para ser acionada e desacionada presente no módulo ponte H, estudaremos mais a fundo esse módulo brevemente na construção de alguns projetos.

Como de costume os arquivos para a reprodução desse projeto encontra-se nesse LINK. Muito obrigado e continue acompanhando o blog, curtindo a página no Facebook e compartilhando o canal

Bons estudos!




3 comentários:

  1. Hola, saludos desde Argentina. me podrias enviar las librerias adafruit que utilizaron para que funcione en arduino UNO. por modificaciones que hice en la pc las perdi y las que descargue no me funcionaron. Saludos! EZequiel

    ResponderExcluir
  2. Bom dia,
    Experimentei o vosso projeto: "Código fonte - acionamento dos leds", mas não funciona com a Arduino Mega 2560.
    A placa admite a transferência, mas o Display TFT 2,4 permanece aceso mas sem imagem.
    Utilizei adicional mente o include #include "SWTFT.h" // Hardware-specific library modificado de Uno para Mega mas dá o mesmo resultado.
    Haverá algo de específico no código que impeça o TFT de mostrar imagem?
    Gostaria de receber o vosso comentário sobre o assunto.
    Se preferirem poderão utilizar o meu endereço de e-mail = abel.nunes@gmail.com.
    Os meus melhores cumprimentos
    Abel Nunes

    ResponderExcluir
  3. bom dia testei o seu projeto, mas notei o seguinte, que quando ligo o modulo de 4 reles ele ja aciona os 4 reles e ao apertar os botoes ele desarma gostaria de saber como posso modificar essa configuração de acionar os reles só quando ligo os botoes,me parece que o funcionamento está invertido, tentei fazer a modificação mas não tive sucesso devido a falta de conhecimento da programação.

    Sem mais agradeço a vossa atenção

    Guilherme Teixeira

    ResponderExcluir