Adafruit GFX Text aktualisieren

Hallo folgender Code:

// 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
#include <OneWire.h>
#include <DallasTemperature.h>

#define ONE_WIRE_BUS A5 /* Digitalport Pin 2 definieren */

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

OneWire ourWire(ONE_WIRE_BUS); /* Ini oneWire instance */

DallasTemperature sensors(&ourWire);/* Dallas Temperature Library für Nutzung der oneWire Library vorbereiten */


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();

  identifier = 0x9341;

  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;
    
    sensors.begin();/* Inizialisieren der Dallas Temperature library */

    adresseAusgeben(); /* Adresse der Devices ausgeben */

    Serial.print("Starte Temperatur abfragen ...");

    sensors.setResolution(TEMP_12_BIT); // Genauigkeit auf 12-Bit setzen
    
    
  }

  //tft.begin(0x9325);
  tft.begin(identifier);

 
}
int first = 0;
void loop(void) {
if (first == 0)
{
tft.fillScreen(BLACK);  
first = 1;
}

sensors.requestTemperatures(); // Temp abfragen

tft.setCursor(10, 10);
tft.setRotation(1);
tft.setTextSize(3);
tft.setTextColor(WHITE);
tft.setCursor(10, 10);
tft.fillScreen(BLACK);  
tft.print("Temp.: ");
tft.print(sensors.getTempCByIndex(0));
tft.print(char(247));
tft.print("C");
delay(5000);

  


  //for(uint8_t rotation=0; rotation<4; rotation++) {
   // tft.setRotation(rotation);
//    testText();


    //delay(200);
  //}
}

void adresseAusgeben(void) {
  byte i;
  byte present = 0;
  byte data[12];
  byte addr[8];

  Serial.print("Suche 1-Wire-Devices...\n\r");// "\n\r" is NewLine
  while (ourWire.search(addr)) {
    Serial.print("\n\r\n\r1-Wire-Device gefunden mit Adresse:\n\r");
    for ( i = 0; i < 8; i++) {
      Serial.print("0x");
      if (addr[i] < 16) {
        Serial.print('0');
      }
      Serial.print(addr[i], HEX);
      if (i < 7) {
        Serial.print(", ");
      }
    }
    if ( OneWire::crc8( addr, 7) != addr[7]) {
      Serial.print("CRC is not valid!\n\r");
      return;
    }
  }
  Serial.println();
  ourWire.reset_search();
  return;
}


/*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;
}

*/

klappt prinzipiell auch einwandfrei nur das beim aktualisieren am Display immer ein unschönes flackern aufritt. Das tft.fillScreen(BLACK); weglassen ist auch keine Lösung, da er dann alle Zahlen ineinander schreibt und nach kurzer Zeit nur noch ein schwarzer Glotz zu sehen ist. Jemand eine Lösung dafür?

mfg

Chris

Naja, das Flackern läßt sich wohl nicht ganz vermeiden, aber reduzieren läßt es sich schon noch, wenn du beim

tft.setTextColor(WHITE);

Befehl, noch die Hintergrundfarbe als zweites Argument angibst und dann auf das löschen des Bildschirms verzeichtest:

tft.setTextColor(WHITE, BLACK);

Oliver

hi

wow geile Sache danke dir, absolut kein flackern mehr genau so hab ich es mir vorgestellt! DANKE!

mfg

Chris

Hallo,

habe das gleiche Problem.

Beim Standard FONTS geht es mit dem Schwarzen Hintergrund der Schrift.

Beim benutzten andere Schriftarten, funktioniert es nicht.
habe auch schon versucht vorher ein schwarzes Rechteck zu malen und dann,
die Schrift drüber, leider ohne Erfolg.

Hat jemand eine Lösung für die anderen Schriftarten?

Danke

Den alten Buchstaben mit der Hintergrundfarbe schreiben, dann den neuen mit der Vordergrundfarbe.

Keine Superlösung, schade dass es aus der Library nicht mit dem BG geht...

Aber als Notlösung funktioniert es!

Danke!

AingTii:
Beim benutzten andere Schriftarten, funktioniert es nicht.
habe auch schon versucht vorher ein schwarzes Rechteck zu malen und dann,
die Schrift drüber, leider ohne Erfolg.

Ich habe dieses Verfahren tft.fillRect(0, 160, 320, 80, ILI9341_YELLOW) zusammen mit FreeSansBold18pt7b verwendet, das funktioniert.

jetzt weiß ich auch meinen Fehler.

Ich glaube die anderen Schriftarten haben nicht wie die Standard oben links die Koordinate,
sondern unten links.
So wurde das Rechteck unterhalb der Schrift gezeichnet...

Danke

AingTii:
Ich glaube die anderen Schriftarten haben nicht wie die Standard oben links die Koordinate,
sondern unten links.

Jetzt, wo ich es lese, fällt es mir auch wieder ein, stimmt!

Hallo auch wenn das Thema ein wenig älter ist hat es mich nicht zufriedengestellt, vielleicht kann ja jemand etwas mit dieser Info anfangen

Als erstes nur einen Native Bitmap benutzen also kein tft.setTextSize(x);
dann eine function die ähnliche dieser ist

// Text Function zur Ausgabe aufs TFT
void SetText(int16_t X, int16_t Y, char Text[], uint16_t Color)
{
 tft.setCursor(X, Y );
 tft.setTextColor(Color, clNAVY); //clNavyy ist die Hintergrundfarbe
 tft.print(Text);
}



void OnSetCPUTempMax(void)
{

 SetText(Text_X2, Text_Y_S + Text_Y * 4, fCPUTempMax, clNAVY); // Function alten zu überschreibenden Text setzen mit der Hintergrundfarbe
 strcpy( Buffer, cmdMessenger.readStringArg()); // neuen Wert einlesen
 sprintf(Buffer, "%s°C" , Buffer); // und in ein Char Buffer schreiben
 strcpy(fCPUTempMax, Buffer); // Neuen Wert in einen Merker schreiben 
 SetText(Text_X2, Text_Y_S + Text_Y * 4, Buffer, clLGTGRAY); // Neuen Wert schreiben
}
}