Wie verwende ich eine gemeinsame 7-Segment-4-stellige Anodenanzeige?

9

Bitte nehmen Sie diese Frage als Beispiel für (meine) Antwort unten.

Ich habe eine 7-Segment-, 4-stellige LED-Anzeige, aber ich habe keine Ahnung, wie ich sie verdrahten soll.

Ich verstehe den Unterschied zwischen gemeinsamer Anode / Kathode nicht und habe keine 2 Pins pro LED, was seltsam ist. Vor kurzem wurde eine Frage zu einer "7-Segment-4-stelligen gemeinsamen Anode" gelöscht. In diesem Moment tippte ich eine Antwort.

Trotzdem möchte ich meine Antwort mit Ihnen oder der Person, die sie gefragt hat, teilen. Bitte überprüfen / aktualisieren Sie meine Antwort mit weiteren Informationen. Konkret, könnte jemand Arbeitscode hinzufügen, kann ich im Moment nicht.

Paul
quelle
Nur neugierig. Haben Sie eine Frage gestellt, damit Sie sie beantworten können?
PhillyNJ
Dafür gibt es tatsächlich eine Option. Die Kommentare in meiner Frage erzählen jedoch auch die "Hintergrundgeschichte". Ich habe eine Frage beantwortet, die gelöscht wurde. Und hatte trotzdem das Bedürfnis, meine Antwort zu posten. Also ja, ich habe es getan. Aber es ist eine gültige Methode und ich hatte die Antwort vor der Frage. Also machte es für mich Sinn. Wenn Sie eine wirklich gute Frage (und Antwort) haben, kann ich Sie nur ermutigen, dasselbe zu tun, da dies für jemanden irgendwann nützlich sein könnte.
Paul

Antworten:

7

Als Ergänzung zu Pauls Antwort habe ich ein kurzes Programm geschrieben, um zu zeigen, wie man die 4-stellige 7-Segment-Anzeige seiner Figur steuert:

Schaltplan

Dies ist eigentlich eine übliche Kathodenanzeige, daher geht das Programm davon aus, ebenso wie die besondere Verdrahtung der Figur. Der interessante Teil ist die refresh_display()Funktion, die regelmäßig aufgerufen werden sollte. Der Algorithmus ist wie folgt:

  • Fahren Sie die 7 Anoden mit den entsprechenden Signalen für eine der Ziffern, die wir anzeigen möchten
  • Set HIGHder Ausgabe, die steuert , daß der digit Kathode durch den NPN - Transistor
  • Warten Sie 2,5 ms (für eine Bildwiederholfrequenz von 100 Hz).
  • Stellen Sie LOWden kathodensteuernden Ausgang ein
  • gehe zur nächsten Ziffer.

Es ist zu beachten, dass das Warten durchgeführt wird, ohne die CPU zu blockieren, indem die im Arduino-Tutorial " Blinken ohne Verzögerung" beschriebene Technik verwendet wird . Hier ist das Programm:

const int NB_DIGITS     = 4;  // 4-digit display
const int FIRST_ANODE   = 2;  // anodes a..g on pins 2..8
const int FIRST_CATHODE = 9;  // cathodes, right to left, on pins 9..12

// Digits to display, from right to left.
uint8_t digits[NB_DIGITS];

// Set all the used pins as outputs.
void init_display()
{
    for (int i = 0; i < 7; i++)
        pinMode(FIRST_ANODE + i, OUTPUT);
    for (int i = 0; i < NB_DIGITS; i++)
        pinMode(FIRST_CATHODE + i, OUTPUT);
}

