Elecrow 5" ESP32 Display

Hallo,
Ich habe mir für ein Projekt ein 5" Display gekauft.
Elecrow ESP32 Display

Ich brauche für das Projekt keinen Touch, aber den muss man nicht verwenden.

Mein Problem ist, dass ich nicht mehr weiter komme. Habe schon viele Bibliotheken probiert, aber keine funktioniert. Ich brauche bei dem Projekt nur einen schwarzen Hintergrund, die Darstellungen sollen in Gelb oder Orange sein.
Es soll eine analoge Uhr und auch Zahlen dargestellt werden.
Wenn ich jedoch meinen Code hochlade, was funktioniert, habe ich nur einen weissen Bildschirm.
Ich vermute dass dieses Display mit den Bibliotheken nicht funktioniert.
Habe schon nach Bibliotheken des Herstellers gesucht, komme damit aber nicht klar, weil diese obwohl geladen, immer wieder abgefragt werden.

Mein derzeitiger Code ( ohne Hersteller Bibliotheken).
`
// i2c Ports des ESP 32 sind:
// SDA: GPIO 21 - Carrera Schiene
// SCL: GPIO 22 - Eingang Cockpit

#include "CarreraDigitalControlUnit.h" // Bibliothek für die Carrera CU
#include <TFT_eSPI.h> // Bibliothek für das Elecrow 5" Display
#include <SPI.h>
#include <WiFi.h>
#include <time.h> // Für die Zeitfunktionen

// Display-Initialisierung für 800x480 RGB
TFT_eSPI tft = TFT_eSPI(); // Display-Objekt erstellen

// Wi-Fi Einstellungen (später anpassen)
const char* ssid = "Dein_SSID"; // Wi-Fi SSID
const char* password = "Dein_Passwort"; // Wi-Fi Passwort

// Feste IP-Adresse
//IPAddress local_IP(10, 0, 0, 254);
//IPAddress gateway(10, 0, 0, 1);
//IPAddress subnet(255, 255, 255, 0);
//IPAddress primaryDNS(10, 0, 0, 1); // Gateway ist gleich Primary DNS
//IPAddress secondaryDNS(8, 8, 8, 8); // Google DNS

// NTP-Server Einstellungen
const char* ntpServer = "pool.ntp.org";
const long gmtOffset_sec = 3600; // MEZ (GMT+1 Stunde)
const int daylightOffset_sec = 3600; // Automatische Sommerzeit (MESZ)

// Einstellbare Display-Positionen und Größen
// Analoge Uhr
int clockCenterX = 400; // Mittelpunkt X-Koordinate der Uhr (zentriert)
int clockCenterY = 240; // Mittelpunkt Y-Koordinate der Uhr (zentriert)
int clockRadius = 150; // Radius der Uhr (300 px Gesamtgröße)
// Stoppuhr
int stopwatchX = 50; // X-Koordinate der Stoppuhranzeige
int stopwatchY = 20; // Y-Koordinate der Stoppuhranzeige
int stopwatchWidth = 240; // Breite der Stoppuhranzeige
int stopwatchHeight = 120; // Höhe der Stoppuhranzeige
int stopTextSize = 12; // Textgröße Stoppuhr 120px
// Rundenanziege
int lapX = 50; // X-Koordinate der Anzeige für currentLap
int lapY = 100; // Y-Koordinate der Anzeige für currentLap
int lapTextSize = 12; // Textgröße für currentLap 12ßpx
// führende ID
int fahrIDX = 50; // X-Koordinate der Anzeige für FahrID
int fahrIDY = 160; // Y-Koordinate der Anzeige für FahrID
int fahrIDTextSize = 12; // Textgröße für FahrID 120px

// Varibalen für Zeiteinstellung
int lastHourX;
int lastHourY;
int lastMinuteX;
int lastMinuteY;
int hourMarkLength;
int hourLength;
int minuteLength;

// Variablen für die Stoppuhr
const int signalPin = 22; // I2C Pin für das Signal (SCL)
unsigned long startTime = 0;
unsigned long elapsedTime = 0;
bool isRunning = false;

// Zusätzliche Variablen für Carrera

int cuPin = 21; // Pin für Carrera CU (I2C Pin) (SDA)

// set digital pin #2 as input - make sure it does not deliver more
// than 5V or 3.3V, depending on platform!
CarreraDigitalControlUnit cu(cuPin);

int currentLap = -1;
int previousLap = -2;
uint8_t lapHigh = 0;
int fahrID = 0;

void setup() {
// TFT initialisieren
tft.init();
tft.setRotation(1); // Display-Ausrichtung, anpassen falls nötig
tft.fillScreen(TFT_BLACK);

// Serielle Schnittstelle für Debugging
Serial.begin(115200);

// Wi-Fi verbinden und Uhrzeit einstellen
connectToWiFiAndSetTime();
// print your WiFi shield's IP address:
Serial.print("IP Addresse: ");
Serial.println(WiFi.localIP());

// Signalpin initialisieren
pinMode(signalPin, INPUT);

// Erster Draw-Aufruf
drawClock();
displayLapAndFahrID(); // Zusätzliche Anzeige initialisieren
}

void loop() {
// Carrera CU abfragen
// Code dafür ausgebelendet, das dieser nicht öffentlich gemacht werden darf!
// Hier wird die Aktuelle Runde und die ID des führenden ermittelt.
//
// Variable currentLap kommt aus diesem Teil
// Variable fahrID kommt ebenfalls aus diesem Programmcode

//

static unsigned long lastUpdateTime = 0;

// Uhr aktualisieren alle 10 Sekunden
if (millis() - lastUpdateTime >= 10000) {
drawClock();
lastUpdateTime = millis();
}

// Stoppuhr aktualisieren
updateStopwatch();
}

// Funktion zur Wi-Fi-Verbindung und Zeiteinstellung über NTP
void connectToWiFiAndSetTime() {
// Verbindung mit Wi-Fi herstellen
Serial.print("Verbinde mit Wi-Fi: ");
Serial.println(ssid);

// Festlegen der IP-Adresse, wenn gewünscht
//if (!WiFi.config(local_IP, gateway, subnet, primaryDNS, secondaryDNS)) {
// Serial.println("STA hat die Konfiguration fehlgeschlagen");
//}

WiFi.begin(ssid, password);

// Warten, bis das Wi-Fi verbunden ist
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}

Serial.println("");
Serial.println("Wi-Fi verbunden.");
Serial.print("IP-Adresse: ");
Serial.println(WiFi.localIP());

// NTP-Server konfigurieren und Zeit synchronisieren
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
struct tm timeinfo;
if (!getLocalTime(&timeinfo)) {
Serial.println("Fehler beim Abrufen der Zeit vom NTP-Server.");
return;
}
Serial.println("Zeit erfolgreich synchronisiert!");

// Wi-Fi trennen, da dies für die Funktion nicht notwendiug ist
WiFi.disconnect(true);
WiFi.mode(WIFI_OFF);
Serial.println("Wi-Fi getrennt und deaktiviert.");
}

// Funktion zur Darstellung der Uhr
void drawClock() {
// Aktuelle Zeit abrufen
struct tm timeinfo;
if (!getLocalTime(&timeinfo)) {
Serial.println("Fehler beim Abrufen der Zeit");
return;
}

// Berechne Winkel für Stunden- und Minutenzeiger
float hourAngle = (timeinfo.tm_hour % 12 + timeinfo.tm_min / 60.0) * 30.0; // 30 Grad pro Stunde
float minuteAngle = timeinfo.tm_min * 6.0; // 6 Grad pro Minute

// Lösche vorherige Zeiger
tft.drawLine(clockCenterX, clockCenterY, lastHourX, lastHourY, TFT_BLACK);
tft.drawLine(clockCenterX, clockCenterY, lastMinuteX, lastMinuteY, TFT_BLACK);

// Zeichne Stundenmarkierungen
for (int i = 0; i < 12; i++) {
float angle = i * 30 * PI / 180; // 30 Grad in Bogenmaß
int xStart = clockCenterX + cos(angle) * (clockRadius - hourMarkLength);
int yStart = clockCenterY + sin(angle) * (clockRadius - hourMarkLength);
int xEnd = clockCenterX + cos(angle) * clockRadius;
int yEnd = clockCenterY + sin(angle) * clockRadius;
tft.drawLine(xStart, yStart, xEnd, yEnd, TFT_WHITE);
}

// Berechne und zeichne aktuellen Stundenzeiger
lastHourX = clockCenterX + cos((hourAngle - 90) * PI / 180) * hourLength;
lastHourY = clockCenterY + sin((hourAngle - 90) * PI / 180) * hourLength;
tft.drawLine(clockCenterX, clockCenterY, lastHourX, lastHourY, TFT_WHITE);

// Berechne und zeichne aktuellen Minutenzeiger
lastMinuteX = clockCenterX + cos((minuteAngle - 90) * PI / 180) * minuteLength;
lastMinuteY = clockCenterY + sin((minuteAngle - 90) * PI / 180) * minuteLength;
tft.drawLine(clockCenterX, clockCenterY, lastMinuteX, lastMinuteY, TFT_WHITE);
}

// Funktion zur Aktualisierung der Stoppuhr
void updateStopwatch() {
// Lesen des Signals an Pin D21
int signalState = digitalRead(signalPin);

// Überprüfen, ob das Signal auf LOW wechselt und die Stoppuhr nicht läuft
if (signalState == LOW && !isRunning) {
if (elapsedTime != 0) {
elapsedTime = 0;
tft.fillRect(stopwatchX, stopwatchY, stopwatchWidth, stopwatchHeight, TFT_BLACK); // Platz für Stoppuhranzeige leeren
}
startTime = millis();
isRunning = true;
Serial.println("Stoppuhr gestartet");
tft.setCursor(stopwatchX, stopwatchY);
tft.setTextSize(12); // Größe der Stoppuhranzeige: 120pt
tft.setTextColor(TFT_YELLOW, TFT_BLACK);
tft.print("Stoppuhr laeuft");
}

// Überprüfen, ob das Signal auf HIGH wechselt und die Stoppuhr läuft
if (signalState == HIGH && isRunning) {
elapsedTime = millis() - startTime;
isRunning = false;
Serial.print("Stoppuhr gestoppt. Zeit: ");
Serial.print(elapsedTime);
Serial.println(" ms");

// Zeit auf dem Display anzeigen
tft.fillRect(stopwatchX, stopwatchY, stopwatchWidth, stopwatchHeight, TFT_BLACK); // Platz für Stoppuhranzeige leeren
tft.setCursor(stopwatchX, stopwatchY);
tft.setTextSize(stopTextSize); // Größe der Stoppuhranzeige: 120pt
tft.setTextColor(TFT_YELLOW, TFT_BLACK);
tft.print("Stoppuhr: ");
tft.print(formatTime(elapsedTime));
delay(1000); // Sekundentakt

}
}

// Funktion zur Formatierung der Zeit in hh:mm:ss
String formatTime(unsigned long milliseconds) {
unsigned long totalSeconds = milliseconds / 1000;
int hours = totalSeconds / 3600;
int minutes = (totalSeconds % 3600) / 60;
int seconds = totalSeconds % 60;

char timeString[9]; // hh:mm:ss hat 8 Zeichen + Nullterminator
snprintf(timeString, sizeof(timeString), "%02d:%02d:%02d", hours, minutes, seconds);
return String(timeString);
}

// Funktion zur Anzeige von currentLap und FahrID
void displayLapAndFahrID() {
// Anzeige für currentLap
tft.fillRect(lapX, lapY, 400, 120, TFT_BLACK); // Platz für currentLap-Anzeige leeren
tft.setCursor(lapX, lapY);
tft.setTextSize(9); // Größe: 90pt
tft.setTextColor(TFT_WHITE, TFT_BLACK);
tft.print("R: ");

tft.setCursor(lapX + 100, lapY); // Verschiebung nach rechts für die Zahl
tft.setTextSize(lapTextSize); // Größe: 120pt
tft.setTextColor(TFT_YELLOW, TFT_BLACK);
tft.print(currentLap);

// Anzeige für FahrID
tft.fillRect(fahrIDX, fahrIDY, 400, 120, TFT_BLACK); // Platz für FahrID-Anzeige leeren
tft.setCursor(fahrIDX, fahrIDY);
tft.setTextSize(9); // Größe: 90pt
tft.setTextColor(TFT_WHITE, TFT_BLACK);
tft.print("F: ");

tft.setCursor(fahrIDX + 200, fahrIDY); // Verschiebung nach rechts für die ID
tft.setTextSize(fahrIDTextSize); // Größe: 120pt
tft.setTextColor(TFT_YELLOW, TFT_BLACK);
tft.print(fahrID);
}
`
Hat jemand Erfahrung mit diesem Display?
Was mache ich falsch?

