Zum Inhalt springen
Stoppuhr mit Arduino und Segmentanzeige TM1637

Stoppuhr mit Arduino und Segmentanzeige – Arduino+TM1637

    In diesem Beispiel zeige ich dir, wie du eine Stoppuhr mit Arduino und einer vierstelligen Segmentanzeige TM1637 bauen kannst. Sprechen wir kurz über den Aufbau und die Funktionsweise.

    Aufbau

    Die Stoppuhr besteht aus einer vierstelligen Sieben-Segment-Anzeige (TM1637) und zwei Tastern. Einer ist der Start-Taster, der andere der Zwischenzeit-Taster.

    Funktionsweise

    Zuerst zeigt die Stoppuhr einfach vier Nullen an. Wird nun der Start-Taster betätigt, fängt die Segmentanzeige an, Sekunden hoch zuzählen. Drückt man den Zwischenzeit-Taster, stoppt die Zeit auf dem Display. Im Hintergrund wird aber weitergezählt. Ein erneuter Druck auf den Zwischenzeit-Taster zeigt wieder die aktuell laufende Zeit an. Drückt man den Start-Taster, stoppt die Uhr sowohl im Display, als auch im Hintergrund. Nun kann man die Uhr entweder per Druck auf den Zwischenzeit-Taster weiter laufen lassen, oder durch erneuten Druck auf den Start-Taster auf null zurücksetzen.


    Sieh dir jetzt meinen neuen Arduino-Videokurs an: Jetzt ansehen!


    Arduino+TM1637: Bauteile

    Arduino+TM1637: Schaltplan

    Stoppuhr mit Arduino und Segmentanzeige TM1637 Schaltplan

    Beide Taster sind jeweils auf einer Seite mit dem GND verbunden. Der Start-Taster ist darüber hinaus am digitalen Pin 9, der Zwischenzeit-Taster am Pin 8 angeschlossen. Die Segmentanzeige TM1637 verfügt über einen integrierten Controller und benötigt nur zwei Datenleitungen, die am Pin 2 (CLK) und Pin 3 (DIO) angeschlossen sind (Meine Segmentanzeige ist genau umgedreht zu der im Bild). Wichtig ist, dass man noch mal nach der Beschriftung auf der Platine vom Display sieht.

    Programm-Prinzip

    Nachdem wir uns im Abschnitt Funktionsweise schon angesehen haben, wie sich die Stoppuhr verhalten soll, können wir genau das in eine State-Machine einsetzen. Dabei handelt es sich grob gesagt um den Programmablauf als Switch-Case-Abfrage. Die Variable programState speichert den aktuellen Zustand des Programms. So sieht der Programmablauf im Überblick aus:

    switch (programState) {
      case 0: // gestoppt
        // hier werden einfach vier Nullen auf dem Display angezeigt
        // wird der Start-Taster gerdückt, springe zu State 1
        break;
    case 1: // gestartet
        // zeige die vergangene Zeit auf dem Display
        // Wenn der Zwischenzeit-Taster gedrückt wird, springe zu State 2
        // Wenn der Start-Taster gedrückt wird, springe zu State 3
        break;
    case 2: // Zwischenzeit anzeigen
        // zeige die Zwischenzeit an
        // Wenn der Zwischenzeit-Taster gedrückt wird, springe zu State 1
        break;
    case 3: // gestoppt
        // Wenn der Zwischenzeit-Taster gedrückt wird, springe zu State 1 (weiter laufen)
        // Wenn der Start-Taster gedrückt wird, springe zu State 0 (löschen)
        break;
    }

    Die Segmentanzeige benötigt noch eine Programm-Bibliothek. Gehe dafür im Menü der Arduino-Software auf Sketch>Bibliotheken einbinden>Bibliotheken verwalten und suche nach TM1637. Installiere die TM1637 Bibliothek von Avishay Orpaz in der aktuellen Version.
    Nun kannst du den Code ausprobieren:

    #include <TM1637Display.h>
    
    #define numberOfSeconds(_time_) ((_time_ / 1000) % 60)
    #define numberOfMinutes(_time_) (((_time_ / 1000) / 60) % 60)
    
    int startPin = 9; // start, stop, delete
    int zwischenzeitPin = 8; // pause, continue
    
    int stateStart;
    int stateZwischenzeit;
    
    int lastStateStart;
    int lastStateZwischenzeit;
    
    int programState = 0;
    
    unsigned long startZeit = 0;
    long zwischenzeit = 0;
    long zeitAngehalten = 0;
    
    TM1637Display display(2, 3);
    
    void setup() {
      Serial.begin(115200);
    
      pinMode(startPin, INPUT_PULLUP);
      pinMode(zwischenzeitPin, INPUT_PULLUP);
    
      // Set brightness
      display.setBrightness(0x0c);
    
    }
    
    void showTime(long theTime) {
    
      unsigned long myTime = theTime - startZeit;
    
      int seconds = numberOfSeconds(myTime);
      int minutes = numberOfMinutes(myTime);
    
      display.showNumberDecEx(seconds, 0, true, 2, 2);
      if (seconds % 2 == 0) {
        display.showNumberDecEx(minutes, 0b01000000, true, 2, 0);
      } else {
        display.showNumberDecEx(minutes, 0, true, 2, 0);
      }
    }
    
    void loop() {
    
      stateStart = digitalRead(startPin);
      stateZwischenzeit = digitalRead(zwischenzeitPin);
    
      switch (programState) {
        case 0: // gestoppt
          startZeit = 0;
          display.showNumberDecEx(0, 0b01000000, true, 2, 2);
          display.showNumberDecEx(0, 0b01000000, true, 2, 0);
          // start
          if ((stateStart == LOW) && (stateStart != lastStateStart)) {
            startZeit = millis();
            programState = 1;
          }
          break;
        case 1: // gestartet
          showTime(millis());
          // zwischenzeit
          if ((stateZwischenzeit == LOW) && (stateZwischenzeit != lastStateZwischenzeit)) {
            zwischenzeit = millis();
            programState = 2;
          }
          // stop
          if ((stateStart == LOW) && (stateStart != lastStateStart)) {
            zeitAngehalten = millis();
            programState = 3;
          }
          break;
        case 2: // zwischenzeit
          showTime(zwischenzeit);
          // zwischenzeit ausblenden
          if ((stateZwischenzeit == LOW) && (stateZwischenzeit != lastStateZwischenzeit)) {
            programState = 1;
          }
          break;
        case 3: // gestoppt
          // weiter laufen lassen
          if ((stateZwischenzeit == LOW) && (stateZwischenzeit != lastStateZwischenzeit)) {
            startZeit = startZeit + (millis() - zeitAngehalten);
            programState = 1;
          }
          // löschen
          if ((stateStart == LOW) && (stateStart != lastStateStart)) {
            programState = 0;
          }
          break;
      }
    
      lastStateStart = stateStart;
      lastStateZwischenzeit = stateZwischenzeit;
    }

    Wenn dir das Projekt gefallen hat und du von weiteren interessanten Projekten inspiriert werden willst, sieh dir doch mal mein neues E-Book »Arduino Projekte Volume 1« an!

    • Die beliebtesten Arduino-Projekte von StartHardware
    • Inklusive Schaltplan, Beschreibung und Code
    • Arduino-Schnellstart-Kapitel
    • Kompakter Programmierkurs


    15 Gedanken zu „Stoppuhr mit Arduino und Segmentanzeige – Arduino+TM1637“

    1. Hallo Herr Hermann, auf der Suche nach einer Stoppuhr mit dem Arduino-Uno bin ich auf Ihre tolle Seite gestoßen. Das Beispiel “Arduino + TM1637” habe ich aufgebaut und es funktioniert genau so, wie ich es benötige. Eine Kleinigkeit würde ich gerne ändern. Der Doppelpunkt des Displays soll nicht im Sekundentakt blinken, sondern kontinuierlich leuchten. Leider bin ich durch den Programmcode nicht so ganz durchgestiegen und habe diese Änderung (noch) nicht realisiert. Gibt es vielleicht eine ganz einfache Methode, den Doppelpunkt ein- bzw. auszuschalten.

      Mit freundlichem Gruß Dieter L

    2. Hallo zusammen.
      Hätte da eine Frage da ich auch Arduino Anfänger bin und zwar wie muss das Programm umgeschrieben werden wenn ich auch “Hundelste Sekunden” Anzeigen lassen möchte?
      Dankeschön schon mal vorab.
      LG Andreas

    3. Hallo,

      ich brauche hilfe bei der umsetzung eines Projekts.
      Ziel ist es, einen Stromlaufplan sowie den entsprechenden Programmcode für eine Stoppuhr mit Display zu entwerfen. Das Display kann entweder als LC-Display oder als OLED-Display ausgeführt sein.

      Die Bedienung der Stoppuhr soll über einen einzigen Taster erfolgen. Ein
      erster Tastendruck startet die Zeitmessung, während ein zweiter Tastendruck die Uhr stoppt. Die Genauigkeit liegt im Tausendstelsekunden-Bereich.

      Der Schaldplan soll mit der CAD – Software “Eagle” erstellt werden und der Programmcode soll mit Ardoino geschrieben werden.

    4. Hallo,

      ist es möglich eine Startzeit einzugeben?
      Möchte eine Fußball Anzeigetafel bauen, 1. Halbzeit Start bei 00.00 für die 2. Halbzeit wäre eine Startzeit mit 45.00 optimal

    5. Hallo,
      da ich mich nicht so richtig mit Arduino auskenne lautet meine Frage, was ich noch tun muss wenn ich alles zusammengebaut habe und den Sketch abgeschrieben habe. Geht das dann schon direkt?
      Würde mich über eine Antwort freuen :)
      Liebe Grüße!

      1. Hi Laura,

        den Sketch kannst du natürlich per Copy&Paste einfach in die Arduino-Software kopieren. Dann musst du es noch auf das Arduino-Board laden und es funktioniert dann auch direkt.

        Liebe Grüße :-)

    6. Guten Abend!

      Ich hätte eine Frage bezüglich de Programmcode, indem Sie dazu schreiben, dass Sie es in die “State-Machine” einsetzen. Was ist denn diese State-Machine?

      Mit freundlichen Grüßen
      Karl Ihrs

    7. Hallo, ich bin es wieder! :)
      Ich habe ein Problem, dass mir beim programmieren eine Fehlermeldung angezeigt wird. Das Problem liegt an der Bibliothek. Ich habe eine Bibliothek unter dem Namen “TM1637” gefunden, auch der Ersteller stimmt über ein. Jedoch heißt die Bibliothek im Code “TM1637.h” und nicht “TM1637Display.h”. Eventuell könnten Sie mir da weiterhelfen.

      Mit freundlichen Grüßen
      Linus Keidel

      1. Hm, das ist wirklich merkwürdig. In welchem Code meinst du? In meinem nutze ich ja die TM1637Display.h – Kannst du mal versuchen, die Beispieldatei hochzuladen? Die findest du im Arduino-Menü unter Datei>Beispiele>TM1637>TM1637Test …

        1. Hallo,
          Mir wird in der Beispieldatei die Bibliothek “TM1637Display” auf einmal angezeigt. Wissen Sie wie ich nun fortfahren könnte? Ich bin neu auf dem Gebiet, da ich eine Stoppuhr für ein Schulprojekt bauen muss. Daher hoffe ich, dass Sie mir ein wenig helfen könnten. :)

          Mit freundlichen Grüßen
          Linus Keidel

    8. Hallo,

      ich hätte eine Frage bezüglich den Kabeln. Habe Sie für den Anschluss an das Display ein female-to-male Kabel genutzt? Und ist das (auf dem Schaltplan) gelbe Kabel ein male-to-male Kabel? Außerdem würde ich gerne wissen, was das für kleine blaue Teile auf der Steckplatte sein sollen?

      Mit freundlichen Grüßen,
      Linus K

      1. Hi Linus,

        danke für deine Frage. Es ist genau so, wie du vermutet hast. Ich nutze für die Verbindung vom Breadboard zum Arduino male-to-male und zum Display wie im Titelbild male-to-female Kabel. Die kleinen blauten Teile im Titelbild sind ebenfalls Verbindungskabel. Diese speziellen heißen Drahtbrücken* und ich verwende sie gerne für kurze Kabelwege. Die kann man sich natürlich auch selber bauen (z. B. aus alten Netzwerkkabeln). Ich hoffe, das hilft dir weiter :-)

        Liebe Grüße

        Stefan

    Schreibe einen Kommentar

    Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

     

    Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.