0

Error with the tutorial for 2'8 Breakboard TFT LCD
Moderators: adafruit_support_bill, adafruit

Please be positive and constructive with your questions and comments.

Error with the tutorial for 2'8 Breakboard TFT LCD

by Thomos on Wed Jun 29, 2022 9:31 am

Hello !

Thank you for clicking on this post.

Here is my problem, I'm actually following the "Adafruit 2.8" and 3.2" Color TFT Touchscreen Breakout v2" tutorial (https://learn.adafruit.com/adafruit-2-8-and-3-2-color-tft-touchscreen-breakout-v2/8-bit-wiring-and-test) and I can't make my touchscreen displayed the content of the code. I have the error below :


Code: Select all | TOGGLE FULL SIZE
TFT LCD test
Using Adafruit 2.8" TFT Breakout Board Pinout
TFT size is 240x320
Unknown LCD driver chip: 0
If using the Adafruit 2.8" TFT Arduino shield, the line:
  #define USE_ADAFRUIT_SHIELD_PINOUT
should appear in the library header (Adafruit_TFT.h).
If using the breakout board, it should NOT be #defined!
Also if using the breakout, double-check that all wiring
matches the tutorial.

I do have a line of squares in first line of code before TCT LCD test.


I'm using a 2.8 TFT LCD Breakout Board+ 4wires Resistive Touchscreen ILI9341 with an Arduino UNO. I'm coding via the Arduino IDE 2.0.0 rc7 under Windows 10.

Basically, in my intership project, I want to verify that a PCB I made is working correctly but as it doesnt lol. So, I simply wanted to verify that the wiring was correct and that the screen display an example pre coded "graphictest". So I followed the tutorial with a breadboard but unfortunatly can't make it works.

I have everything in double so I tried with the others UNO and Touchscreen, still not working. I octo-checked my wiring and installed the two Adafruit librairies GFX and TFTLCD using the librairies manager as specified in the tutorial.

Can someone please help me ?
I understand from the error code above that the screen isn't recognize by the UNO as it return 0 for the driver number where it should be 9341. Still, I don't understand where the problem can come from since in my opinion, the wiring is correct on my board

I'm joining the example code and photos of my wiring. Sorry for bad quality.

Code: Select all | TOGGLE FULL SIZE
// IMPORTANT: Adafruit_TFTLCD LIBRARY MUST BE SPECIFICALLY
// CONFIGURED FOR EITHER THE TFT SHIELD OR THE BREAKOUT BOARD.
// SEE RELEVANT COMMENTS IN Adafruit_TFTLCD.h FOR SETUP.

#include <Adafruit_GFX.h>    // Core graphics library
#include <Adafruit_TFTLCD.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).

// 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

Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);
// If using the shield, all control and data lines are fixed, and
// a simpler declaration can optionally be used:
// Adafruit_TFTLCD tft;

void setup(void) {
  Serial.begin(9600);
  Serial.println(F("TFT LCD test"));

#ifdef USE_ADAFRUIT_SHIELD_PINOUT
  Serial.println(F("Using Adafruit 2.8\" TFT Arduino Shield Pinout"));
#else
  Serial.println(F("Using Adafruit 2.8\" TFT Breakout Board Pinout"));
#endif

  Serial.print("TFT size is "); Serial.print(tft.width()); Serial.print("x"); Serial.println(tft.height());

  tft.reset();

  uint16_t identifier = tft.readID();

  if(identifier == 0x9325) {
    Serial.println(F("Found ILI9325 LCD driver"));
  } else if(identifier == 0x9328) {
    Serial.println(F("Found ILI9328 LCD driver"));
  } else if(identifier == 0x7575) {
    Serial.println(F("Found HX8347G LCD driver"));
  } else if(identifier == 0x9341) {
    Serial.println(F("Found ILI9341 LCD driver"));
  } else if(identifier == 0x8357) {
    Serial.println(F("Found HX8357D LCD driver"));
  } else {
    Serial.print(F("Unknown LCD driver chip: "));
    Serial.println(identifier, HEX);
    Serial.println(F("If using the Adafruit 2.8\" TFT Arduino shield, the line:"));
    Serial.println(F("  #define USE_ADAFRUIT_SHIELD_PINOUT"));
    Serial.println(F("should appear in the library header (Adafruit_TFT.h)."));
    Serial.println(F("If using the breakout board, it should NOT be #defined!"));
    Serial.println(F("Also if using the breakout, double-check that all wiring"));
    Serial.println(F("matches the tutorial."));
    return;
  }

  tft.begin(identifier);

  Serial.println(F("Benchmark                Time (microseconds)"));

  Serial.print(F("Screen fill              "));
  Serial.println(testFillScreen());
  delay(500);

  Serial.print(F("Text                     "));
  Serial.println(testText());
  delay(3000);

  Serial.print(F("Lines                    "));
  Serial.println(testLines(CYAN));
  delay(500);

  Serial.print(F("Horiz/Vert Lines         "));
  Serial.println(testFastLines(RED, BLUE));
  delay(500);

  Serial.print(F("Rectangles (outline)     "));
  Serial.println(testRects(GREEN));
  delay(500);

  Serial.print(F("Rectangles (filled)      "));
  Serial.println(testFilledRects(YELLOW, MAGENTA));
  delay(500);

  Serial.print(F("Circles (filled)         "));
  Serial.println(testFilledCircles(10, MAGENTA));

  Serial.print(F("Circles (outline)        "));
  Serial.println(testCircles(10, WHITE));
  delay(500);

  Serial.print(F("Triangles (outline)      "));
  Serial.println(testTriangles());
  delay(500);

  Serial.print(F("Triangles (filled)       "));
  Serial.println(testFilledTriangles());
  delay(500);

  Serial.print(F("Rounded rects (outline)  "));
  Serial.println(testRoundRects());
  delay(500);

  Serial.print(F("Rounded rects (filled)   "));
  Serial.println(testFilledRoundRects());
  delay(500);

  Serial.println(F("Done!"));
}