Gruß

Willkommen im Forum :wink:
Mit TFT_eSPI wird nicht funktionieren :wink:
Die kennt den Driver nicht und kann noch nicht 800 x 480 ansteuern. Damit unten sollte der tun.

Ist ja für dein Display.

Versuche es mal damit.

Zitat deines Links

Wiki & Dokumente

Wenn du auf OPENHASP klickst, und dort im Text auf.
Light and Versatile Graphics Library

Landest du auf den Link. (unter Beispiele)

Ist wie üblich etwas tricky aber sollte funktionieren.

  1. Regel : IMMER zuerst das Beispiel ans laufen bringen. Das sichert das die Verdrahtung stimmt und man kann darauf aufbauen.
    Gruß

Pucki

ER will kein LVGL Dazu kommt das TFT_eSPI ist nur unterbau für LVGL.
Wen du dich in LVGL einarbeitet hast mach ein neuen Topic auf ich lerne gerne dazu, will mich mit LVGL erst im Winter beschäftigen, ist ganz was Anderes als Standard Arduino Bibliotheken.
Bitte jedoch keine Links !

Hat der doch versucht :wink:

Ach ja auch wen der TO dein Beispiel probieren wurde, schätze mall es wird nicht sofort funktionieren aus zwei Gründen, welsche finde selber raus, kleine Hilfe es geht direkt um LVGL.
Sowas testet man bevor man was zeigt.

