Ratgeber · 14 Min. Lesezeit

Arduino Code mit KI erstellen: Prompts, Prüfung und Fehler

Arduino Code mit KI wie ChatGPT erstellen: Prompt-Vorlage, Prüfschritte vor dem Upload, erfundene Funktionen, falsche Pins, delay()-Blockaden und 230 V.

Arduino Code mit KI erstellen heißt, einem Chat-Assistenten wie ChatGPT, Gemini, Claude oder Copilot dein Projekt zu beschreiben und ihn um funktionierenden Code für einen Arduino, ESP32 oder Raspberry Pi Pico zu bitten. Richtig eingesetzt macht das aus Stunden Minuten: Statt vor einer leeren Seite zu sitzen, hast du einen Entwurf, der bereit zum Kompilieren ist. Aber die KI sieht deine Schaltung nicht, kennt das Board auf deinem Tisch nicht und kann etwas Falsches mit voller Überzeugung behaupten. Sie erfindet vielleicht eine Bibliotheksfunktion, die es nicht gibt, wählt den falschen Pin oder schreibt delay()-Schleifen, die alles blockieren. Die eigentliche Fähigkeit ist deshalb nicht, nach Code zu fragen, sondern gut zu fragen und das Ergebnis zu prüfen.

In dieser Anleitung erfährst du, wie ein KI-Assistent Arduino-Code erzeugt und warum er sich irrt, wie du einen guten Prompt mit Board, Pins, Bibliotheken und erwartetem Verhalten schreibst und mit welchen Schritten du den Code prüfst, bevor du ihn hochlädst. Die drei häufigsten Fehler sehen wir uns mit echten Compiler-Meldungen und korrigiertem Code an. Danach geht es darum, wie du einen Kompilierfehler richtig einfügst und beheben lässt, warum du der KI bei 230 V Netzspannung nicht vertrauen solltest und wie du diese Werkzeuge nutzt, ohne mit dem Lernen aufzuhören.

Arduino Uno R3 Board
Die KI kann Code schreiben, sieht aber weder dein Board noch deine Verkabelung oder deine Module; diese Angaben musst du ihr im Prompt liefern.

Wie schreibt eine KI Arduino-Code und warum irrt sie sich?

Große Sprachmodelle (LLMs) wie ChatGPT schreiben Code nicht, indem sie ihn wie ein Compiler ausführen, sondern indem sie aus Millionen von Beispielen aus dem Training die wahrscheinlichste Fortsetzung vorhersagen. Bei Themen mit vielen Beispielen im Netz (LED blinken lassen, DHT11 auslesen, Servo drehen) klappt das sehr gut. Das Wissen des Modells ist aber auf einem bestimmten Stand eingefroren, sodass es Funktionen, die sich in neueren Bibliotheksversionen geändert haben, womöglich nicht kennt. Es kann die Funktionen zweier verschiedener Bibliotheken mit gleichem Namen verwechseln. Vor allem erfindet es manchmal eine plausibel klingende Antwort, statt „weiß ich nicht“ zu sagen; das nennt man Halluzination. Weil das Modell deine Schaltung nicht sieht, leitet es Pinnummern, Spannungspegel und Modulversionen entweder aus deinen Angaben oder aus eigenen Vermutungen ab.

AufgabeWie gut ist die KI?Warum?
Einfacher Beispielcode (LED, Taster, Sensor auslesen)Sehr gutIm Netz gibt es Tausende ähnlicher Beispiele
Vorhandenen Code Zeile für Zeile erklärenSehr gutCode lesen und erklären erfordert kein Raten
Ursache eines Kompilierfehlers findenGutFehlermeldungen folgen Mustern, die Modelle erkennen
Code für die neueste BibliotheksversionSchwachIhr Wissen ist auf einem bestimmten Stand eingefroren; neue Funktionen kennt sie oft nicht
Pins passend zu deiner Schaltung wählenSchwachSie sieht weder Board noch Verkabelung und wählt nach Annahmen
Timing und mehrere Aufgaben gleichzeitigMittelDie meisten Beispiele nutzen delay(), also entsteht blockierender Code
230 V, Akkus und Schaltungen mit hohem StromUnzuverlässigFehler kosten Verbrennungen, Brände oder Stromschläge; das Modell übernimmt keine Verantwortung

Wie schreibt man einen guten Prompt?

Der Code der KI kann nicht besser sein als die Informationen, die du ihr gibst. Bei einer Ein-Satz-Anfrage wie „Schreib Arduino-Code zum Temperaturmessen“ wählt das Modell Board, Sensor, Pin und Bibliothek selbst aus. Passt diese Auswahl nicht zu deinen Bauteilen, lässt sich der Code nicht kompilieren, oder er kompiliert und funktioniert trotzdem nicht. Schreib einen guten Prompt so, als würdest du das Projekt einem Freund am Telefon erklären, der zum ersten Mal davon hört: Board, Bauteile, Verbindungen, Bibliotheken, erwartetes Verhalten und Einschränkungen nennst du einzeln. Die Tabelle fasst zusammen, was in einen Arduino-Prompt gehört:

