Ratgeber · 16 Min. Lesezeit

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.

Arduino Uno R3 Board
Arduino Uno: Der Code wird für den Prozessor des unter Werkzeuge > Board gewählten Boards kompiliert (hier der ATmega328P); ein falsch gewähltes Board kann selbst bei korrektem Code einen Kompilierfehler auslösen.

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 siehstPhaseWas es bedeutet
error: ... und am Ende exit status 1KompilierenIn deinem Code oder einer Bibliothek steckt ein C++-Fehler; die Ursache steht in der error:-Zeile
fatal error: DHT.h: No such file or directoryKompilieren (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 statusLinkenEine Funktion ist deklariert, aber ihr Rumpf existiert nirgends
multiple definition of ...LinkenDieselbe Variable oder Funktion ist in zwei Dateien definiert
Sketch too big und text section exceeds available space in boardGrößenprüfungDas Programm passt nicht in den Flash-Speicher des Boards
Not enough memory und data section exceeds available space in boardGrößenprüfungDie globalen Variablen passen nicht in den RAM
Failed uploading: uploading error: exit status 1HochladenDer 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.

TeilWert im BeispielBedeutung
DateiBlink.inoDie Datei mit dem Fehler; bei mehreren Tabs erkennst du hier, welcher es ist
Zeile6Die Zeile, in der der Compiler den Fehler bemerkt hat; der eigentliche Fehler steht manchmal eine Zeile darüber
Spalte3Das wievielte Zeichen der Zeile; dorthin zeigt das ^
Arterrorerror bricht ab, warning warnt, note ergänzt
Meldung'digitalwrite' was not declared in this scopeDer Teil, der das Problem beschreibt; nach diesem Text suchst du im Internet
Vorschlagnote: suggested alternative: 'digitalWrite'Die Vermutung des Compilers; zeigt oft die richtige Schreibweise
  1. 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.
  2. 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.
  3. Scrolle im Ausgabefenster ganz nach oben und suche die erste Zeile mit error:. Die meisten Fehler danach sind Folgefehler dieses ersten.
  4. 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.
  5. 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.
  6. 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.
Ein einziger Fehler kann Dutzende roter Zeilen erzeugen. Eine einzige Serial.println-Zeile mit typografischen Anführungszeichen, die von einer Webseite kopiert wurden, liefert auf dem Uno zum Beispiel sechs stray-Fehler und einen was not declared-Fehler. Lass dich von der Anzahl also nicht verrückt machen: Behebe den obersten Fehler und kompiliere neu. Ob deine geschweiften Klammern zusammenpassen, prüfst du mit Werkzeuge > Automatisch formatieren (Strg+T): Verrutschen die Einrückungen unerwartet, fehlt irgendwo eine Klammer.

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).

Arduino (C++)
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}
UrsacheFalschRichtig
Groß- und Kleinschreibungdigitalwrite(13, HIGH);digitalWrite(13, HIGH);
Konstante falsch geschriebenpinMode(13, OUPUT);pinMode(13, OUTPUT);
Variable in einer anderen Funktion deklariertint led = 13; in setup() deklarieren und led in loop() verwendenDie Zeile int led = 13; außerhalb aller Funktionen nach oben verschieben
Variable erst nach der Verwendung deklariertint zaehler = 0; steht nach der Zeile zaehler++;Die Deklaration vor die Stelle setzen, an der sie verwendet wird
Bibliothek nicht eingebundenWire.begin(); ohne #include-Zeile#include <Wire.h> an den Anfang der Datei schreiben
Funktion, die das Board nicht hatSerial1.begin(9600); mit gewähltem UnoEin Board mit mehreren seriellen Ports wie den Mega wählen oder SoftwareSerial nutzen
Reihenfolge in einer zusätzlichen .cpp-DateiEine Funktion wird in einem .cpp-Tab vor ihrer Definition aufgerufenIn .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.

