TFT-Display, 1,8 Zoll SPI 128 x 160 Pixel, zeigt falsche Farben

Hallo,

das oben genannte Display (ST7735 Bildcontroller ) wurde mit folgendem Sketch gefüttert:

/*
 * Code siehe hier:
 * https://www.arduino.cc/en/Reference/TFTBackground
 * leicht verändert 
 */
 
#include <SPI.h>
#include <TFT.h>            // Arduino LCD library

#define cs   10
#define dc   9
#define rst  8

TFT screen = TFT(cs, dc, rst);

void setup() {
  
  // initialize the screen
  screen.begin();

  // make the background white     // sollte weiß sein, ist auch weiß
  screen.background(255,255,255);
  delay(1000);

  // make the background red       // sollte rot sein, ist aber blau
  screen.background(255,0,0);
  delay(1000);

  // make the background green     // sollte grün sein, ist auch grün
  screen.background(0,255,0);
  delay(1000);

  // make the background blue      // sollte blau sein, ist aber rot
  screen.background(0,0,255);
  delay(1000);

  screen.background(0, 255, 255);   // sollte cyan sein, ist aber gelb
  delay(1000);

  screen.background(255, 0, 255);   // sollte magenta sein, ist auch magenta
  delay(1000);
  
  screen.background( 255, 255,0);   // sollte gelb sein, ist aber cyan
  delay(1000);

  // make the background black      // sollte schwarz sein, ist auch schwarz
  screen.background(0,0,0);
  delay(1000);

   for(int i=0;i<256;i++){
     screen.background(0,0,i);
     delay(400);
  }
}

void loop() {  

}

Wie schon in den Kommentaren angedeutet, vertauscht er “rot” und “blau”.

Was ist passiert? Und:
Wie kann ich es - in meinem Sketch - korrigieren?

Herzlichen Dank

Von den Dingern gibt es unterschiedliche Ausführungen.
Da sind dann tatsächlich Farben vertauscht.
Schau mal bitte hier rein, die Ada-Bibliothek lässt dich das korrigieren (ob es die Arduino-Lib kann, weiss ich nicht).

Wenn es nur um das Vertauschen der Farben geht und die Lib das nicht unterstützt, kann man sich ja Wrapper bauen, die das machen.
Man kann natürlich auch die Lib forken und ändern.

Gruß Tommy

Hi

Man kann auch einfach eine Funktion schreiben, Der man die Farben als RGB übergibt und Diese eben die Lib aufruft mit verdrehten Farben, in diesem Fall BGR.
Wenn beim nächsten Update die Lib wieder richtig tickt, hat man nur eine Funktion, Die man abändern muß.

Ggf. kann man Das auch mit einer #define ZEile erschlagen, mir ist aber akut nicht klar, ob ich einem Befehl 1:1 per #define 'umstricken' kann, stelle mir Das ungefähr so vor:
#define set_rgb(byte r, byte g, byte b) set_rgb(byte b, byte g, byte r)

Wenn Das klappt, müsste man, sofern die Lib wieder normal arbeitet, nur das #define ausremmen und der Trops ist gelutscht.

MfG

Hallo,
viele Gedanken, langes Schweigen … :slight_smile:

Die TFT- Library hat ja die Adafruit Libraries in den “utilities” im Hintergrund.

In der Adafruit_GFX.cpp habe ich nun mit viel Mut und viel hinundher und einem nach langer Zeit wieder aufgespieltem Notepad++ folgende Zeilen umgeschrieben:

uint16_t Adafruit_GFX::newColor(uint8_t r, uint8_t g, uint8_t b)
{
//return ((r & 0xF8) << 8) | ((g & 0xFC) << 3) | (b >> 3);
return (r >> 3) | ((g & 0xFC) << 3) | ((b & 0xF8)<< 8);
}

void Adafruit_GFX::background(uint8_t red, uint8_t green, uint8_t blue)
{
background(newColor(red, green, blue));
// background(newColor(blue, green, red));
}

Es funktioniert in dieser Konstellation auch für die Funktionen fill(), stroke() usw.

Das war also das “forkeln”.

Das ist natürlich noch etwas unschön wenn man mal ein anderes Gerät mit dem gleichen Sketch laufen lassen will , oder wie postmaster erwähnt es zu einem Update kommt, oder irgendwas anderes.

Wie könnte ich das aus dem Sketch heraus lösen?
Evtl. mit einer eigenen .h? und 'Include?

Da ist mir noch unklar, was der Compiler wann wie liest und zusammenführt, da muss ich mich noch schlau machen …

Erst mal vielen Dank für die Anregungen!

Nochmal Hallo!

Alles ist ganz anders :).

Wenn ich die Beispiele aus den Adafruit- Libraries benutzt habe, war ja alles gut,
nur die Arduino-TFT - Library machte Zicken. Und die TFT.h includet ja die beiden Adafruit- Libraries, wie schon gesagt.
Es liegt an den verschiedenen Initialisierungen.
Einmal mit

begin()

bei den Sketchen mit TFT.h,
bei den puren Adafruits mit z.B.

tft.initR(INITR_BLACKTAB);

Wenn ich als nun diese Zeile vor das "begin();" setze, läuft alles gut:

void setup() {
// Use this initializer if you're using a 1.8" TFT
tft.initR(INITR_BLACKTAB);
tft.begin();
.....

Frokeln in der Adafruit_GFX.cpp war also gar nicht nötig: Alles wieder zurück auf null!

Die initR() liegt in der Adafruit_ST7735.h, der Autor scheint mit seinen #defines nicht ganz zufrieden zu sein, siehe emoticon aus der original .h :

// some flags for initR() :frowning:
#define INITR_GREENTAB 0x0
#define INITR_REDTAB 0x1
#define INITR_BLACKTAB 0x2

Das, wonach ich gefragt habe, war also schon längst da, nur an unvermuteter Stelle.

Vielen Dank für alle eure Bemühungen.