← Alle MakerNEWS

ESP32

ESP32 GPIO einfach erklärt: Eingänge, Ausgänge, HIGH und LOW

Herr Brinke 12 Minuten Lesezeit Aktualisiert: 29/08/2026
harrison broadbent LXdDYiL w unsplash scaled

Auf dem ESP32 befinden sich jede Menge kleine Anschlüsse.

Aber wofür sind die eigentlich da?

Über diese Anschlüsse kann der ESP32 mit der Außenwelt kommunizieren.

Er kann zum Beispiel erkennen, ob ein Taster gedrückt wurde, und daraufhin eine LED einschalten.

Das klingt simpel, ist aber eine wichtige Grundlage:

Fast jedes ESP32-Projekt besteht daraus, Informationen einzulesen, zu verarbeiten und anschließend etwas zu steuern.

In diesem Beitrag schauen wir uns deshalb die GPIO-Pins des ESP32 genauer an.

Ganz einfach und ohne unnötige Fachbegriffe.


Was bedeutet GPIO?

Die Abkürzung GPIO steht für:

General Purpose Input/Output

Auf Deutsch ungefähr:

Allgemein verwendbarer Ein- und Ausgang

Das klingt kompliziert.

Gemeint ist aber einfach ein Anschluss des ESP32, der für unterschiedliche Aufgaben verwendet werden kann.

Ein GPIO kann beispielsweise als Eingang verwendet werden.

Dann kann der ESP32 etwas erkennen.

Zum Beispiel:

  • Taster gedrückt
  • Schalter eingeschaltet
  • Bewegung erkannt
  • Tür geöffnet
  • Sensor aktiv

Oder ein GPIO wird als Ausgang verwendet.

Dann kann der ESP32 etwas steuern.

Zum Beispiel:

  • LED einschalten
  • Summer aktivieren
  • Relais ansteuern
  • Signal ausgeben

Damit kommen wir wieder zu unserem wichtigsten Grundprinzip:

Eingabe → Verarbeitung → Ausgabe


Was ist ein Eingang?

Beginnen wir mit dem Eingang.

Auf Englisch:

INPUT

Ein Eingang liefert dem ESP32 eine Information.

Ein einfaches Beispiel ist ein Taster.

TASTER
  ↓
ESP32

Der ESP32 möchte wissen:

Ist der Taster gedrückt?

Dafür wird ein GPIO als Eingang eingestellt.

Zum Beispiel:

pinMode(21, INPUT);

Damit sagen wir:

GPIO 21 soll als Eingang verwendet werden.

Anschließend können wir den Zustand dieses Eingangs auslesen.

Dafür gibt es:

digitalRead(21);

digitalRead() bedeutet vereinfacht:

Lies den Zustand dieses Pins.


Was ist ein Ausgang?

Das Gegenteil eines Eingangs ist ein Ausgang.

Auf Englisch:

OUTPUT

Hier bekommt der ESP32 keine Information.

Stattdessen gibt er etwas aus.

Zum Beispiel:

ESP32
  ↓
 LED

Der ESP32 entscheidet:

LED einschalten.

Oder:

LED ausschalten.

Dafür wird der GPIO zunächst als Ausgang eingestellt:

pinMode(21, OUTPUT);

Anschließend können wir den Ausgang steuern:

digitalWrite(21, HIGH);

oder:

digitalWrite(21, LOW);

HIGH und LOW einfach erklärt

Jetzt tauchen zwei Begriffe auf, die beim ESP32 ständig vorkommen:

HIGH

und

LOW

Für den Anfang kann man sich merken:

HIGH = 1

LOW = 0

Bei einem digitalen Ausgang kann man sich zusätzlich vereinfacht vorstellen:

HIGH = EIN

LOW = AUS

Bei unserer LED bedeutet das beispielsweise:

digitalWrite(21, HIGH);

LED einschalten

und:

digitalWrite(21, LOW);

LED ausschalten

Ganz so einfach ist HIGH = EIN und LOW = AUS technisch nicht immer. Für den Einstieg ist diese Vorstellung aber zunächst sehr hilfreich.


Was bedeutet digital?

Warum sprechen wir eigentlich von einem digitalen Eingang oder digitalen Ausgang?

Digital bedeutet hier:

Es gibt zwei Zustände.

Zum Beispiel:

0 oder 1

LOW oder HIGH

AUS oder EIN

Ein Taster ist ein gutes Beispiel.

