
Die Kursreihe kennenlernen
Lektion 1: Die 7-Segment-Anzeige
Um uns Werte (Zahlen) ausgeben zu lassen, können wir eine 7-Segmentanzeige verwenden.
Vorkentnisse:
Für den Schnupperkurs wird ein grundliegendes Verständniss von Funktionen benötige (Was sind Funktionen, wie werden sie erstellt/aufgerufen). Hier helfen dir der Starterkurs oder der Ergänzungskurses „Karel the Robot“.
Bauarten
7-Segmentanzeigen werden gerne genutzt, um die Ziffern 0-9 anzuzeigen.
Jedes Segment besteht bestehen aus einer oder mehreren LEDs, die in einem Gehäuse angeordnet und unabhängig von den anderen Segmenten beleuchtet (genutzt) werden können. Um die Anzahl der Pins zu reduzieren, werden alle Kathoden (Minuspole) oder alle Anoden (Pluspole) der LEDs zusammengeschaltet und gemeinsam aus dem Gehäuse geführt. Daher müssen wir allerdings die 2 Typen unterscheiden:
gemeinsame Kathode

Eine Verschaltung von Leuchtdioden mit gemeinsamer Kathode kennt ihr bereits aus dem Startkerkurs (beispielsweise das Lauflicht).
Hardware
Ob du ein Modul mit gemeinsamer Anode oder gemeinsamer Kathode verwendest, kannst du dem Datenblatt entnehmen. Alternativ kann das Bauelement auch einfach anschließen und als gemeinsame Kathode programmieren: Leuchten die Segmente auf, hast du „richtig geraten“, wenn nicht, einfach den COM-Pin an 5V anschließen.
TinkerCAD
Klickt das Bauteil an. In dem Menüfenster kannst du anschließend (analog zu den Widerständen) die Eigenschaften des Bauteils festlegen. Hier: Unter Allgemein „Katode“ oder „Anode“ auswählen und damit die Bauart „bestimmen“.
Die 7-Segmentanzeige
Hinweis: Wir nutzen im Folgenden ein Bauteil mit gemeinsamer Kathode (eng.: common cathode). Die Pinbelegung sowie die Syntax bleiben bei beiden Typen – bis auf den COM-Pin (GND/5V) – gleich.
Pinbelegung


Es gibt 2 COM-Anschlüsse.
Hinwies: Hier für GND, da wir ein Bauteil mit gemeinsamer Kathode verwenden.
Wenn du der dünne Linie auf der 7-Segment-Anzeige folgst, lässt sich erkennen, dass die Anschlüsse im Gehäuse bereits miteinander verbunden (kurzgeschlossen) sind. Natürlich können auch beide Pins mit GND verbunden werden.
Ohne Vorwiderstand
Im Internet sehe ich immer wieder Schaltungen ohne Vorwiderstände. Hier lauft ihr Gefahr, das Bauteil (hier die 7-Segment-Anzeige) oder das Board (den Arduino) zu beschädigen! Im Vergleich: Bei einer einzelnen LED ist die Gefahr nicht so groß, hier wird lediglich der Bandabstand verkleinert, wodurch die Lebensdauer der LED sinkt (mehr hierzu, wenn wir uns die LED im Detail anschauen).
Andere Widerstände
In „Optik mit dem Arduino“ betrachten wir den Vorwiderstand (beispielsweise von LEDs) genauer und lernen elektrische Netzwerke zu berechnen.
Die hier verwendete 7-Segmentanzeige benötigt 12mA, wodurch sich ein Widerstand von 250Ω ergibt. Durch Abgleich mit der Widerstandsreihe wurden die 220Ω-Widerstäne ausgewählt.
Durch anwendung der Maschenregel lernen wir später ebenfalls, dass alternativ auch nur 1 Widerstand am COM-Pin (hier GND) verwendet werden könnte. Durch die Bauteil-Toleranzen können in diesem Fall die einzelnen Segmente der Anzeige unterschiedich hell leuchten, in den meisten Fällen ist das aber bereits ausreichend (ok).

