vineri, 14 noiembrie 2014

Ecran tactil de 2,4" (6cm)

English version: 2.4" touch TFT LCD shield


   Am achizitionat de pe ebay un ecran grafic inclusiv partea de touch rezisitv:
   Desi pe vanzatorul indicata o pagina unde s-ar fi aflat librarii utile si sketch-uri, acestea nu au functionat, asa ca am gasit articolul A 2.4″ TFT TOUCHSCREEN SHIELD FOR ARDUINO de pe site-ul http://www.smokeandwires.co.nz/.
   Ecranul de pe shield are driver-ul ST7781 si pentru a-l face functional, cei de la Smoke and Wires au modificat libraria Adafruit-TFTLCD realizand astfel libraria SWTFT. Aceasta librarie lucreaza impreuna cu libraria Adafruit GFX, iar partea de ecran tactil lucreaza cu libraria Touch-Screen, tot de la Adafruit.
   Primul lucru care m-a deranjat este acela ca foloseste aproape toti pinii lui Arduino Uno, liber este doar A5 pe partea de analogic, iar pe digital doar D0 si D1 sunt liberi, care sunt folositi de interfata USB, de fapt. Dintre acestia, 4 sunt folositi pentru cardul SD (D10, D11, D12 si D13), deci as putea face un shield intermediar pentru a putea folosi acesti pini sau sa-i deconectez mecanic (intrerupere circuite), deoarece ma gandeam sa fac un termostat de centrala cu butoane virtuale...
   Prima data am incarcat sketch-urile din exemplele librariei modificate, facand un filmulet numit afisaj color de 2,4" cu touch rezistiv si Arduino
   Am facut si niste poze ale ecranului si a informatiilor de pe el:

   Pentru a intelege sketch-urile si librariile folosite, am inceput sa le fac mici modificari, dupa cum apare in filmuletul afisaj color de 2,4" cu touch rezistiv si Arduino (2)
   Am facut si poze:
   Ulterior, am "intors" ecranul pe "lat" si am obtinut filmuletul afisaj color de 2,4" cu touch rezistiv si Arduino (3)
   Un sketch corectat si cu un buton de stergere in dreapta este:
// Original code provided by Smoke And Wires
// http://www.smokeandwires.co.nz
// This code has been taken from the Adafruit TFT Library and modified
//  by us for use with our TFT Shields / Modules
// For original code / licensing please refer to
// https://github.com/adafruit/TFTLCD-Library

// adapted sketch by niq_ro from http://arduinotehniq.blogspot.com/
// ver. 1m5 - 13.11.2014, Craiova - Romania

#include <Adafruit_GFX.h>    // Core graphics library
#include "SWTFT.h" // Hardware-specific library

// The control pins for the LCD can be assigned to any digital or
// analog pins...but we'll use the analog pins as this allows us to
// double up the pins with the touch screen (see the TFT paint example).
// #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

// When using the BREAKOUT BOARD only, use these 8 data lines to the LCD:
// For the Arduino Uno, Duemilanove, Diecimila, etc.:
//   D0 connects to digital pin 8  (Notice these are
//   D1 connects to digital pin 9   NOT in order!)
//   D2 connects to digital pin 2
//   D3 connects to digital pin 3
//   D4 connects to digital pin 4
//   D5 connects to digital pin 5
//   D6 connects to digital pin 6
//   D7 connects to digital pin 7
// For the Arduino Mega, use digital pins 22 through 29
// (on the 2-row header at the end of the board).


#include <Adafruit_GFX.h>    // Core graphics library
#include <SWTFT.h> // Hardware-specific library
#include <TouchScreen.h>


#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

// For better pressure precision, we need to know the resistance
// between X+ and X- Use any multimeter to read it
// For the one we're using, its 300 ohms across the X plate
TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300);



// Assign human-readable names to some common 16-bit color values:
#define BLACK   0x0000
#define BLUE    0x001F
#define RED     0xF800
#define GREEN   0x07E0
#define CYAN    0x07FF
#define MAGENTA 0xF81F
#define YELLOW  0xFFE0
#define WHITE   0xFFFF
//#define ROZ     0xFD20
#define ROZ     0xFBE0
#define GRI     0xBDF7
// http://stackoverflow.com/questions/13720937/c-defined-16bit-high-color
// http://wiibrew.org/wiki/U16_colors

