«

»

Ago 05

Stampa Articolo

1,8″ Tft Shield Adafruit Demo

Un display nel tuo progetto ha sempre un fascino unico e poter utilizzare il display della 1,8″ Tft shield rende tutto più professionale.

1 8 tft display ST7735

I display LCD 16×2, 128×64 di cui hai letto i test e hai visto nei miei progetti hanno il vantaggio di essere poco costosi e adatti a molti progetti, tuttavia hanno dei limiti:

  • usano molti pin per la connessione ad arduino ( minimo 6 ) limitando la possibilità di espandere il progetto in futuro;
  • sono monocromatici;
  • hanno la dimensione del font fissa.

La display 1,8″ Tft shield è equipaggiata con un display Tft da 160×120 pixel simile a quello presente sul Nokia 6110. Avresti mai immaginato di poter utilizzare il display del tuo vecchio telefonino con arduino?

Cosa c’è sul 1,8″ Tft shield

Oltre al display Tft da 1,8″ a colori sulla shield sono presenti uno slot per SD Card ed un Joystick digitale da 4 posizioni ( Up,Down, Right, Left ) più la pressione del pulsante centrale che puoi utilizzare nei tuoi progetti per:

  • controlare le opzioni di un menu;
  • impostare parametri;
  • controllare un robot;
  • modificare delle impostazioni del progetto;
  • ecc…

Vedrai in un prossimo articolo come funziona il joystick digitale della 1,8″ Tft Shield.

Oggi voglio concentrarmi sulla shield e sui pin che la connettono ad Arduino, parti dalla documentazione ufficiale e leggerai che la shield va assemblata, nulla di complesso devi solo saldare gli header per collegarla ad Arduino e trovi la documentazione completa in questo link con tanto di foto passo passo.

Saldati i pin che la connettono ad Arduino potrai notare che sulla superficie della shield sono serigrafate delle sigle in corrispondenza di alcuni pin, in particolare:

  • DC in corrispndenza del pin 8
  • CS in corrispondenza del pin 10
  • MOSI in corrispondenza del pin 11
  • SCK in corrispondenza del pin 13

1 8 tft display serigrafia pin

questi pin saranno quelli che inserirai nella configurazione dello sketch per indicare ad arduino come comunicare con la 1,8″ tft shield attraverso la sua libreria ST7735.

Libreria ST7735 per 1,8″ Tft shield adafruit

Ho citato la libreria ST7735 rilasciata da adafruit che semplifica di molto l’uso della shield con arduino e del display in particolare.

Prima di tutto scarica la liberia da GitHub cliccando su Download:

1 8 tft display adafruit st7735 library

decomprimi il file .zip e copia il contenuto nella tua cartella ~/Arduino/libraries/ con il nome AdafruitST7735:

1 8 tft display adafruit st7735 library

ricorda che i nomi delle directory sotto la libraries possono contenere sole lettere e numeri altrimenti ti compare il seguente errore quando avvii l’IDE Arduino:

1 8 tft display adafruit errore

Uso della Libreria ST7735 con la Tft Shield

Dopo aver caricato la libreria nel giusto path e con il nome corretto in modo che l’IDE possa leggere tutti gli esempi in essa contenuti puoi avviare l’IDE arduino e sotto Esempi troverai la tua Adafruit_ST7735 contenente tutti gli esempi:

1 8 tft display st7735 esempi

seleziona il primo “graphictest” e vedrai comparire nell’ide il seguente esempio:

/***************************************************
  This is an example sketch for the Adafruit 1.8" SPI display.
  This library works with the Adafruit 1.8" TFT Breakout w/SD card
  ----> http://www.adafruit.com/products/358
  as well as Adafruit raw 1.8" TFT display
  ----> http://www.adafruit.com/products/618
 
  Check out the links above for our tutorials and wiring diagrams
  These displays use SPI to communicate, 4 or 5 pins are required to
  interface (RST is optional)
  Adafruit invests time and resources providing this open source code,
  please support Adafruit and open-source hardware by purchasing
  products from Adafruit!

  Written by Limor Fried/Ladyada for Adafruit Industries.
  MIT license, all text above must be included in any redistribution
 ****************************************************/

// You can use any (4 or) 5 pins
#define sclk 4
#define mosi 5
#define cs   6
#define dc   7
#define rst  8  // you can also connect this to the Arduino reset

#include <Adafruit_GFX.h>    // Core graphics library
#include <Adafruit_ST7735.h> // Hardware-specific library
#include <SPI.h>

// Option 1: use any pins but a little slower
Adafruit_ST7735 tft = Adafruit_ST7735(cs, dc, mosi, sclk, rst);

