Anzeige

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 hochzuzä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.

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 an!

Darin findest du die beliebtesten Arduino-Projekte von StartHardware. Jedes Projekt umfasst Schaltplan, Bauteile, Beschreibung und Code. Für Einsteiger gibt es ein Arduino-Schnellstart-Kapitel und einen kompakten Programmierkurs. Zusätzlich findest du Zwischenkapitel mit Expertenwissen zu den Komponenten, die verwendet werden. Alle Code-Beispiele gibt es natürlich als Download.

Weitere Informationen findest du auf der Produktseite. Klicke jetzt auf den Button, um Details anzusehen.


Stefan Hermann

Ich bin Stefan und arbeite seit 2007 mit Arduino. Als Designer und Produktmanager setze ich das Board in erster Linie zum Bau von Prototypen ein. Hier teile ich meine Faszination und Erfahrung mit dir!

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.