SWTFT tft;

#define BOXSIZE 40
#define PENRADIUS 3
int oldcolor, currentcolor;
int ics; 

void setup(void) {
  Serial.begin(9600);
  Serial.println(F("Paint!"));
  
  tft.reset();
  
  uint16_t identifier = tft.readID();

  Serial.print(F("LCD driver chip: "));
  Serial.println(identifier, HEX);
    

  tft.begin(identifier);

  tft.fillScreen(BLACK);
  tft.fillRect(0, 0, 320, 240, BLACK);
  tft.setRotation(3);
  tft.setCursor(30, 100);
  tft.setTextColor(RED);  tft.setTextSize(3);
  tft.println("LCD driver chip: ");
  tft.setCursor(100, 150);
  tft.setTextColor(BLUE);
  tft.println(identifier, HEX);

delay(2000);
tft.fillRect(0, 0, 320, 240, BLACK);
  
tft.setRotation(0);
  tft.fillRect(0, 0, BOXSIZE, BOXSIZE, RED);
  tft.fillRect(0, BOXSIZE, BOXSIZE, BOXSIZE, YELLOW);
  tft.fillRect(0, BOXSIZE*2, BOXSIZE, BOXSIZE, GREEN);
  tft.fillRect(0, BOXSIZE*3, BOXSIZE, BOXSIZE, CYAN);
  tft.fillRect(0, BOXSIZE*4, BOXSIZE, BOXSIZE, BLUE);
  tft.fillRect(0, BOXSIZE*5, BOXSIZE, BOXSIZE, MAGENTA);
  tft.fillRect(0, BOXSIZE*6, BOXSIZE, BOXSIZE, GRI);
  tft.fillRect(0, BOXSIZE*7, BOXSIZE, BOXSIZE,  ROZ);
//tft.fillRect(BOXSIZE, BOXSIZE, BOXSIZE, BOXSIZE, WHITE);
 
  tft.drawRect(0, 0, BOXSIZE, BOXSIZE, WHITE);
  currentcolor = RED;


 cifre (WHITE);
  pinMode(13, OUTPUT);
}

#define MINPRESSURE 10
#define MAXPRESSURE 1000