// Option 2: must use the hardware SPI pins
// (for UNO thats sclk = 13 and sid = 11) and pin 10 must be
// an output. This is much faster - also required if you want
// to use the microSD card (see the image drawing example)
//Adafruit_ST7735 tft = Adafruit_ST7735(cs, dc, rst);
float p = 3.1415926;

void setup(void) {
  Serial.begin(9600);
  Serial.print("hello!");

  // Our supplier changed the 1.8" display slightly after Jan 10, 2012
  // so that the alignment of the TFT had to be shifted by a few pixels
  // this just means the init code is slightly different. Check the
  // color of the tab to see which init code to try. If the display is
  // cut off or has extra 'random' pixels on the top & left, try the
  // other option!
  // If you are seeing red and green color inversion, use Black Tab

  // If your TFT's plastic wrap has a Black Tab, use the following:
  tft.initR(INITR_BLACKTAB);   // initialize a ST7735S chip, black tab
  // If your TFT's plastic wrap has a Red Tab, use the following:
  //tft.initR(INITR_REDTAB);   // initialize a ST7735R chip, red tab
  // If your TFT's plastic wrap has a Green Tab, use the following:
  //tft.initR(INITR_GREENTAB); // initialize a ST7735R chip, green tab

  Serial.println("init");

  uint16_t time = millis();
  tft.fillScreen(ST7735_BLACK);
  time = millis() - time;

  Serial.println(time, DEC);
  delay(500);

  // large block of text
  tft.fillScreen(ST7735_BLACK);
  testdrawtext("Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur adipiscing ante sed nibh tincidunt feugiat. Maecenas enim massa, fringilla sed malesuada et, malesuada sit amet turpis. Sed porttitor neque ut ante pretium vitae malesuada nunc bibendum. Nullam aliquet ultrices massa eu hendrerit. Ut sed nisi lorem. In vestibulum purus a tortor imperdiet posuere. ", ST7735_WHITE);
  delay(1000);

  // tft print function!
  tftPrintTest();
  delay(4000);

  // a single pixel
  tft.drawPixel(tft.width()/2, tft.height()/2, ST7735_GREEN);
  delay(500);

  // line draw test
  testlines(ST7735_YELLOW);
  delay(500);

  // optimized lines
  testfastlines(ST7735_RED, ST7735_BLUE);
  delay(500);

  testdrawrects(ST7735_GREEN);
  delay(500);

  testfillrects(ST7735_YELLOW, ST7735_MAGENTA);
  delay(500);

  tft.fillScreen(ST7735_BLACK);
  testfillcircles(10, ST7735_BLUE);
  testdrawcircles(10, ST7735_WHITE);
  delay(500);

  testroundrects();
  delay(500);

  testtriangles();
  delay(500);

  mediabuttons();
  delay(500);

  Serial.println("done");
  delay(1000);
}

void loop() {
  tft.invertDisplay(true);
  delay(500);
  tft.invertDisplay(false);
  delay(500);
}

void testlines(uint16_t color) {
  tft.fillScreen(ST7735_BLACK);
  for (int16_t x=0; x < tft.width(); x+=6) {
    tft.drawLine(0, 0, x, tft.height()-1, color);
  }
  for (int16_t y=0; y < tft.height(); y+=6) {
    tft.drawLine(0, 0, tft.width()-1, y, color);
  }

  tft.fillScreen(ST7735_BLACK);
  for (int16_t x=0; x < tft.width(); x+=6) {
    tft.drawLine(tft.width()-1, 0, x, tft.height()-1, color);
  }
  for (int16_t y=0; y < tft.height(); y+=6) {
    tft.drawLine(tft.width()-1, 0, 0, y, color);
  }

  tft.fillScreen(ST7735_BLACK);
  for (int16_t x=0; x < tft.width(); x+=6) {
    tft.drawLine(0, tft.height()-1, x, 0, color);
  }
  for (int16_t y=0; y < tft.height(); y+=6) {
    tft.drawLine(0, tft.height()-1, tft.width()-1, y, color);
  }

  tft.fillScreen(ST7735_BLACK);
  for (int16_t x=0; x < tft.width(); x+=6) {
    tft.drawLine(tft.width()-1, tft.height()-1, x, 0, color);
  }
  for (int16_t y=0; y < tft.height(); y+=6) {
    tft.drawLine(tft.width()-1, tft.height()-1, 0, y, color);
  }
}

void testdrawtext(char *text, uint16_t color) {
  tft.setCursor(0, 0);
  tft.setTextColor(color);
  tft.setTextWrap(true);
  tft.print(text);
}

void testfastlines(uint16_t color1, uint16_t color2) {
  tft.fillScreen(ST7735_BLACK);
  for (int16_t y=0; y < tft.height(); y+=5) {
    tft.drawFastHLine(0, y, tft.width(), color1);
  }
  for (int16_t x=0; x < tft.width(); x+=5) {
    tft.drawFastVLine(x, 0, tft.height(), color2);
  }
}