Dann hilf ihm und labere mich nicht tot.

Immerhin gibt der HERSTELLER genau diesen Weg vor.

Warum bindet man dann das ein : include <lvgl.h> <-

Gruß

Pucki

Du bist mal wieder im Flow gell?

@fony hat ihm schon längste geholfen und auf die Lib verlinkt, die für das genannte Display vorgesehen ist…

Jajn, aber es gibt funktionierende Beispiele im Blog.
Punkt 2 direkt beim Hersteller Jingcai gibt es mehr zu erfahren was ist was unter Display Typ JC80448W550. wollte dem nämlich, holen nur wo zu soll er liegen wen noch nicht alles ausgereift ist.

Und auch funktioniert :wink:

Dann werde ich da mal suchen.
Den LVGL brauche ich da nicht.

Das Display hat den Treiber: ILI6122 & ILI5960.
Wenn ich danach suche, wird mit eine Arduino GFX Library angeboten.
Hier habe ich mal versucht Das Hello World File auf das Display zu laden. Hier ist die Antwort eine schwarzer Schirm, aber keine Reaktion ansonsten.

Wurde der BL Pin aktiviert?
Zeige mal dein Sketch mach aber folgendes gehe in der IDE auf bearbeiten, Für Forum Kopieren und hier mit STRG+V einfügen.
Ein andere Teilnehmer arbeitet mit der Adafruit GFX ist anderes Display aber tut.

ich beschäftige mich das erste mal mit Displays am Arduino. Mit Raspberrys habe ich schon ein Display am laufen.
Meine bisherigen Arduino Dinge waren eher banal, wie Temperaturen- und Luftfeuchtewerte und per mqtt weitergeben oder Relais zu schalten. In letzter Zeit auch Servos zu betreiben bzw Ledstreifen anzusteuern mit Helligkeitsregelung.

Ich hoffe, dass ich das Display mit Hilfe des Forums zum laufen bekomme. Habe mich bei dem gekauften Elecrow Display, wahrscheinlich zu sehr blenden lassen weil gleich der ESP32 verbaut ist.
Habe mich zur Ansteuerung des Displays im Code oben auch mit Chat GPT beholfen. Doch hier ist die KI keine Hilfe.

Also bitte um Nachsicht, wenn ich blöde Fragen stelle.

Hier der Code mit der GFX Library.


```cpp

/*******************************************************************************
 * Start of Arduino_GFX setting
 *
 * Arduino_GFX try to find the settings depends on selected board in Arduino IDE
 * Or you can define the display dev kit not in the board list
 * Defalult pin list for non display dev kit:
 * Arduino Nano, Micro and more: CS:  9, DC:  8, RST:  7, BL:  6, SCK: 13, MOSI: 11, MISO: 12
 * ESP32 various dev board     : CS:  5, DC: 27, RST: 33, BL: 22, SCK: 18, MOSI: 23, MISO: nil
 * ESP32-C3 various dev board  : CS:  7, DC:  2, RST:  1, BL:  3, SCK:  4, MOSI:  6, MISO: nil
 * ESP32-S2 various dev board  : CS: 34, DC: 38, RST: 33, BL: 21, SCK: 36, MOSI: 35, MISO: nil
 * ESP32-S3 various dev board  : CS: 40, DC: 41, RST: 42, BL: 48, SCK: 36, MOSI: 35, MISO: nil
 * ESP8266 various dev board   : CS: 15, DC:  4, RST:  2, BL:  5, SCK: 14, MOSI: 13, MISO: 12
 * Raspberry Pi Pico dev board : CS: 17, DC: 27, RST: 26, BL: 28, SCK: 18, MOSI: 19, MISO: 16
 * RTL8720 BW16 old patch core : CS: 18, DC: 17, RST:  2, BL: 23, SCK: 19, MOSI: 21, MISO: 20
 * RTL8720_BW16 Official core  : CS:  9, DC:  8, RST:  6, BL:  3, SCK: 10, MOSI: 12, MISO: 11
 * RTL8722 dev board           : CS: 18, DC: 17, RST: 22, BL: 23, SCK: 13, MOSI: 11, MISO: 12
 * RTL8722_mini dev board      : CS: 12, DC: 14, RST: 15, BL: 13, SCK: 11, MOSI:  9, MISO: 10
 * Seeeduino XIAO dev board    : CS:  3, DC:  2, RST:  1, BL:  0, SCK:  8, MOSI: 10, MISO:  9
 * Teensy 4.1 dev board        : CS: 39, DC: 41, RST: 40, BL: 22, SCK: 13, MOSI: 11, MISO: 12
 ******************************************************************************/
#include <Arduino_GFX_Library.h>

#define GFX_BL DF_GFX_BL // default backlight pin, you may replace DF_GFX_BL to actual backlight pin

/* More dev device declaration: https://github.com/moononournation/Arduino_GFX/wiki/Dev-Device-Declaration */
#if defined(DISPLAY_DEV_KIT)
Arduino_GFX *gfx = create_default_Arduino_GFX();
#else /* !defined(DISPLAY_DEV_KIT) */

/* More data bus class: https://github.com/moononournation/Arduino_GFX/wiki/Data-Bus-Class */
Arduino_DataBus *bus = create_default_Arduino_DataBus();

/* More display class: https://github.com/moononournation/Arduino_GFX/wiki/Display-Class */
Arduino_GFX *gfx = new Arduino_ILI9341(bus, DF_GFX_RST, 0 /* rotation */, false /* IPS */);

#endif /* !defined(DISPLAY_DEV_KIT) */
/*******************************************************************************
 * End of Arduino_GFX setting
 ******************************************************************************/

void setup(void)
{
  Serial.begin(115200);
  // Serial.setDebugOutput(true);
  // while(!Serial);
  Serial.println("Arduino_GFX Hello World example");

#ifdef GFX_EXTRA_PRE_INIT
  GFX_EXTRA_PRE_INIT();
#endif

  // Init Display
  if (!gfx->begin())
  {
    Serial.println("gfx->begin() failed!");
  }
  gfx->fillScreen(BLACK);

#ifdef GFX_BL
  pinMode(GFX_BL, OUTPUT);
  digitalWrite(GFX_BL, HIGH);
#endif

  gfx->setCursor(10, 10);
  gfx->setTextColor(RED);
  gfx->println("Hello World!");

  delay(5000); // 5 seconds
}

void loop()
{
  gfx->setCursor(random(gfx->width()), random(gfx->height()));
  gfx->setTextColor(random(0xffff), random(0xffff));
  gfx->setTextSize(random(6) /* x scale */, random(6) /* y scale */, random(2) /* pixel_margin */);
  gfx->println("Hello World!");

  delay(1000); // 1 second
}

Normalerweise kann man sehen ob die Hintergrundbeleuchtung ist an. Wenn die ist aus sieht man nichts.

GPIO2 ist für die Hintergrundbeleuchtung.

Ich frage mich ja, wenn schon ein elecrow Board gekauft wurde, warum dann nicht nach den Tutorials dieses Hersteller vorgegangen wird, der in Beitrag #2 verlinkt wurde?

Bist dir Sicher , ok den Schaltplan konnte nicht aufmachen, nur habe irgend wo auf der Seite 31 gelesen.

Ja so gefunden, 2 ist die Hintergrundbeleuchtung und 31 für Display


OK Danke!

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.