Weißer Bildschirm nach aktualisieren Arduino Mega 2560 2,8 Zoll TFT LCD Shield

Hallo! Ich habe ein Problem mit meinem Code. Ich benutze aktuell ein Arduino Mega 2560 und rufe stelle in meinem Code ein Hauptmenü dar. Das passt soweit auch alles. Im Hauptmenü wird dann auf eine Auswahl der Button via Touchscreen gewartet und bei Betätigung currentMenu entsprechend gesetzt und wieder in die loop gegangen. Zum Testen soll er hier einfach einmal den Bildschirm schwarz machen, currentMenue wieder auf 1 setzen und dann das Hauptmenü wieder zeigen. Die Auswahl über die Button passt soweit, es wird die richtige betätigung im serial monitor ausgegeben. Danach wird noch einmal ausgegeben in Loop, dann ist der Bildschirm nur noch weiß und der Arduino hat sich wohl aufgehangen.
Ich habe das auch mit einem Uno getestet, für den das Shield eigentlich ist, hier mit der TFT bibliothek von Adafruit, gleiches Bild. Ich weiß grade echt nicht wirklich weiter.
Das Display hat auch ein SD-Kartenslot über SPI, welches beim Mega so nicht funktioniert, weil die Pins für den Uno positioniert sind, daran kann es aber ja nicht liegen, da ich das gar nciht benutze und es beim Uno auch nicht geht. Ich hoffe mir kann einer weiterhelfen, ich bin grade echt am verzweifeln.

#include "config.h"
#include <Adafruit_GFX.h>
#include <TouchScreen.h>
#include <MCUFRIEND_kbv.h> 

// Funktion zur Rückgabe der Anzahl der Elemente in einem Array
#define NUM_ELEMENTS(arr) (sizeof(arr) / sizeof(arr[0]))

// Initialisiere das Display und den Touchscreen
MCUFRIEND_kbv tft;
TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300);

// Deklaration globaler Variablen
int currentMenue = 0;
TSPoint touch_p = {0, 0, 0};

// Struktur für Tasten definieren
struct Button {
  int x;
  int y;
  int width;
  int height;
  String label;
};

void setup() {
  Serial.begin(9600); // Initialisierung der seriellen Kommunikation
  int step = 0;
  bool warning = false;

  // Display initialisieren
  tft.reset();
  uint16_t identifier = tft.readID();
  tft.begin(identifier);
  tft.setRotation(3); // Querformat
}

void loop() {
  // Anzeigen des Hauptmenüs, falls aktuell kein anderes Menü aktiv ist
  switch (currentMenue) {
    case 0:
    displayMainMenu();
    Serial.println(currentMenue);
    delay(5000);
    break;

    case 1:
    Serial.println("Verlassen in 1");
    delay (5000);
    tft.fillScreen(BLACK);
    break;
  }
  Serial.println("In Loop");
  currentMenue = 0;
}

void drawMenu(Button buttons[], int numButtons) {
  // Leere den Bildschirm
  tft.fillScreen(BLACK);

  // Zeichne die Buttons und Überschrift
  for (int i = 0; i < numButtons; i++) {
    if (i == 0) {
      // Zeichne Überschrift
      tft.setTextColor(WHITE);
      tft.setTextSize(3);
      tft.setCursor(buttons[i].x, buttons[i].y);
      tft.print(buttons[i].label);
    } else {
      // Zeichne Buttons
      tft.setTextSize(2);
      tft.fillRect(buttons[i].x, buttons[i].y, buttons[i].width, buttons[i].height, DARKGREY);
      tft.drawRect(buttons[i].x, buttons[i].y, buttons[i].width, buttons[i].height, WHITE);
      tft.setCursor(buttons[i].x + 20, buttons[i].y + 10);
      tft.print(buttons[i].label);
    }
  }
}

void displayMainMenu() {
  // Hauptmenü Tasten
  Button mainMenuButtons[] = {
    {60, 20, 0, 0, "Hauptmenue"}, // Überschrift
    {40, 60, 240, 40, "Spiel Starten"},
    {40, 120, 240, 40, "Statistiken"},
    {40, 180, 240, 40, "Einstellungen"},
  };

  // Zeichne das Menü und warte auf eine Auswahl
  drawMenu(mainMenuButtons, NUM_ELEMENTS(mainMenuButtons));
  currentMenue = AuswahlButton(mainMenuButtons, NUM_ELEMENTS(mainMenuButtons));
}

int AuswahlButton(Button MenuButtons[], int numButtons) {
  while (true) {
    // Erfasse und mappe den Touchscreen-Punkt
    TSPoint touch_p = ts.getPoint();
    if (touch_p.z > ts.pressureThreshhold) {
      touch_p.x = map(touch_p.x, TS_MINX, TS_MAXX, 0, tft.width());
      touch_p.y = map(touch_p.y, TS_MINY, TS_MAXY, 0, tft.height());

      for (int i = 1; i < numButtons; i++) { // Starten von 1, um die Überschrift zu überspringen
        if (touch_p.x > MenuButtons[i].x && touch_p.x < MenuButtons[i].x + MenuButtons[i].width &&
            touch_p.y > MenuButtons[i].y && touch_p.y < MenuButtons[i].y + MenuButtons[i].height) {
          return i; // Index des gedrückten Buttons zurückgeben
        }
      }
    }
  }
}

meine config.h:


//Pins fürs Display
#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

// 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
#define LIGHTGREY   0xC618
#define DARKGREY    0x7BEF
#define ORANGE      0xFD20 
#define PINK        0xF81F
#define PURPLE      0x780F 
#define BROWN       0xA145
#define LIGHTBLUE   0xAEDC 
#define DARKGREEN   0x03E0 
#define LIGHTGREEN  0x87F0 
#define DARKRED     0x8800 