Was gehört in den Prompt?Warum ist das wichtig?Beispiel
Genauer Board-NamePins, Spannung und Befehle unterscheiden sich bei Uno, ESP32 und PicoArduino Uno R3 (ATmega328P)
IDE- und Core-VersionBeim ESP32 haben sich Funktionen zwischen Core 2.x und 3.x geändertArduino IDE 2.3, esp32-Core 3.x
Typenbezeichnung der BauteileDHT11 und DHT22 oder SG90 und MG996R sind nicht dasselbeDHT22, 16x2-I2C-LCD (PCF8574, Adresse 0x27)
PinbelegungDas Modell erfindet keine Pins, sondern hält sich an deine VerkabelungDHT22 DATA → D2, Taster zwischen D3 und GND
Name und Autor der BibliothekGleichnamige Bibliotheken nutzen unterschiedliche FunktionenAdafruit DHT sensor library, Frank de Brabander LiquidCrystal I2C
Erwartetes Verhalten in Zahlen„Piepen, wenn es warm wird“ ist vage, „über 30 °C“ ist messbarAlle 2 Sekunden messen, über 30 °C den Summer 3-mal piepen lassen
EinschränkungenUnterbindet schlechte Gewohnheiten des Modells von Anfang anKein delay(), stattdessen millis()
AusgabeformatDu bekommst Code und Einrichtungshinweise zusammenEine einzige .ino-Datei, deutsche Kommentare, Liste der nötigen Bibliotheken

Dieser Prompt liefert zum Beispiel deutlich bessere Ergebnisse als eine Ein-Satz-Anfrage: „Ich nutze einen Arduino Uno R3 und die Arduino IDE 2.3. Der DATA-Pin des DHT22 hängt an D2, ein aktiver Summer an D8, und ein 16x2-I2C-LCD (PCF8574, Adresse 0x27) hat SDA an A4 und SCL an A5. Installiert sind die Adafruit DHT sensor library und die LiquidCrystal-I2C-Bibliothek von Frank de Brabander. Zeig alle 2 Sekunden Temperatur und Luftfeuchtigkeit auf dem LCD an und lass den Summer kurz piepen, wenn die Temperatur über 30 °C steigt. Verwende millis() statt delay() und kommentiere die Zeilen auf Deutsch. Liste am Anfang die Bibliotheken auf, die ich installieren muss, und am Ende deine Annahmen.“ Bei diesem Prompt bleibt dem Modell kaum noch etwas zu raten.

Bevor du nach Code fragst, ergänze: „Fehlen dir Informationen für dieses Projekt? Stell mir zuerst Fragen.“ Ein gutes Modell fragt dann nach der Versorgungsspannung, ob der Sensor nackt oder auf einem Modul sitzt, oder nach der LCD-Adresse. Dein WLAN-Passwort, API-Schlüssel oder Bot-Token gehören nie in einen Prompt; nimm stattdessen Platzhalter wie „DEIN_PASSWORT“ und trag die echten Werte ganz zum Schluss selbst in den Code ein.

So prüfst du KI-generierten Code

Egal wie ordentlich der Code aussieht: Geh vor dem Hochladen eine Checkliste durch. Die meisten Schritte dauern nur ein paar Minuten und sind viel billiger als ein Modul, das wegen eines falsch angeschlossenen Pins durchbrennt:

  1. Zuerst nur kompilieren: Klick ohne angeschlossenes Board auf Überprüfen (das Häkchen). Kommt ein Fehler, lass ihn mit der Methode weiter unten beheben; was die Meldungen bedeuten, steht unter Arduino-Kompilierfehler.
  2. Bibliotheken einzeln prüfen: Such jede #include-Zeile im Bibliotheksverwalter und installiere die Bibliothek, deren Name, Autor und Beispiele zum Code passen. Wie das geht, zeigt die Anleitung Arduino-Bibliothek hinzufügen Schritt für Schritt.
  3. Pins vergleichen: Vergleich jede Pinnummer im Code mit deiner Verkabelung und der Pinbelegung des Boards. Für PWM-Pins und Pins, die du meiden solltest, hilft das Werkzeug Pinout.
  4. Elektrische Werte nachrechnen: Prüf den vorgeschlagenen Widerstandswert mit dem Rechner LED-Vorwiderstand. Soll ein Sensor mit 5-V-Ausgang an einen ESP32 oder Pico mit 3,3 V, gehört ein Spannungsteiler dazwischen.
  5. Im Simulator testen: Lass den Code in Wokwi oder Tinkercad laufen, bevor du echte Hardware anschließt; so findest du Logikfehler, ohne Bauteile zu riskieren.
  6. Schritt für Schritt testen: Lade nicht das ganze Projekt auf einmal hoch. Probier zuerst einen kleinen Sketch, der nur den Sensor ausliest und im Seriellen Monitor ausgibt, dann füg das Display hinzu und zuletzt den Summer oder das Relais.
  7. Mit dem Seriellen Monitor beobachten: Setz an wichtigen Stellen Serial.println() ein, um zu sehen, ob Variablen die erwarteten Werte annehmen, und achte darauf, dass die Baudrate zu Serial.begin() im Code passt. Mehr dazu unter Arduino Serieller Monitor.
  8. Code erklären lassen: Frag bei jeder Zeile, die du nicht verstehst: „Was macht diese Zeile, und was passiert, wenn ich sie lösche?“ Lade keinen Code hoch, den du nicht erklären kannst.

Häufiger Fehler 1: Bibliotheksfunktionen, die es nicht gibt

