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.
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.
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);
}
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.