Er kann vereinfacht zwei Zustände besitzen:

nicht gedrückt

oder

gedrückt

Eine LED ebenfalls:

aus

oder

an

Das sind digitale Zustände.


Unsere erste Ausgangsschaltung: eine LED

Eine LED ist perfekt, um einen Ausgang zu verstehen.

Wir benötigen:

  • ESP32
  • Breadboard
  • LED
  • Vorwiderstand
  • Jumper-Kabel

Für ein einfaches Experiment kann beispielsweise ein 220-Ω-Widerstand verwendet werden. Auch Newbiely verwendet bei seinem ESP32-LED-Beispiel einen entsprechenden Vorwiderstand.

Der Widerstand ist wichtig, weil er den Strom durch die LED begrenzt.


Warum braucht die LED einen Widerstand?

Eine LED sollte nicht einfach direkt zwischen einen GPIO und GND gesteckt werden.

Ohne geeignete Strombegrenzung könnte zu viel Strom fließen.

Das kann die LED beschädigen und im ungünstigen Fall auch den ESP32 belasten.

Deshalb verwenden wir einen Vorwiderstand.

Vereinfacht:

GPIO
 │
 │
Widerstand
 │
 │
LED
 │
 │
GND

Der Widerstand begrenzt den Strom.


Achtung bei der LED: Plus und Minus

Eine normale LED besitzt eine Richtung.

Sie hat:

Anode = Plus-Seite

und

Kathode = Minus-Seite

Bei vielen bedrahteten LEDs erkennt man:

langes Bein → Anode

kurzes Bein → Kathode

Außerdem ist das LED-Gehäuse auf der Kathodenseite häufig abgeflacht.

Wird eine LED falsch herum eingebaut, leuchtet sie normalerweise nicht.


LED an den ESP32 anschließen

Für unser Beispiel verwenden wir:

GPIO 21

Die Schaltung besteht vereinfacht aus:

GPIO 21
   │
   │
 Widerstand
   │
   │
  LED
   │
   │
  GND

Damit kann der ESP32 die LED über GPIO 21 steuern.


Das erste LED-Programm

Jetzt brauchen wir ein Programm.

#define LED_PIN 21

void setup() {

  pinMode(LED_PIN, OUTPUT);

}

void loop() {

  digitalWrite(LED_PIN, HIGH);

}

Schauen wir uns die wichtigen Stellen an.


Einen Namen für den GPIO vergeben

Diese Zeile:

#define LED_PIN 21

bedeutet:

Unsere LED ist mit GPIO 21 verbunden.

Statt später überall:

21

zu schreiben, verwenden wir:

LED_PIN

Das macht den Code verständlicher.


Den GPIO als Ausgang festlegen

Jetzt kommt:

pinMode(LED_PIN, OUTPUT);

Damit teilen wir dem ESP32 mit:

Dieser GPIO wird als Ausgang verwendet.

Diese Einstellung muss nur einmal erfolgen.

Deshalb steht sie in:

setup()

LED einschalten

Jetzt kommt:

digitalWrite(LED_PIN, HIGH);

Damit wird der Ausgang auf HIGH gesetzt.

Unsere LED leuchtet.

Möchten wir sie ausschalten, verwenden wir:

digitalWrite(LED_PIN, LOW);

Das ist bereits die grundlegende Steuerung eines digitalen Ausgangs.


Die LED blinken lassen

Jetzt können wir daraus eine kleine Schleife machen:

#define LED_PIN 21

void setup() {

  pinMode(LED_PIN, OUTPUT);

}

void loop() {

  digitalWrite(LED_PIN, HIGH);

  delay(1000);

  digitalWrite(LED_PIN, LOW);

  delay(1000);

}

Das Programm macht:

LED EIN
   ↓
1 Sekunde warten
   ↓
LED AUS
   ↓
1 Sekunde warten
   ↓
wieder von vorne

Die LED blinkt.

Damit haben wir unseren ersten digitalen OUTPUT verstanden.


Jetzt brauchen wir einen Eingang

Eine blinkende LED ist nett.

Interessanter wird es aber, wenn der ESP32 auf seine Umgebung reagieren kann.

Dafür brauchen wir einen Eingang.

Unser einfachstes Beispiel:

ein Taster

Der ESP32 soll erkennen:

Wurde der Taster gedrückt?


Wie funktioniert ein Taster?