Pinbelegung
Ordne die Pins den passenden Bezeichnungen zu. Im Code (der nächsten Aufgabe) kannst du dann die einzelnen Segmente mit #define deklarieren.
Sie dir den Schaltplan oben genau an. Erkennst du die dünnen Linien?
Später (für andere Projekte) ist der vermutlich einfachste Weg, die einzelnen Segmente (automatisiert) einzeln anzusteuern und anschließend die Pins zuzuordnen. Nutze hierzu die Syntax (unten).
digitalWrite(4, HIGH);
delay(5000);
digitalWrite(4, LOW);
digitalWrite(5, HIGH);
delay(5000);
digitalWrite(5, LOW);
…
Syntax
Da die 7-Segment-Anzeige prinzipiell nichts anderes als gemeinsam Verschaltete LEDs sind, können wir auch die selben Befehle nutzen:



Der automatische Zähler
Schließe eine -Segment-Anzeige an und nutze die Zuordnung aus der vorherigen Aufgabe. Die Ziffern 0 – 9 sollen automatisch (mit je einer Pause von 1 Sekunde) von der 7-Segment Anzeige ausgegeben werden.
// Verwende Funktionen:
void Eins(){
}
void Zwei(){
}
// Wir wollen alle Ziffern 1x sehen (keine Endlosschleife)
void setup(){
Eins();
delay(1000);
Zwei();
delay(1000);
…
AUS(); // Schaltet alle Segmente aus
}
void loop(){
}
Wenn die Zahlen nicht richtig angezeigt werden, gibt es mehrere Möglichkeiten:
* Das Bauteil ist falsch angeschlossen
* Die deklaration (Zuweisung bei #define) ist falsch
* Du hast pinMode vergessen
Oder am Wahrscheinlichsten:
* Du hast vergessen die nicht benötigten Segmente auszustellen:
![]() | digitalWrite(b, HIGH); digitalWrite(a, LOW); |
void Zaehler(){
null();
alles_aus();
eins();
alles_aus();
zwei();
alles_aus();
drei();
alles_aus();
vier();
alles_aus();
fuenf();
alles_aus();
sechs();
alles_aus();
sieben();
alles_aus();
acht();
alles_aus();
neun();
alles_aus();
}
void setup(){
pinMode(13,OUTPUT);
pinMode(12,OUTPUT);
pinMode(11,OUTPUT);
pinMode(10,OUTPUT);
pinMode(9,OUTPUT);
pinMode(8,OUTPUT);
pinMode(7,OUTPUT);
pinMode(6,OUTPUT);
}
void loop(){
Zaehler();
}
// Die einzelnen Segmente ansteuern
void null(){
digitalWrite(7, HIGH);
digitalWrite(8, HIGH);
digitalWrite(9, HIGH);
digitalWrite(10, HIGH);
digitalWrite(11, HIGH);
digitalWrite(12, HIGH);
}
void eins(){
digitalWrite(7, HIGH);
digitalWrite(10, HIGH);
}
void zwei(){
digitalWrite(8, HIGH);
digitalWrite(9, HIGH);
digitalWrite(10, HIGH);
digitalWrite(11, HIGH);
digitalWrite(13, HIGH);
}
void drei(){
digitalWrite(7, HIGH);
digitalWrite(8, HIGH);
digitalWrite(10, HIGH);
digitalWrite(11, HIGH);
digitalWrite(13, HIGH);
}
void vier(){
digitalWrite(7, HIGH);
digitalWrite(10, HIGH);
digitalWrite(12, HIGH);
digitalWrite(13, HIGH);
}
void fuenf(){
digitalWrite(7, HIGH);
digitalWrite(8, HIGH);
digitalWrite(11, HIGH);
digitalWrite(12, HIGH);
digitalWrite(13, HIGH);
}
void sechs(){
digitalWrite(7, HIGH);
digitalWrite(8, HIGH);
digitalWrite(9, HIGH);
digitalWrite(11, HIGH);
digitalWrite(12, HIGH);
digitalWrite(13, HIGH);
}
void sieben(){
digitalWrite(11, HIGH);
digitalWrite(10, HIGH);
digitalWrite(7, HIGH);
}
void acht(){
digitalWrite(7, HIGH);
digitalWrite(8, HIGH);
digitalWrite(9, HIGH);
digitalWrite(10, HIGH);
digitalWrite(11, HIGH);
digitalWrite(12, HIGH);
digitalWrite(13, HIGH);
}
void neun(){
digitalWrite(7, HIGH);
digitalWrite(8, HIGH);
digitalWrite(10, HIGH);
digitalWrite(11, HIGH);
digitalWrite(12, HIGH);
digitalWrite(13, HIGH);
}
// Alle Segmente ausschalten und 1 Sekunde warten
void alles_aus(){
delay(1000);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
digitalWrite(9, LOW);
digitalWrite(10, LOW);
digitalWrite(11, LOW);
digitalWrite(12, LOW);
digitalWrite(13, LOW);
}
// Zuordnung der Pins
/ Erinnerung: define muss immer ganz oben im Code stehen
#define a 5
#define b 4
#define c 7
#define d 8
#define e 9
#define f 10
#define g 11
#define dp 6
void Zaehler(){
null();
alles_aus();
eins();
alles_aus();
zwei();
alles_aus();
drei();
alles_aus();
vier();
alles_aus();
fuenf();
alles_aus();
sechs();
alles_aus();
sieben();
alles_aus();
acht();
alles_aus();
neun();
alles_aus();
}
void setup(){
pinMode(13,OUTPUT);
pinMode(12,OUTPUT);
pinMode(11,OUTPUT);
pinMode(10,OUTPUT);
pinMode(9,OUTPUT);
pinMode(8,OUTPUT);
pinMode(7,OUTPUT);
pinMode(6,OUTPUT);
}
void loop(){
Zaehler();
}
// Die einzelnen Segmente ansteuern
// Die Ziffern 0-9
// In jeder Funktio müssen alle 7 (8) Pins mit HIGH und LOW stehen, sonst kommt es zu überlagerungen auf der Anzeige
void Null(){
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
}
void Eins(){
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
}
void Zwei(){
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(g, HIGH);
}
void Drei(){
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(g, HIGH);
}
void Vier(){
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
}
void Fuenf(){
digitalWrite(a, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
}
void Sechs(){
digitalWrite(a, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
}
void Sieben(){
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
}
void Acht(){
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
}
void Neun(){
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
}
// Alle Segmente ausschalten und 1 Sekunde warten
void alles_aus(){
delay(1000);
digitalWrite(a, LOW);
digitalWrite(b, LOW);
digitalWrite(c, LOW);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, LOW);
}
Wir rufen in der loop() „nur“ die Funktion Zaeler auf:
void Zaeler(){
eins();
alles_aus();
zwei();
alles_aus();
// …
}
Durch die Funktionen eins(), zwei(), … werden die einzelnen Segmente (a-g) so angesteuert, dass die Zahlen ausgegeben werden
In der Funktion alles_aus() passieren 2 „Sachen“:
* Es werden alle Segmente wieder ausgeschaltet, damit wir nicht ungewollt Segmente aufleuchten lassen.
* Wir warten 1 Sekunde, bevor durch erneutes aufrufen einer Funktion (eins(), zwei(), …) eine neue Zahl ausgegeben wird.
7-Segment-Anzeige mit 4 Digits
Wenn wir Zahlen größer als neun (>9) ausgeben wollen, benötigen wir mehr als „nur“ eine Anzeige. Die einzelnen Ziffern (eng. Digits) lassen sich über Multiplexing ansteuern, so dass wir die „Große“ Anzeige genauso leicht programmieren können, wie die „Kleine“.


Beim Thema Multiplexing werden am Anfang einige Fehler gemacht, die dazu führen, dass due Anzeige komische Zahlen ausgibt, das Display flackert oder erst garnicht funktioniert.
Genau diese Fehler sind leicht zu vermeiden, wenn man sich klar macht, was Multiplexing eigentlich bedeutet! Dann kann auch eine 7-Segment-Anzeige mit 4 Digits genauso programmiert werden, wie im Beispiel oben (mit eiem Digit).
Beim Multiplexing werden verschiedene Datensignle durch einen gemeinsamen Pfad oder eine gemeinsame Gruppe von Drähten (Bus genannt) geleitet. Die Signale können dann von mehreren Zielen (hier von den Digits, also von den einzelnen (4) Anzeigen) gemeinsam genutzt werden.
Mehr zu dem Thema und dem Ansteuern der 4-stelligen Anzeige schauen wir uns gemeinsam im Aufbaukurs an.
Vertiefungsübung
Die Vierstellige 7-Segment-Anzeige wird im Aufbaukurs zum Kern der Vertiefungsübung. In der Vertiefungsübung werden alle Kursinhalte (Die Bauteile Taster und 7-Segment-Anzeige, Rechenoperationen,Variablen Kontrollstrukturen, Vergleichsoperatoren) in einem größeren Hardware-Projekt wiederholt.
Das Ziel: Wir wollen mit der Hilfe von 2 Tastern einen Zähler programmieren, der die Zahlen von -999 bis 9999 darstellen kann. Wird die Zahl größer oder kleiner, wollen wir eine Laufschrift auf der Anzeige ausgeben!
Ausblick
Wissenswertes zum Bauteil: 7-Segment-Anzeige

Programmieren könne wir die Anzeige, jetzt haben wir nur 1 „Problem“: Die Pins! Wir haben alle digitalen Pins (des Arduino UNO) „verbraucht“.
Wir (er-)schaffen uns einfach zusätzliche Anschlüsse!
Möglichkeit 1
Wir können die analogen Pins A0-A5 „ganz normal“ als digitale Pins mit 0V oder 5V schalten. Das nutzen wir beipielsweise in der Vertiefungsübung am Ende dieses Kurses aus.
Möglichkeit 2
Wir erweitern unsere Schaltung um ein weiteres Bauteil: Das Schieberegister als Porterweiterung zum ansteuern mehrerer LEDs, 7-Segmentanzeigen und co. Für eine einstellige Anzeige werden dann beispielsweise nurnoch 3 digitale Pins und für die 4-stellige Anzeige 7 Pins (3+4) benötigen.
Und was ist mit den Pins 0 und 1?
Im Starterkurs haben wir gelernt, dass diese als Kommunikationsschnittstlle verwendet werden und wir deshab besser keine Bauelemente an die Tx-/Rx-Pins anschließen.
Wie eigentlich fast immer, gibt es auch hier mehrere Möglichkeiten, das Modul zu programmieren:
Arrays
Oft wird die 7-Segment-Anzeige mit Hilfe von Arrays programmiert. Hier werden satt Funktionen Arrays verwendet, um die Ziffern 0-9 zu programmieren (wann welches Segment an bzw. aus ist). Arrays behandeln wir im Kurs „Optik mit dem Arduino“
Bibliotheken
Natürlich gibt es auch eine Bibliothek, mit deren Hilfe die Anzeige programmiert werden kann: „SevSeg“. Bibliotheken können sehr hilfreich sein, wir lernen sie beispielsweise beim LCD-Modu kennen. Hier macht die Bibliothek nur das, was wir bereits programmiert haben, daher können wir darauf verzichten.
Vorgriff: In einem anderem Kurs lernen wir den Seriellen Minitor kennen.
Um den Seriellen Monitor anzusteuern, müssen wir eine Baudrate (Übertragungsrate von Bits pro Sekunde) vorgeben. Normalerweise verwenden wir hier 9600. Jetzt kann es allerdings passieren, dass die 7-Segment-Anzeige dann flackert, wenn du gleichzeitig Daten auf dem Seriellen Monitor ausgibst – und das obwohl du eigentlich keinen Fehler gemacht hast!
Ändert in diesem Fall einfach die Baudrate auf 115200.
Die Kursinhalte
Programmieren muss nicht schwer sein und Elektronik ist kein Hexenwerk!
Deshalb werden in allen Kursen der Ideenschmiede die Inhalte spielerisch leicht erklärt, so dass alle -egal ob Schüler/Studenten/Berufstätige teilnehmen können. Um sich tiefergeend mit den einzelnen Thematiken zu befassen gibt es die Punkte „Wissenswertes“, die mehr über die Informatik, den Aufbau (Elektronik) oder die Hintergründe verraten.
Die Inhlte der Ideenschmiede werden immer öfter für Messen/Ausstellungen, oder auch als Lehrgänge und Workshops in Kooperation mit Schulen, Unternehmen und Behören angefragt. Wenn Sie hier Interesse haben, kontaktieren Sie mich gerne! Ein breit aufgestelltes Angebot für Einzelpersonen ist bereits vorhanden und es gibt noch viel zu entdecken 😉