//Touchscreen
#define YP A2  // must be an analog pin, use "An" notation!
#define XM A3  // must be an analog pin, use "An" notation!
#define YM 8   // can be a digital pin
#define XP 9   // can be a digital pin

//Touschscreen Kalibrierung
#define TS_MINX 110
#define TS_MINY 105
#define TS_MAXX 947
#define TS_MAXY 947

Sieht das so aus?

image

Bei mir wird leider nichts ausgegeben :roll_eyes:

ja das sieht so so aus, so soll es auch sein. Mh, komisch, bei mir steht halt 1, da ich ja current Menue printe und dann In Loop

ich habe jetzt nochmal was getestet, es scheint, als hätte es was mit der Funktion AuswahlButton zu tun, eventuell mit der Endlosschleife? geht das so nicht? Wenn ich das auskommentiere und einfach nach aufruf des Hauptmenüs sage, dass das Display schwarz werden soll, dann wieder das Hauptmenüe aufrufe geht es. Sollte ich die loop zum Warten auf die Bestätigung in die loop() packen? und dann ohne Endlosschleifen mit while(true)?

//Touchscreen
#define YP A2  // must be an analog pin, use "An" notation!
#define XM A1  // must be an analog pin, use "An" notation!
#define YM 6   // can be a digital pin
#define XP 7   // can be a digital pin

Wenn ich die Pins ändere, funktioniert auch Touch :slightly_smiling_face:

Unabhängig von der Fehlerursache ist eine Endlosschleife keine gute Idee, also ja!

Zeige mall link zum Display,

ok, danke für eure Hilfe! Ich habe den Fehler gefunden. Mein Display nutzt A2 und A3 für Touch und Display, deshalb muss ich nach nutzen des Touchscreens diese wieder als OUTPUT definieren, dann klappt es auch. @fony ja genau, das ist ein Aufsatz. Mir ist das Problem mit dem SPI bekannt, ich denke ich werde die Pins vorsichtig umknicken und dann mit Kabeln auf den 6er Block gehen, hoffe das klappt. Wenn nicht muss ich mir wohl ein anderes Display besorgen. Bei meinem Uno wird mit meinem Vorhaben der SRAM knapp..
Wenn ihr jetzt grade schonmal hier seid, wie auf dem Bild zu sehen sieht das Hauptmenü optisch echt schlecht und alt aus, gibt es irgendwie noch eine Bibliothek oder ähnliches, um solche Sachen optisch schnell schön zu machen? Oder benutze ich die Bibliothek einfach falsch ?

Hier der Link zum Display: https://de.aliexpress.com/item/32992884961.html?spm=a2g0o.order_list.order_list_main.22.65a75c5fD3kYue&gatewayAdapt=glo2deu

Ich habe solche zwei, sind für Mega.
Nur muss dir sofort sagen das man SD und Touch gemeinsam nicht nutzen kann.
Mit umknicken der Pins bei deinem wurde nicht machen, das zweite Problem ist der SD Slot hat kein Pegelumsetzer, damit machst Du dir die SD Karten kaputt. Die vertragen keine 5V

mh ok, meinst du die Pins knicken ab oder wieso? selbst wenn die abknicken, dann ist das so, dann kann ich ja immernoch ein neues besorgen. Und was meinst du mit Pegelumsetzer? muss ich die SPI pins auf 3,3V regeln? würden da auch widerstände gehen?

Erst mall zu deinem Display schau mall hier
Wen es um SD geht wurde die an der zeitliche nicht belegter Leiste Anzapfen und danach über Level Schifter (so einen nutzen), die SD Pins für Uno müssen aber weg :wink:

ok danke! An welche Pins am Level Shifter müsste ich denn dann dran?

Erst mall bring dein Sketch zum Laufen :wink:
Du musst erstmal wissen wie auf den Seitlichen kontakten der SD ist.
Multimeter messen Aufschreiben, oder kaufst so einen egal wo, nur nicht bei AZ -Delivery
Und es muss gleich aussehen .

ja, dadran habe ich auch schon gedacht, ist für mich wohl am einfachsten. Ich habe jetzt noch ein Problem mit der AdafruitTFTLCD Bibliothek. Ich würde die gerne nutzen, um mein Menü hübscher zu machen, allerdings geht die davon aus, dass meine Datenpins auf 22-29 liegen, was ja durch das Shield nicht der Fall ist. ich blicke durch die pin_magic.h nicht ganz durch, kann ich das irgendwie anpassen, damit das Display als Shield und der Bibliothek auf dem Mega läuft? Mit der Bib MCUFRIEND_kbv.h gehts ja auch

Versuch doch mit der LCD Wicki, ich kann dir sofort sagen mit keiner Bibliothek wirst du Glücklich, die sind unheimlich langsam, du willst ja Menü bauen, und wo möglich jedes Menü in anderer Farbe, schau dir doch die Beispiele an, wen du damit Leben kannst ist ok. ich bin mittlerweile verwöhnt. Ok alte Projekte laufen noch nur werden langsam Entsorgt :wink:

langsam ist mir eigenltich egal, ich möchte nur, dass das Menü vernüftig und modern aussieht :smiley:

Wenn Sie Meinen :rofl:
Vier Sekunden warten bis nächstes Menü wird aufgerufen :wink:

Gratulation!

Mit Software-SPI geht es bei meinem Display :wink:

Weil es ein Shield ist, habe ich es einfach draufgesteckt und mich gefreut, daß es funktioniert. Meine SD-Karte hat sich bislang nicht über die 5 V beschwert, da habe ich möglicherweise Glück gehabt.

Gut zu wissen. Habe damals nur getestet, noch nicht alles verstanden, war mein zweites Display, in Arduino Welt ist das schon Ewigkeit