void loop(void) {
  for(uint8_t rotation=0; rotation<4; rotation++) {
    tft.setRotation(rotation);
    testText();
    delay(2000);
  }
}

unsigned long testFillScreen() {
  unsigned long start = micros();
  tft.fillScreen(BLACK);
  tft.fillScreen(RED);
  tft.fillScreen(GREEN);
  tft.fillScreen(BLUE);
  tft.fillScreen(BLACK);
  return micros() - start;
}

unsigned long testText() {
  tft.fillScreen(BLACK);
  unsigned long start = micros();
  tft.setCursor(0, 0);
  tft.setTextColor(WHITE);  tft.setTextSize(1);
  tft.println("Hello World!");
  tft.setTextColor(YELLOW); tft.setTextSize(2);
  tft.println(1234.56);
  tft.setTextColor(RED);    tft.setTextSize(3);
  tft.println(0xDEADBEEF, HEX);
  tft.println();
  tft.setTextColor(GREEN);
  tft.setTextSize(5);
  tft.println("Groop");
  tft.setTextSize(2);
  tft.println("I implore thee,");
  tft.setTextSize(1);
  tft.println("my foonting turlingdromes.");
  tft.println("And hooptiously drangle me");
  tft.println("with crinkly bindlewurdles,");
  tft.println("Or I will rend thee");
  tft.println("in the gobberwarts");
  tft.println("with my blurglecruncheon,");
  tft.println("see if I don't!");
  return micros() - start;
}

unsigned long testLines(uint16_t color) {
  unsigned long start, t;
  int           x1, y1, x2, y2,
                w = tft.width(),
                h = tft.height();

  tft.fillScreen(BLACK);

  x1 = y1 = 0;
  y2    = h - 1;
  start = micros();
  for(x2=0; x2<w; x2+=6) tft.drawLine(x1, y1, x2, y2, color);
  x2    = w - 1;
  for(y2=0; y2<h; y2+=6) tft.drawLine(x1, y1, x2, y2, color);
  t     = micros() - start; // fillScreen doesn't count against timing

  tft.fillScreen(BLACK);

  x1    = w - 1;
  y1    = 0;
  y2    = h - 1;
  start = micros();
  for(x2=0; x2<w; x2+=6) tft.drawLine(x1, y1, x2, y2, color);
  x2    = 0;
  for(y2=0; y2<h; y2+=6) tft.drawLine(x1, y1, x2, y2, color);
  t    += micros() - start;

  tft.fillScreen(BLACK);

  x1    = 0;
  y1    = h - 1;
  y2    = 0;
  start = micros();
  for(x2=0; x2<w; x2+=6) tft.drawLine(x1, y1, x2, y2, color);
  x2    = w - 1;
  for(y2=0; y2<h; y2+=6) tft.drawLine(x1, y1, x2, y2, color);
  t    += micros() - start;

  tft.fillScreen(BLACK);

  x1    = w - 1;
  y1    = h - 1;
  y2    = 0;
  start = micros();
  for(x2=0; x2<w; x2+=6) tft.drawLine(x1, y1, x2, y2, color);
  x2    = 0;
  for(y2=0; y2<h; y2+=6) tft.drawLine(x1, y1, x2, y2, color);

  return micros() - start;
}

unsigned long testFastLines(uint16_t color1, uint16_t color2) {
  unsigned long start;
  int           x, y, w = tft.width(), h = tft.height();

  tft.fillScreen(BLACK);
  start = micros();
  for(y=0; y<h; y+=5) tft.drawFastHLine(0, y, w, color1);
  for(x=0; x<w; x+=5) tft.drawFastVLine(x, 0, h, color2);

  return micros() - start;
}