Der heimtückischste Fehler der KI sind Funktionen, die es gar nicht gibt, deren Namen aber sehr plausibel klingen. Die Standard-Servo-Bibliothek hat zum Beispiel attach(), write(), writeMicroseconds(), read() und detach(), aber keine setSpeed()-Funktion für die Geschwindigkeit; das Modell erfindet sie womöglich, wenn du einen langsam drehenden Servo willst. Manchmal gibt es die Funktion wirklich, aber auf einem anderen Board: Serial.printf() funktioniert auf dem ESP32, lässt sich auf dem Arduino Uno aber nicht kompilieren. Und manchmal stammt die Funktion aus einer alten Version: In der 2024 erschienenen Version 3.x des ESP32-Arduino-Cores wurden ledcSetup() und ledcAttachPin() entfernt, trotzdem schreiben die meisten Modelle noch Code damit. Dazu kommen verschiedene Bibliotheken mit derselben Header-Datei: Bei einer Bibliothek namens LiquidCrystal_I2C.h startet man das Display mit lcd.init(), bei einer gleichnamigen anderen mit lcd.begin(). Siehst du in der Compiler-Ausgabe die Warnung „Multiple libraries were found“, steckt wahrscheinlich diese Verwechslung dahinter.

Was die KI schreibtCompiler-Meldung oder SymptomEchte Lösung
Serial.printf("%d", x) auf dem Uno'class HardwareSerial' has no member named 'printf'; did you mean 'print'?Stückweise mit Serial.print() ausgeben oder den Text vorher mit snprintf() zusammenbauen
sprintf(buf, "%.1f", t) auf dem UnoKompiliert, gibt aber ? statt der Zahl ausAuf AVR unterstützt die printf-Familie keine Kommazahlen; dtostrf(t, 4, 1, buf) verwenden
servo.setSpeed(10)'class Servo' has no member named 'setSpeed'Den Winkel in einer Schleife in kleinen Schritten ändern
ledcSetup(0, 5000, 8) mit ESP32-Core 3.x'ledcSetup' was not declared in this scopeledcAttach(Pin, Frequenz, Auflösung) und ledcWrite(Pin, Wert) verwenden
Nur die DHT-Bibliothek installiertfatal error: Adafruit_Sensor.h: No such file or directoryZusätzlich die Bibliothek Adafruit Unified Sensor installieren
lcd.begin(), das nicht zur installierten Bibliothek passtno matching function for call to 'LiquidCrystal_I2C::begin()'Das Beispiel der installierten Bibliothek öffnen und deren Startbefehl (etwa lcd.init()) nutzen
analogReadResolution(12) auf dem Uno'analogReadResolution' was not declared in this scopeDer ADC des Uno hat 10 Bit; Zeile löschen, die Werte liegen zwischen 0 und 1023

Die Altlast beim ESP32: ledcAttach statt ledcSetup

Fragst du nach ESP32-Code, der LED-Helligkeit oder Motordrehzahl regelt, schreibt die KI höchstwahrscheinlich das Trio ledcSetup(Kanal, Frequenz, Auflösung), ledcAttachPin(Pin, Kanal) und ledcWrite(Kanal, Wert). Dieser Code läuft mit Version 2.x des Cores. In Version 3.x werden die Kanäle dagegen automatisch vergeben: ledcAttach(Pin, Frequenz, Auflösung) richtet den Pin in einem Schritt ein, und ledcWrite(Pin, Wert) erwartet jetzt eine Pinnummer statt eines Kanals. Welche Version installiert ist, siehst du im Boardverwalter neben dem esp32-Paket. Der folgende Code prüft die Version beim Kompilieren und läuft deshalb mit beiden Cores:

C++ (Arduino IDE)
1// ESP32 PWM: çekirdek 2.x ve 3.x ile uyumlu LED soldurma / LED fade for both core 2.x and 3.x
2#include <esp_arduino_version.h>   // ESP_ARDUINO_VERSION_MAJOR için / for ESP_ARDUINO_VERSION_MAJOR
3
4const int LED_PIN = 2;             // çoğu DevKit'te dahili LED / onboard LED on most DevKits
5const uint32_t FREKANS = 5000;     // PWM frekansı, Hz / PWM frequency, Hz
6const uint8_t COZUNURLUK = 8;      // 8 bit: 0-255 / 8-bit: 0-255
7
8#if ESP_ARDUINO_VERSION_MAJOR >= 3
9// Çekirdek 3.x: kanal otomatik seçilir, fonksiyonlar pin alır / Core 3.x: channel is automatic, functions take the pin
10void pwmBaslat() { ledcAttach(LED_PIN, FREKANS, COZUNURLUK); }
11void pwmYaz(uint32_t deger) { ledcWrite(LED_PIN, deger); }
12#else
13// Çekirdek 2.x: önce kanal kurulur, sonra pine bağlanır / Core 2.x: set up a channel, then attach the pin
14const uint8_t KANAL = 0;
15void pwmBaslat() { ledcSetup(KANAL, FREKANS, COZUNURLUK); ledcAttachPin(LED_PIN, KANAL); }
16void pwmYaz(uint32_t deger) { ledcWrite(KANAL, deger); }
17#endif
18
19void setup() {
20  Serial.begin(115200);
21  Serial.print("ESP32 Arduino cekirdegi / core: ");
22  Serial.println(ESP_ARDUINO_VERSION_MAJOR);
23  pwmBaslat();
24}
25
26void loop() {
27  // Tek iş yaptığı için burada delay() sorun değil / delay() is fine here: only one task
28  for (int d = 0; d <= 255; d++) { pwmYaz(d); delay(4); }   // yavaşça yan / fade in
29  for (int d = 255; d >= 0; d--) { pwmYaz(d); delay(4); }   // yavaşça sön / fade out
30}

