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