5.3 - Zeitmesser

Ein 4-stelliges 7-Segment-Display besteht aus vier miteinander verknüpften 7-Segment-Anzeigen.

Das 4-stellige 7-Segment-Display arbeitet eigenständig. Es nutzt das Prinzip der visuellen Persistenz des menschlichen Auges, um die Zeichen jedes 7-Segment-Displays in einer Schleife schnell anzuzeigen und so fortlaufende Zeichenfolgen zu bilden.

Zum Beispiel, wenn „1234“ angezeigt wird, erscheint die „1“ im ersten 7-Segment-Display, während „234“ nicht angezeigt werden. Nach einer kurzen Zeit zeigt das zweite 7-Segment-Display „2“, während die ersten, dritten und vierten 7-Segmente aus bleiben. Und so weiter, alle vier Ziffern werden nacheinander angezeigt. Dieser Prozess ist sehr kurz (typischerweise 5ms), und durch den optischen Nachleuchteffekt sowie das Prinzip der visuellen Persistenz sehen wir alle vier Zeichen gleichzeitig.

Benötigte Komponenten

Für dieses Projekt werden die folgenden Komponenten benötigt.

Ein Komplettset ist definitiv praktisch, hier ist der Link:

Name

ARTIKEL IN DIESEM SET

KAUF-LINK

Kepler-Set

450+

Kepler Kit

Alternativ können Sie die Komponenten auch einzeln über die untenstehenden Links erwerben.

SN

KOMPONENTENBESCHREIBUNG

ANZAHL

KAUF-LINK

1

Raspberry Pi Pico W

1

BUY

2

Micro-USB-Kabel

1

3

Steckbrett

1

BUY

4

Jumperkabel

Mehrere

BUY

5

Widerstand

4(220Ω)

BUY

6

4-stellige 7-Segment-Anzeige

1

7

74HC595

1

BUY

Schaltplan

sch_4dig

Die Verdrahtungsprinzipien sind im Grunde die gleichen wie bei 5.1 Mikrochip - 74HC595, der einzige Unterschied besteht darin, dass Q0-Q7 an die a ~ g Pins des 4-stelligen 7-Segment-Displays angeschlossen sind.

Dann werden G10 ~ G13 verwendet, um auszuwählen, welches 7-Segment-Display aktiv sein soll.

Verdrahtung

wiring_4dig

Code

Bemerkung

  • Die Datei 5.3_time_counter.ino finden Sie im Verzeichnis kepler-kit-main/arduino/5.3_time_counter.

  • Oder kopieren Sie diesen Code in die Arduino IDE.

  • Vergessen Sie nicht, das Board (Raspberry Pi Pico) und den korrekten Port vor dem Klicken auf die Hochladen-Taste auszuwählen.

Nach dem Ausführen des Programms wird das 4-stellige 7-Segment-Display zu einem Zähler, und die Zahl erhöht sich jede Sekunde um 1.

Wie funktioniert es?

Das Senden von Signalen an jedes 7-Segment-Display erfolgt auf die gleiche Weise wie bei 5.2 - Zahlenanzeige, mit der Funktion hc595_shift(). Der Kernpunkt beim 4-stelligen 7-Segment-Display ist die selektive Aktivierung jedes 7-Segment-Displays. Der damit verbundene Code ist wie folgt.

const int placePin[4] = {13,12,11,10};

void setup ()
{
    for (int i = 0; i<4;i++){
        pinMode(placePin[i],OUTPUT);
    }
}

void loop()
{
    pickDigit(0);
    hc595_shift(count%10/1);

    pickDigit(1);
    hc595_shift(count%100/10);

    pickDigit(2);
    hc595_shift(count%1000/100);

    pickDigit(3);
    hc595_shift(count%10000/1000);
}

void pickDigit(int digit){
    for(int i = 0; i < 4; i++){
        digitalWrite(placePin[i],HIGH);
    }
    digitalWrite(placePin[digit],LOW);
}

Hier werden vier Pins (GP10, GP11, GP12, GP13) verwendet, um jede Stelle des 4-stelligen 7-Segment-Displays einzeln zu steuern. Wenn der Status dieser Pins LOW ist, ist das entsprechende 7-Segment-Display aktiv; wenn der Status HIGH ist, arbeitet es nicht.

Die Funktion pickDigit(digit) wird verwendet, um alle 7-Segment-Displays zu deaktivieren und dann eine bestimmte Ziffer individuell zu aktivieren. Danach wird hc595_shift() verwendet, um den entsprechenden 8-Bit-Code für das 7-Segment-Display zu schreiben.

Das 4-stellige 7-Segment-Display muss kontinuierlich nacheinander aktiviert werden, damit alle vier Ziffern sichtbar sind. Das bedeutet, dass man im Hauptprogramm nicht einfach Code hinzufügen kann, der das Timing beeinflusst.

Allerdings ist es notwendig, diesem Beispiel eine Timing-Funktion hinzuzufügen. Wenn wir ein delay(1000) einfügen, wird offensichtlich, dass nur ein 7-Segment-Display jeweils aktiv ist und die Illusion entlarvt wird, dass alle vier 7-Segment-Displays gleichzeitig arbeiten.

Eine ausgezeichnete Methode, dies zu erreichen, ist die Verwendung der millis()-Funktion.

void setup()
{
    timerStart = millis();
}

void loop()
{
    unsigned int count = (millis() - timerStart) / 1000;
}

Die millis()-Funktion gibt die Anzahl der Millisekunden zurück, die seit dem Start des aktuellen Programms vergangen sind. Der erste Zeitwert wird als timerStart gespeichert;

wenn die Zeit erneut abgerufen werden muss, rufen wir die millis()-Funktion wieder auf und subtrahieren timerStart, um die bisherige Laufzeit des Programms zu ermitteln.

Abschließend wird dieser Zeitwert umgewandelt, um ihn auf dem 4-stelligen 7-Segment-Display darzustellen.