Forum Rule: Always post complete source code & details to reproduce any issue!
Results 1 to 10 of 10

Thread: Teensy 3.6/4.0 and 2" TFT ST7789

  1. #1

    Teensy 3.6/4.0 and 2" TFT ST7789

    Hi Everyone,

    I was wondering if anyone has used this combination of Teensy + LCD? I just keep getting a black screen and I've tried searching and haven't found any leads. I also tried other libraries in hopes of getting something to work. Currently at work so I figured I'd post here before trying to dissect code. (I'm mostly looking for hope that it works and I didn't burn $20.

  2. #2
    Senior Member+ KurtE's Avatar
    Join Date
    Jan 2014
    Posts
    5,744
    Is this the Adafruit one? https://www.adafruit.com/product/4311

    Which version of Teensyduino do you have installed? If the most recent, than I believe the support that @mjs513 and I did to support this one is in that build. In the library st7735_t3. Likewise I it should probably also work in latest versions of Adafruit_st7735 and st7789 library. Warning there is an older version of this library that sometimes gets used instead of their more current version, so I removed it from my machine.


    If not, @mjs513 has a more advanced version, that I think is still waiting to be pulled into the master version:
    I believe the most up to date version of that is his branch: https://github.com/mjs513/ST7735_t3/...735_T4_rewrite

    @mjs513 - You might want to look at the current examples on your branch, where some of them are not using st7735 or st7789?

    But back onto this:

    With the released library, you should try loading one of the example sketches like graphic test,

    You then need to update a couple of things. Hopefully the current version of graphic test has most of it in comments...

    You need to use the constructor for an ST7789_t3 and not the ST7735_t3.
    Like the line:
    // For 1.54" TFT with ST7789
    //ST7789_t3 tft = ST7789_t3(TFT_CS, TFT_DC, TFT_RST);

    You then need to update setup to call the right init for this display and comment out (or remove the other ones)
    // OR use this initializer (uncomment) if using a 2.0" 320x240 TFT:
    //tft.init(240, 320); // Init ST7789 320x240

  3. #3
    Hi Kurt!

    Yes I bought it through digikey - it is the adafruit one. Currently it's just a black screen.

    I need to double check when I get home but I'm confident it's the latest version of Teensyduino.





    Quote Originally Posted by KurtE View Post
    Is this the Adafruit one? https://www.adafruit.com/product/4311

    Which version of Teensyduino do you have installed? If the most recent, than I believe the support that @mjs513 and I did to support this one is in that build. In the library st7735_t3. Likewise I it should probably also work in latest versions of Adafruit_st7735 and st7789 library. Warning there is an older version of this library that sometimes gets used instead of their more current version, so I removed it from my machine.


    If not, @mjs513 has a more advanced version, that I think is still waiting to be pulled into the master version:
    I believe the most up to date version of that is his branch: https://github.com/mjs513/ST7735_t3/...735_T4_rewrite

    @mjs513 - You might want to look at the current examples on your branch, where some of them are not using st7735 or st7789?

    But back onto this:

    With the released library, you should try loading one of the example sketches like graphic test,

    You then need to update a couple of things. Hopefully the current version of graphic test has most of it in comments...

    You need to use the constructor for an ST7789_t3 and not the ST7735_t3.
    Like the line:
    // For 1.54" TFT with ST7789
    //ST7789_t3 tft = ST7789_t3(TFT_CS, TFT_DC, TFT_RST);

    You then need to update setup to call the right init for this display and comment out (or remove the other ones)
    // OR use this initializer (uncomment) if using a 2.0" 320x240 TFT:
    //tft.init(240, 320); // Init ST7789 320x240

  4. #4
    Senior Member+ MichaelMeissner's Avatar
    Join Date
    Nov 2012
    Location
    Ayer Massachussetts
    Posts
    3,375
    It might make sense to post a picture showing exactly how you wired it up, and exactly what program (including what libraries) were used.

  5. #5
    Will do when I get home

    Quote Originally Posted by MichaelMeissner View Post
    It might make sense to post a picture showing exactly how you wired it up, and exactly what program (including what libraries) were used.

  6. #6
    Senior Member+ mjs513's Avatar
    Join Date
    Jul 2014
    Location
    New York
    Posts
    4,315
    Quote Originally Posted by KurtE
    If not, @mjs513 has a more advanced version, that I think is still waiting to be pulled into the master version:
    I believe the most up to date version of that is his branch: https://github.com/mjs513/ST7735_t3/...735_T4_rewrite

    @mjs513 - You might want to look at the current examples on your branch, where some of them are not using st7735 or st7789?
    Will double check and update.

    Just as a note I have the same display and tested it with both libraries. It both cases did not have a problem. In addition to checking that you have installed the latest Teensyduino you might want to check the wiring. Testing was done primarily with the T4.


    EDIT: @KurtE - just checked the rewrite branch and all the examples are setup for either the 7735 and/or the 7789. But just noticed my master/rewrite branch is 7 commits behind the master. Have to sort that out - thought it was even - so something got in that I missed. Doesn't look major though.
    Last edited by mjs513; 11-19-2019 at 10:22 PM.

  7. #7
    I apologize for the crappy picture, I need to get a new phone.

    Click image for larger version. 

