
Der ESP32-C6-Zero verfügt über 13 digitale Pins, Bluetooth und WiFi.
Board installieren
Trage unter Datei -> Einstellungen eine zusätzliche Boardverwalter-URL ein:
https://dl.espressif.com/dl/package_esp32_index.json

Board auswählen

- Icon für den Boardverwalter anklicken oder Werkzeuge-> Board -> Boardverwalter
- nach ESP32 suchen
- Board installieren
Wenn der ESP32-C6-Zero nicht automatisch erkannt wurde, klicke auf “Wähle ein anderes Board und einen anderen Port” und suche nach esp32c6. Je nach Betriebssystem wird der USB-Port eine andere Bezeichnung haben.

Seriellen Monitor einschalten
Der Serielle Monitor steht erst nach einer Änderung der Konfiguration zur Verfügung:

RGB-LED

Wenn du nur die weiße Farbe der RGB-LED verwenden willst, kannst du sie mit der Bezeichnung LED_BUILTIN ansprechen. .
1 2 3 4 5 6 7 8 9 10 11 12 | void setup() { pinMode(LED_BUILTIN, OUTPUT); } void loop() { digitalWrite(LED_BUILTIN, HIGH); delay(1000); digitalWrite(LED_BUILTIN, LOW); delay(1000); } |
Auf dem Board ist eine RGB-LED verbaut, sie kann mit Hilfe einer Bibliothek angesprochen werden.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | #include “Adafruit_NeoPixel.h” #define RGBLED 8 #define AnzahlLED 1 // RGB -> Name der RGB-LED Adafruit_NeoPixel RGB(AnzahlLED, RGBLED, NEO_GRB + NEO_KHZ800); void setup() { // setBrightness(0..255) RGB.setBrightness(200); // NeoPixel Bibliothek initialisieren RGB.begin(); } void loop() { // rot RGB.fill(RGB.Color(255, 0, 0), 0, AnzahlLED); RGB.show(); delay(1000); // grün RGB.fill(RGB.Color(0, 255, 0), 0, AnzahlLED); RGB.show(); delay(1000); // blau RGB.fill(RGB.Color(0, 0, 255), 0, AnzahlLED); RGB.show(); delay(1000); // gelb RGB.fill(RGB.Color(255, 255, 0), 0, AnzahlLED); RGB.show(); delay(1000); RGB.clear(); } |
Pinbelegung

I²C
⇒Info
Alle digitalen Pins können für I²C verwendet werden
Schaltplan 4‑zeiliges LCD

So sieht es aus:

Das dazugehörige Programm:
Benötigte Bibliothek installieren

Du musst die gewünschten I²C-Pins definieren und im setup-Teil Wire.begin() mit den zuvor definierten Anschlüssen für SCL und SDA starten.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | // Pins anpassen #define SDA_PIN 21 #define SCL_PIN 22 #include “LCDIC2.h” // 4‑zeiliges LCD LCDIC2 lcd(0x27, 20, 4); // 2‑zeiliges LCD // LCDIC2 lcd(0x3f, 16, 2); void setup() { // Wire mit den I2C-Pins starten Wire.begin(SDA_PIN, SCL_PIN); // Zufallsgenerator starten randomSeed(analogRead(A0)); // LCD starten lcd.begin(); // Cursor “verstecken” lcd.setCursor(false); // Ausgabe auf dem LCD // Cursor auf Position 0 in Zeile 0 setzen lcd.setCursor(0, 0); lcd.print(“Zufallszahlen:”); lcd.setCursor(0, 1); for (int i = 1; i <= 6; i++) { int Zahl = random(1, 7); lcd.print(String(Zahl)); lcd.print(“ ”); } } void loop() { // bleibt leer, Programm läuft nur einmal } |
SPI
⇒Info

SPI-Pins
18 -> CS
19 -> COPI (MOSI)
20 -> CIPO (MISO)
21 -> SCK
Schaltplan mit Adafruit 1,8 Zoll TFT

rot -> 5V
braun -> 21 (SCK)
blau -> 19 (VOPI/MOSI)
weiß -> 18 (CS)
grün -> 2 (DC)
gelb -> 3 (RST)
rot -> 5V
schwarz -> GND
Benötigte Bibliothek

