Arduino exit status 1: Fehler beim Kompilieren finden und lösen
Was bedeutet exit status 1 beim Arduino? So löst du was not declared in this scope, expected ';', No such file, does not name a type und Sketch too big.
Der Arduino-Fehler exit status 1 ist eine allgemeine Meldung, die dir sagt, dass dein Code nicht kompiliert werden konnte, der Compiler dein Programm also nicht in Maschinencode für den Prozessor übersetzen konnte; die eigentliche Ursache steht nie in dieser Zeile. Sie steht in der ersten Zeile mit dem Wort error:, ein paar Zeilen weiter oben im Ausgabefenster: Du hast einen Namen falsch geschrieben, ein Semikolon vergessen, eine Bibliothek fehlt oder der Code wurde für ein anderes Board geschrieben. Die Meldung Compilation error: exit status 1 unten rechts in der Arduino IDE 2 (auf Deutsch Fehler beim kompilieren: exit status 1) und die Zeile Fehler beim Kompilieren für das Board Arduino Uno. aus der alten Version 1.8 bedeuten genau dasselbe.
In dieser Anleitung siehst du zuerst, was beim Kompilieren im Hintergrund passiert und wie du eine Fehlermeldung in Datei, Zeile und Spalte zerlegst. Danach gehen wir die häufigsten Kompilierfehler einzeln durch: was not declared in this scope, expected ';' before, No such file or directory, does not name a type, redefinition of und Sketch too big. Zu jedem findest du die Situation, die ihn auslöst, die echte Meldung des Compilers und ein korrigiertes Beispiel, das fehlerfrei kompiliert. Außerdem behandeln wir Fehler durch die falsche Board-Auswahl, Besonderheiten beim ESP32 und Raspberry Pi Pico sowie am Ende eine Fehler-Lösungs-Tabelle, die alles zusammenfasst. Wenn dein Code fehlerfrei kompiliert, aber nicht auf das Board kommt, liegt das Problem in einer anderen Phase; dafür ist die Anleitung Arduino Sketch lässt sich nicht hochladen da.

Was ist Arduino exit status 1? Kompilieren und Hochladen im Vergleich
Wenn du auf Überprüfen (das Häkchen) oder Hochladen klickst, startet die Arduino IDE im Hintergrund mehrere Programme. Zuerst fügt sie die .ino-Dateien im Sketch-Ordner zusammen und macht daraus eine gewöhnliche C++-Datei, indem sie oben die Header-Datei Arduino.h und die Prototypen deiner Funktionen einfügt. Dann kompiliert ein Compiler wie avr-g++ für den Uno oder xtensa-esp32-elf-g++ für den ESP32 diese Datei und die verwendeten Bibliotheken, der Linker fügt alle Teile zu einem Programm zusammen, und zum Schluss wird geprüft, ob das Programm auf das Board passt. Jedes Programm gibt am Ende einen Exit-Code zurück: 0 bedeutet Erfolg, 1 einen Fehler. "exit status 1" sagt genau das: Eines der Programme in dieser Kette ist gescheitert. Deshalb taucht derselbe Ausdruck auch auf, wenn avrdude beim Hochladen scheitert; welcher Fall vorliegt, verrät dir die Meldung davor.
| Was du in der Ausgabe siehst | Phase | Was es bedeutet |
|---|---|---|
| error: ... und am Ende exit status 1 | Kompilieren | In deinem Code oder einer Bibliothek steckt ein C++-Fehler; die Ursache steht in der error:-Zeile |
| fatal error: DHT.h: No such file or directory | Kompilieren (Präprozessor) | Die per #include angeforderte Datei wurde nicht gefunden; Bibliothek fehlt oder Name ist falsch |
| undefined reference to ... und collect2: error: ld returned 1 exit status | Linken | Eine Funktion ist deklariert, aber ihr Rumpf existiert nirgends |
| multiple definition of ... | Linken | Dieselbe Variable oder Funktion ist in zwei Dateien definiert |
| Sketch too big und text section exceeds available space in board | Größenprüfung | Das Programm passt nicht in den Flash-Speicher des Boards |
| Not enough memory und data section exceeds available space in board | Größenprüfung | Die globalen Variablen passen nicht in den RAM |
| Failed uploading: uploading error: exit status 1 | Hochladen | Der Code wurde kompiliert, aber nicht auf das Board geschrieben; schau dir die avrdude- oder esptool-Zeilen an |
Wie liest man eine Arduino-Fehlermeldung?
Jede Fehlerzeile des Compilers folgt demselben Muster: zuerst der Dateiname, dann durch Doppelpunkte getrennt die Zeilen- und Spaltennummer, danach die Art des Fehlers und seine Beschreibung. Direkt darüber steht oft eine Zeile wie In function 'void loop()':, die dir sagt, in welcher Funktion der Fehler liegt; darunter folgen eine Kopie der fehlerhaften Zeile und ein kleines ^, das auf die Problemstelle zeigt. error ist ein echter Fehler, der das Kompilieren abbricht, warning ist nur eine Warnung und der Code wird trotzdem kompiliert, note liefert Zusatzinfos zur vorigen Meldung. Oft hängt der Compiler auch einen Vorschlag an: Im Beispiel unten zeigt er mit suggested alternative: 'digitalWrite' selbst die richtige Schreibweise.
| Teil | Wert im Beispiel | Bedeutung |
|---|---|---|
| Datei | Blink.ino | Die Datei mit dem Fehler; bei mehreren Tabs erkennst du hier, welcher es ist |
| Zeile | 6 | Die Zeile, in der der Compiler den Fehler bemerkt hat; der eigentliche Fehler steht manchmal eine Zeile darüber |
| Spalte | 3 | Das wievielte Zeichen der Zeile; dorthin zeigt das ^ |
| Art | error | error bricht ab, warning warnt, note ergänzt |
| Meldung | 'digitalwrite' was not declared in this scope | Der Teil, der das Problem beschreibt; nach diesem Text suchst du im Internet |
| Vorschlag | note: suggested alternative: 'digitalWrite' | Die Vermutung des Compilers; zeigt oft die richtige Schreibweise |
- Setze unter Datei > Einstellungen in der Zeile Compiler-Meldungen anzeigen beim den Haken bei Kompilieren. So siehst du auch, welche Dateien und Bibliotheksordner der Compiler verwendet hat.
- Das Board muss nicht angeschlossen sein: Klicke auf Überprüfen (das Häkchen). Überprüfen kompiliert nur; liegt der Fehler beim Kompilieren, kostet dich ein Klick auf Hochladen nur Zeit.
- Scrolle im Ausgabefenster ganz nach oben und suche die erste Zeile mit error:. Die meisten Fehler danach sind Folgefehler dieses ersten.
- Springe zur Zeilennummer aus der Meldung. Die IDE 2 unterstreicht das fehlerhafte Zeichen rot, Version 1.8 färbt die ganze Zeile rot. Siehst du in dieser Zeile kein Problem, schau eine Zeile darüber.
- Behebe nur diesen ersten Fehler und klicke erneut auf Überprüfen. Wenn die Zahl der Fehler plötzlich sinkt, bist du auf dem richtigen Weg.
- Wenn du im Internet suchst, entferne deine eigenen Variablennamen und Dateipfade aus der Meldung: was not declared in this scope statt 'zaehler' was not declared in this scope liefert viel mehr Treffer. Wenn du in einem Forum um Hilfe bittest, kopiere dagegen die komplette Ausgabe.
Fehler 'was not declared in this scope' und seine Lösung
Diese Meldung bedeutet, dass der Compiler einen Namen an dieser Stelle nicht kennt, auf Deutsch etwa "in diesem Gültigkeitsbereich nicht deklariert". Die häufigste Ursache ist ein Tippfehler: Arduino unterscheidet Groß- und Kleinschreibung, digitalwrite, Digitalwrite und digitalWrite sind drei verschiedene Namen. Die zweite große Ursache ist der Gültigkeitsbereich (Scope): Deklarierst du eine Variable in setup(), lebt sie nur, solange setup() läuft, und loop() kann sie nicht sehen. Brauchst du eine Variable in mehreren Funktionen, deklariere sie außerhalb aller Funktionen ganz oben in der Datei. Auch eine Variable, die erst nach der Zeile deklariert wird, in der du sie benutzt, löst denselben Fehler aus, weil der Compiler die Datei von oben nach unten liest. Und schließlich erscheint der Fehler, wenn du ein Objekt nutzt, dessen Bibliothek du nicht eingebunden hast (Wire, Servo), oder eine Funktion, die das gewählte Board nicht hat (Serial1 auf dem Uno).
1// Kapsam (scope) örneği / Scope example
2const int LED_PIN = 13; // global: her fonksiyon görür / global: every function can see it
3int yanmaSayisi = 0; // setup() içine taşırsan loop() göremez / move it into setup() and loop() can't see it
4
5void setup() {
6 pinMode(LED_PIN, OUTPUT);
7 Serial.begin(9600);
8}
9
10void loop() {
11 int sure = 500; // yerel: yalnız loop() içinde / local: only inside loop()
12 digitalWrite(LED_PIN, HIGH); // digitalwrite yazarsan: was not declared / typing digitalwrite: was not declared
13 delay(sure);
14 digitalWrite(LED_PIN, LOW);
15 delay(sure);
16 yanmaSayisi++;
17 Serial.println(yanmaSayisi); // kaç kez yandı / how many times it blinked
18}| Ursache | Falsch | Richtig |
|---|---|---|
| Groß- und Kleinschreibung | digitalwrite(13, HIGH); | digitalWrite(13, HIGH); |
| Konstante falsch geschrieben | pinMode(13, OUPUT); | pinMode(13, OUTPUT); |
| Variable in einer anderen Funktion deklariert | int led = 13; in setup() deklarieren und led in loop() verwenden | Die Zeile int led = 13; außerhalb aller Funktionen nach oben verschieben |
| Variable erst nach der Verwendung deklariert | int zaehler = 0; steht nach der Zeile zaehler++; | Die Deklaration vor die Stelle setzen, an der sie verwendet wird |
| Bibliothek nicht eingebunden | Wire.begin(); ohne #include-Zeile | #include <Wire.h> an den Anfang der Datei schreiben |
| Funktion, die das Board nicht hat | Serial1.begin(9600); mit gewähltem Uno | Ein Board mit mehreren seriellen Ports wie den Mega wählen oder SoftwareSerial nutzen |
| Reihenfolge in einer zusätzlichen .cpp-Datei | Eine Funktion wird in einem .cpp-Tab vor ihrer Definition aufgerufen | In .cpp-Dateien den Prototyp (void blinken();) oben hinschreiben; in .ino-Dateien erledigt das die IDE |
'expected ';' before' und andere Syntaxfehler
In C++ endet jede Anweisung mit einem Semikolon. Vergisst du es am Ende einer Zeile, merkt der Compiler das erst, wenn er das nächste Wort liest. Deshalb zeigt die Zeilennummer in expected ';' before 'delay' beim Compiler des Uno auf die Zeile unter dem Fehler: Das fehlende Semikolon gehört ans Ende der Zeile vor delay. Die neueren Compiler der ESP32- und Pico-Pakete zeigen dagegen direkt auf das Ende der Zeile, in der das Semikolon fehlt. Vergisst du es in der letzten Zeile einer Funktion, lautet die Meldung expected ';' before '}' token. Klammerfehler verhalten sich ähnlich. Schließt du die geschweifte Klammer eines if-Blocks oder einer Funktion nicht, liest der Compiler bis zum Dateiende weiter und meldet erst dort expected '}' at end of input. Liegt die offene Klammer in setup(), kommt zusätzlich a function-definition is not allowed here before '{' token, denn für den Compiler ist loop() jetzt eine Funktion, die du innerhalb von setup() definieren willst. Kommas statt Semikolons in der Klammer einer for-Schleife sind ein weiterer Klassiker dieser Familie.
| Meldung | Wahrscheinlichste Ursache | Wo nachsehen? |
|---|---|---|
| expected ';' before 'delay' | Am Ende der vorherigen Zeile fehlt ein Semikolon | Beim Uno die Zeile über der gemeldeten, beim ESP32 das Ende der gemeldeten Zeile |
| expected ';' before '}' token | In der letzten Zeile des Blocks fehlt ein Semikolon | Die Zeile direkt vor der schließenden Klammer |
| expected ';' before '<' token | Kommas statt Semikolons in einer for-Anweisung | Schreibe for (int i = 0; i < 10; i++) |
| expected '}' at end of input | Eine geschweifte Klammer wurde nicht geschlossen | Einrückung mit Automatisch formatieren prüfen; zu jeder { gehört eine } |
| a function-definition is not allowed here before '{' token | Die schließende Klammer der vorherigen Funktion fehlt | Das Ende der Funktion vor der gemeldeten |
| expected ')' before ';' token | Eine runde Klammer wurde nicht geschlossen | Klammern in if-Bedingungen und Funktionsaufrufen zählen |
| expected primary-expression before ')' token | In der Klammer fehlt ein Wert | Ein leeres Argument wie digitalWrite(13, ) |
| expected constructor, destructor, or type conversion before '(' token | Ein Befehl steht außerhalb einer Funktion | Befehle wie pinMode() in setup() verschieben |
| expected unqualified-id before '{' token | Semikolon nach dem Funktionskopf | void loop() { statt void loop(); { schreiben |
'No such file or directory': Bibliothek nicht gefunden
Die Zeilen fatal error: DHT.h: No such file or directory und das folgende compilation terminated. sagen, dass die Datei, die eine #include-Zeile in deinem Code anfordert, auf deinem Rechner nicht gefunden wurde. Das Wort "fatal" heißt, dass das Kompilieren an dieser Stelle komplett abbricht; Fehler im restlichen Code siehst du erst, wenn dieser behoben ist. Die Ursache ist fast immer eine nicht installierte Bibliothek. Wenn du ein Projekt aus dem Internet öffnest, lies die #include-Zeilen am Anfang nacheinander und installiere die jeweilige Bibliothek über Werkzeuge > Bibliotheken verwalten. Wählst du im Fenster mit den Abhängigkeiten nicht Alle installieren, wird zwar die Hauptbibliothek installiert, aber die zweite, die sie braucht, fehlt; dann steht in der Meldung nicht eine Datei aus deinem Code, sondern eine, die die Bibliothek selbst aufruft (zum Beispiel Adafruit_Sensor.h). Auch die Groß- und Kleinschreibung des Dateinamens zählt: Unter Linux sind dht.h und DHT.h verschiedene Dateien. Die drei Wege, eine Bibliothek zu installieren, und ZIP-Probleme findest du in der Anleitung Arduino-Bibliothek installieren.
| Datei in der Meldung | Im Bibliotheksverwalter suchen | Hinweis |
|---|---|---|
| DHT.h | DHT sensor library (Adafruit) | Alle installieren wählen; Adafruit Unified Sensor kommt mit |
| Adafruit_Sensor.h | Adafruit Unified Sensor | Fehlende Abhängigkeit einer anderen Adafruit-Bibliothek |
| LiquidCrystal_I2C.h | LiquidCrystal I2C (Frank de Brabander) | Nicht mehrere gleichnamige Bibliotheken installieren; siehe Warnung unten |
| Adafruit_SSD1306.h | Adafruit SSD1306 | Wird mit Adafruit GFX und Adafruit BusIO installiert |
| MFRC522.h | MFRC522 (GithubCommunity) | Für das RFID-Modul RC522 |
| IRremote.h | IRremote | Neuere Versionen nutzen IrReceiver.begin(); alte Beispiele können Warnungen oder Fehler liefern |
| SoftwareSerial.h (mit gewähltem ESP32) | Nicht installieren; im ESP32-Paket nicht enthalten | Den Hardware-Port Serial2 des ESP32 nutzen oder die Bibliothek EspSoftwareSerial installieren |
Der Fehler 'does not name a type'
does not name a type bedeutet, dass der Compiler am Zeilenanfang einen Datentyp (wie int, float, Servo oder LiquidCrystal_I2C) erwartet, das geschriebene Wort aber nicht kennt. Es gibt drei häufige Ursachen. Die erste ist eine vergessene #include-Zeile: Wird Servo klappe; ohne Servo.h kompiliert, kommt 'Servo' does not name a type. Die zweite ist ein falsch geschriebener Typ: Richtig ist String statt string und int statt Int, und oft hilft der Compiler mit did you mean 'String'?. Die dritte und überraschendste ist ein Befehl außerhalb einer Funktion. Außerhalb von Funktionen darfst du nur deklarieren: int winkel = 0; ist gültig, schreibst du aber in einer späteren Zeile nur winkel = 90;, hält der Compiler winkel für einen Typnamen und meldet 'winkel' does not name a type. Dazu kommt eine Arduino-typische Falle: Die IDE fügt die Prototypen deiner Funktionen automatisch direkt vor der ersten Funktion ein. Hast du eine Funktion geschrieben, die einen eigenen struct-Typ zurückgibt, und den struct unter setup() definiert, landet der Prototyp vor dem struct und es kommt derselbe Fehler. Die Lösung: struct-Definitionen ganz nach oben schreiben, vor die erste Funktion.
1#include <Servo.h> // bu satır yoksa: 'Servo' does not name a type / without it: 'Servo' does not name a type
2
3struct Olcum { // struct'ı ilk fonksiyondan önce tanımla / define structs before the first function
4 int ham;
5 float volt;
6};
7
8Servo kapak; // tür adı büyük harfle başlar / the type name starts with a capital letter
9int aci = 0; // dışarıda tanım ve ilk değer serbest / declaring with a value outside is fine
10// aci = 90; // dışarıda tek başına atama: 'aci' does not name a type / bare assignment outside: error
11
12Olcum potOku() {
13 Olcum o;
14 o.ham = analogRead(A0); // potansiyometre A0'da / potentiometer on A0
15 o.volt = o.ham * 5.0 / 1023.0; // 0-1023 değerini volta çevir / convert 0-1023 to volts
16 return o;
17}
18
19void setup() {
20 Serial.begin(9600);
21 kapak.attach(9); // servo sinyali D9 / servo signal on D9
22}
23
24void loop() {
25 Olcum o = potOku();
26 aci = map(o.ham, 0, 1023, 0, 180); // atama fonksiyonun içinde / assignment inside a function
27 kapak.write(aci);
28 Serial.println(o.volt);
29 delay(20);
30}Der Fehler 'redefinition of': dasselbe doppelt definiert
Der Fehler redefinition of 'void setup()' sagt, dass es zwei Definitionen mit demselben Namen gibt; die Zeile note: 'void setup()' previously defined here direkt darunter zeigt, wo die erste steht. Bei Einsteigern ist die häufigste Ursache, dass zwei Beispielsketches hintereinander in eine Datei kopiert wurden: Dann gibt es zwei setup() und zwei loop(). Die zweite Ursache sind Tabs. Vor dem Kompilieren fügt die Arduino IDE alle .ino-Dateien im Sketch-Ordner zu einer zusammen. Eine alte Sicherungskopie im Ordner (zum Beispiel projekt_alt.ino) oder ein zweiter Tab mit eigenem setup() und loop() löst diesen Fehler aus, selbst wenn du den Tab nie öffnest; die Lösung ist, die Datei aus dem Ordner zu entfernen. Wird dieselbe Variable zweimal deklariert, kommt eine ähnliche Meldung: redefinition of 'int led'. Das Gegenstück beim Linker heißt multiple definition of; es erscheint, wenn eine Variable mit Wertzuweisung in einer Header-Datei (.h) in zwei verschiedene .cpp-Dateien eingebunden wird. Das Gegenteil, undefined reference to, weist auf eine Funktion hin, deren Prototyp du geschrieben hast, deren Rumpf aber fehlt oder deren Name anders geschrieben ist.
1// İki örneği birleştirmek: tek setup(), tek loop() / Merging two sketches: one setup(), one loop()
2const int LED_PIN = 13; // 1. örnek: Blink / sketch 1: Blink
3const int POT_PIN = A0; // 2. örnek: potansiyometre / sketch 2: potentiometer
4unsigned long oncekiZaman = 0; // millis() zamanlayıcısı / millis() timer
5bool ledDurum = false;
6
7void setup() {
8 pinMode(LED_PIN, OUTPUT); // 1. örneğin setup içeriği / setup body of sketch 1
9 Serial.begin(9600); // 2. örneğin setup içeriği / setup body of sketch 2
10}
11
12void loop() {
13 // 1. örnek: delay yerine millis ile yanıp sönme / sketch 1: blink with millis instead of delay
14 if (millis() - oncekiZaman >= 500) {
15 oncekiZaman = millis();
16 ledDurum = !ledDurum;
17 digitalWrite(LED_PIN, ledDurum);
18 }
19 // 2. örnek: potansiyometreyi oku ve yaz / sketch 2: read and print the potentiometer
20 int deger = analogRead(POT_PIN); // 0-1023 arası / between 0 and 1023
21 Serial.println(deger);
22 delay(50);
23}Halte dich beim Zusammenführen an diese Reihenfolge: Sammle zuerst die #include-Zeilen beider Sketches ohne Dopplungen oben, füge dann globale Variablen und Konstanten hinzu; gibt es einen Namen in beiden, benenne einen um. Danach kommt der Inhalt beider setup()-Funktionen in ein einziges setup() und der Inhalt beider loop()-Funktionen in ein einziges loop(). Nutzt einer der Sketches ein langes delay(), bremst er den anderen aus; das löst du mit der Methode millis() statt delay(). Prüfe zum Schluss, ob beide Sketches denselben Pin benutzen: Der Compiler bemerkt das nicht, aber deine Schaltung funktioniert dann nicht wie erwartet.
'Sketch too big' und Fehler bei zu wenig Speicher
Am Ende jedes erfolgreichen Kompilierens siehst du zwei Zeilen. Kompilierst du das Scope-Beispiel oben für den Uno, sagt dir die Zeile Sketch uses 2212 bytes (6%) of program storage space. Maximum is 32256 bytes., wie viel Flash-Speicher das Programm belegt, und Global variables use 190 bytes (9%) of dynamic memory, wie viel RAM die globalen Variablen brauchen. Passt das Programm nicht in den Flash, steigt der Wert über 100 Prozent, gefolgt von der Warnung Sketch too big und dem Fehler text section exceeds available space in board. Passen die globalen Variablen nicht in den RAM, siehst du stattdessen Not enough memory und data section exceeds available space in board. Liegt die RAM-Auslastung über 75 Prozent, kann die IDE die Warnung Low memory available, stability problems may occur. ausgeben: Der Code wird kompiliert, aber weil zur Laufzeit kein Platz für lokale Variablen bleibt, kann das Board zufällig hängen bleiben oder von selbst neu starten. Beim Uno belegt der Bootloader 0,5 KB der 32 KB Flash, deshalb liegt die Grenze bei 32256 Byte.
| Board | Grenze Programmspeicher | RAM (dynamischer Speicher) | Hinweis |
|---|---|---|---|
| Arduino Uno R3 | 32256 Byte | 2048 Byte | 0,5 KB sind für den Bootloader reserviert |
| Arduino Nano (ATmega328P) | 30720 Byte | 2048 Byte | Die IDE reserviert bei beiden Bootloader-Optionen 2 KB |
| Arduino Leonardo | 28672 Byte | 2560 Byte | 4 KB Bootloader; auch der USB-Code braucht Platz |
| Arduino Mega 2560 | 253952 Byte | 8192 Byte | Einfacher Umstieg für Projekte, die nicht auf den Uno passen |
| ESP32 (Standard-Partitionierung) | 1310720 Byte | 327680 Byte | Mit Huge APP steigt der Wert auf 3145728 Byte |
| Raspberry Pi Pico (arduino-pico, 2MB no FS) | 2093056 Byte | 262144 Byte | Reservierst du Platz für ein Dateisystem, schrumpft der Programmbereich |
1// RAM tasarrufu: F() ve PROGMEM / Saving RAM: F() and PROGMEM
2const char mesaj[] PROGMEM = "Bu uzun metin RAM yerine flasta durur"; // flaşta saklanır / stored in flash
3const byte notalar[] PROGMEM = {60, 62, 64, 65, 67, 69, 71, 72}; // byte: int'in yarısı / byte: half of an int
4
5void setup() {
6 Serial.begin(9600);
7 Serial.println(F("Merhaba! Bu metin de flastan okunur")); // F(): RAM harcamaz / F(): uses no RAM
8 char tampon[48]; // geçici RAM tamponu / temporary RAM buffer
9 strcpy_P(tampon, mesaj); // flaştan RAM'e kopyala / copy from flash to RAM
10 Serial.println(tampon);
11 for (byte i = 0; i < sizeof(notalar); i++) {
12 Serial.print(pgm_read_byte(¬alar[i])); // flaştan bir bayt oku / read one byte from flash
13 Serial.print(' ');
14 }
15 Serial.println();
16}
17
18void loop() {
19}- Feste Texte in F() packen: Serial.println(F("System bereit")); liest den Text direkt aus dem Flash, ohne ihn in den RAM zu kopieren. Das gilt auch für feste Texte auf LCD- und OLED-Displays.
- Große Arrays in PROGMEM verschieben: Notentabellen, Display-Bitmaps und lange Texte müssen nicht im RAM liegen, wenn sie sich nie ändern. Ausführlichere Techniken findest du im Artikel Arduino: zu wenig Speicher.
- Den passenden Datentyp wählen: Für einen Wert zwischen 0 und 255 reicht byte (1 Byte); ein int belegt auf dem Uno 2 Byte, long und float je 4 Byte.
- Die String-Klasse sparsam einsetzen: Ständig zusammengesetzte String-Objekte zerstückeln den RAM; char-Arrays fester Länge sind berechenbarer.
- Den versteckten Bedarf von Display-Bibliotheken kennen: Adafruit SSD1306 reserviert für ein 128×64-OLED-Display erst zur Laufzeit einen Puffer von 1 KB. Dieser Speicher taucht im Kompilierbericht nicht auf; das Display kann also ausfallen, obwohl der Bericht 70 Prozent anzeigt.
- Auf ein größeres Board umsteigen: Ein Projekt, das nicht auf den Uno passt, läuft auf dem Mega oder ESP32 problemlos. Beim ESP32 vergrößerst du den Programmbereich von 1,25 MB auf 3 MB, indem du unter Werkzeuge > Partition Scheme die Option Huge APP (3MB No OTA/1MB SPIFFS) wählst; Updates per Funk (OTA) sind damit nicht möglich.
Fehler durch die falsche Board-Auswahl
Der Compiler übersetzt deinen Code immer für den Prozessor des Boards, das unter Werkzeuge > Board (in der IDE 2 in der Board-Auswahl oben) eingestellt ist. Derselbe Code kann für den Mega fehlerfrei kompilieren und mit gewähltem Uno scheitern, denn jedes Board hat eigene Hardware, eigene Pin-Namen und eigene Bibliotheken aus seinem Board-Paket. Wenn du ein Projekt aus dem Internet öffnest, prüfe zuerst, für welches Board es geschrieben wurde: Code für den ESP32 kompiliert nicht mit gewähltem Uno, und Uno-Code, der direkt auf die Register des Prozessors zugreift, kompiliert nicht mit gewähltem ESP32. Taucht dein Board gar nicht in der Liste auf, ist sein Board-Paket nicht installiert; die Pakete für ESP32 und Raspberry Pi Pico installierst du über die Board-Verwaltung. Die Schritte findest du in der Anleitung Arduino IDE installieren.
| Fehlermeldung | Was ist passiert? | Lösung |
|---|---|---|
| 'Serial1' was not declared in this scope | Der Code ist für Mega oder Leonardo geschrieben, gewählt ist der Uno; der Uno hat nur einen Hardware-Seriellport | Das richtige Board wählen oder auf dem Uno SoftwareSerial nutzen |
| SoftwareSerial.h: No such file or directory | Der ESP32 ist gewählt; im ESP32-Paket fehlt diese Bibliothek | Die Hardware-Seriellports des ESP32 (Serial2) nutzen |
| 'LED_BUILTIN' was not declared in this scope | Manche Board-Definitionen wie ESP32 Dev Module definieren die Konstante für die eingebaute LED nicht | Die Pinnummer direkt angeben (bei vielen DevKit-Boards GPIO 2) |
| 'D5' was not declared in this scope | Namen wie D0–D8 gibt es bei ESP8266-Boards wie NodeMCU und Wemos und bei einigen anderen Boards, nicht aber beim Uno oder beim ESP32 Dev Module | Auf Uno und ESP32 die GPIO-Nummer schreiben oder das richtige Board wählen |
| 'TCCR1A' was not declared in this scope | Code, der direkt auf AVR-Timer-Register zugreift, wird für den ESP32 kompiliert | Die LEDC- und Timer-Funktionen des ESP32 verwenden |
| WiFi.h: No such file or directory oder 'WIFI_STA' was not declared in this scope | ESP32-Code wird für den Uno kompiliert; der Uno hat kein WLAN | Unter Werkzeuge > Board ESP32 Dev Module wählen |
| 'ledcSetup' was not declared in this scope | Das ESP32-Paket hat Version 3.x, der Code wurde für 2.x geschrieben | ledcAttach() und ledcWrite() mit der Pinnummer verwenden |
Kompilierfehler beim ESP32

Auch der ESP32 wird in der Arduino-Sprache programmiert, aber weil Compiler und Board-Paket andere sind, kann Code, der auf dem Uno fehlerfrei kompiliert, auf dem ESP32 hängen bleiben. Der häufigste Grund ist die Paketversion: In Version 3.x des ESP32-Arduino-Pakets haben sich die PWM-Funktionen geändert; ledcSetup() und ledcAttachPin() wurden entfernt und durch ledcAttach() und ledcWrite() ersetzt, die mit der Pinnummer statt einer Kanalnummer arbeiten. Ältere Beispiele aus dem Internet liefern deshalb 'ledcSetup' was not declared in this scope; entweder stellst du den Code auf die neuen Funktionen um oder installierst über die Board-Verwaltung Version 2.0.17. Der zweite Unterschied sind die Compiler-Einstellungen. Das Uno-Paket kompiliert mit der Option -fpermissive, die manche Fehler zu Warnungen herabstuft; beim ESP32 fehlt sie. Eine Variable ohne geschweifte Klammern in einem switch-case zu deklarieren, kompiliert deshalb auf dem Uno, liefert auf dem ESP32 aber den Fehler jump to case label. Aktuelle ESP32-Pakete kompilieren außerdem mit -Werror=return-type: Vergisst du das return in einer Funktion, die einen Wert zurückgeben muss, bekommst du no return statement in function returning non-void, sobald Compiler-Meldungen auf etwas anderes als Keine steht. In Version 2.x werden mit Compiler-Meldungen auf Mehr oder Alle die meisten Warnungen zu Fehlern. Zur Grundeinrichtung des Boards wirf einen Blick in den Artikel Was ist der ESP32.
1// ESP32 Arduino paketi 3.x / ESP32 Arduino core 3.x
2const int LED_PIN = 2; // birçok DevKit kartında dahili LED / onboard LED on many DevKit boards
3const int FREKANS = 5000; // PWM frekansı 5 kHz / PWM frequency 5 kHz
4const int COZUNURLUK = 8; // 8 bit: 0-255 arası / 8 bits: range 0-255
5
6int parlaklik(int adim) {
7 return (adim % 32) * 8; // return unutulursa 3.x'te derleme hatası olabilir / a missing return can fail to compile on 3.x
8}
9
10void setup() {
11 Serial.begin(115200);
12 // eski 2.x kodu / old 2.x code: ledcSetup(0, FREKANS, COZUNURLUK); ledcAttachPin(LED_PIN, 0);
13 ledcAttach(LED_PIN, FREKANS, COZUNURLUK); // 3.x: kanal otomatik seçilir / channel is picked automatically
14}
15
16void loop() {
17 for (int adim = 0; adim < 32; adim++) {
18 ledcWrite(LED_PIN, parlaklik(adim)); // 3.x: pin numarasıyla yaz / write using the pin number
19 delay(30);
20 }
21 if (Serial.available()) {
22 switch (Serial.read()) {
23 case 'h': { // case içinde değişken varsa süslü parantez şart / braces needed if a case declares a variable
24 int deger = ledcRead(LED_PIN);
25 Serial.println(deger);
26 break;
27 }
28 default:
29 break;
30 }
31 }
32}Raspberry Pi Pico: Fehler in Arduino IDE und MicroPython
Programmierst du den Pico mit der Arduino IDE, also mit dem arduino-pico-Paket von Earle Philhower, ist der Compiler weiterhin GCC und alle Meldungen aus diesem Artikel gelten unverändert. Bei MicroPython ist es anders: Es gibt keinen vorgelagerten Kompilierschritt; der Pico übersetzt die Datei beim Start in Bytecode und führt sie Zeile für Zeile aus. Deshalb erscheinen Fehler im Shell-Bereich unten in Thonny, in einer Meldung, die mit Traceback (most recent call last): beginnt. Lies diese Meldung von unten nach oben: Die letzte Zeile nennt Fehlerart und Beschreibung, die Angabe line 7 darüber die Zeile. Syntaxfehler (SyntaxError, IndentationError) werden gemeldet, bevor das Programm überhaupt startet; andere Fehler tauchen erst auf, wenn das Programm die betreffende Zeile erreicht, dein Code kann also eine Weile laufen und dann stehen bleiben. Zur Installation von MicroPython und den ersten Schritten lies den Artikel Was ist der Raspberry Pi Pico.
| MicroPython-Fehler | Bedeutung | Lösung |
|---|---|---|
| SyntaxError: invalid syntax | Kaputte Syntax: Am Ende einer if-, while- oder def-Zeile fehlt der Doppelpunkt oder eine Klammer ist nicht geschlossen | Doppelpunkt am Zeilenende ergänzen, Klammern zählen |
| IndentationError: unexpected indent | Uneinheitliche Einrückung; Leerzeichen und Tabs gemischt | In jedem Block 4 Leerzeichen verwenden |
| NameError: name 'led' isn't defined | Name falsch geschrieben oder vor der Definition benutzt | Groß- und Kleinschreibung und Ort der Definition prüfen |
| ImportError: no module named 'ssd1306' | Die Treiberdatei liegt nicht auf dem Pico | ssd1306.py mit Thonny auf dem Pico speichern |
| AttributeError: 'Pin' object has no attribute 'toggel' | Das Objekt hat keine solche Funktion | Funktionsnamen korrigieren: toggle() |
| TypeError: can't convert 'int' object to str implicitly | Text und Zahl mit + verbunden | str(zahl) verwenden oder die Werte mit Komma an print übergeben |
| OSError: [Errno 5] EIO | Das I2C-Gerät antwortet nicht | Verkabelung, Adresse sowie SDA- und SCL-Pin prüfen |
1from machine import Pin
2import time
3
4led = Pin("LED", Pin.OUT) # Pico ve Pico W dahili LED / onboard LED on Pico and Pico W
5sayac = 0
6
7while True: # iki nokta unutulursa SyntaxError / a missing colon gives SyntaxError
8 led.toggle() # blok içinde 4 boşluk girinti / 4-space indent inside the block
9 sayac += 1
10 print("Sayac:", sayac) # "Sayac: " + sayac yazmak TypeError verir / "Sayac: " + sayac raises TypeError
11 time.sleep(0.5)Tabelle: Arduino-Kompilierfehler und ihre Lösungen
| Fehlermeldung | Ursache | Lösung |
|---|---|---|
| exit status 1 / Compilation error: exit status 1 | Ein Programm der Kompilier- oder Upload-Kette ist gescheitert | Nach oben scrollen, die erste Zeile mit error: lesen |
| 'x' was not declared in this scope | Tippfehler, Groß- und Kleinschreibung, Gültigkeitsbereich oder fehlendes #include | Namen korrigieren, Variable global machen, Bibliothek einbinden |
| expected ';' before ... | In der vorherigen Zeile fehlt ein Semikolon | Beim Uno die Zeile darüber, beim ESP32 das Ende der gemeldeten Zeile prüfen |
| expected '}' at end of input | Nicht geschlossene geschweifte Klammer | Klammern mit Automatisch formatieren (Strg+T) abgleichen |
| X.h: No such file or directory | Bibliothek nicht installiert oder Dateiname falsch | Über den Bibliotheksverwalter samt Abhängigkeiten installieren |
| 'X' does not name a type | Fehlendes #include, falscher Typname oder Befehl außerhalb einer Funktion | Bibliothek einbinden, Schreibweise von String und int prüfen, Befehl in eine Funktion verschieben |
| redefinition of 'void setup()' | Zwei setup() oder eine zusätzliche .ino-Datei im Ordner | Sketches zusammenführen, alte Datei aus dem Ordner entfernen |
| stray '\342' in program | Kopiertes typografisches Anführungszeichen oder Strich, Umlaut im Variablennamen | Anführungszeichen neu tippen, Namen ohne Umlaute |
| 'class X' has no member named 'y' | Falscher Funktionsname oder andere Bibliotheksversion | Die Beispiele der Bibliothek ansehen, passende Version installieren |
| too few arguments to function / too many arguments to function | Zu wenige oder zu viele Werte an eine Funktion übergeben | Mit der Definition in der Zeile note: declared here vergleichen |
| lvalue required as left operand of assignment | Zuweisung statt Vergleich: if (digitalRead(2) = HIGH) | Für Vergleiche == verwenden |
| jump to case label | Variable im case ohne geschweifte Klammern deklariert (beim ESP32 ein Fehler) | Den case-Block in { } einschließen |
| undefined reference to `blinken()' | Die Funktion hat nur einen Prototyp, keinen Rumpf | Funktion schreiben oder Namen korrigieren |
| Sketch too big / text section exceeds available space in board | Das Programm passt nicht in den Flash | Code verkleinern, größeres Board, beim ESP32 Partition Scheme |
| data section exceeds available space in board | Globale Variablen passen nicht in den RAM | F()-Makro, kleinere Datentypen, Arrays in PROGMEM |
| #error This library only supports boards with ... | Die Bibliothek unterstützt die Architektur des gewählten Boards nicht | Passende Bibliothek installieren oder Board wechseln |
Nächste Schritte zu fehlerfreiem Code
- Grundlagen festigen: Der Artikel Arduino-Programmierung: Grundlagen erklärt Variablen, Gültigkeitsbereiche, Funktionen und Schleifen; die meisten Fehler aus diesem Artikel haben dort ihren Ursprung.
- Befehle richtig schreiben: Die Liste der Arduino-Befehle zeigt Syntax und Parameter jedes Befehls mit Beispielen.
- Bibliotheken richtig installieren: Die Anleitung Arduino-Bibliothek installieren behandelt die Meldungen No such file or directory und Multiple libraries were found ausführlich.
- Sehen, was dein Code zur Laufzeit tut: Bei Code, der kompiliert, sich aber nicht wie erwartet verhält, ist die Ausgabe von Variablen im seriellen Monitor der schnellste Weg zur Diagnose.
- Ohne Board testen: In den Simulatoren Wokwi oder Tinkercad kannst du deinen Code kompilieren und zusammen mit der Schaltung ausführen.
- KI-Code prüfen: Code von Chatbots ist oft für alte Bibliotheksversionen oder ein anderes Board geschrieben; der Artikel Arduino-Code mit KI zeigt, wie du solche Probleme erkennst.
Kompilierfehler wirken anfangs abschreckend, aber eigentlich sagt dir der Compiler, wo das Problem liegt, und oft auch, wie du es löst: Datei, Zeile, Spalte und eine kurze Beschreibung. Lies den ersten Fehler, behebe nur diesen, kompiliere neu und wiederhole das; nach ein paar Projekten löst du solche Fehler in Sekunden. Sobald dein Code kompiliert und auf dem Board ist, kannst du mit den LED-, Taster-, Sensor- und Display-Projekten in der BlueGrays-App weitermachen: Für Arduino, ESP32 und Raspberry Pi Pico gibt es zu jedem Projekt einen Schaltplan und fehlerfrei kompilierenden Code, Schritt für Schritt.
Häufige Fragen
Was bedeutet exit status 1 beim Arduino?
exit status 1 ist eine allgemeine Meldung, dass eines der Programme beim Kompilieren oder Hochladen mit einem Fehler beendet wurde; die Ursache nennt sie selbst nicht. Scrolle im Ausgabefenster nach oben und suche die erste Zeile mit error:, dort stehen Dateiname, Zeilennummer und Beschreibung. Behebst du diesen Fehler und kompilierst neu, verschwindet auch exit status 1.
Wie behebe ich 'was not declared in this scope'?
Der Compiler kennt eine Variable, Funktion oder Konstante an dieser Stelle nicht. Die häufigsten Ursachen sind falsche Groß- und Kleinschreibung (digitalwrite), eine Variable, die in einer anderen Funktion deklariert ist, und eine nicht eingebundene Bibliothek. Meist reicht es, die Schreibweise zu prüfen und gemeinsam genutzte Variablen außerhalb aller Funktionen zu deklarieren.
Was bedeutet "expected ';' before" beim Arduino?
Der Fehler sagt, dass ein Semikolon fehlt. Weil der Compiler des Uno das erst beim nächsten Wort merkt, steht in seiner Meldung meist die Zeile darunter; setze das Semikolon dann ans Ende der Zeile direkt darüber. Beim ESP32 und Pico zeigt die Meldung direkt auf die Zeile, in der das Semikolon fehlt. Kommas statt Semikolons in der Klammer einer for-Schleife führen zur selben Meldung.
Warum kommt der Fehler 'does not name a type'?
Der Compiler erwartet am Zeilenanfang einen Datentyp, kennt das geschriebene Wort aber nicht. Eine vergessene #include-Zeile (etwa für Servo), string statt String und eine alleinstehende Zuweisung wie winkel = 90; außerhalb einer Funktion sind die drei häufigsten Ursachen. Nutzt du in Arduino einen eigenen struct-Typ, definiere ihn vor der ersten Funktion.
Was tun bei 'Sketch too big' auf dem Arduino?
Die Meldung bedeutet, dass das Programm nicht in den Flash-Speicher des Boards passt; beim Uno liegt die Grenze bei 32256 Byte. Entferne ungenutzte Bibliotheken und Debug-Ausgaben, verschiebe große konstante Arrays in PROGMEM oder steige auf ein Board mit mehr Speicher wie den Mega oder ESP32 um. Beim ESP32 vergrößert Huge APP im Menü Partition Scheme den Programmbereich auf etwa 3 MB.
Der Sketch kompiliert, lässt sich aber nicht hochladen. Warum?
Ist das Kompilieren erfolgreich, siehst du die Zeile Sketch uses mit der Programmgröße; Fehler danach gehören zum Hochladen und haben mit Kabel, Treiber, Port oder Board-Auswahl zu tun, nicht mit dem Code. Zeilen mit avrdude deuten beim Uno und Nano auf ein Upload-Problem hin, esptool-Zeilen beim ESP32. Arbeite dann die Schritte der Anleitung zum Hochladen-Fehler der Reihe nach ab.
Projekte, die du danach bauen kannst
Alle Projekte ansehen
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

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

HC-SR04 Abstandsmessung (serielle Anzeige)
Der Sensor HC-SR04 funktioniert wie eine Fledermaus, die im Dunkeln ihren Weg findet: Er sendet einen Ton, den du nicht hörst, lauscht auf das Echo und misst, wie weit der Gegenstand vor ihm entfernt

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

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.

Raspberry Pi Pico Onboard-LED Blinken (GP25 Interne LED)
Das Eröffnungsprojekt der Raspberry Pi Pico-Serie! Wir bringen die interne LED (grüne LED an GP25) 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

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

Verwendung von Servomotoren
Der Arm eines kleinen Servomotors dreht sich nacheinander in drei Stellungen: ganz an den Anfang, genau in die Mitte und ganz ans Ende, mit jeweils zwei Sekunden Pause. Der Arduino sagt dem Motor, bei
Weitere Artikel
BlueGrays-App
Diese Schaltung Schritt für Schritt auf dem Handy nachbauen
Schaltplan, Code und Teileliste auf einem Bildschirm. Über 160 Arduino-, ESP32- und Pico-Projekte zum Nachbauen.
Mit dem Handy scannen
Richte die Kamera auf den Code, dann öffnet sich der App-Store deines Handys.
oder im Store öffnen

