Wie verbinde ich diese 7-Segment-LED-Anzeige mit Arduino?

Ich habe die folgende LED-Anzeige, die ich an Arduino UNO anschließen möchte.

Laut Datenblatt gibt es einen Uhrstift. Muss ich dafür eine externe Taktquelle bauen oder kann ich sie von Arduino speisen?

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

Wir freuen uns über jeden praktischen Rat zum Anschließen.

Aktualisieren:

Dank Oli Glaser habe ich eine Skizze für Arduino erstellt und präsentiere sie hier, nur für den Fall, dass jemand die gleiche Art von LED-Anzeige hat.

const int CLOCK_PIN = 2; 
const int DATA_PIN  = 3; 
const int DATA_EN_PIN  = 4; 

const byte numbers[16] = {
                    0b11111100,
                    0b01100000,
                    0b11011010,
                    0b11110010,
                    0b01100110,
                    0b10110110,
                    0b10111110,
                    0b11100000,
                    0b11111110,
                    0b11100110,
                    0b11101110,
                    0b00111110,
                    0b10011100,
                    0b01111010,
                    0b10011110,
                    0b10001110
};

void loadLed(byte d1, byte d2, byte d3)
{
  digitalWrite(DATA_EN_PIN, 0);

  digitalWrite(DATA_PIN, 1);
  digitalWrite(CLOCK_PIN, 1);
  delayMicroseconds(5);
  digitalWrite(CLOCK_PIN, 0);
  delayMicroseconds(5);

  for (int i=7; i >= 0; i--)
  {
    if(d1 & (1 << i))
      digitalWrite(DATA_PIN, 1);
    else
      digitalWrite(DATA_PIN, 0);
    digitalWrite(CLOCK_PIN, 1);
    delayMicroseconds(5);      
    digitalWrite(CLOCK_PIN, 0);
    delayMicroseconds(5);
  }

  for (int i=7; i >= 0; i--)
  {
    if(d2 & (1 << i))
      digitalWrite(DATA_PIN, 1);
    else
      digitalWrite(DATA_PIN, 0);
    digitalWrite(CLOCK_PIN, 1);
    delayMicroseconds(5);      
    digitalWrite(CLOCK_PIN, 0);
    delayMicroseconds(5);
  }

  for (int i=7; i >= 0; i--)
  {
    if(d3 & (1 << i))
      digitalWrite(DATA_PIN, 1);
    else
      digitalWrite(DATA_PIN, 0);
    digitalWrite(CLOCK_PIN, 1);
    delayMicroseconds(5);      
    digitalWrite(CLOCK_PIN, 0);
    delayMicroseconds(5);
  }

  for (int i=0; i <= 10; i++)
  {
    digitalWrite(DATA_PIN, 0);
    digitalWrite(CLOCK_PIN, 1);
    delayMicroseconds(5);      
    digitalWrite(CLOCK_PIN, 0);
    delayMicroseconds(5);
  }
  digitalWrite(DATA_EN_PIN, 1);
}

void setup()
{
  pinMode(CLOCK_PIN, OUTPUT);
  pinMode(DATA_PIN, OUTPUT);
  pinMode(DATA_EN_PIN, OUTPUT);
  delay(100);
  loadLed(numbers[7], numbers[8], numbers[3]);
}


void loop()
{
}

Dies kann natürlich optimiert werden, aber es gibt ein kleines Problem - jeder fünfte Reset des Boards zeigt zufälligen Müll an. Versucht, mit Verzögerung zu spielen, auf 50 eingestellt - nicht gut. Suche nach Lösung.

Ihr ursprüngliches Bild war stark überdimensioniert. Ich habe es ohne Informationsverlust von 3,1 Mpix auf 160 kpix reduziert.

Antworten (1)

Die Takt- und Datenpins sind für Ihren seriellen Eingang. Diese können direkt vom Arduino aus gesteuert werden, verbinden Sie einfach jeden mit einem digitalen Ausgang.

Für die Datenroutine gibt es laut Datenblatt ein Startbit, gefolgt von 35 Datenbits, die der Tabelle "Serial Input Sequence" in Ihrer Frage entsprechen.