MeldungWahrscheinlichste UrsacheWo nachsehen?
expected ';' before 'delay'Am Ende der vorherigen Zeile fehlt ein SemikolonBeim Uno die Zeile über der gemeldeten, beim ESP32 das Ende der gemeldeten Zeile
expected ';' before '}' tokenIn der letzten Zeile des Blocks fehlt ein SemikolonDie Zeile direkt vor der schließenden Klammer
expected ';' before '<' tokenKommas statt Semikolons in einer for-AnweisungSchreibe for (int i = 0; i < 10; i++)
expected '}' at end of inputEine geschweifte Klammer wurde nicht geschlossenEinrückung mit Automatisch formatieren prüfen; zu jeder { gehört eine }
a function-definition is not allowed here before '{' tokenDie schließende Klammer der vorherigen Funktion fehltDas Ende der Funktion vor der gemeldeten
expected ')' before ';' tokenEine runde Klammer wurde nicht geschlossenKlammern in if-Bedingungen und Funktionsaufrufen zählen
expected primary-expression before ')' tokenIn der Klammer fehlt ein WertEin leeres Argument wie digitalWrite(13, )
expected constructor, destructor, or type conversion before '(' tokenEin Befehl steht außerhalb einer FunktionBefehle wie pinMode() in setup() verschieben
expected unqualified-id before '{' tokenSemikolon nach dem Funktionskopfvoid loop() { statt void loop(); { schreiben
Der Fehler stray '\342' in program bedeutet, dass in deinem Code ein Zeichen steht, das der Compiler nicht kennt; die Zahlen sind die Oktalwerte der UTF-8-Bytes dieses Zeichens. In Code, der von Webseiten, aus Word- oder PDF-Dateien und Messengern kopiert wurde, stecken oft typografische Anführungszeichen („ “) statt gerader ("), ein Gedankenstrich statt eines Minuszeichens oder ein unsichtbares geschütztes Leerzeichen: Typografische Anführungszeichen und Striche erscheinen als \342, das geschützte Leerzeichen als \302. Auch Umlaute in Variablennamen akzeptiert der Uno-Compiler nicht: int größe liefert stray '\303' in program. Die Lösung: Tippe Anführungszeichen und Striche in der gemeldeten Zeile neu über die Tastatur ein und verwende in Variablennamen nur Buchstaben ohne Umlaute und ß. Umlaute in Texten zwischen doppelten Anführungszeichen stören das Kompilieren dagegen nicht.

'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 MeldungIm Bibliotheksverwalter suchenHinweis
DHT.hDHT sensor library (Adafruit)Alle installieren wählen; Adafruit Unified Sensor kommt mit
Adafruit_Sensor.hAdafruit Unified SensorFehlende Abhängigkeit einer anderen Adafruit-Bibliothek
LiquidCrystal_I2C.hLiquidCrystal I2C (Frank de Brabander)Nicht mehrere gleichnamige Bibliotheken installieren; siehe Warnung unten
Adafruit_SSD1306.hAdafruit SSD1306Wird mit Adafruit GFX und Adafruit BusIO installiert
MFRC522.hMFRC522 (GithubCommunity)Für das RFID-Modul RC522
IRremote.hIRremoteNeuere Versionen nutzen IrReceiver.begin(); alte Beispiele können Warnungen oder Fehler liefern
SoftwareSerial.h (mit gewähltem ESP32)Nicht installieren; im ESP32-Paket nicht enthaltenDen 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.

Arduino (C++)
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.

Arduino (C++)
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.

BoardGrenze ProgrammspeicherRAM (dynamischer Speicher)Hinweis
Arduino Uno R332256 Byte2048 Byte0,5 KB sind für den Bootloader reserviert
Arduino Nano (ATmega328P)30720 Byte2048 ByteDie IDE reserviert bei beiden Bootloader-Optionen 2 KB
Arduino Leonardo28672 Byte2560 Byte4 KB Bootloader; auch der USB-Code braucht Platz
Arduino Mega 2560253952 Byte8192 ByteEinfacher Umstieg für Projekte, die nicht auf den Uno passen
ESP32 (Standard-Partitionierung)1310720 Byte327680 ByteMit Huge APP steigt der Wert auf 3145728 Byte
Raspberry Pi Pico (arduino-pico, 2MB no FS)2093056 Byte262144 ByteReservierst du Platz für ein Dateisystem, schrumpft der Programmbereich
Arduino (C++)
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(&notalar[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.

FehlermeldungWas ist passiert?Lösung
'Serial1' was not declared in this scopeDer Code ist für Mega oder Leonardo geschrieben, gewählt ist der Uno; der Uno hat nur einen Hardware-SeriellportDas richtige Board wählen oder auf dem Uno SoftwareSerial nutzen
SoftwareSerial.h: No such file or directoryDer ESP32 ist gewählt; im ESP32-Paket fehlt diese BibliothekDie Hardware-Seriellports des ESP32 (Serial2) nutzen
'LED_BUILTIN' was not declared in this scopeManche Board-Definitionen wie ESP32 Dev Module definieren die Konstante für die eingebaute LED nichtDie Pinnummer direkt angeben (bei vielen DevKit-Boards GPIO 2)
'D5' was not declared in this scopeNamen 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 ModuleAuf Uno und ESP32 die GPIO-Nummer schreiben oder das richtige Board wählen
'TCCR1A' was not declared in this scopeCode, der direkt auf AVR-Timer-Register zugreift, wird für den ESP32 kompiliertDie LEDC- und Timer-Funktionen des ESP32 verwenden
WiFi.h: No such file or directory oder 'WIFI_STA' was not declared in this scopeESP32-Code wird für den Uno kompiliert; der Uno hat kein WLANUnter Werkzeuge > Board ESP32 Dev Module wählen
'ledcSetup' was not declared in this scopeDas ESP32-Paket hat Version 3.x, der Code wurde für 2.x geschriebenledcAttach() und ledcWrite() mit der Pinnummer verwenden
Zu Beginn des Kompilierens siehst du vielleicht eine Zeile wie WARNING: library LiquidCrystal_I2C claims to run on avr architecture(s) and may be incompatible with your current board which runs on esp32 architecture(s). Das ist kein Fehler; sie sagt nur, dass der Autor der Bibliothek den ESP32 nicht in die Liste der unterstützten Boards eingetragen hat, und oft funktioniert die Bibliothek trotzdem. Achten solltest du vor allem auf die Meldung Multiple libraries were found for "LiquidCrystal_I2C.h": Sind zwei gleichnamige Bibliotheken installiert, nimmt die IDE eine davon, und passt diese Wahl nicht zu deinem Code, bekommst du einen Fehler wie 'class LiquidCrystal_I2C' has no member named 'init'. Die Zeilen Used und Not used darunter zeigen, welcher Ordner verwendet wurde; lösche die Kopie, die du nicht brauchst, aus dem libraries-Ordner.

Kompilierfehler beim ESP32

ESP32-Entwicklungsboard
ESP32: Er wird in der Arduino IDE in derselben Sprache programmiert, aber mit einem anderen Compiler und Board-Paket übersetzt, deshalb scheitert hier mancher Code, der auf dem Uno läuft.

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.

Arduino (C++)
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-FehlerBedeutungLösung
SyntaxError: invalid syntaxKaputte Syntax: Am Ende einer if-, while- oder def-Zeile fehlt der Doppelpunkt oder eine Klammer ist nicht geschlossenDoppelpunkt am Zeilenende ergänzen, Klammern zählen
IndentationError: unexpected indentUneinheitliche Einrückung; Leerzeichen und Tabs gemischtIn jedem Block 4 Leerzeichen verwenden
NameError: name 'led' isn't definedName falsch geschrieben oder vor der Definition benutztGroß- und Kleinschreibung und Ort der Definition prüfen
ImportError: no module named 'ssd1306'Die Treiberdatei liegt nicht auf dem Picossd1306.py mit Thonny auf dem Pico speichern
AttributeError: 'Pin' object has no attribute 'toggel'Das Objekt hat keine solche FunktionFunktionsnamen korrigieren: toggle()
TypeError: can't convert 'int' object to str implicitlyText und Zahl mit + verbundenstr(zahl) verwenden oder die Werte mit Komma an print übergeben
OSError: [Errno 5] EIODas I2C-Gerät antwortet nichtVerkabelung, Adresse sowie SDA- und SCL-Pin prüfen
MicroPython
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

FehlermeldungUrsacheLösung
exit status 1 / Compilation error: exit status 1Ein Programm der Kompilier- oder Upload-Kette ist gescheitertNach oben scrollen, die erste Zeile mit error: lesen
'x' was not declared in this scopeTippfehler, Groß- und Kleinschreibung, Gültigkeitsbereich oder fehlendes #includeNamen korrigieren, Variable global machen, Bibliothek einbinden
expected ';' before ...In der vorherigen Zeile fehlt ein SemikolonBeim Uno die Zeile darüber, beim ESP32 das Ende der gemeldeten Zeile prüfen
expected '}' at end of inputNicht geschlossene geschweifte KlammerKlammern mit Automatisch formatieren (Strg+T) abgleichen
X.h: No such file or directoryBibliothek nicht installiert oder Dateiname falschÜber den Bibliotheksverwalter samt Abhängigkeiten installieren
'X' does not name a typeFehlendes #include, falscher Typname oder Befehl außerhalb einer FunktionBibliothek 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 OrdnerSketches zusammenführen, alte Datei aus dem Ordner entfernen
stray '\342' in programKopiertes typografisches Anführungszeichen oder Strich, Umlaut im VariablennamenAnführungszeichen neu tippen, Namen ohne Umlaute
'class X' has no member named 'y'Falscher Funktionsname oder andere BibliotheksversionDie Beispiele der Bibliothek ansehen, passende Version installieren
too few arguments to function / too many arguments to functionZu wenige oder zu viele Werte an eine Funktion übergebenMit der Definition in der Zeile note: declared here vergleichen
lvalue required as left operand of assignmentZuweisung statt Vergleich: if (digitalRead(2) = HIGH)Für Vergleiche == verwenden
jump to case labelVariable 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 RumpfFunktion schreiben oder Namen korrigieren
Sketch too big / text section exceeds available space in boardDas Programm passt nicht in den FlashCode verkleinern, größeres Board, beim ESP32 Partition Scheme
data section exceeds available space in boardGlobale Variablen passen nicht in den RAMF()-Makro, kleinere Datentypen, Arrays in PROGMEM
#error This library only supports boards with ...Die Bibliothek unterstützt die Architektur des gewählten Boards nichtPassende Bibliothek installieren oder Board wechseln
Kompilierfehler hältst du am besten klein, indem du deinen Code in kleinen Schritten wachsen lässt: Starte mit einem funktionierenden Beispiel, klicke nach jedem neuen Teil auf Überprüfen und schau bei einem Fehler nur auf die zuletzt ergänzten Zeilen. Achte auch auf Fehler, die der Compiler nicht findet: if (zustand = HIGH) mit einer Variablen kompiliert fehlerfrei, weist aber zu, statt zu vergleichen, und die Bedingung ist immer wahr; das Semikolon am Ende von if (abstand < 10); macht die Bedingung ebenfalls wirkungslos. Stellst du Compiler-Meldungen auf Alle, siehst du die meisten dieser Logikfehler als Warnungen.

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.

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(179)
977
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.9(112)
198
HC-SR04 Abstandsmessung (serielle Anzeige)
#27Anfänger

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

4.6(45)
68
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)
64
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(36)
96
Raspberry Pi Pico Onboard-LED Blinken (GP25 Interne LED)
#147Anfänger

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

5.0(1)
9
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
Verwendung von Servomotoren
#35Anfänger
Premium

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

4.7(48)
67