Die Lehre gilt nicht nur für den ESP32: Nennst du im Prompt Core- und Bibliotheksversion, hat das Modell eine Chance, die richtigen Funktionen zu wählen. Nutzt es trotz Versionsangabe alte Funktionen, öffne eines der offiziellen Beispiele der Bibliothek unter Datei > Beispiele und füg es mit „Schreib es mit den Funktionen aus diesem Beispiel neu“ in den Prompt ein. Offizielle Beispiele passen immer zur installierten Version. Wie PWM funktioniert, erklärt der Beitrag Was ist PWM?

Häufiger Fehler 2: der falsche Pin

Selbst wenn der Code kompiliert und hochgeladen wird, bedeutet ein falscher Pin eine Schaltung, die stillschweigend nichts tut, oder ein durchgebranntes Modul. Der Compiler kann das nicht erkennen, denn für ihn ist eine Pinnummer nur eine Zahl. Das sind die häufigsten Pin-Fehler der KI, nach Board sortiert:

BoardTypischer KI-FehlerWas passiert?Richtig ist
Arduino UnoEin Pin ohne PWM für analogWrite() (z. B. D7)Die LED dimmt nicht: unter 128 aus, ab 128 voll anPWM-Pins: 3, 5, 6, 9, 10, 11
Arduino UnoEin Modul an D0 oder D1 anschließenDas Hochladen kann scheitern, der Serielle Monitor zeigt eventuell ZeichensalatD0 und D1 sind die serielle USB-Leitung; ab D2 anfangen
Arduino NanoA6 und A7 als digitale Pins verwendendigitalRead() und digitalWrite() funktionieren nichtA6 und A7 sind reine Analogeingänge
ESP32GPIO 6–11 verwendenDas Board stürzt ab oder startet ständig neuDiese Pins hängen am Flash-Speicher; sichere Pins wie GPIO 4, 5, 16–19, 21–23 wählen
ESP32GPIO 34–39 als Ausgang nutzenDie LED bleibt aus; ein Taster liefert ohne Pull-up wechselnde WerteDiese Pins sind reine Eingänge ohne interne Pull-up-Widerstände
ESP32Bei aktivem WLAN analog von ADC2-Pins lesenanalogRead() scheitert oder liefert sinnlose WerteAnaloge Sensoren an ADC1-Pins (GPIO 32–39) anschließen
Raspberry Pi Pico WPin(25) für die Onboard-LEDDie LED bleibt ausBeim Pico W hängt die LED am Funkchip; Pin("LED") verwenden
Die KI berücksichtigt Spannungspegel oft nicht. Die Pins von ESP32 und Raspberry Pi Pico arbeiten mit 3,3 V und sind nicht 5-V-tolerant; ein Sensor mit 5-V-Ausgang kann den Pin bei direktem Anschluss dauerhaft beschädigen. Beim Arduino Uno solltest du einem Pin dauerhaft höchstens 20 mA entnehmen (absolute Grenze 40 mA). Motoren, Relaisspulen oder lange LED-Streifen gehören nie direkt an einen Pin; dazwischen kommt ein Transistor oder Treiber. Die Pinbelegung deines Boards findest du unter Arduino Uno Pinbelegung.

Häufiger Fehler 3: blockierendes delay()

Weil die meisten Arduino-Beispiele im Netz mit delay() geschrieben sind, verwendet auch die KI standardmäßig delay(). Während delay(1000) läuft, tut der Prozessor eine ganze Sekunde lang nichts anderes: Er liest keine Taster, prüft keine Sensoren und aktualisiert kein Display. In Code mit nur einer Aufgabe ist das kein Problem. Verlangst du aber zwei Dinge gleichzeitig, etwa „LED blinken lassen und bei Tastendruck den Summer piepen lassen“, kommt oft Code wie dieser heraus:

C++ (Arduino IDE)
1// Yapay zekanın sık ürettiği, kilitlenen kod / Blocking code that AI often produces
2const int BUTON_PIN = 2;    // buton: D2 ile GND arası / button between D2 and GND
3const int LED_PIN = 13;     // dahili LED / onboard LED
4const int BUZZER_PIN = 8;   // aktif buzzer / active buzzer
5
6void setup() {
7  pinMode(BUTON_PIN, INPUT_PULLUP);
8  pinMode(LED_PIN, OUTPUT);
9  pinMode(BUZZER_PIN, OUTPUT);
10}
11
12void loop() {
13  digitalWrite(LED_PIN, HIGH);
14  delay(1000);                          // 1 sn boyunca buton okunmaz / button is not read for 1 s
15  digitalWrite(LED_PIN, LOW);
16  delay(1000);                          // 1 sn daha kör bekleme / another blind second
17
18  if (digitalRead(BUTON_PIN) == LOW) {  // yalnızca tam bu anda basılıysa / only if pressed right now
19    digitalWrite(BUZZER_PIN, HIGH);
20    delay(200);
21    digitalWrite(BUZZER_PIN, LOW);
22  }
23}