Ein Taster ist eigentlich nur ein einfacher Schalter.

Nicht gedrückt:

──────  ──────

Die Verbindung ist unterbrochen.

Gedrückt:

──────────────

Die Verbindung ist geschlossen.

Das kann der ESP32 erkennen.


Warum haben viele Taster vier Beine?

Ein kleiner Breadboard-Taster besitzt häufig vier Anschlüsse.

Das kann zunächst verwirrend sein.

Eigentlich werden aber nur zwei elektrische Anschlüsse benötigt.

Jeweils zwei Pins sind intern bereits miteinander verbunden. Die vier Beine sorgen unter anderem dafür, dass der Taster stabil auf einer Platine sitzt.

Deshalb ist es wichtig, den Taster auf dem Breadboard richtig herum einzusetzen.


Der Taster am ESP32

Wir machen es uns einfach.

Eine Seite des Tasters verbinden wir mit:

GPIO 21

Die andere Seite mit:

GND

Vereinfacht:

GPIO 21
   │
   │
 TASTER
   │
   │
  GND

Jetzt fehlt allerdings noch etwas.


Das Problem mit einem offenen Eingang

Ist der Taster gedrückt, wird GPIO 21 mit GND verbunden.

Das ist eindeutig.

Aber was passiert, wenn der Taster nicht gedrückt wird?

Dann hängt der Eingang praktisch in der Luft.

Der ESP32 kann dann möglicherweise keine eindeutige HIGH- oder LOW-Information erkennen.

Das nennt man einen:

Floating Input

oder auf Deutsch:

schwebenden Eingang.

Das wollen wir vermeiden.


Der Pull-up-Widerstand

Dafür gibt es sogenannte:

Pull-up-Widerstände

Der Widerstand sorgt dafür, dass der Eingang einen definierten Zustand besitzt, solange der Taster nicht gedrückt wird.

Praktischerweise besitzt der ESP32 solche Widerstände bereits intern.

Wir müssen deshalb für diese einfache Taster-Schaltung keinen zusätzlichen Widerstand einbauen.

Wir schreiben:

pinMode(21, INPUT_PULLUP);

Damit sagen wir:

Verwende GPIO 21 als Eingang und aktiviere zusätzlich den internen Pull-up-Widerstand.

Newbiely empfiehlt für einfache ESP32-Tasterprojekte ebenfalls die Verwendung des internen Pull-up-Widerstands, da dadurch die Schaltung einfacher wird.


Jetzt passiert etwas scheinbar Seltsames

Bei unserer Schaltung gilt:

Taster NICHT gedrückt

→ HIGH

und:

Taster gedrückt

→ LOW

Moment.

Ist das nicht genau falsch herum?

Es wirkt zunächst so.

Aber durch den Pull-up-Widerstand ist das völlig normal.

Man kann sich merken:

INPUT_PULLUP + Taster gegen GND

nicht gedrückt = HIGH

gedrückt = LOW

Das begegnet einem bei Mikrocontroller-Projekten sehr häufig.


Taster programmieren

Jetzt können wir unseren Taster auslesen.

#define BUTTON_PIN 21

void setup() {

  Serial.begin(115200);

  pinMode(BUTTON_PIN, INPUT_PULLUP);

}

void loop() {

  int buttonState = digitalRead(BUTTON_PIN);

  Serial.println(buttonState);

  delay(100);

}

Was passiert hier?


Tasterzustand lesen

Diese Zeile:

int buttonState = digitalRead(BUTTON_PIN);

liest den Zustand des Eingangs.

Das Ergebnis wird in der Variable:

buttonState

gespeichert.

Der Wert kann sein:

HIGH

oder:

LOW

Zustand im Serial Monitor anzeigen

Mit:

Serial.println(buttonState);

zeigen wir den Wert im Serial Monitor an.

Ohne gedrückten Taster sehen wir beispielsweise:

1
1
1
1
1
1

Drücken wir den Taster:

0
0
0
0
0

Lassen wir ihn wieder los:

1
1
1
1
1

Dabei gilt:

1 = HIGH = nicht gedrückt

0 = LOW = gedrückt

Damit haben wir unseren ersten digitalen INPUT.


Jetzt verbinden wir Eingang und Ausgang

Jetzt kommt der interessante Teil.

Wir verwenden:

einen Taster als Eingang

und:

eine LED als Ausgang

Unser ESP32 soll:

Die LED einschalten, wenn der Taster gedrückt wird.