void loop()
{
  digitalWrite(13, HIGH);
  // Recently Point was renamed TSPoint in the TouchScreen library
  // If you are using an older version of the library, use the
  // commented definition instead.
  // Point p = ts.getPoint();
  TSPoint p = ts.getPoint();
  digitalWrite(13, LOW);

  // if sharing pins, you'll need to fix the directions of the touchscreen pins
  //pinMode(XP, OUTPUT);
  pinMode(XM, OUTPUT);
  pinMode(YP, OUTPUT);
  //pinMode(YM, OUTPUT);

  // we have some minimum pressure we consider 'valid'
  // pressure of 0 means no pressing!

  if (p.z > MINPRESSURE && p.z < MAXPRESSURE) {
  /*  
    Serial.print("X = "); Serial.print(p.x);
    Serial.print("\tY = "); Serial.print(p.y);
    Serial.print("\tPressure = "); Serial.println(p.z);
  */      
if (p.y < (TS_MINY-5)) stergere();
    // scale from 0->1023 to tft.width
    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));
  /*  
    Serial.print("("); Serial.print(p.x);
    Serial.print(", "); Serial.print(p.y);
    Serial.println(")");
  */  
    if (p.x < BOXSIZE) {
       oldcolor = currentcolor;

       if (p.y < BOXSIZE) { 
         currentcolor = RED; 
         tft.drawRect(0, 0, BOXSIZE, BOXSIZE, WHITE); 
//         text (currentcolor);
       } else if (p.y < BOXSIZE*2) {
         currentcolor = YELLOW;
         tft.drawRect(0, BOXSIZE, BOXSIZE, BOXSIZE, WHITE);
//         text (currentcolor);
       } else if (p.y < BOXSIZE*3) {
         currentcolor = GREEN;
         tft.drawRect(0, BOXSIZE*2, BOXSIZE, BOXSIZE, WHITE);
//         text (currentcolor);
       } else if (p.y < BOXSIZE*4) {
         currentcolor = CYAN;
         tft.drawRect(0, BOXSIZE*3, BOXSIZE, BOXSIZE, WHITE);       
//         text (currentcolor);
       } else if (p.y < BOXSIZE*5) {
         currentcolor = BLUE;
         tft.drawRect(0, BOXSIZE*4, BOXSIZE, BOXSIZE, WHITE);        
//         text (currentcolor);
       } else if (p.y < BOXSIZE*6) {
         currentcolor = MAGENTA;
         tft.drawRect(0,BOXSIZE*5, BOXSIZE, BOXSIZE, WHITE);        
//         text (currentcolor);
       } else if (p.y < BOXSIZE*7) {
         currentcolor = GRI;
         tft.drawRect(0,BOXSIZE*6, BOXSIZE, BOXSIZE, WHITE);        
//         text (currentcolor);
       } else if (p.y < BOXSIZE*8) {
         currentcolor = ROZ;
         tft.drawRect(0,BOXSIZE*7, BOXSIZE, BOXSIZE, WHITE);
         stergere();        
       }

text (currentcolor);
//cifre (currentcolor);
       if (oldcolor != currentcolor) {
          if (oldcolor == RED) tft.fillRect(0, 0, BOXSIZE, BOXSIZE, RED);
          if (oldcolor == YELLOW) tft.fillRect(0, BOXSIZE, BOXSIZE, BOXSIZE, YELLOW);
          if (oldcolor == GREEN) tft.fillRect(0, BOXSIZE*2, BOXSIZE, BOXSIZE, GREEN);
          if (oldcolor == CYAN) tft.fillRect(0, BOXSIZE*3, BOXSIZE, BOXSIZE, CYAN);
          if (oldcolor == BLUE) tft.fillRect(0, BOXSIZE*4, BOXSIZE, BOXSIZE, BLUE);
          if (oldcolor == MAGENTA) tft.fillRect(0, BOXSIZE*5, BOXSIZE, BOXSIZE, MAGENTA);
          if (oldcolor == GRI) tft.fillRect(0, BOXSIZE*6, BOXSIZE, BOXSIZE, GRI);
          if (oldcolor == ROZ) tft.fillRect(0, BOXSIZE*7, BOXSIZE, BOXSIZE, ROZ);
     cifre (currentcolor);  
     }
      
    }
   // if (((p.y-PENRADIUS) > BOXSIZE) && ((p.y+PENRADIUS) < tft.height())) {
/*
if (((p.y-PENRADIUS) > 5) && ((p.y+PENRADIUS) < tft.height())) {
   tft.fillCircle(p.x, p.y, PENRADIUS, currentcolor);
    }
*/
if (((p.x-PENRADIUS) > BOXSIZE) && ((p.x+PENRADIUS) < tft.width())) {
   tft.fillCircle(p.x, p.y, PENRADIUS, currentcolor);
    }

  }
}

void text (int culoare) 
{
tft.setRotation(3);
tft.setCursor(70, 80);
          tft.setTextColor(culoare);  tft.setTextSize(5);
 /*         tft.println("niq_ro");
          tft.setCursor(12, 130); tft.setTextSize(3);
          tft.println("www.tehnic.go.ro");
          tft.setCursor(20, 165); tft.setTextSize(2);
          tft.println("nicuflorica.blogspot.ro");
*/
          tft.setCursor(5, 220); tft.setTextSize(2);
          tft.println("arduinotehniq.blogspot.com");
tft.setRotation(0);
}