unsigned long testRects(uint16_t color) {
  unsigned long start;
  int           n, i, i2,
                cx = tft.width()  / 2,
                cy = tft.height() / 2;

  tft.fillScreen(BLACK);
  n     = min(tft.width(), tft.height());
  start = micros();
  for(i=2; i<n; i+=6) {
    i2 = i / 2;
    tft.drawRect(cx-i2, cy-i2, i, i, color);
  }

  return micros() - start;
}

unsigned long testFilledRects(uint16_t color1, uint16_t color2) {
  unsigned long start, t = 0;
  int           n, i, i2,
                cx = tft.width()  / 2 - 1,
                cy = tft.height() / 2 - 1;

  tft.fillScreen(BLACK);
  n = min(tft.width(), tft.height());
  for(i=n; i>0; i-=6) {
    i2    = i / 2;
    start = micros();
    tft.fillRect(cx-i2, cy-i2, i, i, color1);
    t    += micros() - start;
    // Outlines are not included in timing results
    tft.drawRect(cx-i2, cy-i2, i, i, color2);
  }

  return t;
}

unsigned long testFilledCircles(uint8_t radius, uint16_t color) {
  unsigned long start;
  int x, y, w = tft.width(), h = tft.height(), r2 = radius * 2;

  tft.fillScreen(BLACK);
  start = micros();
  for(x=radius; x<w; x+=r2) {
    for(y=radius; y<h; y+=r2) {
      tft.fillCircle(x, y, radius, color);
    }
  }

  return micros() - start;
}

unsigned long testCircles(uint8_t radius, uint16_t color) {
  unsigned long start;
  int           x, y, r2 = radius * 2,
                w = tft.width()  + radius,
                h = tft.height() + radius;

  // Screen is not cleared for this one -- this is
  // intentional and does not affect the reported time.
  start = micros();
  for(x=0; x<w; x+=r2) {
    for(y=0; y<h; y+=r2) {
      tft.drawCircle(x, y, radius, color);
    }
  }

  return micros() - start;
}

unsigned long testTriangles() {
  unsigned long start;
  int           n, i, cx = tft.width()  / 2 - 1,
                      cy = tft.height() / 2 - 1;

  tft.fillScreen(BLACK);
  n     = min(cx, cy);
  start = micros();
  for(i=0; i<n; i+=5) {
    tft.drawTriangle(
      cx    , cy - i, // peak
      cx - i, cy + i, // bottom left
      cx + i, cy + i, // bottom right
      tft.color565(0, 0, i));
  }

  return micros() - start;
}

unsigned long testFilledTriangles() {
  unsigned long start, t = 0;
  int           i, cx = tft.width()  / 2 - 1,
                   cy = tft.height() / 2 - 1;

  tft.fillScreen(BLACK);
  start = micros();
  for(i=min(cx,cy); i>10; i-=5) {
    start = micros();
    tft.fillTriangle(cx, cy - i, cx - i, cy + i, cx + i, cy + i,
      tft.color565(0, i, i));
    t += micros() - start;
    tft.drawTriangle(cx, cy - i, cx - i, cy + i, cx + i, cy + i,
      tft.color565(i, i, 0));
  }

  return t;
}

unsigned long testRoundRects() {
  unsigned long start;
  int           w, i, i2,
                cx = tft.width()  / 2 - 1,
                cy = tft.height() / 2 - 1;

  tft.fillScreen(BLACK);
  w     = min(tft.width(), tft.height());
  start = micros();
  for(i=0; i<w; i+=6) {
    i2 = i / 2;
    tft.drawRoundRect(cx-i2, cy-i2, i, i, i/8, tft.color565(i, 0, 0));
  }

  return micros() - start;
}

unsigned long testFilledRoundRects() {
  unsigned long start;
  int           i, i2,
                cx = tft.width()  / 2 - 1,
                cy = tft.height() / 2 - 1;

  tft.fillScreen(BLACK);
  start = micros();
  for(i=min(tft.width(), tft.height()); i>20; i-=6) {
    i2 = i / 2;
    tft.fillRoundRect(cx-i2, cy-i2, i, i, i/8, tft.color565(0, i, 0));
  }

  return micros() - start;
}


image3 (1).jpeg
image3 (1).jpeg (33.98 KiB) Viewed 773 times

image2 (1).jpeg
image2 (1).jpeg (33.01 KiB) Viewed 773 times

image1 (1).jpeg
image1 (1).jpeg (36.02 KiB) Viewed 773 times


I hope you have all the informations, don't hesitate to ask me more precisions !

Thank you in advance,
Thomas

Thomos
 
Posts: 8
Joined: Wed Jun 29, 2022 8:49 am

Re: Error with the tutorial for 2'8 Breakboard TFT LCD

