7-Segmentanzeige am ESP32 programmieren – Zahlen & Buchstaben ohne Library
Am ESP32 ist ein OLED-Display per I2C schnell angeschlossen und mit wenig Code einsatzbereit. Trotzdem ist eine 7-Segmentanzeige in vielen Projekten genau die richtige Wahl – vor allem dann, wenn es um Zahlen, Zählerstände oder einfache Statusanzeigen geht. Sie ist sofort ablesbar, kommt ohne Menüs aus und konzentriert sich auf das Wesentliche. In diesem Beitrag zeige ich, wie eine 7-Segmentanzeige am ESP32 funktioniert und wie sich Zahlen sauber programmieren lassen.
https://youtu.be/jhgOORek6yg
Ein ähnliches Prinzip habe ich bereits am Arduino gezeigt. Im Beitrag Arduino Lektion 62: 7 Segmentanzeige wird die 7-Segmentanzeige ausführlich erklärt und programmiert. Der dort gezeigte Code lässt sich grundsätzlich auch auf den ESP32 übertragen, da sich die Logik zur Ansteuerung nicht unterscheidet. Mit diesem Artikel reiche ich den bisher fehlenden, passenden Beitrag speziell für den ESP32 nach und gehe dabei gezielt auf dessen Einsatz ein.
Aufbau einer 7-Segmentanzeige
7-Segmentanzeigen gibt es in unterschiedlichen Ausführungen. Neben der einfachen Variante mit einer einzelnen Ziffer, wie ich sie in diesem Beitrag verwende, sind auch vierstellige Anzeigen weit verbreitet. Zusätzlich existieren fertige Module auf einer Platine, die über eine I2C-Schnittstelle verfügen. Diese vereinfachen sowohl den Anschluss als auch die Programmierung, da nur wenige Leitungen benötigt werden.
Segmentanzeigen
14 Segmentanzeige
Unabhängig von der Bauform gibt es 7-Segmentanzeigen in zwei elektrischen Varianten: gemeinsame Kathode und gemeinsame Anode. Dieser Unterschied ist besonders wichtig beim Aufbau der Schaltung, da er bestimmt, ob ein Segment durch HIGH oder LOW aktiviert wird.
Welche Variante vorliegt, lässt sich in der Regel über die Typnummer auf der Anzeige ermitteln. Mithilfe dieser Kennzeichnung kann das passende Datenblatt im Internet gefunden werden. In meinem Fall handelt es sich um eine 7-Segmentanzeige vom Typ 5101AS, die über eine gemeinsame Kathode verfügt – die Segmente besitzen also einen gemeinsamen Minuspol.
Schaltung der 7-Segmentanzeige am ESP32
Für dieses Beispiel verwende ich eine 7-Segmentanzeige mit gemeinsamer Kathode. Die einzelnen Segmente A bis G (sowie optional DP) sind jeweils mit einem eigenen GPIO-Pin des ESP32 verbunden.
Der gemeinsame Anschluss der Segmentanzeige ist in meinem Aufbau über einen Vorwiderstand mit GND verbunden, was für diese Anwendung eine ausreichende Helligkeit liefert.
Wird ein GPIO-Pin auf HIGH gesetzt, leuchtet das zugehörige Segment. Auf diese Weise lassen sich die einzelnen Segmente gezielt ansteuern und zu Ziffern zusammensetzen.
Für die Schaltung benötige ich:
- einen ESP32* zbsp. den Wemos D1 R32*, - ein Micro-USB Datenkabel*, - diverse Breadboardkabel*, männlich-männlich, 10cm, - zwei 220 Ohm Widerstand*, - ein 400 Pin Breadboard*
Hinweis von mir: Die mit einem Sternchen (*) markierten Links sind Affiliate-Links. Wenn du über diese Links einkaufst, erhalte ich eine kleine Provision, die dazu beiträgt, diesen Blog zu unterstützen. Der Preis für dich bleibt dabei unverändert. Vielen Dank für deine Unterstützung!
Schaltung - ESP32 mit Segmentanzeige
ESP-WROOM-32 mit 7 Segmentanzeige
Wemos D1 R32 mit 7 Segmentanzeige
Zahlen mit einer 7-Segmentanzeige am ESP32 programmieren
Im folgenden Beispiel wird gezeigt, wie sich eine 7-Segmentanzeige am ESP32 ohne zusätzliche Libraries ansteuern lässt. Die Idee dahinter ist einfach: Für jede Ziffer wird festgelegt, welche Segmente aktiv sein müssen, und diese Information wird in einer übersichtlichen Tabelle abgelegt. Der ESP32 setzt diese Vorgaben anschließend direkt auf die entsprechenden GPIO-Pins um.
Der Quellcode ist bewusst kompakt gehalten und soll vor allem das Grundprinzip der Segmentansteuerung verdeutlichen. Auf dieser Basis lassen sich später problemlos Erweiterungen wie der Dezimalpunkt, weitere Ziffern oder mehrstellige Anzeigen realisieren.
// GPIO-Pins des ESP32 für die einzelnen Segmente // Benennung entspricht der Beschriftung auf der 7-Segmentanzeige #define a 16 #define b 27 #define c 5 #define d 13 #define e 12 #define f 17 #define g 25 #define dp 23 // Anzahl der Segmente (a–g + Dezimalpunkt) const int NUM_SEGMENTS = 8; // Array mit allen Segment-Pins in fester Reihenfolge // Reihenfolge ist wichtig, da sie später mit der DIGITS-Tabelle übereinstimmen muss constexpr uint8_t SEGMENT_DISPLAY = { a, b, c, d, e, f, g, dp }; // Segment-Matrix für die Ziffern 0–9 // true (1) = Segment an // false (0) = Segment aus constexpr bool DIGITS = { // a, b, c, d, e, f, g, dp { 1, 1, 1, 1, 1, 1, 0, 0 }, // 0 { 0, 1, 1, 0, 0, 0, 0, 0 }, // 1 { 1, 1, 0, 1, 1, 0, 1, 0 }, // 2 { 1, 1, 1, 1, 0, 0, 1, 0 }, // 3 { 0, 1, 1, 0, 0, 1, 1, 0 }, // 4 { 1, 0, 1, 1, 0, 1, 1, 0 }, // 5 { 1, 0, 1, 1, 1, 1, 1, 1 }, // 6 (dp aktiv) { 1, 1, 1, 0, 0, 0, 0, 0 }, // 7 { 1, 1, 1, 1, 1, 1, 1, 0 }, // 8 { 1, 1, 1, 1, 0, 1, 1, 0 }, // 9 }; void setup() { Serial.begin(9600); // Alle Segment-Pins als Ausgang konfigurieren for (int pin = 0; pin < NUM_SEGMENTS; pin++) { pinMode(SEGMENT_DISPLAY, OUTPUT); } } void loop() { // Ziffern von 0 bis 9 nacheinander anzeigen for (int digit = 0; digit