Erstellen Sie eine Funktion in Ihrer "Skizze", um das serielle Laden zu steuern, etwa wie unten - ich habe diesen Code nicht überprüft. Sie müssen es nur aufrufen, wenn Sie die Anzeige aktualisieren möchten.
Sie müssen die set_data_pinund set_clock_pindurch die richtigen Arduino-Aufrufe an die GPIO-Pins ersetzen, die Sie an die Taktdaten-Pins auf dem Display angeschlossen haben (ich verwende kein Arduino, daher kenne ich sie nicht). Dasselbe gilt für die (Mikrosekundenverzögerung) delay_us. kann an jedes gewünschte Timing angepasst werden, bis zu einer Taktrate von 500 kHz - Sie können eine Definition für den Wert hinzufügen, um das Ändern jedes einzelnen zu sparen.
Jedes Segment wird von MSB nach LSB verschoben, was A(MSB) nach DP(LSB) für jedes Eingabezeichen entspricht:

void load_data(char seg1, char seg2, char seg3)
{
    char i, temp;
    char position = 0;

    set_data_pin(1);  // clock start bit in
    set_clock_pin(1);
    delay_us(5);
    set_clock_pin(0);
    delay_us(5);

    temp = seg1;
    while(i<8)
    {
        set_data_pin(temp & 0x80);  // set data pin
        set_clock_pin(1);
        delay_us(5);
        set_clock_pin(0);
        delay_us(5);
        i++;
        temp = temp << i; // shift next bit out
    }

    temp = seg2;
    while(i<8)
    {
        set_data_pin(temp & 0x80);  // set data pin
        set_clock_pin(1);
        delay_us(5);
        set_clock_pin(0);
        delay_us(5);
        i++;
        temp = temp << i; // shift next bit out
    }

    temp = seg3;
    while(i<8)
    {
        set_data_pin(temp & 0x80);  // set data pin
        set_clock_pin(1);
        delay_us(5);
        set_clock_pin(0);
        delay_us(5);
        i++;
        temp = temp << i; // shift next bit out
    }

    // Last 11 bits - do something here if needed
    while(i<11)
    {
        set_data_pin(0);  // set data pin
        set_clock_pin(1);
        delay_us(5);
        set_clock_pin(0);
        delay_us(5);
        i++;
    }
}

Verbindungen

  • Verbinden Sie den VDD-Pin mit +5 V und den VSS-Pin mit Masse (0 V).
  • Verbinden Sie die VLED-Pins ebenfalls mit +5V.
  • Verbinden Sie den DATA ENABLE-Pin niedrig (dh mit Masse), da er aktiv niedrig ist .
  • Lassen Sie die Bits 25-34 Pins unbeschaltet, wenn Sie sie nicht verwenden möchten, andernfalls können Sie sie als digitale Ausgänge verwenden. Binden Sie sie nicht hoch oder niedrig (dh verbinden Sie sie nicht mit +5 V oder Masse)
  • Für den BC-Pin (Helligkeitssteuerung) können Sie nur einen Widerstand verwenden, um die Helligkeit zu fixieren, oder ein Potentiometer und einen Widerstand, um die Helligkeit des Displays zu steuern.
    Um den Wert zu ermitteln, können wir die Informationen im Datenblatt verwenden:

    1. Das absolute Maximum ICH F (Durchlassstrom) für das Display beträgt 30mA (S.2)
    2. Der Anzeigestrom ist typischerweise 36-mal größer als der Strom in den BC-Pin (Seite 4) und der maximale Strom in den BC-Pin ist 550 μ A (Seite 5)

    Mit diesen Informationen können wir also den besten Wert für den Pot ermitteln. Wenn wir ein typisches Betriebsmaximum von 20 mA anstreben, dann:

    + 5 v 20 M A ÷ 36 = 9 k Ω

    Dies ist der Mindestwiderstandswert, den wir verwenden würden (verbunden zwischen +5 V und BC-Pin).
    Wenn wir den Strom variieren möchten, sagen wir von 10 M A 20 M A , dann können wir a hinzufügen 9 k Ω Topf in Reihe mit dem Widerstand, dessen Schleifer an einem Ende (an beiden Enden) angeschlossen ist. Dann variiert der Strom zwischen:

    + 5 v 9 k Ω × 36 = 20 M A

    mit dem Topf ganz in die andere Richtung gedreht

    + 5 v 9 k Ω + 9 k Ω × 36 = 10 M A

    Beachten Sie, dass das Datenblatt mit Details zum Helligkeitssteuerstift nicht besonders hilfreich ist - es zeigt den Topf, der für eine variierende Spannungssteuerung im Diagramm eingerichtet ist, was die Dinge ein wenig verwirrt. Ich habe dieses Diagramm einfach ignoriert und das Geschriebene für richtig gehalten. Ich gehe auch davon aus, dass der Widerstand über die vollen 5 V liegt (dh der BC-Pin liegt knapp über 0 V), was wahrscheinlich nicht der Fall ist, aber es ist besser, auf der konservativen Seite zu sein, wenn keine Details angegeben werden.
    Dies bedeutet, dass Sie möglicherweise ein wenig experimentieren müssen, um die Helligkeit richtig einzustellen. Wenn es zu dunkel ist, versuchen Sie, auf einen niedrigeren Widerstand zu wechseln.

