Vierstellige 7-Segment Anzeige mit Multiplex Ansteuerung
Bei den LED Anzeigen mit mehreren Ziffern handelt es sich vom Prinzip um eine Aneinanderreihung einzelner 7-Segmentanzeigen in einem gemeinsamen Gehäuse. Die Segmente A-G plus der Dezimalpunkt DP sind bei allen Ziffern intern miteinander verbunden. Die GND Leitungen der Anzeigen sind einzeln herausgeführt und mit D1-D4 gekennzeichnet (bei Anzeigen mit gemeinsamen Minuspol).
Möchte man beispielsweise eine 8 anzeigen, werden die Segmente A-G mit HIGH angesteuert. Die Spannung liegt jetzt an alle 4 Anzeigen an. Welche der 4 Anzeigen schließlich leuchtet, wird über den GND Anschluss gesteuert. Legt man D1 auf LOW, wird die 8 in der ersten Anzeige dargestellt. Legt man D1-D4 auf LOW wird die 8 bei allen 4 Anzeigen dargestellt. Mit diesem Aufbau ist es nicht möglich verschiedene Ziffer gleichzeitig darzustellen. Dafür kommt das Multiplexen zum Einsatz. Multiplexen kann rein über eine Softwareansteuerung erfolgen oder über externe LED Treiber IC's. Extra IC's haben den Vorteil, dass sie den Controller für andere Aufgaben entlasten.
Software Multiplexen
Beim Multiplexen wird das menschliche Auge getäuscht. Ab einer Bildwiederholung von 100Hz kann man nicht mehr einzeln erkennen ob eine LED ein- oder ausgeschaltet ist. Man nimmt nur noch ein mittleres Helligkeitsniveau wahr. Wenn man eine LED pro Sekunde 100x ein- und 100x ausschalten möchte, hat man dafür 100Hz/1000ms = 10ms Zeit. Also 5ms an und 5ms aus. Bei einer Vierer-Anzeige passt dies Umrechnung nicht ganz, da eine Anzeige 5ms an ist und dann für die drei anderen Anzeigen 15ms aus. Durch Versuche kann man sich aber herantasten ab wann die Anzeige ohne flackern leuchtet.
Schaltung und Programmcode
In dieser Schaltung ist zur Vereinfachung des Aufbaus nur ein Vorwiderstand je Anzeige bzw. je 8 Segmente eingesetzt worden. Es wurde ein 300Ω Widerstand verwendet. Falls der komplette Strom am Widerstand abfällt, würde der Arduino Ausgang noch nicht überlastet (5V/300Ω≈ 17mA) werden. Die LED kann beim Multiplexen übrigens stärker belastet werden. Wenn sie nur 10% der Zeit an ist kann jedes Segment laut Datenblatt statt mit max 30mA mit max 160mA bestromt werden. In unserem Fall ist jedes Segment 25% der Zeit bestromt. Unser Maximalwert dürfte also irgendwo dazwischen liegen. Eine höhere Stromstärke ist beim Multiplexen übrigens notwendig um die gleiche Helligkeit wie bei der direkten Ansteuerung zu erreichen.
// Arrays mit den Anschluss-Pins definieren
int digitPins[] = {10, 11, 12, 13}; //D1=10|D2=11|D3=12|D4=13
int segmentPins[] = {2, 3, 4, 5, 6, 7, 8, 9}; //A=2|B=3|C=4|D=5|E=6|F=7|G=8|DP=9
// Definition der Zahlen (A B C D E F G DP)
const byte segmente[] = { B11111100, // 0
B01100000, // 1
B11011010, // 2
B11110010, // 3
B01100110, // 4
B10110110, // 5
B10111110, // 6
B11100000, // 7
B11111110, // 8
B11110110, // 9
B00000000 }; // AUS
void setup () {
// Pins als Ausgänge definieren
for (int i = 0; i < 4; i++) pinMode(digitPins[i], OUTPUT);
for (int i = 0; i < 8; i++) pinMode(segmentPins[i], OUTPUT);
}
void loop() {
byte d = 5; // Anzeigedauer in ms
Anzeigen(1, 1); delay(d);
Anzeigen(2, 2); delay(d);
Anzeigen(3, 3); delay(d);
Anzeigen(4, 4); delay(d);
}
// Funktion zum Anzeigen
void Anzeigen (byte s, byte d) {
//Zunächst alle DigitPins ausschalten (auf HIGH legen)
for (int i = 0; i < 4; i++) digitalWrite(digitPins[i], HIGH);
//... dann die Segmente mit +5V versorgen
byte seg = segmente[s];
for (int i = 0; i < 8; i++) {
digitalWrite(segmentPins[i], bitRead(seg, 7 - i));
}
//... und dann den Ausgang für die gewählte Anzeige wieder mit GND verbunden
digitalWrite(digitPins[d - 1], LOW);
}