// This should be called periodically.
void refresh_display()
{
    // Our 7-segment "font".
    static const uint8_t font[10] = {
        //abcdefg
        0b1111110, // 0
        0b0110000, // 1
        0b1101101, // 2
        0b1111001, // 3
        0b0110011, // 4
        0b1011011, // 5
        0b1011111, // 6
        0b1110000, // 7
        0b1111111, // 8
        0b1111011  // 9
    };

    // Wait for 2.5 ms before switching digits.
    static uint32_t last_switch;
    uint32_t now = micros();
    if (now - last_switch < 2500) return;
    last_switch = now;

    // Switch off the current digit.
    static uint8_t pos;
    digitalWrite(FIRST_CATHODE + pos, LOW);

    // Set the anodes for the next digit.
    pos = (pos + 1) % NB_DIGITS;
    uint8_t glyph = font[digits[pos]];
    for (int i = 0; i < 7; i++)
        digitalWrite(FIRST_ANODE + i, glyph & 1 << (6-i));

    // Switch digit on.
    digitalWrite(FIRST_CATHODE + pos, HIGH);
}

/***********************************************************************
 * Example usage.
 */

void setup()
{
    init_display();
}

void loop()
{
    uint32_t now = millis();

    // Change the number displayed every second.
    static uint32_t last_change;
    if (now - last_change >= 1000) {
        digits[3] = digits[2];
        digits[2] = digits[1];
        digits[1] = digits[0];
        digits[0] = (digits[0] + 1) % 10;
        last_change = now;
    }

    refresh_display();
}

Paul hat einen Link zu einem Tutorial zu Parallax bereitgestellt , das die Verwendung der Multiplex7Seg Arduino-Bibliothek vorschlägt . Diese Bibliothek ist allgemeiner als der obige Beispielcode, da sie keine Annahmen über die verwendeten Pins macht. Der große Unterschied zwischen der Bibliothek und diesem Code besteht jedoch in der Art und Weise, wie die Timings verwaltet werden:

  • Die Bibliothek wird vom Timer 2-Überlauf-Interrupt gesteuert. Dies sollte ein sehr stabiles Timing bieten, auf Kosten eines Timers, der für diesen Job vorgesehen ist.
  • Der obige Code hängt davon ab, dass der Benutzer refresh_display()häufig genug anruft . Es erfordert keine dedizierten Hardwareressourcen, funktioniert aber nicht gut mit Programmen, die zu lange dauern loop(): Sie möchten nicht, dass Sie anrufen delay().
Edgar Bonet
quelle
Deshalb mag ich Open-Source-Sachen. Sie können die Arbeitslast mit dem Rest der Welt teilen und etwas wirklich Schönes schaffen. Was dann wieder mit dem Rest der Welt geteilt wird :) Sie können viel von anderen Entwicklern lernen und dieses Wissen wird beständig sein und nicht nur vor allen anderen verborgen bleiben.
Paul
Ich habe eine Frage zum Basiswiderstandswert von Tranistor. Ich habe ein großes Problem mit der Berechnung des Widerstandswerts. Was ist der Grund für die Verwendung eines 4,7K-Widerstands in vier 2N2222-Transistoren? Wenn ein einzelnes Segment 10 mA verbraucht, wird für alle Segmente einschließlich DP maximal 80 mA Strom gezogen. Wenn V (BE * sat) = 1,3 V und I (B) = 15 mA ist, reichen 300 Ohm aus. Ist meine Berechnung falsch?
März
@maruf: Das minimal erforderliche I_B ist das erwartete I_C geteilt durch die minimale Transistorverstärkung. Wenn Sie 80 mA am Kollektor wünschen und eine Verstärkung von mindestens 100 erwarten (es kann optimistisch sein, ich habe das Datenblatt nicht überprüft), dann benötigen Sie mindestens 80/100 = 0,8 mA an der Basis. Dann ist der Maximalwert des Basiswiderstands der Spannungsabfall über ihm (ungefähr 5 V - 0,7 V) geteilt durch diesen Strom oder ungefähr 5,3 kΩ.
Edgar Bonet
5