Dieser Code kompiliert fehlerfrei, aber meistens passiert beim Drücken des Tasters nichts. Etwa 2 Sekunden jedes loop()-Durchlaufs vergehen in den beiden delay()-Aufrufen, und der Taster wird nur in den wenigen Mikrosekunden dazwischen gelesen. Ein kurzer Druck verpasst diesen Moment fast immer; damit der Summer sicher piept, musst du den Taster länger als 2 Sekunden halten. Die Lösung heißt nicht warten, sondern auf die Uhr schauen: millis() liefert die Millisekunden seit dem Start, jede Aufgabe prüft, ob ihre Zeit gekommen ist, und loop() läuft tausende Male pro Sekunde:

C++ (Arduino IDE)
1// millis() ile kilitlenmeyen sürüm / Non-blocking version with millis()
2const int BUTON_PIN = 2;    // buton: D2 ile GND arası / button between D2 and GND
3const int LED_PIN = 13;     // dahili LED / onboard LED
4const int BUZZER_PIN = 8;   // aktif buzzer / active buzzer
5
6const unsigned long LED_ARALIK = 1000;  // LED değişim aralığı, ms / LED toggle interval, ms
7const unsigned long BIP_SURE = 200;     // bip süresi, ms / beep length, ms
8const unsigned long SICRAMA = 30;       // debounce süresi, ms / debounce time, ms
9
10unsigned long ledZaman = 0;     // LED'in son değiştiği an / last LED toggle
11unsigned long bipZaman = 0;     // bipin başladığı an / beep start
12unsigned long butonZaman = 0;   // butonun son değiştiği an / last button change
13bool ledDurum = false;
14bool bipCaliyor = false;
15int oncekiButon = HIGH;         // önceki buton seviyesi / previous button level
16
17void setup() {
18  pinMode(BUTON_PIN, INPUT_PULLUP);
19  pinMode(LED_PIN, OUTPUT);
20  pinMode(BUZZER_PIN, OUTPUT);
21}
22
23void loop() {
24  unsigned long simdi = millis();
25
26  // 1) LED: zamanı geldiyse durum değiştir / toggle the LED when its time has come
27  if (simdi - ledZaman >= LED_ARALIK) {
28    ledZaman = simdi;
29    ledDurum = !ledDurum;
30    digitalWrite(LED_PIN, ledDurum ? HIGH : LOW);
31  }
32
33  // 2) Buton: yalnızca basıldığı anı yakala / catch only the moment of the press
34  int buton = digitalRead(BUTON_PIN);
35  if (buton != oncekiButon && simdi - butonZaman >= SICRAMA) {
36    butonZaman = simdi;
37    oncekiButon = buton;
38    if (buton == LOW && !bipCaliyor) {  // HIGH -> LOW: yeni basış / new press
39      bipCaliyor = true;
40      bipZaman = simdi;
41      digitalWrite(BUZZER_PIN, HIGH);
42    }
43  }
44
45  // 3) Buzzer: süre dolunca sustur / silence it when the time is up
46  if (bipCaliyor && simdi - bipZaman >= BIP_SURE) {
47    bipCaliyor = false;
48    digitalWrite(BUZZER_PIN, LOW);
49  }
50}

In dieser Version arbeiten LED, Taster und Summer, ohne aufeinander zu warten. Eine Subtraktion der Form simdi - ledZaman >= LED_ARALIK liefert auch dann das richtige Ergebnis, wenn millis() etwa alle 49,7 Tage auf null überläuft; der Vergleich millis() > zielZeit, den die KI manchmal schreibt, versagt bei diesem Überlauf. Weil nur der Wechsel des Tasters von HIGH auf LOW zählt, piept der Summer nicht immer wieder, solange der Taster gedrückt bleibt, und die 30 ms Wartezeit filtern das Prellen der Kontakte (Entprellen). Das ganze Thema findest du in der Anleitung Arduino millis() statt delay(), den Anschluss des Tasters unter Taster am Arduino anschließen.

Schreibst du gleich in den Prompt „kein delay(), jede Aufgabe mit millis() timen“, tritt dieses Problem gar nicht erst auf. Zwei weitere Blockademuster solltest du prüfen: Auf Boards mit nativem USB wie Leonardo und Micro lässt die Zeile while (!Serial); das Programm ewig warten, wenn das Board nicht mit einem Computer verbunden ist. Und ein delay() in einer Interrupt-Routine (ISR) kann das Programm hängen lassen, weil millis() während des Interrupts nicht weiterzählt.

Kompilierfehler einfügen und beheben lassen