Damit haben wir eine vollständige kleine Steuerung:

TASTER
   ↓
 INPUT
   ↓
 ESP32
   ↓
PROGRAMM
   ↓
 OUTPUT
   ↓
  LED

Das Programm

Wir verwenden beispielsweise:

GPIO 21 für die LED

und:

GPIO 18 für den Taster

#define LED_PIN 21
#define BUTTON_PIN 18

void setup() {

  pinMode(LED_PIN, OUTPUT);

  pinMode(BUTTON_PIN, INPUT_PULLUP);

}

void loop() {

  int buttonState = digitalRead(BUTTON_PIN);

  if (buttonState == LOW) {

    digitalWrite(LED_PIN, HIGH);

  }
  else {

    digitalWrite(LED_PIN, LOW);

  }

}

Jetzt passiert:

Taster nicht gedrückt
        ↓
      HIGH
        ↓
     LED AUS

und:

Taster gedrückt
       ↓
      LOW
       ↓
     LED EIN

Damit haben wir bereits eine echte kleine Steuerung gebaut.


INPUT und OUTPUT im Vergleich

Die beiden wichtigsten GPIO-Betriebsarten lassen sich einfach zusammenfassen:

EinstellungAufgabeBeispiel
INPUTInformation einlesenSensor
INPUT_PULLUPEingang mit internem Pull-upTaster
OUTPUTetwas steuernLED

Für viele erste Projekte reichen diese drei Einstellungen bereits aus.


digitalRead() und digitalWrite()

Auch diese beiden Befehle sollte man auseinanderhalten.

digitalRead()

digitalRead()

bedeutet:

lesen

Beispiel:

digitalRead(BUTTON_PIN);

Der ESP32 möchte wissen:

Welchen Zustand hat der Taster?


digitalWrite()

digitalWrite()

bedeutet:

schreiben bzw. Ausgang setzen

Beispiel:

digitalWrite(LED_PIN, HIGH);

Der ESP32 sagt:

Schalte den Ausgang auf HIGH.

Als Eselsbrücke:

READ  → ESP32 bekommt Information

WRITE → ESP32 gibt Information aus

GND: Ein unscheinbarer, aber wichtiger Anschluss

Bei fast jeder Schaltung taucht die Abkürzung:

GND

auf.

GND steht für:

Ground

oder:

Masse

Vereinfacht kann man sich GND als gemeinsamen Bezugspunkt der Schaltung vorstellen.

Viele Komponenten müssen denselben Bezugspunkt besitzen.

Deshalb sieht man bei ESP32-Schaltungen sehr häufig Verbindungen zu GND.

Fehlt diese Verbindung, funktioniert eine Schaltung möglicherweise nicht oder verhält sich merkwürdig.


3,3 Volt: Beim ESP32 besonders wichtig

Der klassische ESP32 arbeitet an seinen GPIOs mit 3,3-V-Logik.

Das ist ein wichtiger Punkt.

Ein HIGH-Signal entspricht also nicht einfach automatisch den 5 Volt, die vielleicht von klassischen Arduino-Projekten bekannt sind.

Deshalb gilt:

Nicht einfach jedes 5-V-Signal mit einem ESP32-GPIO verbinden.

Vor dem Anschluss eines Sensors oder Moduls sollte geprüft werden:

  • Welche Versorgungsspannung benötigt das Modul?
  • Welche Signalspannung gibt das Modul aus?
  • Ist diese Spannung für den ESP32 geeignet?

Das ist besonders wichtig, wenn Module eigentlich für 5-V-Systeme gedacht sind.


GPIO ist nicht gleich Stromversorgung

Ein weiterer wichtiger Punkt:

Ein GPIO ist zum Steuern von Signalen gedacht.

Er ist keine kleine Steckdose.

Eine normale LED mit geeignetem Vorwiderstand ist für ein erstes Experiment geeignet.

Größere Verbraucher gehören aber nicht direkt an einen GPIO.

Zum Beispiel:

  • Motor
  • Pumpe
  • Heizdraht
  • starke Lampe
  • leistungsstarker LED-Streifen
  • Magnetventil

Solche Verbraucher benötigen eine geeignete Treiberschaltung.

Dafür können beispielsweise verwendet werden:

  • Transistoren
  • MOSFETs
  • Motortreiber
  • Relaismodule

und häufig:

eine externe Stromversorgung