Das Programm
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 | // Bibliotheken einbinden #include “Adafruit_GFX.h” #include “Adafruit_ST7735.h” /* Adafruit TFT 1,8 SPI-Pins ————– CS: 18 COPI: 19 CIPO: 20 (nicht verwendet) SCK: 21 ————– */ #define TFT_CS 18 #define TFT_RST 3 #define TFT_DC 2 Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST); void setup() { Serial.begin(9600); delay(500); Serial.println(“Bildschirm: ” + String(tft.height()) + ” x ” + String(tft.width())); tft.initR(INITR_BLACKTAB); // Rotation anpassen tft.setRotation(2); // schwarzer Hintergrund tft.fillScreen(ST7735_BLACK); // verschiedene Schriftgrößen tft.setTextSize(1); tft.setCursor(1, 5); tft.setTextColor(ST7735_BLUE); tft.print(“Text”); delay(500); tft.setTextSize(2); tft.setCursor(1, 20); tft.setTextColor(ST7735_GREEN); tft.print(“Text”); delay(500); tft.setTextSize(3); tft.setCursor(1, 40); tft.setTextColor(ST7735_RED); tft.print(“Text”); delay(500); tft.setTextSize(4); tft.setCursor(1, 70); tft.setTextColor(ST7735_YELLOW); tft.print(“Text”); delay(2000); // Linien ziehen tft.fillScreen(ST7735_BLACK); for (int i = 1; i < tft.height(); i+=10) { tft.drawLine(1, i, tft.width(), i, ST7735_ORANGE); } delay(2000); // Kreise zeichnen tft.fillScreen(ST7735_BLACK); tft.fillCircle(tft.width() / 2, tft.height() / 2, 50, ST7735_MAGENTA); tft.fillCircle(tft.width() / 2, tft.height() / 2, 30, ST7735_GREEN); tft.fillCircle(tft.width() / 2, tft.height() / 2, 10, ST7735_YELLOW); delay(2000); // Rechtecke zeichnen tft.fillScreen(ST7735_BLACK); tft.drawRect(1, 1, 50, 50, ST7735_ORANGE); tft.drawRect(5, 5, 50, 50, ST7735_ORANGE); tft.drawRect(10, 10, 50, 50, ST7735_ORANGE); delay(2000); // ausgefüllte Rechtecke zeichnen tft.fillScreen(ST7735_BLACK); tft.fillRect(5, 5, 50, 50, ST7735_GREEN); tft.fillRect(10, 10, 70, 70, ST7735_BLUE); tft.fillRect(15, 15, 90, 90, ST7735_RED); } void loop() { // nichts zu tun, das Programm // läuft nur einmal } |
Digitale Pins

Analoge Pins

Die Auflösung des ADC-Wandlers kann zwischen 9‑Bit (0 — 511), 10 Bit (0 — 1023), 11 Bit (0 — 2047) und 12 Bit (0 — 4095) Die Standardeinstellung ist 12 Bit. Die Anweisung analogReadResolution() beeinflusst den ADC-Wandler. Diese Werte sind aber eher theoretisch, bei meinen Versuchen wurden sie bei keiner Auflösung erreicht.
Beispiel:
1 2 3 4 5 6 7 8 9 10 11 | void setup() { Serial.begin(9600); analogReadResolution(10); } void loop() { Serial.println(“ADC-Wert: ” + String(analogRead(35))); delay(200); } |
Beispiel:
Potentiometer an Pin 1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | // Potentiometer an Pin 1 int Potentiometer = 1; // Variable für den gelesenen Wert int GelesenerWert = 0; void setup() { Serial.begin(9600); delay(1000); } void loop() { // analogen Wert lesen GelesenerWert = analogRead(Potentiometer); Serial.println(GelesenerWert); delay(500); } |
Zeit mit der Bibliothek time.h anzeigen
ESP32-Mikrocontroller können mit der Standardbibliothek Datum und Zeit anzeigen.