Im Erklären von Kompilierfehlern ist die KI wirklich gut, solange du ihr den kompletten Fehler und den Zusammenhang gibst. Nur „der Code geht nicht“ zu schreiben, zwingt das Modell zum Raten. Geh in dieser Reihenfolge vor:

  1. Erscheint in der Arduino IDE 2 ein Kompilierfehler, klick in der Benachrichtigung unten rechts auf Fehlermeldungen kopieren oder markiere und kopiere den gesamten Text im Ausgabefenster. Das exit status 1 in der letzten Zeile allein nützt nichts; die eigentliche Ursache steht weiter oben in der Zeile mit error:.
  2. Dein Prompt sollte in dieser Reihenfolge enthalten: Board und Core-Version, den vollständigen Code, die vollständige Fehlermeldung sowie Namen und Versionen der installierten Bibliotheken.
  3. Bevor du um eine Korrektur bittest, schreib „Erklär zuerst die Ursache des Fehlers und zeig dann nur die Zeilen, die sich ändern müssen“. So schreibt das Modell nicht den ganzen Sketch neu und baut keine neuen Fehler ein, und du lernst, was sich warum ändert.
  4. Übernimm die vorgeschlagene Änderung und kompiliere erneut. Taucht ein neuer Fehler auf, füg wieder die oberste error:-Zeile ein; behebe immer nur einen Fehler auf einmal.
  5. Bleibt derselbe Fehler nach zwei, drei Runden bestehen, brich die Schleife ab und kompiliere das offizielle Beispiel der Bibliothek. Lässt sich auch das Beispiel nicht kompilieren, liegt das Problem nicht im Code, sondern in der Einrichtung: falsches Board gewählt, fehlende Bibliothek oder zwei gleichnamige Bibliotheken im Konflikt.

Tritt der Fehler nicht beim Kompilieren, sondern beim Hochladen auf (etwa „avrdude: stk500_recv(): programmer is not responding“ oder beim ESP32 „Failed to connect to ESP32“), hilft es nichts, den Code zu ändern; dann musst du Port, Kabel, Treiber und Board-Auswahl prüfen. Die Anleitung Arduino Sketch lässt sich nicht hochladen führt dich Schritt für Schritt durch diese Fälle. Wenn du die KI nach einem Upload-Fehler fragst, gib die komplette Meldung und dein Betriebssystem an.

Code für Raspberry Pi Pico und MicroPython mit KI

Für MicroPython-Code gelten dieselben Regeln, aber hier verwechselt die KI zusätzlich gern Plattformen. Code für Raspberry-Pi-Computer mit RPi.GPIO oder gpiozero läuft nicht auf dem Pico; dort nutzt du das machine-Modul von MicroPython. Die CircuitPython-Module board und digitalio gibt es in MicroPython ebenfalls nicht. Schreib deshalb klare Angaben wie „Raspberry Pi Pico W, MicroPython, Thonny“ in den Prompt. Der folgende Code läuft auf Pico und Pico W und steuert das Timing mit ticks_ms(), statt zu warten:

MicroPython
1# Pico ve Pico W: bekletmeden LED + buton / Pico and Pico W: LED + button without blocking
2from machine import Pin
3import time
4
5led = Pin("LED", Pin.OUT)             # Pico W'da Pin(25) çalışmaz / Pin(25) does not work on Pico W
6buton = Pin(14, Pin.IN, Pin.PULL_UP)  # buton: GP14 ile GND arası / button between GP14 and GND
7
8ARALIK = 500                          # LED değişim aralığı, ms / LED toggle interval, ms
9SICRAMA = 30                          # debounce süresi, ms / debounce time, ms
10son = time.ticks_ms()                 # LED'in son değiştiği an / last LED toggle
11degisim = time.ticks_ms()             # butonun son değiştiği an / last button change
12onceki = 1                            # önceki buton seviyesi / previous button level
13sayac = 0
14
15while True:
16    simdi = time.ticks_ms()
17    if time.ticks_diff(simdi, son) >= ARALIK:      # taşmada da doğru / correct even on overflow
18        son = simdi
19        led.toggle()
20    deger = buton.value()
21    if deger != onceki and time.ticks_diff(simdi, degisim) >= SICRAMA:
22        degisim = simdi
23        onceki = deger
24        if deger == 0:                # basıldığı an / moment of the press
25            sayac += 1
26            print("Basma / press:", sayac)

Startest du den Code in Thonny, blinkt die Onboard-LED im Halbsekundentakt, und bei jedem Tastendruck erscheint im Shell-Fenster eine steigende Zahl. time.ticks_diff() liefert auch dann den richtigen Abstand, wenn der Zeitzähler überläuft; die einfache Subtraktion time.ticks_ms() - son, die die KI oft schreibt, kann in lange laufendem Code ein falsches Ergebnis liefern. Bist du neu beim Pico, fang mit Was ist der Raspberry Pi Pico? an.

Bei 230 V Netzspannung: Trau der KI nicht

Die KI schreibt in Sekunden Code für ein Relais, das eine 230-V-Lampe, Steckdose oder Heizung schaltet, und beschreibt die Verkabelung voller Überzeugung. Aber Netzspannung kann töten; ein falscher Anschluss oder ein lockerer Draht führt zu Stromschlag und Brand. Das Modell kann die beschriebene Verkabelung nicht messen, sieht deine Schaltung nicht und übernimmt keine Verantwortung für das Ergebnis. Stell keine einzige Verbindung zur Netzspannung nur nach der Anleitung einer KI her; bist du unter 18, mach diese Arbeit unbedingt gemeinsam mit einem Erwachsenen oder einer Elektrofachkraft.