void cifre (int culoare)
{
// number for "buttons"
 tft.setRotation(3);
 tft.setTextColor(culoare);
 tft.setTextSize(3);
 tft.drawLine(0, 0, 40, 40, culoare);
 tft.drawLine(0, 40, 40, 0, culoare);
// tft.setCursor(15, 10);
// tft.println("1");
 tft.setCursor(55, 10);
 tft.println("1");
 tft.setCursor(95, 10);
 tft.println("2");
 tft.setCursor(135, 10);
 tft.println("3");
 tft.setCursor(175, 10);
 tft.println("4");
 tft.setCursor(215, 10);
 tft.println("5");
 tft.setCursor(255, 10);
 tft.println("6");
 tft.setCursor(295, 10);
 tft.println("7");
  
 tft.setRotation(0);
}

void stergere ()
{
      Serial.println("erase");
      // press the bottom of the screen to erase 
 //     tft.fillRect(0, BOXSIZE, tft.width(), tft.height()-BOXSIZE, BLACK);
   tft.fillRect(0, 0, 240, 320, BLACK);
   tft.setRotation(0);
  tft.fillRect(0, 0, BOXSIZE, BOXSIZE, RED);
  tft.fillRect(0, BOXSIZE, BOXSIZE, BOXSIZE, YELLOW);
  tft.fillRect(0, BOXSIZE*2, BOXSIZE, BOXSIZE, GREEN);
  tft.fillRect(0, BOXSIZE*3, BOXSIZE, BOXSIZE, CYAN);
  tft.fillRect(0, BOXSIZE*4, BOXSIZE, BOXSIZE, BLUE);
  tft.fillRect(0, BOXSIZE*5, BOXSIZE, BOXSIZE, MAGENTA);
  tft.fillRect(0, BOXSIZE*6, BOXSIZE, BOXSIZE, GRI);
  tft.fillRect(0, BOXSIZE*7, BOXSIZE, BOXSIZE,  ROZ);
//tft.fillRect(BOXSIZE, BOXSIZE, BOXSIZE, BOXSIZE, WHITE);
 
  tft.drawRect(0, 0, BOXSIZE, BOXSIZE, WHITE);
  currentcolor = RED;
     cifre (WHITE);  
    }
   De data aceasta, apare ecranul liber pentru desenare:
   Am facut si un filmulet numit afisaj color de 2,4" cu touch rezistiv si Arduino (4) care prezinta modul de comportare al programului si ce se poate face cu el:

