2,2" SPI Display - Anzeige Probleme

Hallo,

ich baue mir eine Multifunktionsanzeige die diverse Werte immer wieder einlesen und auf dem Display ausgeben soll. Mein Problem ist aber das die aktualisierten Werte über die alten geschrieben werden und somit aus einer 2 und einer 5 eine 8 entsteht.

Die Suche hat mich auch nicht wirklich weiter gebracht.

Der Sketch:

// TFT PIN Belegung
// MISO >>> PIN 12
// LED >>> PIN +3,3V
// SCK >>> PIN 13
// MOSI >>> PIN 11
// D/C >>> PIN 9
// RESET >>> PIN RESET
// CS >>> PIN 10
// GND >>> PIN GND
// VCC >>> PIN +5V

//**************** SPI TFT ****************\

#include "SPI.h"
#include "Adafruit_GFX.h"
#include "Adafruit_ILI9340.h"

#define _sclk 13
#define _miso 12
#define _mosi 11
#define _cs 10
#define _dc 9
#define _rst 8

Adafruit_ILI9340 tft = Adafruit_ILI9340(_cs, _dc, _rst);

// Initialisierung Sensor Pins
int abgastempPin = 0;
int oiltempPin = 1;
int lambdaPin = 2;
int dstellerPin = 3;
int boardnetzPin = 4;
int ladedruckPin = 5;

void setup() {

pinMode (abgastempPin, INPUT);
pinMode (oiltempPin, INPUT);
pinMode (lambdaPin, INPUT);
pinMode (dstellerPin, INPUT);
pinMode (boardnetzPin, INPUT);
pinMode (ladedruckPin, INPUT);

Serial.begin(9600);
tft.begin();

tft.fillScreen(ILI9340_BLACK);

tft.setCursor(155, 47);
tft.setTextColor(ILI9340_RED); tft.setTextSize(3);
tft.println("bar");

tft.setCursor(3, 95);
tft.setTextColor(ILI9340_RED); tft.setTextSize(1);
tft.println(".......................................");

tft.setCursor(8, 130);
tft.setTextColor(ILI9340_RED); tft.setTextSize(3);
tft.println("Abgas");
tft.setCursor(210, 130);
tft.setTextColor(ILI9340_RED); tft.setTextSize(3);
tft.println("C");

}

void loop() {

//**************** Variablen ****************\

int abgastemp = analogRead(abgastempPin);
int oiltemp = analogRead(oiltempPin);
int lambda = analogRead(lambdaPin);
int dsteller = analogRead(dstellerPin);
int boardnetz = analogRead(boardnetzPin);
int ladedruck = analogRead(ladedruckPin);

//**************** TFT Output ****************\

tft.setCursor(40, 40);
tft.setTextColor(ILI9340_RED); tft.setTextSize(4.5);
tft.println(ladedruck);

tft.setCursor(140, 130);
tft.setTextColor(ILI9340_RED); tft.setTextSize(3);
tft.println(abgastemp);

delay(5000);

}

Von setTextColor() gibt es zwei Versionen:

void Adafruit_GFX::setTextColor(uint16_t c) {
  // For 'transparent' background, we'll set the bg
  // to the same as fg instead of using a flag
  textcolor = textbgcolor = c;
}

void Adafruit_GFX::setTextColor(uint16_t c, uint16_t b) {
  textcolor   = c;
  textbgcolor = b;
}

Der zweite Parameter ist für die Hintergrund-Farbe

Am besten du packst den Teil in eine eigene Funktion der du die Größe, Position und den Text übergibst:

     tft.setCursor(8, 130);
  tft.setTextColor(ILI9340_RED);  tft.setTextSize(3);
  tft.println("Abgas");

Dann musst du das nicht jedesmal alles schreiben. Sowas:

void printText(uint16_t x, uint16_t y, uint8_t size, const char* text)
{
   tft.setCursor(x, y);
   tft.setTextColor(ILI9340_RED, ILI9340_BLACK);
   tft.setTextSize(size);
   tft.println(text);
}

Und/oder mit F() Makro um RAM zu sparen:

void printText(uint16_t x, uint16_t y, uint8_t size, const __FlashStringHelper* text)
{
   tft.setCursor(x, y);
   tft.setTextColor(ILI9340_RED, ILI9340_BLACK);
   tft.setTextSize(size);
   tft.println(text);
}

Dann kann man wie bei print()/println() auch die Strings per F() im Flash lassen

Gleiches Problem hatte ich auch schon.
Hier [gelöst] Beliebige Zeichen im TFT überschreiben - #13 by HotSystems - Deutsch - Arduino Forum in Post #8 habe ich es beschrieben.

Edit
Serenifly ist schneller :wink:

Du hast übrigens evtl. immer noch das Problem dass Ziffern stehen bleiben wenn du z.B. nach 100 -> 90 anzeigst. Also Zahlen immer auf eine konstante Breite formatieren und links oder rechts (je nach Geschmack) mit Leerzeichen auffüllen.

Dank für die Antworten.

Ich habe aber ein Problem das ich die beschriebene Funktion nicht zum Laufen bekomme.
Das Display bleibt schwarz. Serenifly kannst mir das ganze vielleicht in meinen Setch packen damit ich meinen Fehler vielleicht selbst erkenne denn ich muss sagen das ich mit dem Arduino erst seit 2 Wochen arbeite und der aktuelle Sketch hart erkämpft ist. :wink:

Am einfachsten reicht einfach das:

tft.setTextColor(ILI9340_RED, ILI9340_BLACK);

Du musst halt nicht nur die Text-Farbe, sondern auch die Hintergrund-Farbe angeben

Das andere ist nicht Arduino-spezifisch und auch nicht C-spezifisch. Sondern ein allgemeiner Programmier-Grundsatz. Wenn man Code hat der sich ständig wiederholt lagert man ihn in eine Funktion aus. Also anschauen wie man Funktionen schreibt und verwendet. Das ist eine ganz wichtige Sache.
Wenn jemand TFTs programmiert (was nicht trivial und daher nichts für Programmier-Anfänger ist) kann man das eigentlich erwarten.