So,
es geht ursprünglich um dieses Display: "KMR - 1.8 SPI mit Cardreader"
https://www.marotronics.de/18-TFT-LCD-Modul-128-x-160-SPI-SD-Card-fuer-Arduino-Raspberry-Pi
Die aufgetreten Probleme äußerten sich folgendermaßen:
- Keine Anzeige
- Kein Zugriff auf den Cardreader
- Zuletzt vertauschte Farben Rot und Blau
Hier nun meine Lösung der unterschiedlichen Probleme:
- Die eltr. Verbindungen zwischen Arduino UNO und dem Display waren, auf Grund der irreführenden Aufdrucke auf dem Shield, falsch. Lösung: Siehe beigefügte PDF-Datei zum korrekten Anschluss. Es ist zu beachten, dass das Display für die Signalleitungen 3,3 Volt verlangt, der Arduino UNO aber 5 Volt liefert. Hier sollte ein Pegelwandler, oder entsprechende Widerstands Spannungsteiler, eingesetzt werden.
- Beim Einsatz eines Pegelwandlers ist auf die umgekehrte Signalrichtung von MISO zu achten. Über MISO liest der Arduino von dem Cardreader, also umgekehrt 3.3 Volt Signale vom Display zu 5 Volt Arduino. !!!Wichtig: ist dieser PIN falsch beschaltet, bleibt das Display "stumm". Bleibt der PIN unbeschaltet funktioniert das Display.
- Nachdem nun die generelle Funktion von Display und Cardreader gelöst war fand ich eine Lösung für die Problematik der Vertauschung von Rot und Blau hier im Forum:
mosi_miso:
Hallo,
viele Gedanken, langes Schweigen ... 
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 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!
Dieses "forkeln" hat bei mir jedenfalls geholfen. Mit den entsprechenden Änderungen an ...GFX.h funktioniert nun auch der folgenden Code und stellt das Bitmap mit den richtigen Farben dar:
/*
Arduino TFT Bitmap Logo example
This example reads an image file from a micro-SD card
and draws it on the screen, at random locations.
In this sketch, the Arduino logo is read from a micro-SD card.
There is a .bmp file included with this sketch.
- open the sketch folder (Ctrl-K or Cmd-K)
- copy the "arduino.bmp" file to a micro-SD
- put the SD into the SD slot of the Arduino TFT module.
This example code is in the public domain.
Created 19 April 2013 by Enrico Gueli
http://www.arduino.cc/en/Tutorial/TFTBitmapLogo
*/
// include the necessary libraries
#include <SPI.h>
#include <SD.h>
#include <TFT.h> // mit angepasster Adafruit GFX library. Rot -Blau vertauscht
// pin definition for the Uno
#define sd_cs 4
#define lcd_cs 10
#define dc 8
#define rst 9
// pin definition for the Leonardo
//#define sd_cs 8
//#define lcd_cs 7
//#define dc 0
//#define rst 1
byte orientation=2; //Ausrichtung der Bitmapgrafik 0 ... 3 , 0 -> Landscape, 2 -> Portrait, 1 + 3 jeweils 180° gedreht
TFT TFTscreen = TFT(lcd_cs, dc, rst);
// this variable represents the image to be drawn on screen
PImage logo;
void setup() {
// initialize the GLCD and show a message
// asking the user to open the serial line
TFTscreen.begin();
TFTscreen.background(0, 0, 0);
TFTscreen.setRotation(2);
TFTscreen.stroke(255, 255, 255);
TFTscreen.println();
TFTscreen.println(F("Arduino TFT Bitmap Example"));
TFTscreen.stroke(0, 0, 0);
TFTscreen.println(F("Open serial monitor"));
TFTscreen.println(F("to run the sketch"));
delay(5000);
// initialize the serial port: it will be used to
// print some diagnostic info
Serial.begin(9600);
while (!Serial) {
// wait for serial port to connect. Needed for native USB port only
}
// clear the GLCD screen before starting
TFTscreen.background(255, 255, 255);
// try to access the SD card. If that fails (e.g.
// no card present), the setup process will stop.
Serial.print(F("Initializing SD card..."));
if (!SD.begin(sd_cs)) {
Serial.println(F("failed!"));
return;
}
Serial.println(F("OK!"));
// initialize and clear the GLCD screen
TFTscreen.begin();
TFTscreen.background(0, 0, 0);
// now that the SD card can be access, try to load the
// image file.
logo = TFTscreen.loadImage("parrot.bmp");
if (!logo.isValid()) {
Serial.println(F("error while loading arduino.bmp"));
}
}
void loop() {
// don't do anything if the image wasn't loaded correctly.
if (logo.isValid() == false) {
return;
}
Serial.println(F("drawing image"));
// get a random location where to draw the image.
// To avoid the image to be draw outside the screen,
// take into account the image size.
// int x = random(TFTscreen.width() - logo.width());
// int y = random(TFTscreen.height() - logo.height());
int x = 0;
int y = 0;
//Serial.print(x); // Ausgabe der Bildkoordinaten im seriellen Monitor
//Serial.print(" = x ");
//Serial.print(y);
//Serial.println(" = y");
// draw the image to the screen
TFTscreen.setRotation(orientation); //Definition der Bildausrichtung
TFTscreen.image(logo, x, y);
// wait a little bit before drawing again
delay(1500);
}
Bessere Lösungsmöglichkeiten zur Rot-Blau Vertauschung nehme ich gerne entgegen.
Noch offene Probleme:
Laut Verkäufer ist das Display mit dem ST7735 Chipsatz ausgestattet. Damit funktioniert es aber nicht. Mit entsprechenden "Klimmzügen" kriegt man es als ST7789 bedingt zum Laufen. Gibt es da schon irgendwelche Lösungsansätze?
Ich hoffe meine Doku hilft jemandem weiter, der ebenso hilflos, wie ich bis vor kurzer Zeit, mit diesem Display kämpft!
Gruss und schönes Wochenende
Helmut
KMR-1.8 SPI.pdf (429 KB)