14 comentarii:

  1. Buna ziua, felicitari ptr site. Am si eu o problema cu un TFT Easytft are un driver ILI9341 conectat pe portul paralel 8080Am tot incercat librari de initilaizare dar nimik. Reusesc sa citesc id-ul cipului dar cam atat. nu resusesc sa citesc nici un alt registru. un cod pe care l-am folosit ptr citire ar fi :

    Write_Cmd(0xd3);
    Write_Data(0x12); //nu stiu de ce este nevoie
    temp=Read_Data(); //temp=0x000000
    temp=Read_Data(); //temp=0x000093
    temp=temp>>8; //temp=0x009300
    temp|=Read_Data(); //temp=0x009341

    Si cam atat nu pot citi nici un alt registru sau comanda. Am incercat tot felul de librarii de initializare dar degeaba. Cu stima Cristi

    RăspundețiȘtergere
    Răspunsuri
    1. pe versiunea in engleza a acestui blog sunt cateva comentarii cu probleme legate de aceasta librarie pentru ca ecranele al au chipset... acolo se mentioneza alta: https://github.com/samuraijap/TFTLCD-Library

      Ștergere
  2. eu am un TFT fata ecranul tactil (oricum nu au legatura ca driver-e) cu ILI9341 si l-am comandat foarte bine cu libraria grafica ucglib... am mai multe articole cu asta.. http://nicuflorica.blogspot.ro/search/label/ILI9341 al meu necesita interfata logica la 3,3V.. cred ca am acolo suficiente informatii...

    RăspundețiȘtergere
  3. Vlad Gheorghe scrisese in 11.09.2016: Salut referitor la "Primul lucru care m-a deranjat este acela ca foloseste aproape toti pinii lui Arduino Uno, liber este doar A5 pe partea de analogic, iar pe digital doar D0 si D1 sunt liberi, care sunt folositi de interfata USB, de fapt." poti elibera si A4 si sa-l legi direct la resetul lui Arduino, si astfel ai si A4 si A5 liberi pentru I2c. M-am folosit de cite ceva de pe aici si pentru inceput mi-a iesit asa https://drive.google.com/open?id=0B6GN3A9w-wA7bjFERHhza0xRRnc

    RăspundețiȘtergere
  4. Buna seara ,
    Sa inteleg ca la Arduino Duemilanove raman maxim 5 porturi libere?
    O seara buna , Nelu

    RăspundețiȘtergere
    Răspunsuri
    1. A5 e liber si ar mai fi D0 si D1, dar pe alea nu prea imi place sa le folosesc, mai aales la clone e greu sa faci iar upload :D

      Ștergere
    2. D10-D13 daca se renunta si la card. Afisare numai text. Corect?
      Mie nu-mi functioneaza , este de la ArduShop. Complileaza corect dar nu afiseaza. Un sfat?

      Ștergere
    3. pe versiunea in engleza sunt discutii si acolo e indicata o alta librarie pentru afisaje cu alte drivere, vezi http://arduinotehniq.blogspot.ro/2014/11/24-touch-tft-lcd-shield.html

      Ștergere
    4. Are o clipire abia perceptibila. Gen functionare. Ecranul prea luminos. Folia avea urme vizibile de utilizare. Foloseste 2 cip-uri DP74HC245. Multumesc mult ptr raspunsuri.

      Ștergere
  5. Buna seara ,Dle Florica !De cativa ani buni incerc sa rezolv o problema si nu reusesc .Ma mir cum de nu am dat eu de postarile dvstr.pina acum ,caci sigur era rezolvata problema .Cel putin asa cred.
    Am un excavator Cat 325 .Din 2004,fabricatie .Un nemernic(altfel nu pot spune ) a reusit cu geamul culisabil din fata cabinei sa imi sparga display-ul din consola .Ehh,am zis eu ,nu o fi un capat de lume .Dar este .Cum spune-am de ani de zile caut sa il inlocuiesc si nu reusesc .Numai in Papua Noua Guinee nu am ajuns cu telefoanele ,,in rest peste tot .Raspunsurile la fel ,nu se mai fabrica ,etc.Prea mult nu ma doare lipsa lui ,dar am nevoie de orele de functionare sa le stiu si sunt afisate numai pe display ,restul le tin din frau caci are si senzori lumiiosi si acustici utilajul .Sa nu va plictisesc este vb de un modul display cu 17 Pini fabricat de SII (Seiko-China ,cred )si are inscriptionat pe el G121CB1P0 .Eu ,sunt sigur ,ca in lumea asta exista un inlocuitor al acestui display ,ca nu este de pe o nava extraterestra .Am gasit eu niste module drafice ,dar nimeni nu stie daca se potrivesc .Eu sunt total pe dinafara .Sunt pregatit sa recompensez eventualele sfaturi si montajul .-inlocuirea lui .O sa incerc sa postez niste poze ,daca o sa pot,, de nu astept un mail de la dvstr la -culitapopa@yahoo.com.si o sa va trimit poze si niste link-uri cu ceva care cred ca este asemanator . Va multumesc .Cu stima Popa Nicolae-Bacau

    RăspundețiȘtergere
  6. Am gasit mai sus adresa dvstr de e-mail si am tris acolo poze si ce am mai crezut eu ca va este de trebuinta in a putea sa intelegeti doleanta mea
    Inca odata va multumesc

    RăspundețiȘtergere
  7. Buna ziua . Am achizitionat si eu un tft 2,4 , functioneaza cu exemplele dv dar touch-ul este inversat cu 180 grade . Ce ar trebui sa modific si unde ?
    Multumesc

    RăspundețiȘtergere
    Răspunsuri
    1. in sketch ai asa:
      // (on the 2-row header at the end of the board).

      #include

      #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

      // For better pressure precision, we need to know the resistance
      // between X+ and X- Use any multimeter to read it
      // For the one we're using, its 300 ohms across the X plate
      TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300);

      incearca intai sa schimbi partea de definire
      #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

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

      Ștergere
  8. Buna ziua! Literele pe ecran imi apar oglindite - cum as putea sa le fac sa apara in modul corect?

    RăspundețiȘtergere