Name:	1119192230.jpg 
Views:	17 
Size:	81.4 KB 
ID:	18225

    Below is my code.

    Code:
    /***************************************************
      This is a library for several Adafruit displays based on ST77* drivers.
    
      Works with the Adafruit 1.8" TFT Breakout w/SD card
        ----> http://www.adafruit.com/products/358
      The 1.8" TFT shield
        ----> https://www.adafruit.com/product/802
      The 1.44" TFT breakout
        ----> https://www.adafruit.com/product/2088
      The 1.54" TFT breakout
        ----> https://www.adafruit.com/product/3787
      The 2.0" TFT breakout
        ----> https://www.adafruit.com/product/4311
      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
     ****************************************************/
    
    // This Teensy3 and 4 native optimized and extended version
    // requires specific pins. 
    // If you use the short version of the constructor and the DC
    // pin is hardware CS pin, then it will be slower.
    
    #define TFT_SCLK 13  // SCLK can also use pin 14
    #define TFT_MOSI 11  // MOSI can also use pin 7
    #define TFT_CS   10  // CS & DC can use pins 2, 6, 9, 10, 15, 20, 21, 22, 23
    #define TFT_DC    9  //  but certain pairs must NOT be used: 2+10, 6+9, 20+23, 21+22
    #define TFT_RST   255  // RST can use any pin
    #define SD_CS     4  // CS for SD card, can use any pin
    
    // Note the above pins are for the SPI object.  For those Teensy boards which have
    // more than one SPI object, such as T3.5, T3.6, T4 which have at SPI1 and SPI2
    // LC with SPI1, look at the cards that come with the teensy or the web page
    // https://www.pjrc.com/teensy/pinout.html to select the appropriate IO pins.
    
    #include <Adafruit_GFX.h>    // Core graphics library
    #include <ST7735_t3.h> // Hardware-specific library
    #include <ST7789_t3.h> // Hardware-specific library
    #include <SPI.h>
    
    // Option 1: use any pins but a little slower
    // Note: code will detect if specified pins are the hardware SPI pins
    //       and will use hardware SPI if appropriate
    // For 1.44" and 1.8" TFT with ST7735 use
    //ST7735_t3 tft = ST7735_t3(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST);
    
    // For 1.54" or other TFT with ST7789, This has worked with some ST7789
    // displays without CS pins, for those you can pass in -1 or 0xff for CS
    // More notes by the tft.init call
    //ST7789_t3 tft = ST7789_t3(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_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)
    // For 1.44" and 1.8" TFT with ST7735 use
    //ST7735_t3 tft = ST7735_t3(cs, dc, rst);
    
    // For 1.54" TFT with ST7789
    ST7789_t3 tft = ST7789_t3(TFT_CS,  TFT_DC, TFT_RST);
    
    float p = 3.1415926;
    
    
    void setup(void) {
      pinMode(SD_CS, INPUT_PULLUP);  // don't touch the SD card
      Serial.begin(9600);
      Serial.print("hello!");
    
      // Use this initializer if you're using a 1.8" TFT 128x160 displays
      //tft.initR(INITR_BLACKTAB);
    
      // Or use this initializer (uncomment) if you're using a 1.44" TFT (128x128)
      //tft.initR(INITR_144GREENTAB);
    
      // Or use this initializer (uncomment) if you're using a .96" TFT(160x80)
      //tft.initR(INITR_MINI160x80);
    
      // Or use this initializer (uncomment) for Some 1.44" displays use different memory offsets
      // Try it if yours is not working properly
      // May need to tweek the offsets
      //tft.setRowColStart(32,0);
    
      // Or use this initializer (uncomment) if you're using a 1.54" 240x240 TFT
      //tft.init(240, 240);   // initialize a ST7789 chip, 240x240 pixels
    
      // OR use this initializer (uncomment) if using a 2.0" 320x240 TFT:
      tft.init(240, 320);           // Init ST7789 320x240
    
      // OR use this initializer (uncomment) if using a 240x240 clone 
      // that does not have a CS pin2.0" 320x240 TFT:
      //tft.init(240, 240, SPI_MODE2);           // Init ST7789 240x240 no CS
    
      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(const 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 = tft.width()/2;
      int x = tft.height()-1;
      int y = 0;
      int z = tft.width();
      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 = 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(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);
    }

  8. #8
    Senior Member+ defragster's Avatar
    Join Date
    Feb 2015
    Posts
    10,110
    The ST7789's here were 240x240 and they worked.

    There was one thing I noticed - and this may have been done - after upload unpower the Teensy and display then reconnect the Teensy to power. See if it runs then or upload again. Not sure it was the ST7789 - but it is an easy process.

  9. #9
    Senior Member+ MichaelMeissner's Avatar
    Join Date
    Nov 2012
    Location
    Ayer Massachussetts
    Posts
    3,375
    You have the reset pin connected to 3.3v (and set to 255). I would try to use a real pin for this, rather than just connecting it to high voltage, and let the library reset the display.

    I've had some physical things go wrong in the past, you might want to check these out:
    • I've had holes in breadboards stop connecting current, and I had to move the jumper wire (and throw out the breadboard when I get the chance);
    • I've had doggy jumper wires that worked better when I replaced them;
    • I've had solder joints that don't always connect, unless there is pressure on the board (remember to check both the Teensy and the display);
    • Solder bridges can also create problems (where two pins are connected that shouldn't be by big globs of solder);
    • I don't recall damaging displays with the wrong current applied (I have damaged 3.3v Teensys however), but maybe its possible;
    • After watching the Adafruit forums for a bit, I do see a number of displays need to be RMA'ed (mostly I've been noticing the Monster M4SK, including one I needed to have replaced -- the wiring in those displays is somewhat fragile). Unfortunately, there you would need to deal with digikey;
    • I've had displays that I had to tune the SPI bus clock and/or processor clock, because the Teensy ran too fast;
    • Sometimes having a wait in setup before you enable a display can help;
    • Every so often, I count wrong and attach the wrong pin to the display;
    • In theory you should not need to connect the blacklight, but that might need to be checked;
    • On SPI buses with more than one device, I generally need to add external pull-up resistors, and/or modify the code to set the other CS/DC pins high;
    • In this case, it you are using the correct pins, but in the Teensy 3.x processors, and the _t3 drivers, you have a limited set of pains to use for CS and DC.

  10. #10
    Looks like I'll be spending this weekend debugging.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •