kk logo

Diese Stoppuhr ist nicht nur ein optischer Hingucker durch ihr kräftiges Magenta als Hintergrund auf dem TFT, sondern durch wenig Code und minimale Kommunikation mit dem TFT auf maximale Reaktionsgeschwindigkeit optimiert.

1. Das Herzstück: Das TFT-Display (ILI9486)

Das verwendete TFT ist ein 4 Zoll Display mit einer Auflösung von 480x320 Pixeln, ich verwende es in Kombination mit der ILI9486 Bibliothek.  

  • Technik: Es nutzt den SPI-Bus zur Kommunikation. Da es viele Pixel ansteuern muss, braucht es einen schnellen Datentransfer.
  • Besonderheit: Im Gegensatz zu kleineren Displays muss der Arduino hier Schwerstarbeit leisten, um Grafiken zu zeichnen. Deshalb haben ich im Code eine ausgebremste Abfrage eingebaut, damit der Prozessor nicht überlastet wird. Es werden nur Zentel Sekunden angezeigt, mehr ist mit dem Arduino und dem TFT nicht drin, sonst wird die aktuelle Zahl nicht geladen.

arduino stoppuhr auf TFT diplay projekt

 

2. Die „Engine“: Die StopWatch Bibliothek

Anstatt mühsam mit der Arduino-Funktion millis() zu rechnen, nutzt ich hier im Projekt die StopWatch.h.

  • Vorteil: Sie funktioniert wie eine echte physikalische Stoppuhr. Man kann sie einfach mit Befehlen wie .start(), .stop(), .reset() und .restart() steuern.
  • Präzision: Die Bibliothek läuft im Hintergrund absolut genau mit, egal wie viel der Arduino gerade auf dem Display zeichnet.

3. Der Hardware-Aufbau (Schaltplan)

arduino stoppuhr auf TFT diplay anfänger projekt

4. Der Ablauf & Die Logik (So funktioniert’s)

Das Programm folgt einer klaren Hierarchie, damit die Bedienung flüssig bleibt:

  1. Initialisierung (Setup): Das Display wird auf ein kräftiges Magenta gesetzt, die Taster-Eingänge werden scharfgeschaltet und das Startmenü wird gezeichnet. Die Zeit steht auf 00:00:0.
  2. Die „Bremse“ (100ms Takt): Der Arduino prüft im loop, ob 100 Millisekunden vergangen sind. Nur dann schreibt er die Zeit neu aufs Display. Das spart Rechenleistung für die Taster-Abfrage.
  3. Die Taster-Abfrage: Die Taster werden tausendfach pro Sekunde abgefragt.
    • K1 startet die Uhr.
    • K2 friert die Zeit ein.
    • K3 setzt alles auf 00:00:0.
    • K4 kombiniert Reset und Start für einen "fliegenden" Start.
  4. Feedback-System: Bei jedem Tastendruck ändert sich die Farbe der Status-Kreise auf der linken Seite. So weißt du immer sofort, in welchem Modus die Uhr gerade ist (Grün = Läuft).

 

5. Arduino Code

 

//kreativekiste.de

#include <ILI9486_SPI.h>
#include "StopWatch.h"
ILI9486_SPI tft(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9);
StopWatch MySW;
StopWatch SWarray[1];
long millisabsolut = 0;
long millisupdate = 0;
int zeit_hori = 120;
int zeit_vert = 50;
void zeit();

int m = 0;
int s = 0;
int ms = 0;
void farben();

#define BLACK 0x0000
#define WHITE 0xffff
#define RED 0xD800
#define BLUE 0x001F
#define GREEN 0x07E0
#define YELLOW 0xFFE0
#define CYAN 0x07FF
#define MAGENTA 0xF81F
void start();

void setup() {
pinMode(2, INPUT_PULLUP);
pinMode(3, INPUT_PULLUP);
pinMode(4, INPUT_PULLUP);
pinMode(5, INPUT_PULLUP);
tft.setSpiKludge(false);
tft.init();
tft.setRotation(3);
tft.fillScreen (MAGENTA);
delay( 500 );

SWarray[0].setResolution(StopWatch::MILLIS);
start();

}

void loop() {
millisabsolut = SWarray[0].elapsed();
if (( millisabsolut >= ( millisupdate + 100 ) )) {

zeit();
millisupdate = millisabsolut;
}
if (!( digitalRead(2) )) {

SWarray[0].start();
tft.fillCircle(10, 130, 10, GREEN );
tft.fillCircle(10, 160, 10, BLUE);
tft.fillCircle(10, 190, 10, BLUE);
tft.fillCircle(10, 220, 10, BLUE);
}
if (!( digitalRead(3) )) {

SWarray[0].stop();
tft.fillCircle(10, 130, 10, BLUE );
tft.fillCircle(10, 160, 10, GREEN);
tft.fillCircle(10, 190, 10, BLUE);
tft.fillCircle(10, 220, 10, BLUE);
}
if (!( digitalRead(4) )) {

SWarray[0].reset();
tft.setCursor(zeit_hori, zeit_vert);
tft.setTextColor(BLACK,MAGENTA);
tft.setTextSize(5);
tft.print("00:00:0");
tft.fillCircle(10, 130, 10, BLUE );
tft.fillCircle(10, 160, 10, BLUE);
tft.fillCircle(10, 190, 10, GREEN);
tft.fillCircle(10, 220, 10, BLUE);
millisupdate = 0;
}
if (!( digitalRead(5) )) {

SWarray[0].restart();
tft.fillCircle(10, 130, 10, BLUE );
tft.fillCircle(10, 160, 10, BLUE);
tft.fillCircle(10, 190, 10, BLUE);
tft.fillCircle(10, 220, 10, GREEN);
millisupdate = 0;
}
}

//zeit anzeigen
void zeit() {
m = ( millisabsolut / 60000 );
s = ( ( millisabsolut / 1000 ) % 60 );
ms = ( ( millisabsolut % 1000 ) / 100 );
tft.setCursor(zeit_hori, zeit_vert);
tft.setTextSize(5);
tft.setTextColor(BLACK,MAGENTA);
if (( m < 10 )) {

tft.print("0");
}
tft.print(m);
tft.print(":");
if (( s < 10 )) {

tft.print("0");
}
tft.print(s);
tft.print(":");
tft.print(ms);
}

//.
void farben() {
}

//Funktionsbeschreibung
void start() {
tft.setCursor(zeit_hori, zeit_vert);
tft.setTextColor(BLACK);
tft.setTextSize(5);
tft.print("00:00:0");
tft.setTextSize(3);
tft.setTextColor(BLACK);
tft.setCursor(30, 120);
tft.print("K1 Start");
tft.setCursor(30, 150);
tft.print("K2 Stop");
tft.setCursor(30, 180);
tft.print("K3 Reset");
tft.setCursor(30, 210);
tft.print("K3 Restart");
tft.fillCircle(10, 130, 10, BLUE);
tft.fillCircle(10, 160, 10, GREEN );
tft.fillCircle(10, 190, 10, BLUE);
tft.fillCircle(10, 220, 10, BLUE);
}

Ronnie

schwäbischer tüftler und bastler, kraftsportler, neurodivers, 45 Jahre, 1 Frau, 5 Kinder und 1003 Ideen. 

1.2 ronnie berzins

Kontakt

visitenkarte