Ich werde versuchen, Sie durch die vollständigen Grundlagen von LEDs usw. zu führen. Da 4-stellige 7-Segment-Anzeigen eine Kombination mehrerer "LED-Techniken" sind.

Verdrahtungs-LEDs

LEDs oder Leuchtdioden sind eines der lustigen Dinge von Arduino.

Im Wesentlichen sind sie einfach zu bedienen, schalten sie ein und sie leuchten auf.

Sie können ärgerlich sein, weil sie eine gewisse Polarität haben, was bedeutet, dass sie nur funktionieren, wenn Sie sie richtig verkabeln. Wenn Sie die positive und negative Spannung umkehren, leuchten sie überhaupt nicht auf.

Ärgerlich wie es ist, ist es auch ziemlich nützlich.

Kathode gegen Anode

Bei einer herkömmlichen LED ist die lange Leitung die (+) Anode. Die andere Leitung ist die (-) Kathode.

"Oder, wenn jemand die Beine abgeschnitten hat, versuchen Sie, die flache Kante am äußeren Gehäuse der LED zu finden. Der Stift, der der flachen Kante am nächsten liegt, ist der negative Kathodenstift." - Sparkfun

Quelle: https://learn.sparkfun.com/tutorials/polarity/diode-and-led-polarity

Sparkfun

Grundverkabelung

Ich bin mir nicht sicher, ob dies korrekt ist, da ich das Bild aus dem Internet gerissen habe.

Grundlegende LED-Verkabelung

Das Verdrahten einer LED ist recht einfach. Die Anode (+) wird an eine positive Spannung angeschlossen, vorzugsweise über einen Strombegrenzungswiderstand. Die Kathode (-) wird mit Masse verbunden (mit einem Strombegrenzungswiderstand, falls Sie keinen auf der positiven Seite hatten).

Der Strombegrenzungswiderstand verhindert, dass die LED kurzgeschlossen wird und die LED oder der Mikrocontroller / Arduino beschädigt werden.

Mehrere LEDs, Matrizen, RGB-LEDs

Bei mehreren LEDs sind diese häufig mit der positiven Seite (+), der "gemeinsamen Anode" oder allen mit der (-) "gemeinsamen Kathode" verbunden.

Im Grunde kommt es darauf an.

Gemeinsame RGB-Kathode / Anode

Bei einer gemeinsamen Kathode versorgen Sie die Pins, die Sie haben möchten, mit Strom.

Bei einer gemeinsamen Anode wird der Strom durch die LED gesenkt.

Multiplexing (mehrstellig, 7-Segmente)

Sie sollten sich das Tutorial zur Parallaxe ansehen : http://learn.parallax.com/4-digit-7-segment-led-display-arduino-demo

Parallax 4digit7seg

Wenn Sie viele LEDs haben, ist es oft klug, sie zu "multiplexen". Normalerweise gehen Sie schnell durch "Gruppen" von LEDs, so dass es so aussieht, als ob alle gleichzeitig eingeschaltet sind.

Normalerweise versenken Sie Strom aus einer LED-Spalte und versorgen einzelne LEDs einer Reihe mit Strom.

Oder Sie versorgen eine Spalte mit LEDs mit Strom und senken den Strom von einzelnen LEDs einer Reihe.

Damit können Sie auswählen, welche Spalte aktiviert werden soll und welche LEDs dieser Spalte leuchten sollen. Durch schnelles Ändern dieser Spalten / Zeilen können Sie mehrere LEDs mit viel weniger Pins steuern.

Es gibt sogar Display-Controller dafür, wenn Sie sich nicht um das Umschalten in Ihrer Software kümmern möchten.

Wenn Sie also eine 4-stellige, gemultiplexte 7-Segment-gemeinsame Anode haben

Das Diagramm sieht eher so aus:

Geben Sie hier die Bildbeschreibung ein

http://www.mytutorialcafe.com/Microcontroller%20Application%20C%207segmen.htm

Paul
quelle