by adafruit_support_carter on Wed Jun 29, 2022 1:06 pm

Please post a higher res photo showing the solder job on the breakout header pins:
solder.jpg
solder.jpg (8.67 KiB) Viewed 764 times

adafruit_support_carter
 
Posts: 24050
Joined: Tue Nov 29, 2016 2:45 pm

Re: Error with the tutorial for 2'8 Breakboard TFT LCD

by Thomos on Thu Jun 30, 2022 4:30 am

Sure

IMG_3113.jpg
IMG_3113.jpg (636.22 KiB) Viewed 758 times


Best Thomas

Thomos
 
Posts: 8
Joined: Wed Jun 29, 2022 8:49 am

Re: Error with the tutorial for 2'8 Breakboard TFT LCD

by Thomos on Thu Jun 30, 2022 5:01 am

I put here the other photo with higher quality


image0 (2).jpeg
image0 (2).jpeg (107.65 KiB) Viewed 756 times

Thomos
 
Posts: 8
Joined: Wed Jun 29, 2022 8:49 am

Re: Error with the tutorial for 2'8 Breakboard TFT LCD

by Thomos on Thu Jun 30, 2022 5:01 am

image1 (2).jpeg
image1 (2).jpeg (107.09 KiB) Viewed 756 times

Thomos
 
Posts: 8
Joined: Wed Jun 29, 2022 8:49 am

Re: Error with the tutorial for 2'8 Breakboard TFT LCD

by Thomos on Thu Jun 30, 2022 5:03 am

image3 (2).jpeg
image3 (2).jpeg (114.47 KiB) Viewed 755 times

Thomos
 
Posts: 8
Joined: Wed Jun 29, 2022 8:49 am

Re: Error with the tutorial for 2'8 Breakboard TFT LCD

by adafruit_support_carter on Thu Jun 30, 2022 1:09 pm

Try touching up the soldering on the pins. Some of them looks a little cold soldered and not wetted out enough on the pads. See here for reference:
https://learn.adafruit.com/adafruit-gui ... n-problems

And just to check - Do you really need 8 bit mode? Would SPI mode work for your use case?

adafruit_support_carter
 
Posts: 24050
Joined: Tue Nov 29, 2016 2:45 pm

Re: Error with the tutorial for 2'8 Breakboard TFT LCD

by Thomos on Fri Jul 01, 2022 12:32 pm

First, I would like to thank you for making me discover this so usefull document.
I learnt a lot about bad soldering, etc

However, I resoldered everything again and I believe the soldering is quite honnest right now. I tested every connection with a voltmeter using the "bip" function.
Still, I have a blank screen with the same error.

In the meantime, I use another screen with the SPI connection and it properly works.

Still, for my intership they used the 8bit configuration and I want to make it works with it because I believe parallel communication is faster than serial com.

Do you have any ideas where the problem can comes from ?

Good week end !

Thomos
 
Posts: 8
Joined: Wed Jun 29, 2022 8:49 am

Re: Error with the tutorial for 2'8 Breakboard TFT LCD

by adafruit_support_carter on Fri Jul 01, 2022 12:36 pm

Just as a quick sanity check - the SPI mode jumpers are *not* soldered? So it's actually in 8 bit mode?
https://learn.adafruit.com/adafruit-2-8 ... ers-906160

adafruit_support_carter
 
Posts: 24050
Joined: Tue Nov 29, 2016 2:45 pm

Re: Error with the tutorial for 2'8 Breakboard TFT LCD

by Thomos on Sat Jul 02, 2022 5:59 am

Hi,

I may be a fool, I'll check on Monday thanks.

I also checked with my volmeter and I had 5V on D7 to D5 but 0V on D4 to D0.
Had 5V for the basic pins (Vcc, RD, WR etc)

Wish you a good we
Thomas

Thomos
 
Posts: 8
Joined: Wed Jun 29, 2022 8:49 am

Re: Error with the tutorial for 2'8 Breakboard TFT LCD

by Thomos on Mon Jul 04, 2022 5:19 am

Hello,

I just checked the IMx pins and it wasn't soldered.

Fortunatly, I freshly redo my wiring and it works !

For futurs viewers :

The problem was either the wiring or the librairy.
I tested last time the SPI mode with another screen so I had to install new librairies. Since then, it works !


Thanks for your answers !
Thomas

Thomos
 
Posts: 8
Joined: Wed Jun 29, 2022 8:49 am

Re: Error with the tutorial for 2'8 Breakboard TFT LCD

by adafruit_support_carter on Wed Jul 06, 2022 12:21 pm

Cool! Glad you got it working. That mode does not get used much. So nice to know everything generally works.

adafruit_support_carter
 
Posts: 24050
Joined: Tue Nov 29, 2016 2:45 pm

Please be positive and constructive with your questions and comments.