danke, ich werde versuchen, es in Kürze in Arduino zu "konvertieren" und mich mit weiteren Fragen an Sie zu wenden. Muss ich das in der Zwischenzeit nur einmal oder ständig aufrufen? Soll ich dem Data Enable-Pin 1 geben (mit +5 V verbinden)?
Soll ich VDD und VLED beide an Arduino +5V anschließen?
Sie müssen es nur aufrufen, wenn Sie die Anzeige aktualisieren möchten. Ich habe die Antwort ein wenig mit mehr Details aktualisiert.
Das hat super funktioniert, aber wie ich in meinem Update erwähnt habe, wird ungefähr jeder fünfte Reset Müll produzieren.
Das hört sich so an, als wäre es ein separates Problem, das möglicherweise nichts mit dem Code zu tun hat (zumindest nicht mit dem Teil, den Sie zeigen). Versuchen Sie, eine angemessene Verzögerung (z. B. 100 ms) beim Start (z. B. am Ende einer Init-Routine) hinzuzufügen, bevor Sie irgendwelche Daten an das Display senden. Wenn dies nicht hilft, benötigen wir weitere Details, um das Problem zu beheben. Ich würde eine neue Frage stellen und genau erwähnen, was passiert (verwendeter Reset-Prozess, Stromversorgung, welches Arduino, alle erfassten Oszilloskop- / Multimeterdaten usw.).
@Pablo - oops, ich habe vergessen, die zweite Verzögerung in die Routinen aufzunehmen, sorry. Ich habe aktualisiert - versuchen Sie, dies hinzuzufügen.
Ich habe den Code auch aktualisiert. Nicht gut. Sieht so aus, als hätte es etwas mit dem ersten Aufruf direkt nach dem Neustart zu tun (ich drücke die Reset-Taste auf dem Arduino oder lade einfach von der Arduino IDE). Wenn ich einen Countdown mache, wird der ursprünglich geladene Müll überschrieben und tritt nie auf. Ich lade ein Video hoch, um das Problem zu demonstrieren. Ich fürchte, wenn ich einen neuen Beitrag erstelle, kann er als Duplikat angesehen werden :)
Sie könnten versuchen, den Datenaktivierungsstift mit einem GPIO zu verbinden und ihn hoch zu halten, bis Sie einige Daten laden möchten (dh sie zur Routine hinzufügen). Fügen Sie außerdem einen 10k-Widerstand vom Datenaktivierungsstift zu V + hinzu, um sicherzustellen, dass er hoch ist bis Der Arduino initialisiert und übernimmt die Kontrolle über die Leitung (tun Sie dies früh in der Init-Routine)
Bingo! Die Datenaktivierung macht es absolut stabil !!! Eindrucksvoll! Ich habe den Code aktualisiert und die perfekte Antwort akzeptiert! Vielleicht gibt es dazwischen einen Datenburst.