.. note:: Hallo und willkommen in der SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasten-Gemeinschaft auf Facebook! Tauchen Sie tiefer ein in die Welt von Raspberry Pi, Arduino und ESP32 mit anderen Enthusiasten. **Warum beitreten?** - **Expertenunterstützung**: Lösen Sie Nachverkaufsprobleme und technische Herausforderungen mit Hilfe unserer Gemeinschaft und unseres Teams. - **Lernen & Teilen**: Tauschen Sie Tipps und Anleitungen aus, um Ihre Fähigkeiten zu verbessern. - **Exklusive Vorschauen**: Erhalten Sie frühzeitigen Zugang zu neuen Produktankündigungen und exklusiven Einblicken. - **Spezialrabatte**: Genießen Sie exklusive Rabatte auf unsere neuesten Produkte. - **Festliche Aktionen und Gewinnspiele**: Nehmen Sie an Gewinnspielen und Feiertagsaktionen teil. 👉 Sind Sie bereit, mit uns zu erkunden und zu erschaffen? Klicken Sie auf [|link_sf_facebook|] und treten Sie heute bei! .. _ar_4_digit: 2.7 4-Digital-7-Segment-Anzeige ================================ Überblick ------------- In dieser Lektion lernen Sie die 4-Digital-7-Segment-Anzeige kennen. Es besteht aus vier 7-Segment-Anzeigen, die zusammenarbeiten, um 4-stellige Zahlen anzuzeigen. Erforderliche Komponenten --------------------------------- .. image:: img/list_2.7.png * :ref:`cpn_mega2560` * :ref:`cpn_breadboard` * :ref:`cpn_wires` * :ref:`cpn_resistor` * :ref:`cpn_4_digit` Fritzing-Schaltung -------------------------- .. image:: img/image438.png Schematische Darstellung ---------------------------------------- .. image:: img/image439.png Code ---- .. note:: * Sie können die Datei ``2.7_4digitalSegment.ino`` unter dem Pfad ``sunfounder_vincent_kit_for_arduino\code\2.7_4digitalSegment`` direkt öffnen. .. raw:: html Code-Analyse ------------- Im Wesentlichen verwendet dieser Code das Prinzip des Multiplexing, um eine 4-stellige Zahl auf einer 7-Segment-Anzeige darzustellen. Durch schnelles Umschalten zwischen den Ziffern und Anzeigen einer Ziffer zu einem Zeitpunkt entsteht der Eindruck, dass alle Ziffern gleichzeitig angezeigt werden. Die Stoppuhr-Funktionalität wird durch die Verwendung der eingebauten ``millis()``-Funktion erreicht, um die Zeit zu verfolgen und die angezeigte Zahl jede Sekunde zu erhöhen. #. Variable and Constant Definitions: .. code-block:: arduino int segmentPins[] = {2, 3, 4, 5, 6, 7, 8, 9}; int digitPins[] = {13, 12, 11, 10}; long n = 0; // Variable to store the current stopwatch number int del = 5; // Delay time (in milliseconds) to keep each digit illuminated unsigned long previousMillis = 0; // Store the last time the stopwatch incremented const long interval = 1000; // One-second interval (in milliseconds) * Die Arrays ``segmentPins`` und ``digitPins`` definieren die Pins, die mit den Segmenten bzw. Ziffern der 7-Segment-Anzeige verbunden sind. * ``n`` ist eine long-Variable, die die aktuelle Stoppuhrennummer verfolgt, beginnend bei 0 und erhöhend. * ``del`` ist eine Verzögerungszeit, um die Anzeige der aktuellen Ziffer aufrechtzuerhalten, bevor zur nächsten übergegangen wird. * ``previousMillis`` und ``interval`` beziehen sich auf die Zeitmessung, um zu entscheiden, wann die Stoppuhr erhöht wird. #. 7-Segment-Muster für Zahlen: Das 2D-Array numbers definiert, wie jede der Zahlen 0-9 auf einer Gemeinsam-Kathoden-7-Segment-Anzeige dargestellt wird. Jedes Unterarray hat 8 Werte (entweder HIGH oder LOW), die den 7 Segmenten und einem Dezimalpunkt entsprechen. Dieses Muster hilft, die entsprechenden Segmente für jede Zahl anzusteuern. .. code-block:: arduino byte numbers[10][8] = { {HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, LOW, LOW}, // 0 {LOW, HIGH, HIGH, LOW, LOW, LOW, LOW, LOW}, // 1 {HIGH, HIGH, LOW, HIGH, HIGH, LOW, HIGH, LOW}, // 2 {HIGH, HIGH, HIGH, HIGH, LOW, LOW, HIGH, LOW}, // 3 {LOW, HIGH, HIGH, LOW, LOW, HIGH, HIGH, LOW}, // 4 {HIGH, LOW, HIGH, HIGH, LOW, HIGH, HIGH, LOW}, // 5 {HIGH, LOW, HIGH, HIGH, HIGH, HIGH, HIGH, LOW}, // 6 {HIGH, HIGH, HIGH, LOW, LOW, LOW, LOW, LOW}, // 7 {HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, LOW}, // 8 {HIGH, HIGH, HIGH, HIGH, LOW, HIGH, HIGH, LOW} // 9 }; #. Setup-Funktion: .. code-block:: arduino void setup() { // Configure all segment and digit pins as OUTPUT for (int i = 0; i < 8; i++) { pinMode(segmentPins[i], OUTPUT); } for (int i = 0; i < 4; i++) { pinMode(digitPins[i], OUTPUT); digitalWrite(digitPins[i], HIGH); // Initially turn off all digits (for common-cathode displays, HIGH is OFF) } } * Alle Segment- und Ziffern-Pins sind auf OUTPUT-Modus gesetzt, da sie die Segmente und Ziffern der Anzeige steuern. * Zu Beginn sind alle Ziffern ausgeschaltet, was durch Schreiben von HIGH für eine Gemeinsam-Kathoden-Anzeige angezeigt wird. #. Haupt-Schleife: .. code-block:: arduino void loop() { // Check if a second has passed since the last increment if (millis() - previousMillis >= interval) { previousMillis += interval; // Update the last increment time n = (n + 1) % 10000; // Increment the stopwatch number and wrap around at 9999 } displayNumber(n); // Display the current stopwatch number on the 7-segment display } * Dieser Abschnitt überprüft, ob das Intervall (das auf 1000ms oder 1 Sekunde eingestellt ist) seit der letzten Erhöhung der Stoppuhr vergangen ist. Wenn ja, erhöht es die Nummer. * Die Nummer wird dann auf der 7-Segment-Anzeige mit der Funktion displayNumber() angezeigt. #. ``displayNumber()``-Funktion: .. code-block:: arduino // Function to display a 4-digit number on the 7-segment display void displayNumber(long num) { for (int digit = 0; digit < 4; digit++) { clearLEDs(); // Turn off all segments and digits pickDigit(digit); // Activate the current digit int value = (num / (int)pow(10, 3 - digit)) % 10; // Extract the specific digit from the number pickNumber(value); // Illuminate the segments to display the digit delay(del); // Keep the digit illuminated for a short time } } * Diese Funktion zerlegt die 4-stellige Zahl in einzelne Ziffern und zeigt jede Ziffer nacheinander in schneller Folge an. Dies erzeugt den Eindruck, dass alle Ziffern gleichzeitig angezeigt werden, aufgrund der Trägheit des Sehens. * Für jede Ziffer löscht die Funktion zuerst alle LEDs, wählt die entsprechende Ziffer mit ``pickDigit()`` aus und zeigt dann die Nummer auf dieser Ziffer mit ``pickNumber()`` an. * Die ``delay(del)`` stellt sicher, dass jede Ziffer für eine kurze Zeit sichtbar ist, bevor zur nächsten übergegangen wird. #. ``pickDigit()``-Funktion: Diese Funktion ist dafür verantwortlich, eine der vier Ziffern auf der 7-Segment-Anzeige auszuwählen (oder einzuschalten). Dies wird erreicht, indem der entsprechende Ziffern-Pin auf LOW gesetzt wird. .. code-block:: arduino void pickDigit(int x) { digitalWrite(digitPins[x], LOW); // Turn ON the selected digit (for common-cathode displays, LOW is ON) } #. ``pickNumber()`` Function: Gegeben eine einzelne Zahl (0-9), steuert diese Funktion die Segmente der 7-Segment-Anzeige, um diese Zahl anzuzeigen. Sie verwendet das zuvor definierte ``numbers``-Array, um zu wissen, welche Segmente ein-/ausgeschaltet werden sollen. .. code-block:: arduino void pickNumber(int x) { for (int i = 0; i < 8; i++) { digitalWrite(segmentPins[i], numbers[x][i]); // Set each segment according to the pattern for the given number } } #. ``clearLEDs()`` Function: Wie der Name schon sagt, schaltet diese Funktion alle Segmente und Ziffern aus. Sie wird verwendet, um sicherzustellen, dass während des Multiplexing-Prozesses in der ``displayNumber()``-Funktion nur eine Ziffer aktiv ist. .. code-block:: arduino void clearLEDs() { for (int i = 0; i < 8; i++) { digitalWrite(segmentPins[i], LOW); // Turn off all segments } for (int i = 0; i < 4; i++) { digitalWrite(digitPins[i], HIGH); // Turn off all digits } } Phänomen Bild ------------------ .. image:: img/image104.jpeg