Beim Video zum Tutorial „Serielle Sieben-Segment-Displays von Sparkfun“ wurde in einem Kommentar gefragt, ob man problemlos auch mehrere dieser Displays gleichzeitig betreiben kann. Ich zeige im folgenden Video anhand eines kleinen Beispielprojekts, wie das geht und welche Änderungen im Arduino Sketch dazu notwendig sind.


Solange man noch einen weiteren freien Pin zur Ansteuerung zur Verfügung hat, kann man am Arduino auch noch weitere Display anschließen. Allerdings weiß ich nicht, ab wann dafür eine eigene Stromversorgung für die Anzeigen notwendig ist. Bei den zwei Display im Video war es noch kein Problem, diese über den Arduino zu versorgen.

Hier ist der im Video besprochene Arduino Sketch. Bitte beachten, dass der Schwellenwert des lichtempfindlichen Widerstand (im Sketch auf 200) je nach Eigenschaften des Bauelements und ja nach verwendetem Widerstand (bei mir 220 Ohm) im Spannungsteiler angepasst werden muss. Da der Messwert laufend am Display angezeigt wird, lässt sich dieser Schwellenwert leicht ermitteln.

#include <SoftwareSerial.h>

const int ldrPin = 0;

int displayValue = 0;
char tempString[10];

unsigned long timeStart = 0;
unsigned long timeDiff = 0;

// readPin, writePin
SoftwareSerial display1(4, 2);
SoftwareSerial display2(4, 3);

void setup() {
 display1.begin(9600);
 display2.begin(9600);
 
 clearDisplay(display1);
 clearDisplay(display2);
 
 setBrightness(display1,255);
 setBrightness(display2,255);
 
 // Doppelpunkt zwischen Zeichen 2 und 3 einschalten
 setDecimals(display1, 0b00010000);
 timeStart = millis();
 
}

void loop() {
 // Wenn der Wert vom lichtempfindlichen Widerstand
 // unter eine bestimmte Grenze fällt, dann Zeitnehmung
 // neu starten.
 if (analogRead(ldrPin) < 200) {
 timeStart = millis();
 }

 // Differenz in Millisekunden berechnen und durch 10
 // Ergebnis ist Zeit in Sekunden und Hundertstel Sek.
 // und kann direkt angezeigt werden
 timeDiff = millis() - timeStart;
 timeDiff = timeDiff / 10;
 
 // Max. 4-stellige Anzeige
 if (timeDiff > 9999) {
 timeDiff = 9999;
 }
 
 // Zeit in sshh ausgeben
 sprintf(tempString, "%04d", timeDiff);
 display1.print(tempString);
 
 sprintf(tempString, "%04d", analogRead(ldrPin));
 display2.print(tempString);
 
 delay(10);
 
}


// Send the clear display command (0x76)
// This will clear the display and reset the cursor
void clearDisplay(SoftwareSerial &s7s) {
 s7s.write(0x76);
}

// Set the displays brightness. Should receive byte with the value
// to set the brightness to
// dimmest------------->brightest
// 0--------127--------255
void setBrightness(SoftwareSerial &s7s, byte value)
{
 s7s.write(0x7A); // Set brightness command byte
 s7s.write(value); // brightness data byte
}

// Turn on any, none, or all of the decimals.
// The six lowest bits in the decimals parameter sets a decimal 
// (or colon, or apostrophe) on or off. A 1 indicates on, 0 off.
// [MSB] (X)(X)(Apos)(Colon)(Digit 4)(Digit 3)(Digit2)(Digit1)
void setDecimals(SoftwareSerial &s7s, byte decimals)
{
 s7s.write(0x77);
 s7s.write(decimals);
}  

Code-Sprache: Arduino (arduino)

Fragen zum Projekt bitte einfach in die Kommentare schreiben.

2 thoughts on “Mehrere serielle 7-Segment-Displays gleichzeitig am Arduino betreiben

  • 20. Dezember 2014 at 9:51
    Permalink

    Hallo Adi,
    Danke nochmals für das Tutorial. Ich habe meinen Aufbau wie folgt gestaltet:
    Display 1 zeigt die Gesamte Rennzeit an.
    Nun kommt die Frage, wie kann ich Display 2 aufteilen damit D1 und D2 die linke Bahn mit den gefahrenen Runden und D3 und D4 die rechte Bahn mit den gefahrenen Runden anzeigt?
    Mein Problem besteht in Zeile 54 das „x04d“.
    Beim lesen des LDR <200 lass ich einen rzahler_R++ mit laufen. Die Ausgabe klappt auch mit "x04d" aber
    eben nur auf dem ganzen Display. Irgendwie bin ich nicht in der Lage die Commands wie sie bei Sparkfun gelistet sind in der Zeile einzubauen. https://learn.sparkfun.com/tutorials/using-the-serial-7-segment-display/
    Da gibt es ja die Ansteuerung über 0x7B – 0x7C – 0x7D – 0x7E.
    Über einen Denkanstoß würde ich mir sehr freuen.

    Grüße und ein schönes 4. Adventswochenende,
    Fritz

    Reply
    • 20. Dezember 2014 at 12:59
      Permalink

      Wenn du weiterhin einfach eine vierstellige Zahl an das Display schicken möchtest, dann kannst du die linke Rundenzahl einfach mal 100 nehmen, also z.B.:

      int rundenbahn1 (da steht z.B. 7 drin)
      int rundenbahn2 (da steht z.B. 8 drin)
      int displayValue = rundenbahn1*100 + rundenbahn2 (ergibt 7*100+8 = 708)

      Wenn du damit dann
      sprintf(tempString, „%04d“, displayValue);
      machst, dann kriegst du wieder „0708“ und kannst das am Display anzeigen.

      Alternativ geht auch (da bin ich mir aber nicht ganz sicher), die beiden Zahlen jeweils zweistellig hintereinander ans Display zu schicken, also z.B.:

      sprintf(tempString, „%02d“, rundenbahn1); // Das formatiert die Zahl auf 2 Stellen mit führender Null, falls Zahl < 10 display2.print(tempString); sprintf(tempString, "%02d", rundenbahn2); display2.print(tempString); Ich glaube das müsste auch gehen. Das Display nimmt die Stellen einfach wie sie daherkommen und füllt von links auf. Du musst nur aufpassen, dass es gesamt immer nur 4 Stellen sind, also keine Bahn < 99 Runden kommt. Sonst gibts Zahlensalat, da das Display nach dem 4 Zeichen wieder links anfängt.

      Reply

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Time limit is exhausted. Please reload the CAPTCHA.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.