Soll dein Projekt mit Netzspannung laufen, teste es zuerst mit Kleinspannung: eine LED statt der Lampe, ein 12-V-LED-Streifen statt der Steckdose. Muss das System wirklich 230 V schalten, sind manche Regeln nicht verhandelbar. Zieh vor jeder Arbeit an der Schaltung den Stecker. Das Relais muss den Außenleiter (L) schalten, nicht den Neutralleiter. Überschreite nie den auf dem Relaismodul aufgedruckten Strom- und Spannungswert (bei den meisten Modulen 10 A 250 VAC) und bring die Hochvoltseite in einem geschlossenen, isolierenden Gehäuse unter. Billige Relaismodule haben oft zu wenig Abstand zwischen Nieder- und Hochvoltseite; nimm nach Möglichkeit eine fertige, zertifizierte smarte Steckdose oder Relaisbox. Den Anschluss eines Relaismoduls findest du ausführlich unter Was ist ein Relaismodul?

KI nutzen, ohne das Lernen aufzugeben

Schreibt die KI jeden Sketch für dich, weißt du am ersten Tag, an dem der Code nicht läuft, nicht weiter. Wenn du Elektronik und Programmieren lernen willst, nutze sie nicht als Codeautomaten, sondern als geduldige Lehrerin:

  • Schreib zuerst selbst: Probier den Code selbst und bitte die KI dann um eine Prüfung mit „Zeig mir die Fehler, aber gib mir nicht den korrigierten Code“.
  • Frag nach Hinweisen, nicht nach Lösungen: Wenn du festhängst, sag „Gib mir nur einen Hinweis für den nächsten Schritt“.
  • Lass dir Zeile für Zeile erklären: Versuch nach der Erklärung, dieselbe Logik mit eigenen Worten zu beschreiben; was du nicht erklären kannst, hast du noch nicht gelernt.
  • Abtippen statt kopieren: Code von Hand zu tippen, statt ihn einzufügen, bringt dir Syntax und Funktionsnamen viel schneller bei.
  • Erst vorhersagen, dann testen: Überleg vor dem Ändern eines Werts, was passieren wird (z. B. wenn LED_ARALIK 200 wird), und lade dann hoch und prüfe es.
  • Frag dich selbst ab: Bitte die KI, dir fünf Fragen zum gerade gelernten Thema zu stellen; zum Auffrischen der Grundlagen hilft Arduino-Programmierung: Grundlagen.
  • Halte dich an die Regeln: Bei Hausaufgaben, Schulprojekten und Wettbewerben wie Jugend forscht gelten Regeln zur KI-Nutzung; halte dich daran und gib offen an, wenn du KI verwendet hast.

Erste Projekte, die du mit KI ausprobieren kannst

  • Temperaturanzeige: Zeig die Messwerte eines DHT11 auf einem I2C-LCD an; nenn im Prompt die LCD-Adresse und den Autor der Bibliothek.
  • Einparkhilfe: Miss mit einem HC-SR04 den Abstand und lass den Summer schneller piepen, je näher ein Hindernis kommt; verlang ein Timing mit millis().
  • Nachtlicht: Schalte mit einem LDR eine LED ein, wenn es dunkel wird; lies den Schwellwert vorher im Seriellen Monitor ab und gib ihn als Zahl im Prompt an.
  • LED per WLAN steuern: Schalte mit einem ESP32 eine LED über eine Seite auf deinem Handy ein und aus; nenn im Prompt die Core-Version.
  • Deine eigene Idee: Such dir ein Projekt aus den Arduino-Projektideen aus und beschreib es der KI mit der Prompt-Vorlage aus dieser Anleitung.

Die KI kann beim Arduino-Lernen der schnellste Helfer sein, den du hast, solange du ihr die richtigen Informationen gibst, das Ergebnis kompilierst, die Pins prüfst, Schritt für Schritt testest und keine Zeile hochlädst, die du nicht verstehst. Suchst du verlässliche Beispiele, mit denen du KI-Code vergleichen kannst, findest du in der BlueGrays-App Projekte mit LED, Taster, DHT11, ESP32-PWM und Pico samt Schritt-für-Schritt-Schaltplänen und getestetem Code.

Häufige Fragen

Kann KI Arduino-Code schreiben?

Ja. Assistenten wie ChatGPT, Gemini, Claude und Copilot erzeugen für die meisten einfachen Arduino-, ESP32- und Raspberry-Pi-Pico-Projekte funktionierenden Code. Vor dem Hochladen solltest du ihn aber kompilieren und Pins, Bibliotheken und Spannungspegel selbst prüfen; die KI sieht deine Schaltung nicht und kann sich irren.

Welche KI ist am besten für Arduino-Code?

Eine einzige richtige Antwort gibt es nicht; aktuelle große Modelle liefern bei einfachem Arduino-Code ähnliche Ergebnisse. Der Unterschied liegt meist im Prompt statt im Modell: Ein Prompt, der Board, Pinbelegung, Bibliotheken und erwartetes Verhalten klar nennt, bringt bei jedem Assistenten besseren Code.

Warum funktioniert der Arduino-Code von ChatGPT nicht?

Die häufigsten Gründe sind Funktionen, die es nicht gibt oder die zu einem anderen Board gehören, Code für eine andere Bibliotheksversion, falsche Pins und delay()-Aufrufe, die alles blockieren. Kompiliere den Code zuerst; gibt es einen Fehler, füg die komplette Meldung mit Board- und Versionsangaben ein. Kompiliert er, läuft aber nicht, gib Zwischenwerte im Seriellen Monitor aus, um die Stelle zu finden.

Wie frage ich die KI nach einem Arduino-Kompilierfehler?

Gib Board-Name, Core- und Bibliotheksversionen, den vollständigen Code und die komplette Fehlermeldung aus dem Ausgabefenster in einer Nachricht an. Ergänzt du „Erklär zuerst die Ursache und zeig dann nur die geänderten Zeilen“, bekommst du die richtige Korrektur und verstehst, warum der Fehler auftrat.

Kann ich der KI bei einem 230-V-Relais vertrauen?

Nein, nicht allein. Der Code ist meist in Ordnung, die Gefahr liegt in der Verkabelung; die KI sieht deine Schaltung nicht und kann die Richtigkeit ihrer Anleitung nicht garantieren. Verdrahte die Netzseite nur mit einer kundigen Person, bei gezogenem Stecker und mit einem Relaisaufbau, der den Außenleiter schaltet und in einem geschlossenen Gehäuse sitzt; nimm nach Möglichkeit eine fertige, zertifizierte smarte Steckdose.

Schadet KI beim Arduino-Lernen?

Wenn du Code kopierst, ohne ihn zu verstehen, ja; beim ersten Fehler weißt du dann nicht weiter. Schreibst du zuerst selbst und lässt die KI prüfen, Zeile für Zeile erklären und Hinweise statt Lösungen geben, beschleunigt sie das Lernen. Die Regel ist einfach: Lade keine Zeile hoch, die du nicht erklären kannst.

Alle Projekte ansehen
LED Blinken
#1Anfänger

LED Blinken

Das allererste Hallo der Elektronik: eine einzelne LED an- und ausschalten. Der Arduino schaltet die LED in kurzen Abständen ein und aus, das Licht blinkt also schnell. So siehst du ganz einfach, wie

4.6(188)
1127
LED mit Taster schalten (Push)
#9Anfänger

LED mit Taster schalten (Push)

Wie bei einer Türklingel: Das Licht leuchtet, solange du drückst, und geht aus, wenn du loslässt. Der Arduino horcht ständig auf den Taster; solange er gedrückt ist, leuchtet die LED, und sobald du de

4.8(113)
229
Temperatur und Luftfeuchtigkeit mit DHT11
#55Mittel

Temperatur und Luftfeuchtigkeit mit DHT11

Wie warm ist dein Zimmer, und ist die Luft feucht oder trocken? Der DHT11-Sensor misst Temperatur und Luftfeuchtigkeit, und der Arduino schreibt die Werte auf ein zweizeiliges LCD und aktualisiert sie

4.7(47)
73
LED Blinken mit ESP32
#103Anfänger

LED Blinken mit ESP32

Lehrt die grundlegende Verwendung von GPIO-Ausgängen mit ESP32. Wir erreichen einen Blinkeffekt, indem wir eine LED über einen digitalen Pin ein- und ausschalten. ESP32-Version des klassischen Blink-Projekts auf Arduino UNO; die grundlegenden Blink-Befehle in der Arduino-Umgebung bleiben gleich, aber die Pinbelegung und die GPIO-Pegel von 3,3 V des ESP32 unterscheiden sich von denen des Arduino UNO.

4.7(37)
99
Raspberry Pi Pico Onboard-LED Blinken (Pico und Pico W)
#147Anfänger

Raspberry Pi Pico Onboard-LED Blinken (Pico und Pico W)

Das Eröffnungsprojekt der Raspberry Pi Pico-Serie! Wir bringen die grüne interne LED zum Blinken, um zu überprüfen, ob die Platine funktioniert — ein klassisches "Hello World"-Erstexperiment. Keine externen Komponenten, nur Pico und USB-Kabel. Der Code ist in MicroPython geschrieben (die offiziell von der Raspberry Pi Foundation unterstützte Sprache). Lerne die machine.Pin-Klasse, Pin.OUT-Modus, led.on()/off()-Methoden und time.sleep() in Thonny IDE. Verfolge jede Umsch

5.0(1)
10
ESP32 LED-Überblendung mit PWM
#110Anfänger

ESP32 LED-Überblendung mit PWM

Ändern Sie die Helligkeit der LED stufenlos von 0 bis max, von max bis 0. Wir steuern PWM mit analogWrite() wie in Arduino - die gleiche Syntax mit ESP32 Arduino Core 3.0+ funktioniert reibungslos. Pin-Definition + pinMode + analogWrite ist genug.

4.8(36)
54
Raspberry Pi Pico PWM LED Fade (Atem-Effekt)
#160Anfänger

Raspberry Pi Pico PWM LED Fade (Atem-Effekt)

Die LED blinkt nicht mehr nur — sie atmet! Mit der PWM (Pulsweitenmodulation) des Raspberry Pi Pico steigt die Helligkeit langsam an und fällt wieder ab. Lerne die machine.PWM-Klasse, duty_u16() (16-Bit-Helligkeit 0–65535), PWM-Frequenz, range()-Schleifen und analogähnliche Ausgabe. Grundlage für RGB-Farbmischung, Motorsteuerung, Servos und Buzzer.

0.0(0)
4
Verwendung des LCD-Bildschirms mit I2C
#32Anfänger
Premium

Verwendung des LCD-Bildschirms mit I2C

Gib deinem Arduino ein eigenes Display und lass es seine erste Nachricht schreiben. Das zweizeilige LCD wird mit nur wenigen Kabeln angeschlossen; oben erscheint ein Gruß, dann unten eine zweite Zeile

4.8(53)
70