Sketch seems to be skipping data

Hi,
I can see why you need to break the variable down to discrete digits.
BUT
I have never come across an over write problem with a TFT screen.

What TFT display do you have?

How much data are you displaying?

Tom... :smiley: :+1: :coffee: :australia:
PS, I think this thread should have been placed in the "Displays" section of the forum.

Thank you. I will give it a try.

@TomGeorge,

The problem I’m having with this sketch is not because of, nor causing the TFT flicker. It’s part of a sketch that is supposed to stop the flicker or at least make it look that way. The problem I’m having here is ONLY the skipping of data.

The only reason I mentioned the TFT flicker is because had I not, I would have ended up with someone asking why on earth I’m wanting to do all of this in the first place.

Hi,
I have not come across TFT flicker, that is my experience.
Have you asked about why you have flicker first, before trying to fix it.

Just a suggestion.
That TFT are you using?
Have you run simple display code to see where your initial problem is?

Thanks.. Tom... :smiley: :+1: :coffee: :australia:
PS. I believe in stage by stage development of code.

TomGeorge -

The reason for flicker is because when you write new text, it doesn't wipe out the old text. So you end up with new text over top of old text. The only solutions I've seen are to either write a rectangle over the text first, then write the new text, or as stated here to write the old text in the background color, then write the new. But yes, I did try it out, and it does happen. Again, it's really just the text being blanked out then re-written. So what I'm came up with here was a way to only place the rectangle over the digit that changes, then re-write the value. Since the one digit is changing, it doesn't have the flicker look, and the rest of the value never changed, so even though it's being re-written, it's over the old text which is exactly the same.

david_2018 -

Thank you for this. I plugged it in, and it works. And for those who want to see this for the TFT, I've got the sketch below. One thing I did run into was that when it gets below 10, the digits shift to the left one place, since there is no longer a ones column, which in my case, I don't want that anyway, so I had to add a couple if statements to add " " or " 0" if the value was less than 10 or less than 0.

Note that I took an example sketch for the TFT display, and modified it to test this out, so it might need a little cleaning up around the edges.

#include <Elegoo_GFX.h>    // Core graphics library
#include <Elegoo_TFTLCD.h> // Hardware-specific library

#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

// 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
int Value1;
int Value2;
int OldValue1;
int OldValue2;
float Volts;
int Tenths;
int Ones;
int Tens;
int OldTens;
int OldOnes;
int OldTenths;
float PresentVolts;

Elegoo_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);

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

#ifdef USE_Elegoo_SHIELD_PINOUT
  Serial.println(F("Using Elegoo 2.4\" TFT Arduino Shield Pinout"));
#else
  Serial.println(F("Using Elegoo 2.4\" 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 == 0x4535) {
    Serial.println(F("Found LGDP4535 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 if (identifier == 0x0101)
  {
    identifier = 0x9341;
    Serial.println(F("Found 0x9341 LCD driver"));
  }
  else if (identifier == 0x1111)
  {
    identifier = 0x9328;
    Serial.println(F("Found 0x9328 LCD driver"));
  }
  else {
    Serial.print(F("Unknown LCD driver chip: "));
    Serial.println(identifier, HEX);
    Serial.println(F("If using the Elegoo 2.8\" TFT Arduino shield, the line:"));
    Serial.println(F("  #define USE_Elegoo_SHIELD_PINOUT"));
    Serial.println(F("should appear in the library header (Elegoo_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."));
    identifier = 0x9328;

  }
  tft.begin(identifier);

  Value1 = 100;
  Value2 = 200;
  tft.setRotation(3);
  tft.fillScreen(BLACK);
  unsigned long start = micros();

  Volts = 15.0;
}

void loop(void) {

   PresentVolts = Volts;
  
  //round and convert to integer
  int intVolts = (PresentVolts + 0.05) * 10;
  Tenths = intVolts % 10;
  Ones = (intVolts / 10) % 10;
  Tens = intVolts / 100;

  tft.setCursor(4, 4);

  if (Tens != OldTens) {
    tft.fillRect(0, 0, 20, 30, BLACK);
  }
  if (Ones != OldOnes) {
    tft.fillRect(21, 0, 20, 31, BLACK);
  }
  if (Tenths != OldTenths) {
    tft.fillRect(57, 0, 20, 31, BLACK);
  }
    tft.setTextColor(WHITE);
    tft.setTextSize(3);
    if(Volts<=9.9) {
      tft.print (" ");
      tft.print (Volts, 1);
    }
else if (Volts<=0.9) {
  tft.print (" 0");
      tft.print (Volts, 1);
}
    else{
      tft.print (Volts, 1);
    }
    
  OldTens = Tens;
  OldOnes = Ones;
  OldTenths = Tenths;
  Volts = Volts - .1;
  if (Volts < 0.0) {
    Volts = 15.0;
  }
  delay (500);

}

@TomGeorge -

I've come across something that would address one of your questions a bit further. The issue of flicker with TFT displays on Arduino seems to be a rather common thing, but as I was digging around, I found that there are some third party TFT libraries available which will allow text to be changed and not have the flicker effect. I guess they are able to update the screen quicker. But apparently, not al TFT displays can use different libraries. Mine is an ELEGOO TFT, and it seems to only want to work with the supplied library.

When you run the code that you posted in reply #26, which LCD driver was found, or does it tell you there is an unknown LCD driver chip?

Have you tried the MCUFRIEND_kbv library? That is usable on most TFT displays. The diagnose_TFT_support example sketch included with that library can generally either drive the display, or provide enough information to get some help on here.

A large percentage of the flicker issues with any type display are caused by clearing the entire display and rewriting everything, or rewriting the display every time through the loop instead of just when the data changes. You have already avoided those problems. Oddly the flicker issue I'm seeing if I just rewrite the float number in your code is in the background illumination of my display - possibly caused by the display using a bit more current than the regulator on the UNO is capable of supplying.

I think that the next problem to avoid is updating the display too often even it has changed. How fast can a human read a changing value on the screen ?

The flicker issue is because if you don’t blank out the area where next text is to be written, it will just write over the old without erasing it first. So in this case I have 23 volts, then go to say 22.9. Instead of blanking the whole screen and re displaying everything, the solution is to put a rectangle over the text, then write the text. But doing so means the text disappears then reappears, though with some new digits. But the duhits that didn’t change still go away abd cone back, appearing to flicker. That’s why I’m adding this to my power supply sketch. So that only the digits that change will get blanked out first. But since they are changing anyway, it doesn’t look out of place.

@david_2018 - I never tried the TFT sketch with the serial monitor, so no idea what chip is says. I’ve just been going on what the display does.

I’ll take a look at the library you mentioned and see if it works better with that.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.