void testdrawrects(uint16_t color) {
  tft.fillScreen(ST7735_BLACK);
  for (int16_t x=0; x < tft.width(); x+=6) {
    tft.drawRect(tft.width()/2 -x/2, tft.height()/2 -x/2 , x, x, color);
  }
}

void testfillrects(uint16_t color1, uint16_t color2) {
  tft.fillScreen(ST7735_BLACK);
  for (int16_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 testfillcircles(uint8_t radius, uint16_t color) {
  for (int16_t x=radius; x < tft.width(); x+=radius*2) {
    for (int16_t y=radius; y < tft.height(); y+=radius*2) {
      tft.fillCircle(x, y, radius, color);
    }
  }
}

void testdrawcircles(uint8_t radius, uint16_t color) {
  for (int16_t x=0; x < tft.width()+radius; x+=radius*2) {
    for (int16_t y=0; y < tft.height()+radius; y+=radius*2) {
      tft.drawCircle(x, y, radius, color);
    }
  }
}

void testtriangles() {
  tft.fillScreen(ST7735_BLACK);
  int color = 0xF800;
  int t;
  int w = 63;
  int x = 159;
  int y = 0;
  int z = 127;
  for(t = 0 ; t <= 15; t+=1) {
    tft.drawTriangle(w, y, y, x, z, x, color);
    x-=4;
    y+=4;
    z-=4;
    color+=100;
  }
}

void testroundrects() {
  tft.fillScreen(ST7735_BLACK);
  int color = 100;
  int i;
  int t;
  for(t = 0 ; t <= 4; t+=1) {
    int x = 0;
    int y = 0;
    int w = 127;
    int h = 159;
    for(i = 0 ; i <= 24; i+=1) {
      tft.drawRoundRect(x, y, w, h, 5, color);
      x+=2;
      y+=3;
      w-=4;
      h-=6;
      color+=1100;
    }
    color+=100;
  }
}

void tftPrintTest() {
  tft.setTextWrap(false);
  tft.fillScreen(ST7735_BLACK);
  tft.setCursor(0, 30);
  tft.setTextColor(ST7735_RED);
  tft.setTextSize(1);
  tft.println("Hello World!");
  tft.setTextColor(ST7735_YELLOW);
  tft.setTextSize(2);
  tft.println("Hello World!");
  tft.setTextColor(ST7735_GREEN);
  tft.setTextSize(3);
  tft.println("Hello World!");
  tft.setTextColor(ST7735_BLUE);
  tft.setTextSize(4);
  tft.print(1234.567);
  delay(1500);
  tft.setCursor(0, 0);
  tft.fillScreen(ST7735_BLACK);
  tft.setTextColor(ST7735_WHITE);
  tft.setTextSize(0);
  tft.println("Hello World!");
  tft.setTextSize(1);
  tft.setTextColor(ST7735_GREEN);
  tft.print(p, 6);
  tft.println(" Want pi?");
  tft.println(" ");
  tft.print(8675309, HEX); // print 8,675,309 out in HEX!
  tft.println(" Print HEX!");
  tft.println(" ");
  tft.setTextColor(ST7735_WHITE);
  tft.println("Sketch has been");
  tft.println("running for: ");
  tft.setTextColor(ST7735_MAGENTA);
  tft.print(millis() / 1000);
  tft.setTextColor(ST7735_WHITE);
  tft.print(" seconds.");
}

void mediabuttons() {
  // play
  tft.fillScreen(ST7735_BLACK);
  tft.fillRoundRect(25, 10, 78, 60, 8, ST7735_WHITE);
  tft.fillTriangle(42, 20, 42, 60, 90, 40, ST7735_RED);
  delay(500);
  // pause
  tft.fillRoundRect(25, 90, 78, 60, 8, ST7735_WHITE);
  tft.fillRoundRect(39, 98, 20, 45, 5, ST7735_GREEN);
  tft.fillRoundRect(69, 98, 20, 45, 5, ST7735_GREEN);
  delay(500);
  // play color
  tft.fillTriangle(42, 20, 42, 60, 90, 40, ST7735_BLUE);
  delay(50);
  // pause color
  tft.fillRoundRect(39, 98, 20, 45, 5, ST7735_RED);
  tft.fillRoundRect(69, 98, 20, 45, 5, ST7735_RED);
  // play color
  tft.fillTriangle(42, 20, 42, 60, 90, 40, ST7735_GREEN);
}

noti subito che le prime righe:

// You can use any (4 or) 5 pins
#define sclk 4
#define mosi 5
#define cs   6
#define dc   7
#define rst  8  // you can also connect this to the Arduino reset

contengono informazioni differenti da quelle che conosci per quanto riguarda i pin di connessione ad arduino, dovrai modificarle come segue:

// You can use any (4 or) 5 pins
#define sclk 13
#define mosi 11
#define cs   10
#define dc   8
#define rst  0  // you can also connect this to the Arduino reset

in questo modo arduino e la 1,8″ Tft shield possono comunicare facilmente grazie alla libreria ST7735.

Lo sketch proposto è una demo di tutto quello che puoi realizzare con le funzioni del tuo display 1,8″ Tft shield adafruit ed al cui interno trovi già delle linee interessanti per sviluppare il tuo progetto come ad esempio le linee 069-071: in cui il display richiama la funzione testdrowtext( testo ) con la frase:

“Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur adipiscing ante sed nibh tincidunt feugiat. Maecenas enim massa, fringilla sed malesuada et, malesuada sit amet turpis. Sed porttitor neque ut ante pretium vitae malesuada nunc bibendum. Nullam aliquet ultrices massa eu hendrerit. Ut sed nisi lorem. In vestibulum purus a tortor imperdiet posuere. “

che vedrai visualizzata sul display della 1,8″ Tft shield nel video sotto.

In particolare la linea 070 richiama una funzione resente nello sketch alla linea 154 in cui definisci la funzione testdrowtext();

linea 155: imposti il cursore alla posizione 0,0 grazie al metodo setCursor( x,y ) della classe tft ( definita alla linea 031);

linea 156: usa il metodo setColor( colore ) per definire il colore del testo;

linea 157: indica al display 1,8″ tft shield che il testo deve essere gestito con un ritorno a capo automatico, lo fai impostando a true il valore del metodo setTextWrap();

linea 158: finalmente scrivi il testo sul display con il metodo print();

Nello sketch sono presenti numerose funzioni demo che potrai esplorare e da cui prendere spunto per realizzare il tuo sketch.

Il video del display 1,8″ tft shield

Ecco il video demo che ho realizzato dopo aver caricato su arduino lo sketch di test:

Buona visione !!!

Permalink link a questo articolo: http://www.mauroalfieri.it/elettronica/18-tft-shield-adafruit-demo.html

6 comments

Vai al modulo dei commenti

  1. natacha

    ok can you send me by mail the soft like you use for this shield because the oficial link dont work (many misctake on compilation when i test befor download to arduinon ardware).
    thank you !!!!

    1. Mauro Alfieri

      Hi Natacha,
      all link in this page it’s correct.
      Verify your connection and try to connect.

  2. Daniele

    Salve signor Mauro,intanto complimenti per il suo sito e per i lavori che fa..Io mi chiamo Daniele e avrei bisogno di aiuto per quanto riguarda la programazione di arduino. Premetto che ne capisco abbastanza per quanto riguarda l’elettronica e meccanica, ma a livello di programmazione quasi zero! Se le puo interessare ad aiutarmi per questo progetto le sarei grato..
    Quello che vorrei fare è una stufa a pirolisi o meglio dire una caldaia a pirolisi, utilizata per riscaldare tutti i radiatori presenti in casa.Quello che mi blocca appunto è il controllo. Vorrei utilizare arduino 1 e uno schermo tft. 1.8.
    Sulla schermata principale vorrei le seguenti voci:
    – Temp amb rilevata
    -Temp acqua rilevata
    -On/off
    -Data e ora
    -Menu per impostare tutti i parametri
    Se ha tempo e voglia le do tutti i dettagli di qullo che vorrei fare. Grazie anticipatamente
    Saluti Daniele

    1. Mauro Alfieri

      Ciao Daniele,
      solitamente accetto progetti su commissione solo se non hanno impieghi pericolosi.
      Nel tuo caso il controllo con arduino di una caldaia o stufa comporta un margine di sicurezza ed affidabilità che non penso di essere in grado di garantire.

  3. giancarlo

    ciao mauro,
    volevo sapere se è possibile utilizzare arduino con display, montato in un tachimetro di una macchina per rilevare vari valori.
    tipo:
    temperatura acqua
    pressione turbo
    pressione olio
    giri motore
    temp. esterna
    ecc ecc
    Tramite i pulsanti sul volante, navigare nei menù di arduino…
    magari all’accensione del quadro un messaggio di benvenuto o un’immagine della macchina…

    magari se mi contatta le spiego meglio.
    grazie in anticipo

    1. Mauro Alfieri

      Ciao Giancarlo,
      è tutto fattibile, dipende solo dalle tue capacità di programmazione e quanto tempo vuoi dedicare allo studio del progetto.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Puoi usare i seguenti tag ed attributi HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>