2,8" TFT LCD-Shield auf Arduino Mega

Verwendte Hardware:
2,8" TFT LCD-Shield von Reichelt Elektronik
Arduino Mega 2560 R3 von Makershop

Hallo zusammen!
Da mein Projekt einer Grafikanzeige für Winddaten den Arduino-Uno an seine Grenzen bringt hatte ich gedacht, ich könnte einfach zu einem Arduino-Mega wechseln. Leider gibt es schon Probleme das Display zum laufen zu bekommen.

Ich habe das Display auf das Mega-Board genau so aufgesteckt wie beim Uno (da läuft mein Testprogramm) . Nach Übertragung des Programms auf dem Mega bleibt das Display aber weiß.

Ich habe im Netz etwas rumgesucht aber nicht wirklich was gefunden. In einem Beitrag wurde geschrieben, dass man auf dem Displayshield einige Leiterbahnbrücken öffen und dafür andere schießen muss. Mein Display hat aber keine zugänglichen Leiterbahnbrücken.

Müssen vielleicht nur einige Zeilen im Sketch geändert werden?

Verdächtige sind:
#define LCD_CS A3
#define LCD_CD A2
#define LCD_WR A1
#define LCD_RD A0
#define LCD_RESET A4

oder auch:
tft.begin(0x9341); //Diese Nummer ist für mein Display richtig!!!!

Die Programmübertragung auf dem Mega funktioniert prinzipiell. Einfache Programme ohne Display (LED Blinken oder Ausgabe am seriellen Monitor) bekomme ich ohne Änderung des Uno-Sketches zum laufen.

Was mache ich falsch?

Grüße Anders

Was für Lib nutzt du?
Für dein Display tuts

vom David Prentice
oder LCD Wicki
Zeige genauen Link oder Foto Unterseite.
Dein Sketch bitte auch

Tschuldigung, hätte ich auch gleich machen sollen.

Display von unten:

Sketch:

   //////////////////////////////////////////////
  //               Test Sinuskurve            //
 //                      und                 //
//               Cosinuskurve               //
// Bein Start soll ein Bild angezeigt werde //
// das klappt aber bisher nicht             //
/////////////////////////////////////////////

#include <Adafruit_TFTLCD.h> 
#include <Adafruit_GFX.h>    
//#include <TouchScreen.h>

#include <SD.h>
#include <SPI.h>

#define LCD_CS A3 
#define LCD_CD A2 
#define LCD_WR A1 
#define LCD_RD A0 
#define LCD_RESET A4 


#define BLACK   0x0000
#define BLAU    0x001F
#define ROT     0xF800
#define GRUEN   0x07E0
#define CYAN    0x07FF
#define MAGENTA 0xF81F
#define GELB    0xFFE0
#define WEISS   0xFFFF

#define SD_CS 10     // Set the chip select line to whatever you use (10 doesnt conflict with the library)


Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET); //Pins für Display festlegen

#define BUFFPIXEL 20


int Kurv1[320];
//int Kurv2[320];

void setup() 
{
   tft.reset();
   tft.begin(0x9341); //Diese Nummer ist für mein Display richtig!!!!
   tft.setRotation(3);

tft.println("Vor SD");
delay(1000);

  tft.print(F("Initializing SD card..."));
  if (!SD.begin(SD_CS)) {
  tft.println(F("Klappt nicht"));
    return;
  }
  tft.println("OK! Ging gut");

  tft.println("Nach SD");
delay(5000);

  tft.fillScreen(BLACK);


  //Blauen Rahmen erzeugen
  tft.drawRect(0,0,319,240,BLAU);
  
  //Print Sinus Test" Text
  tft.setCursor(60,30);
  tft.setTextColor(WEISS);
  tft.setTextSize(3);
  tft.print("Sinus Test");
  
  //Arrays füllen  
  for  (int count =0; count<=319; count++)
  {
  Kurv1[count] = int((sin(count*2*PI/320)*120)+120)+.5;      
  }

//  for  (int count =0; count<=319; count++)
//  {
//  Kurv2[count] = int((cos(count*2*PI/320)*120)+120)+.5;      
//  }

 
  tft.setCursor(30,130);
  tft.setTextColor(ROT);
  tft.println("Setup fertig");
  delay(5000);
}

void loop() 
{
    //Bildschirm löschen
    tft.fillScreen(BLACK);
    
    //Rahmen erzeugen
    tft.drawRect(0,0,319,240,WEISS);
    
    tft.setCursor(50,50);
    tft.setTextColor(WEISS);
    tft.setTextSize(3);
    tft.print("Hier bist \n\n      Du\n\n    im Loop");
    tft.setCursor(150, 210);
    tft.setTextColor(ROT);  tft.setTextSize(1);
    tft.println("Hello World!");
    delay(5000); 
 
   
    //Bildschirm löschen
    tft.fillScreen(BLACK);
        
    delay(500);

    for(int count=0; count<=320; count=count+7) //Strichellinie
    {
      tft.drawFastHLine(count, 120, 5, BLAU);
    }

    //Sinuskurve Anzeigen
     for  (int count =0; count<319; count++)
    {
      tft.writePixel(count+1, Kurv1[count], GRUEN); //so wird ein Pixel angezeigt
      delay(50);    
    }

      for  (int count =0; count<=319; count++)
  {
  Kurv1[count] = int((cos(count*2*PI/320)*120)+120)+.5;      
  }

//    Cosinuskurve Anzeigen
     for  (int count =0; count<319; count++)
    {
      tft.writePixel(count+1, Kurv1[count], GELB); //so wird ein Pixel angezeigt
      delay(50);     
    }
   
   delay(5000); 
   while(1); 
  
}

