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ß