Kann jeder GPIO für alles verwendet werden?

Nein.

Und das ist beim ESP32 wichtig.

Auf einem ESP32-Board befinden sich viele Pins, aber nicht jeder Pin eignet sich für jede Aufgabe.

Einige Pins können besondere Funktionen besitzen oder während des Startvorgangs des ESP32 eine Rolle spielen.

Andere Pins können je nach ESP32-Variante Einschränkungen haben.

Deshalb sollte vor einer eigenen Schaltung immer die Pinbelegung des verwendeten ESP32-Boards geprüft werden.

Denn:

ESP32 ist nicht automatisch gleich ESP32.

Es gibt verschiedene Chips und unterschiedliche Development Boards.

Die Beschriftung auf dem eigenen Board ist deshalb wichtig.


Typische Anfängerfehler bei GPIO

Wenn eine Schaltung nicht funktioniert, liegt es häufig an einer Kleinigkeit.

INPUT statt OUTPUT

Die LED soll gesteuert werden, aber im Programm steht:

pinMode(LED_PIN, INPUT);

Für unsere LED benötigen wir:

pinMode(LED_PIN, OUTPUT);

Falscher GPIO

Im Programm steht:

#define LED_PIN 21

Die LED wurde aber an GPIO 18 angeschlossen.

Programm und Schaltung müssen zusammenpassen.


LED falsch herum

LEDs besitzen eine Polarität.

Ist die LED verkehrt herum eingebaut, leuchtet sie nicht.


Vorwiderstand vergessen

Eine externe Standard-LED sollte mit einem geeigneten Vorwiderstand betrieben werden.


GND vergessen

Ohne gemeinsamen Bezugspunkt funktioniert die Schaltung möglicherweise nicht richtig.


INPUT_PULLUP nicht verstanden

Bei unserer Taster-Schaltung gilt:

gedrückt = LOW

Das wirkt am Anfang falsch herum, ist aber korrekt.


5 Volt an einen GPIO

Der ESP32 arbeitet mit 3,3-V-Logik.

Deshalb müssen Signalspannungen angeschlossener Komponenten geprüft werden.


Eine einfache Eselsbrücke

Die wichtigsten Begriffe dieses Beitrags lassen sich sehr einfach merken:

GPIO
│
├── INPUT
│      ↓
│   ESP32 hört zu
│
└── OUTPUT
       ↓
    ESP32 spricht

Oder noch einfacher:

INPUT = hinein

OUTPUT = heraus

Dazu:

digitalRead() = lesen

digitalWrite() = ausgeben


Das Wichtigste in 60 Sekunden

Die GPIOs sind die Verbindung zwischen dem ESP32 und der Außenwelt.

Ein GPIO kann beispielsweise als Eingang verwendet werden:

pinMode(BUTTON_PIN, INPUT_PULLUP);

Dann können wir seinen Zustand lesen:

digitalRead(BUTTON_PIN);

Oder wir verwenden einen GPIO als Ausgang:

pinMode(LED_PIN, OUTPUT);

Dann können wir ihn steuern:

digitalWrite(LED_PIN, HIGH);

oder:

digitalWrite(LED_PIN, LOW);

Für digitale Signale gilt:

HIGH = 1

LOW = 0

Bei einem Taster mit INPUT_PULLUP gilt häufig:

nicht gedrückt = HIGH

gedrückt = LOW

Und damit können wir bereits:

Taster → ESP32 → LED

programmieren.

Das ist eine der wichtigsten Grundlagen für fast alle weiteren ESP32-Projekte.


Wie geht es weiter?

Jetzt kennen wir die wichtigsten GPIO-Grundlagen.

Als nächstes lohnt es sich, einen der wichtigsten Eingänge genauer anzuschauen:

den Taster.

Im nächsten Beitrag geht es deshalb um:

ESP32 und Taster: Anschließen, auslesen und richtig programmieren

Dabei schauen wir uns unter anderem an:

  • wie ein Taster funktioniert
  • warum viele Taster vier Anschlüsse haben
  • was INPUT_PULLUP macht
  • warum ein Taster manchmal scheinbar mehrfach auslöst
  • was Tasterprellen bedeutet
  • wie ein Tastendruck erkannt wird
  • wie zwischen Drücken und Loslassen unterschieden wird
  • wie eine LED per Tastendruck ein- und ausgeschaltet werden kann

Alle Beiträge dieser Serie

Add your first comment to this post