Verwendete Library siehe oben im Code.

Ja der ist von LCD Wicki, und solte mit Mega mit der gezeigter Lib aus GitHub funktionieren.
Der ILI9431 ist ein wenig komischer Driver auf einem Mega funktioniert auf anderem nicht.
Kommt angeblich von das es gibt zwei Sorten vom dem Chip unter der gleicher Bezeichnung.
Wenn die nicht funktioniert die LCD Wicki probieren.
Was aber funktioniert ist ESP32 mit der TFT_eSPI nur man muss den LDO überbrücken, dadurch geht nicht mehr mit Uno, Mega den nutzen, der funktioniert naher nur mit 3,3V.

Hallo fony,
danke für Deine Antwort. Als Anfänger beim Arduino habe ich aber Probleme sie zu verstehen.

Meist Du damit, mit einer anderen Library (also nicht Adafruit) sollte das Display am Mega funktionieren?

Ist das der Chip, der auf dem Display ist?

Da verstehe ich gar nicht was Du meinst.

Grüße Anders

Jetzt hab ich nicht den ganzen Sketch angeschaut.

Aber:
Das Display Shield hat eine Sd Karte Slot der an D10, D11, D12, D13 angeschlossen ist. Das Shield benutzt nicht die ICSP Kontakte.
grafik

Die SPI Schnittstelle ist nur beim UNO (ATmega328) an den Pins D11 bis D13. Der MEGA (ATmega2560) hat die SPI Schnittstelle an den pins D50 bis D52.
Die Schnittstelle ist auch auf den 6 Pins der ISCP herausgeführt Da aber das Shield diese Pins nicht benutzt ist das Sheild ungeeignet für den MEGA

Daraus ergibt sich daß die SD Karte sicher nicht lesbar ist.
Ob der Sketch bei der initialisierugn der SPI abbricht, weiß ich nicht. Die vorher ausgegebenen Texte müssen kommen und eigentlich auch die Fehlermeldung der Sd Karte sollte auf das Display kommen.

Grüße Uwe

Das stimmt, erst mall soll aber das Display was anzeigen danach kommt weiter .

Wenn das Display nicht angesteuert wird, kann es auch nichts anzeigen.
Was rauchst Du?

Gruß Tommy

//////////////////////////////////////////////
//               Test Sinuskurve            //
//                      und                 //
//               Cosinuskurve               //
// Bein Start soll ein Bild angezeigt werde //
// das klappt aber bisher nicht             //
/////////////////////////////////////////////
#define LCD_CS A3
#define LCD_CD A2
#define LCD_WR A1
#define LCD_RD A0
#define LCD_RESET A4


#include <Adafruit_GFX.h>    // Core graphics library
#include <MCUFRIEND_kbv.h>   // Hardware-specific library
MCUFRIEND_kbv tft;
//#include <TouchScreen.h>

#include <SD.h>
#include <SPI.h>




#define BLACK   0x0000
#define BLAU    0x001F
#define ROT     0xF800
#define GRUEN   0x07E0
#define CYAN    0x07FF
#define MAGENTA 0xF81F
#define GELB    0xFFE0
#define WEISS   0xFFFF

#define SD_CS 10     // Set the chip select line to whatever you use (10 doesnt conflict with the library)


//Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET); //Pins für Display festlegen

#define BUFFPIXEL 20


int Kurv1[320];
//int Kurv2[320];

void setup()
{
   Serial.begin(9600);
    uint16_t ID = tft.readID();
     
    Serial.print("found ID = 0x");
    Serial.println(ID, HEX);
    if (ID == 0xD3D3) ID = 0x9481; //force ID if write-only display
    tft.begin(ID);
 // tft.reset();
 // tft.begin(0x9341); //Diese Nummer ist für mein Display richtig!!!!
  tft.setRotation(3);

  tft.println("Vor SD");
  delay(1000);

  tft.print(F("Initializing SD card..."));
  if (!SD.begin(SD_CS)) {
    tft.println(F("Klappt nicht"));
    return;
  }
  tft.println("OK! Ging gut");

  tft.println("Nach SD");
  delay(5000);

  tft.fillScreen(BLACK);


  //Blauen Rahmen erzeugen
  tft.drawRect(0, 0, 319, 240, BLAU);

  //Print Sinus Test" Text
  tft.setCursor(60, 30);
  tft.setTextColor(WEISS);
  tft.setTextSize(3);
  tft.print("Sinus Test");

  //Arrays füllen
  for  (int count = 0; count <= 319; count++)
  {
    Kurv1[count] = int((sin(count * 2 * PI / 320) * 120) + 120) + .5;
  }

  //  for  (int count =0; count<=319; count++)
  //  {
  //  Kurv2[count] = int((cos(count*2*PI/320)*120)+120)+.5;
  //  }


  tft.setCursor(30, 130);
  tft.setTextColor(ROT);
  tft.println("Setup fertig");
  delay(5000);
tft.fillScreen(BLACK);
}

void loop()
{
  //Bildschirm löschen
 // tft.fillScreen(BLACK);

  //Rahmen erzeugen
  tft.drawRect(0, 0, 319, 240, WEISS);

  tft.setCursor(50, 50);
  tft.setTextColor(WEISS);
  tft.setTextSize(3);
  tft.print("Hier bist \n\n      Du\n\n    im Loop");
  tft.setCursor(150, 210);
  tft.setTextColor(ROT);  tft.setTextSize(1);
  tft.println("Hello World!");
  delay(5000);


  //Bildschirm löschen
  tft.fillScreen(BLACK);

  delay(500);

  for (int count = 0; count <= 320; count = count + 7) //Strichellinie
  {
    tft.drawFastHLine(count, 120, 5, BLAU);
  }

  //Sinuskurve Anzeigen
  for  (int count = 0; count < 319; count++)
  {
    tft.writePixel(count + 1, Kurv1[count], GRUEN); //so wird ein Pixel angezeigt
    delay(50);
  }

  for  (int count = 0; count <= 319; count++)
  {
    Kurv1[count] = int((cos(count * 2 * PI / 320) * 120) + 120) + .5;
  }

  //    Cosinuskurve Anzeigen
  for  (int count = 0; count < 319; count++)
  {
    tft.writePixel(count + 1, Kurv1[count], GELB); //so wird ein Pixel angezeigt
    delay(50);
  }

  delay(5000);
  while (1);

}

Zum Teil hast recht, die Pin Zuweisung sollte ganz nach oben den Rest macht die Lib.

Nicht ganz.
Die lib baut ggfls. ein softSPI.

Aber nicht mit den Parametern die im Sketch verwendet werden?
Grüße Uwe

Dazu müsste vermutlich pin_magic.h erstmal durchgeschaut werden und dazu, ob die adafruitlibs mit dem Display kompatibel sind.

Da andere libs das ja wohl können, müssen die ja einen Weg gefunden haben. Und der geht IMHO nur über softSPI.

Es gibt auch Shields, die für beide geeignet sind und den ICSP-Anschluss für SPI nutzen.
Ich habe ein Ethernet-Shield, dass das macht.

Gruß Tommy

Ich beziehe ich nicht auf die möglichen Möglichkeiten sondern auf das was da im Sketch steht.

So geschrieben, auf einem MEGA, erwartet der Sketch die SPI auf den pins 50-52 (oder irre ich mich?)

Daß mit anderen Parametern oder anderen Bibliotheken bei einem MEGA bei Wahl der Pins 11-13 eine SoftSPI verwendet wird, ist eine andere Geschichte.

Grüße Uwe

Das kann ich nachvollziehen.
@fony ist da immer sehr schnell, bessere Controller zu empfehlen. :wink:

Den ESP32 müsstest du per Kabel an das Display anschließen, das kann nicht gesteckt werden. Also nicht so unbedingt von Vorteil für dich.

Was aber wenigstens funktioniert :wink: , das blöde dabei ist, alle Verkäufer schreiben Arduino kompatibel, wo sie wahrscheinlich nur Uno meinen. Die Displays auf Mega machen öfters Probleme.

Das mag ja auch in den meisten Fällen stimmen.
Bedenke nur dabei, wenn jemand mit wenig Erfahrung ein Projekt mit dem Mega aufbaut und damit schon Probleme hat, der wird nicht so schnell auf einen anderen, für ihn "unbekannten" Controller umsteigen.
Zumal im Projekt alles vermeintlich benutzerfreundlich gesteckt wird und dann muss er alles "wackelig" verkabeln.

Erstmal danke für Eure vielen Antworten.

Ich werde es erstmal mit der oben genannten Library probieren, wenn es mir gelingt sie zu installieren.

Wenn der SD-Leser nicht funktioniert wäre es blöd. Im eigentlichen Projekt brauche ich ihn.
Gibt es ein Display mit gleichen Eigenschaften wie das vorhandene, dass mit dem Arduino-Mega kompatibel ist?

Grüße Anders

Was genau verstehst du unter Eigenschaften ?
Es gibt TFT-Displays mit einer SPI Schittstelle, die man mittels Levelshifter am Mega betreiben kann. Damit wären dann mehr Pins am Mega frei bzw. nicht verdeckt.

Und welche oben genannte Library meinst du ?
Eine genauere Angabe wäre hilfreich.