Beispiel: ⇒Anzeige von Datum und Zeit auf einem OLED-Display
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 | #include “WiFi.h” #include “time.h” char Router[] = “Router_SSID”; char Passwort[] = “xxxxxxxx”; // NTP-Server aus dem Pool #define Zeitserver “de.pool.ntp.org” /* Liste der Zeitzonen https://github.com/nayarsystems/posix_tz_db/blob/master/zones.csv Zeitzone CET = Central European Time ‑1 -> 1 Stunde zurück CEST = Central European Summer Time von M3 = März, 5.0 = Sonntag 5. Woche, 02 = 2 Uhr bis M10 = Oktober, 5.0 = Sonntag 5. Woche 03 = 3 Uhr */ #define Zeitzone “CET-1CEST,M3.5.0/02,M10.5.0/03” // time_t enthält die Anzahl der Sekunden seit dem 1.1.1970 0 Uhr time_t aktuelleZeit; /* Struktur tm tm_hour -> Stunde: 0 bis 23 tm_min -> Minuten: 0 bis 59 tm_sec -> Sekunden 0 bis 59 tm_mday -> Tag 1 bis 31 tm_wday -> Wochentag (0 = Sonntag, 6 = Samstag) tm_mon -> Monat: 0 (Januar) bis 11 (Dezember) tm_year -> Jahre seit 1900 tm_yday -> vergangene Tage seit 1. Januar des Jahres tm_isdst -> Wert > 0 = Sommerzeit (dst = daylight saving time) */ tm Zeit; WiFiServer Server(80); WiFiClient Client; void setup() { // Zeitzone: Parameter für die zu ermittelnde Zeit configTzTime(Zeitzone, Zeitserver); Serial.begin(9600); // auf serielle Verbindung warten while (!Serial); delay(1000); // WiFi starten WiFi.mode(WIFI_STA); WiFi.begin(Router, Passwort); Serial.println(“————————”); while (WiFi.status() != WL_CONNECTED) { delay(200); Serial.print(“.”); } Serial.println(); Serial.print(“Verbunden mit ”); Serial.println(Router); Serial.print(“IP über DHCP: ”); Serial.println(WiFi.localIP()); } void loop() { // aktuelle Zeit holen time(&aktuelleZeit); // localtime_r -> Zeit in die lokale Zeitzone setzen localtime_r(&aktuelleZeit, &Zeit); Serial.println(“————————”); // es kann bis zu 30 Sekunden dauern // bis die Zeit ermittelt wird // Name des Wochentages 0–6 switch (Zeit.tm_wday) { case 0: Serial.print(“Sonntag”); break; case 1: Serial.print(“Montag”); break; case 2: Serial.print(“Dienstag”); break; case 3: Serial.print(“Mittwoch”); break; case 4: Serial.print(“Donnerstag”); break; case 5: Serial.print(“Freitag”); break; case 6: Serial.print(“Samstag”); break; } Serial.print(“,”); if (Zeit.tm_mday < 10) Serial.print(“0”); Serial.print(Zeit.tm_mday); Serial.print(“.”); // Monat: führende 0 ergänzen // Zählung beginnt mit 0 -> +1 if ((Zeit.tm_mon + 1) < 10) Serial.print(“0”); Serial.print(Zeit.tm_mon + 1); Serial.print(“.”); // Anzahl Jahre seit 1900 Serial.print(Zeit.tm_year + 1900); Serial.print(“ ”); // Stunde: wenn Stunde < 10 -> 0 davor setzen if (Zeit.tm_hour < 10) Serial.print(“0”); Serial.print(Zeit.tm_hour); Serial.print(“:”); // Minuten if (Zeit.tm_min < 10) Serial.print(“0”); Serial.print(Zeit.tm_min); Serial.print(“:”); // Sekunden if (Zeit.tm_sec < 10) Serial.print(“0”); Serial.print(Zeit.tm_sec); Serial.println(); Serial.println(“Tage seit dem 1.1. ” + String(Zeit.tm_yday)); // Normalzeit/Sommerzeit if(Zeit.tm_isdst > 0) Serial.println(“MESZ = Mitteleuropäische Sommerzeit”); else Serial.println(“MEZ = Mitteleuropäische Zeit”); delay(5000); } |
Webserver
Beispiel
Das Programm zeigt im Browser 6 Zufallszahlen an.
Im Seriellen Monitor wird die mit DHCP ermittelte IP des ESP32-C6 angezeigt.

Diese Adresse musst du in einem Browser deiner Wahl eingeben.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 | #include “WiFi.h” #include “WebServer.h” // SSID und Passwort des Routers char Router[] = “Router_SSID”; char Passwort[] = “xxxxxxxx”; WebServer Server(80); // Minimum und Maximum der Zufallszahlen int Minimum = 1; int Maximum = 49; // statischeIP = false -> IP-Adresse über DHCP vergeben // statischeIP = true -> statische IP festlegen bool statischeIP = false; // ip und gateway müssen an das lokale Netz angepasst werden IPAddress ip(192, 168, 1, 100); IPAddress gateway(192, 168, 1, 1); IPAddress subnet(255, 255, 255, 0); void setup() { Serial.begin(9600); // auf serielle Verbindung warten while (!Serial); delay(1000); // WiFi starten WiFi.begin(Router, Passwort); // statische IP vergeben if (statischeIP) { WiFi.config(ip, gateway, subnet); Serial.print(“Verbunden mit ”); Serial.println(Router); // IP anzeigen Serial.print(“Statische IP: ”); } // IP über DHCP ermitteln else { while (WiFi.status() != WL_CONNECTED) { delay(200); Serial.print(“.”); } Serial.println(); Serial.print(“Verbunden mit ”); Serial.println(Router); Serial.print(“IP über DHCP: ”); } // IP anzeigen Serial.println(WiFi.localIP()); // Zufallsgenerator mit dem Signal an A0 starten randomSeed(analogRead(A0)); Server.begin(); Server.on(“/”, SeiteBauen); } void loop() { Server.handleClient(); } void SeiteBauen() { // Seite zusammenbauen // Kopf der HTML-Seite: aktualisierung alle 60 Sekunden // kann angepasst werden String Nachricht = “<head><meta http-equiv=\“refresh\” content=\“60\”></head>”; Nachricht += “<h1>Zufallszahlen</h1>”; Nachricht += “<hr>”; // Zufallszahlen anzeigen for (int i = 0; i < 7; i++) { int Zahl = random(Minimum, Maximum); Nachricht += String(Zahl) + ” “; } Nachricht += “<hr>”; // Nachricht senden -> Seite anzeigen Server.send(200, “text/html”, Nachricht); } |
Letzte Aktualisierung: