0,96" TFT Modul ST7735

Dieses kleine TFT-Modul besitzt die Dimensionen von 30×24mm, wobei davon nur 23×12mm der Display selbst misst. Es handelt sich dabei um einen IPS Farbdisplay, welcher 65k Farben darstellen kann und über den ST7735S Chip gesteuert wird. Das Modul kann mit 3,3V oder 5V betrieben werden und wird vom Arduino über die SPI-Schnittstelle angesprochen.

0,96 Zoll TFT Modul ST7735

Verwendete Bauteile

Anschlüsse

TFT-Modul Arduino
GND GND
VCC 3,3V oder 5V
SCL 13
SDA 11
RES (RST) 8
DC 9
CS 10
BLK (LED) Hintergrundbeleuchtung: 3,3V für Dauerbetrieb

Demo-Sketches

Für den Test des TFT-Moduls werden drei Libraries verwendet: Adafruit_GFX, Adafruit_BusIO und Adafruit_ST7735. Diese können entweder von GitHub oder direkt in der Arduino-IDE herunter geladen werden.

Grafik-Test

Der folgende Sketch basiert auf einem Beispiel-Test, der bei der Library Adafruit_ST7735 mitgeliefert wird. Ich habe nur einige kleine Anpassungen vorgenommen (z.B. Pins), damit die Ausgabe auf meinem Mini-Display funktioniert.

#include <Adafruit_GFX.h>
#include <Adafruit_ST7735.h>
#include <SPI.h>

#define TFT_CS     10
#define TFT_RST     8
#define TFT_DC      9

Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);
float p = 3.1415926;

void setup()
{
  tft.initR(INITR_MINI160x80);  // Init ST7735S mini display
  tft.invertDisplay(true);
  tft.fillScreen(ST77XX_BLACK);
  delay(1000);

  // large block of text
  tft.fillScreen(ST77XX_BLACK);
  testdrawtext("Lorem ipsum dolor sit amet", ST77XX_WHITE);
  delay(1000);

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

  // a single pixel
  tft.drawPixel(tft.width()/2, tft.height()/2, ST77XX_GREEN);
  delay(1000);

  // line draw test
  testlines(ST77XX_YELLOW);
  delay(1000);

  // optimized lines
  testfastlines(ST77XX_RED, ST77XX_BLUE);
  delay(1000);

  testdrawrects(ST77XX_GREEN);
  delay(1000);

  testfillrects(ST77XX_YELLOW, ST77XX_MAGENTA);
  delay(1000);

  tft.fillScreen(ST77XX_BLACK);
  testfillcircles(10, ST77XX_BLUE);
  testdrawcircles(10, ST77XX_WHITE);
  delay(500);

  testroundrects();
}

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

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

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

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

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

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(ST77XX_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(ST77XX_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(ST77XX_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(ST77XX_BLACK);
  uint16_t color = 0xF800;
  int t;
  int w = tft.width()/2;
  int x = tft.height()-1;
  int y = 0;
  int z = tft.width();
  for(t = 0 ; t <= 15; t++) {
    tft.drawTriangle(w, y, y, x, z, x, color);
    x-=4;
    y+=4;
    z-=4;
    color+=100;
  }
}

void testroundrects() {
  tft.fillScreen(ST77XX_BLACK);
  uint16_t color = 100;
  int i;
  int t;
  for(t = 0 ; t <= 4; t+=1) {
    int x = 0;
    int y = 0;
    int w = tft.width()-2;
    int h = tft.height()-2;
    for(i = 0 ; i <= 16; 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(ST77XX_BLACK);
  tft.setCursor(0, 30);
  tft.setTextColor(ST77XX_RED);
  tft.setTextSize(1);
  tft.println("Hello World!");
  tft.setTextColor(ST77XX_YELLOW);
  tft.setTextSize(2);
  tft.println("Hello World!");
  tft.setTextColor(ST77XX_GREEN);
  tft.setTextSize(3);
  tft.println("Hello World!");
  tft.setTextColor(ST77XX_BLUE);
  tft.setTextSize(4);
  tft.print(1234.567);
  delay(1500);
  tft.setCursor(0, 0);
  tft.fillScreen(ST77XX_BLACK);
  tft.setTextColor(ST77XX_WHITE);
  tft.setTextSize(0);
  tft.println("Hello World!");
  tft.setTextSize(1);
  tft.setTextColor(ST77XX_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(ST77XX_WHITE);
  tft.println("Sketch has been");
  tft.println("running for: ");
  tft.setTextColor(ST77XX_MAGENTA);
  tft.print(millis() / 1000);
  tft.setTextColor(ST77XX_WHITE);
  tft.print(" seconds.");
}

SciFi-Anzeige

Der zweite Sketch mal eine Art Pseudo-Computer-Ausgabe, die einem Raumschiff eines SciFi-Films zugehören könnte. Es ist aber nur ein einfaches Farb- und Anzeigeschema mit Linien und einem Zufallsgenerator.

Resultat der SciFi-Anzeige auf dem TFT-Modul
#include <Adafruit_GFX.h>    // Core graphics library
#include <Adafruit_ST7735.h> // Hardware-specific library for ST7735
#include <Adafruit_ST7789.h> // Hardware-specific library for ST7789
#include <SPI.h>

#define TFT_CS        10
#define TFT_RST        8
#define TFT_DC         9

#define TFT_WIDTH 160
#define TFT_HEIGHT 128

Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);
byte lines[TFT_WIDTH];

void setup()
{
  for (byte i = 0; i < TFT_WIDTH; i++) {
    lines[i] = random(TFT_HEIGHT / 2);
  }

  tft.initR(INITR_MINI160x80);  // Init ST7735S mini display
  tft.invertDisplay(true);
  tft.fillScreen(ST77XX_BLACK);
}

void loop()
{
  for (byte i = 0; i < TFT_WIDTH; i++) {
    tft.drawLine(i, 0, i, lines[i], ST77XX_BLACK);
    lines[i] += random(-3, 3);
    lines[i] = min(TFT_HEIGHT / 2, max(0, lines[i]));
    tft.drawLine(i, 0, i, lines[i], i * 10);
  }
}
zurück