Guide · 17 min di lettura

Arduino exit status 1: come risolvere gli errori di compilazione

Cosa significa exit status 1 su Arduino? Risolvi was not declared in this scope, expected ';', No such file, does not name a type e Sketch too big.

L'errore exit status 1 di Arduino è un messaggio generico che ti dice che il tuo codice non è stato compilato, cioè che il compilatore non è riuscito a trasformare il programma nel codice macchina comprensibile dal processore; la vera causa non è mai scritta su questa riga. Si trova nella prima riga che contiene la parola error:, qualche riga più in alto nel pannello di output: hai scritto male un nome, hai dimenticato un punto e virgola, manca una libreria oppure il codice è stato scritto per un'altra scheda. La notifica Compilation error: exit status 1 in basso a destra nell'Arduino IDE 2 (in italiano Errore di compilazione: exit status 1) e la riga Errore durante la compilazione per la scheda Arduino Uno. della vecchia versione 1.8 significano esattamente la stessa cosa.

In questa guida vedrai prima cosa succede dietro le quinte durante la compilazione e come leggere un messaggio di errore scomponendolo in file, riga e colonna. Poi passeremo in rassegna uno per uno gli errori di compilazione più frequenti: was not declared in this scope, expected ';' before, No such file or directory, does not name a type, redefinition of e Sketch too big. Per ognuno troverai la situazione che lo provoca, il messaggio reale del compilatore e un esempio corretto che compila senza errori. Abbiamo aggiunto anche gli errori dovuti alla scelta della scheda sbagliata, i casi specifici dell'ESP32 e del Raspberry Pi Pico e, alla fine, una tabella errori e soluzioni che riassume tutto. Se il tuo codice compila senza problemi ma non arriva sulla scheda, il problema è in un'altra fase; per quello c'è la guida Arduino non carica lo sketch.

Scheda Arduino Uno R3
Arduino Uno: il codice viene compilato per il processore della scheda scelta in Strumenti > Scheda (qui l'ATmega328P); scegliere la scheda sbagliata può causare un errore di compilazione anche se il codice è corretto.

Cos'è exit status 1 su Arduino? Differenza tra compilazione e caricamento

Quando premi Verifica (il segno di spunta) o Carica, l'Arduino IDE esegue diversi programmi in background. Prima unisce i file .ino della cartella dello sketch e li trasforma in un normale file C++, aggiungendo in cima il file di intestazione Arduino.h e i prototipi delle tue funzioni. Poi un compilatore come avr-g++ per la Uno o xtensa-esp32-elf-g++ per l'ESP32 compila quel file e le librerie che usi, il linker unisce tutti i pezzi in un unico programma e infine si controlla se il programma entra nella scheda. Ogni programma, quando termina, restituisce un codice di uscita: 0 significa successo, 1 errore. "exit status 1" dice esattamente questo: uno dei programmi della catena ha fallito. Ecco perché la stessa espressione compare anche quando avrdude fallisce durante il caricamento; il messaggio che la precede ti dice di quale caso si tratta.

Cosa vedi nell'outputFaseCosa significa
error: ... e alla fine exit status 1CompilazioneC'è un errore C++ nel tuo codice o in una libreria; la vera causa è nella riga error:
fatal error: DHT.h: No such file or directoryCompilazione (preprocessore)Il file richiesto con #include non è stato trovato; manca la libreria o il nome è sbagliato
undefined reference to ... e collect2: error: ld returned 1 exit statusCollegamento (linker)Una funzione è dichiarata ma il suo corpo non esiste da nessuna parte
multiple definition of ...Collegamento (linker)La stessa variabile o funzione è definita in due file diversi
Sketch too big e text section exceeds available space in boardControllo dimensioniIl programma non entra nella memoria flash della scheda
Not enough memory e data section exceeds available space in boardControllo dimensioniLe variabili globali non entrano nella RAM
Failed uploading: uploading error: exit status 1CaricamentoIl codice è stato compilato ma non scritto sulla scheda; guarda le righe di avrdude o esptool

Come si legge un messaggio di errore di Arduino?

Ogni riga di errore del compilatore segue lo stesso schema: prima il nome del file, poi i numeri di riga e colonna separati da due punti, quindi il tipo di errore e la sua descrizione. Subito sopra c'è spesso una riga come In function 'void loop()': che indica in quale funzione si trova l'errore; sotto compaiono una copia della riga sbagliata e un piccolo ^ che indica il punto esatto. error è un vero errore che blocca la compilazione, warning è solo un avviso e il codice viene compilato comunque, mentre note aggiunge informazioni al messaggio precedente. Spesso il compilatore aggiunge anche un suggerimento: nell'esempio qui sotto mostra da solo la grafia corretta con suggested alternative: 'digitalWrite'.

ParteValore nell'esempioSignificato
FileBlink.inoIl file che contiene l'errore; se hai più schede aperte, qui vedi quale
Riga6La riga in cui il compilatore ha notato l'errore; a volte lo sbaglio vero è nella riga sopra
Colonna3La posizione del carattere nella riga; il punto indicato dal ^
Tipoerrorerror blocca, warning avvisa, note informa
Messaggio'digitalwrite' was not declared in this scopeLa parte che descrive il problema; è il testo da cercare su internet
Suggerimentonote: suggested alternative: 'digitalWrite'L'ipotesi del compilatore; spesso mostra la grafia corretta
  1. In File > Preferenze spunta compilazione alla voce Mostra un output dettagliato durante. Così vedrai anche quali file e quali cartelle di librerie ha usato il compilatore.
  2. Non serve collegare la scheda: premi il pulsante Verifica (il segno di spunta). Verifica compila soltanto; se l'errore è nella fase di compilazione, premere Carica ti fa solo perdere tempo.
  3. Scorri il pannello di output fino in cima e trova la prima riga che contiene error:. La maggior parte degli errori successivi sono conseguenze a catena di questo primo.
  4. Vai al numero di riga indicato. L'IDE 2 sottolinea in rosso il carattere con l'errore, la versione 1.8 colora di rosso tutta la riga. Se in quella riga non vedi problemi, guarda quella sopra.
  5. Correggi solo quel primo errore e premi di nuovo Verifica. Se il numero di errori cala di colpo, sei sulla strada giusta.
  6. Se cerchi su internet, togli dal messaggio i nomi delle tue variabili e i percorsi dei file: cercare was not declared in this scope invece di 'contatore' was not declared in this scope dà molti più risultati. Quando invece chiedi aiuto su un forum, copia tutto l'output.
Un solo sbaglio può generare decine di righe rosse. Per esempio, una sola riga Serial.println scritta con virgolette tipografiche copiate da una pagina web dà sulla Uno sei errori stray diversi e un errore was not declared. Quindi non farti spaventare dal numero: correggi quello in cima e ricompila. Per controllare che le parentesi graffe siano accoppiate, usa Strumenti > Formattazione automatica (Ctrl+T): se il rientro si sposta in modo strano, manca la chiusura di una graffa.

L'errore 'was not declared in this scope' e come risolverlo

Questo messaggio indica che il compilatore, in quel punto, non riconosce un nome che hai usato; in italiano, "non dichiarato in questo ambito". La causa più frequente è un errore di battitura: Arduino distingue maiuscole e minuscole, quindi digitalwrite, Digitalwrite e digitalWrite sono tre nomi diversi. La seconda grande causa è l'ambito di visibilità (scope): se dichiari una variabile dentro setup(), esiste solo mentre setup() è in esecuzione e loop() non può vederla. Se userai una variabile in più funzioni, dichiarala fuori da tutte, in cima al file. Dichiarare una variabile dopo la riga in cui la usi provoca lo stesso errore, perché il compilatore legge il file dall'alto verso il basso. Infine, questo errore compare anche quando usi un oggetto di cui non hai incluso la libreria (Wire, Servo) o una funzione che la scheda selezionata non ha (Serial1 sulla 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}
CausaSbagliatoCorretto
Maiuscole e minuscoledigitalwrite(13, HIGH);digitalWrite(13, HIGH);
Costante scritta malepinMode(13, OUPUT);pinMode(13, OUTPUT);
Variabile dichiarata in un'altra funzioneDichiarare int led = 13; dentro setup() e usare led in loop()Sposta la riga int led = 13; fuori da tutte le funzioni, in cima
Variabile dichiarata dopo l'usoint contatore = 0; si trova dopo la riga contatore++;Metti la dichiarazione prima del punto in cui viene usata
Libreria non inclusaWire.begin(); senza riga #includeAggiungi #include <Wire.h> all'inizio del file
Funzione che la scheda non haSerial1.begin(9600); con la Uno selezionataScegli una scheda con più porte seriali come la Mega, oppure usa SoftwareSerial
Ordine in un file .cpp aggiuntivoUna funzione chiamata prima della sua definizione in una scheda .cppNei file .cpp scrivi il prototipo (void lampeggia();) in cima; nei file .ino lo fa l'IDE

'expected ';' before' e altri errori di sintassi

In C++ ogni istruzione termina con un punto e virgola. Quando lo dimentichi alla fine di una riga, il compilatore se ne accorge solo leggendo la parola successiva. Per questo, con il compilatore della Uno, il numero di riga di expected ';' before 'delay' indica la riga sotto lo sbaglio: il punto e virgola mancante è alla fine della riga prima di delay. I compilatori più recenti dei pacchetti ESP32 e Pico, invece, indicano direttamente la fine della riga in cui manca il punto e virgola. Se lo dimentichi nell'ultima riga di una funzione, il messaggio diventa expected ';' before '}' token. Gli errori di parentesi si comportano in modo simile. Se dimentichi di chiudere la graffa di un blocco if o di una funzione, il compilatore legge fino alla fine del file e solo lì dice expected '}' at end of input. Se la graffa non chiusa è dentro setup(), arriva anche a function-definition is not allowed here before '{' token, perché per il compilatore loop() è ora una funzione che stai cercando di definire dentro setup(). Usare virgole al posto dei punti e virgola nelle parentesi di un ciclo for è un altro classico di questa famiglia.

MessaggioCausa più probabileDove guardare
expected ';' before 'delay'Manca il punto e virgola alla fine della riga precedenteSulla Uno la riga sopra quella indicata, sull'ESP32 la fine della riga indicata
expected ';' before '}' tokenManca il punto e virgola nell'ultima riga del bloccoLa riga subito prima della graffa di chiusura
expected ';' before '<' tokenVirgole al posto dei punti e virgola in un forScrivilo come for (int i = 0; i < 10; i++)
expected '}' at end of inputUna parentesi graffa non è stata chiusaControlla il rientro con Formattazione automatica; ogni { vuole la sua }
a function-definition is not allowed here before '{' tokenManca la graffa di chiusura della funzione precedenteLa fine della funzione prima di quella indicata
expected ')' before ';' tokenUna parentesi tonda aperta non è stata chiusaConta le parentesi nelle condizioni if e nelle chiamate di funzione
expected primary-expression before ')' tokenManca un valore tra le parentesiUn argomento vuoto come digitalWrite(13, )
expected constructor, destructor, or type conversion before '(' tokenUn comando scritto fuori da qualsiasi funzioneSposta comandi come pinMode() dentro setup()
expected unqualified-id before '{' tokenUn punto e virgola dopo l'intestazione di una funzioneScrivi void loop() { invece di void loop(); {
L'errore stray '\342' in program indica che nel codice c'è un carattere che il compilatore non riconosce; i numeri sono i valori ottali dei byte UTF-8 di quel carattere. Il codice copiato da pagine web, file Word o PDF e app di messaggistica può contenere virgolette tipografiche (“ ”) al posto di quelle dritte ("), un trattino lungo al posto del segno meno o uno spazio unificatore invisibile: virgolette tipografiche e trattini compaiono come \342, lo spazio unificatore come \302. Il compilatore della Uno non accetta nemmeno le lettere accentate nei nomi delle variabili: scrivere int velocità dà stray '\303' in program. La soluzione è riscrivere da tastiera virgolette e trattini nella riga indicata e usare solo lettere senza accenti nei nomi delle variabili. Gli accenti dentro un testo tra virgolette doppie, invece, non impediscono la compilazione.

'No such file or directory': libreria non trovata

Le righe fatal error: DHT.h: No such file or directory e il compilation terminated. che segue dicono che il file richiesto da una riga #include del tuo codice non è stato trovato sul computer. La parola "fatal" significa che la compilazione si ferma del tutto in quel punto, quindi non vedrai gli errori nel resto del codice finché non risolvi questo. La causa è quasi sempre una libreria non installata. Quando apri un progetto preso da internet, leggi una per una le righe #include all'inizio e installa la libreria di ciascuna da Strumenti > Gestisci librerie. Se nella finestra che chiede delle dipendenze non scegli Installa tutto, la libreria principale viene installata ma la seconda di cui ha bisogno resta mancante; in quel caso il file del messaggio non è uno scritto da te, ma uno richiamato dalla libreria stessa (per esempio Adafruit_Sensor.h). Contano anche maiuscole e minuscole del nome: su Linux dht.h e DHT.h sono file diversi. Per i tre modi di installare una libreria e i problemi con i file ZIP, consulta la guida Come installare una libreria Arduino.

File nel messaggioCerca nel Gestore librerieNota
DHT.hDHT sensor library (Adafruit)Scegli Installa tutto; viene installata anche Adafruit Unified Sensor
Adafruit_Sensor.hAdafruit Unified SensorDipendenza mancante di un'altra libreria Adafruit
LiquidCrystal_I2C.hLiquidCrystal I2C (Frank de Brabander)Non installare più librerie con lo stesso nome; vedi l'avviso più sotto
Adafruit_SSD1306.hAdafruit SSD1306Si installa insieme ad Adafruit GFX e Adafruit BusIO
MFRC522.hMFRC522 (GithubCommunity)Per il modulo RFID RC522
IRremote.hIRremoteLe versioni recenti usano IrReceiver.begin(); i vecchi esempi possono dare avvisi o errori
SoftwareSerial.h (con l'ESP32 selezionato)Non installarla; il pacchetto ESP32 non la contieneUsa la porta seriale hardware Serial2 dell'ESP32 o installa la libreria EspSoftwareSerial

L'errore 'does not name a type'

does not name a type significa che il compilatore si aspettava un tipo di dato (come int, float, Servo o LiquidCrystal_I2C) all'inizio della riga, ma non riconosce la parola che hai scritto. Le cause comuni sono tre. La prima è dimenticare la riga #include della libreria: se compili Servo sportello; senza Servo.h, ottieni 'Servo' does not name a type. La seconda è scrivere male il tipo: si scrive String e non string, int e non Int, e spesso il compilatore aiuta con did you mean 'String'?. La terza, la più sorprendente, è scrivere un comando fuori da una funzione. Fuori dalle funzioni puoi solo dichiarare: int angolo = 0; è valido, ma se in una riga successiva scrivi soltanto angolo = 90;, il compilatore scambia angolo per il nome di un tipo e segnala 'angolo' does not name a type. C'è poi una trappola tipica di Arduino: l'IDE aggiunge automaticamente i prototipi delle tue funzioni subito prima della prima funzione. Se hai scritto una funzione che restituisce un tuo tipo struct e hai definito lo struct sotto setup(), il prototipo finisce prima dello struct e compare lo stesso errore. La soluzione è spostare le definizioni degli struct in cima al file, prima della prima funzione.

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}

L'errore 'redefinition of': definire due volte la stessa cosa

L'errore redefinition of 'void setup()' dice che ci sono due definizioni con lo stesso nome; la riga note: 'void setup()' previously defined here subito sotto mostra dov'è la prima. Per chi inizia, la causa più comune è incollare due sketch di esempio uno dopo l'altro nello stesso file: ci si ritrova con due setup() e due loop(). La seconda causa sono le schede dell'editor. Prima di compilare, l'Arduino IDE unisce in un unico file tutti i file .ino della cartella dello sketch. Una vecchia copia di backup messa nella cartella (per esempio progetto_vecchio.ino) o una seconda scheda con i propri setup() e loop() provoca questo errore anche se non apri mai quella scheda; la soluzione è togliere quel file dalla cartella. Dichiarare due volte la stessa variabile produce un messaggio simile: redefinition of 'int led'. Il gemello di questo errore nel linker è multiple definition of; compare quando una variabile con un valore assegnato in un file di intestazione (.h) viene inclusa in due file .cpp diversi. Il suo opposto, undefined reference to, indica una funzione di cui hai scritto il prototipo ma mai il corpo, oppure il cui nome hai scritto in modo diverso.

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}

Per unire due sketch segui quest'ordine: prima raccogli in cima le righe #include di entrambi senza doppioni, poi aggiungi le variabili globali e le costanti; se un nome esiste in tutti e due, rinominane uno. Quindi metti il contenuto delle due funzioni setup() in un unico setup() e quello dei due loop() in un unico loop(). Se uno degli sketch usa un delay() lungo, rallenterà l'altro; puoi risolvere con la tecnica millis() invece di delay(). Infine controlla se i due sketch usano lo stesso pin: il compilatore non se ne accorge, ma il tuo circuito non funzionerà come previsto.

'Sketch too big' ed errori di memoria insufficiente

Alla fine di ogni compilazione riuscita vedi due righe. Se compili per la Uno l'esempio sull'ambito qui sopra, la riga Sketch uses 2212 bytes (6%) of program storage space. Maximum is 32256 bytes. ti dice quanta memoria flash occupa il programma, e Global variables use 190 bytes (9%) of dynamic memory quanta RAM usano le variabili globali. Se il programma non entra nella flash, supera il 100 per cento e seguono l'avviso Sketch too big e l'errore text section exceeds available space in board. Se invece sono le variabili globali a non entrare nella RAM, vedrai Not enough memory e data section exceeds available space in board. Quando l'uso della RAM supera il 75 per cento, l'IDE può mostrare l'avviso Low memory available, stability problems may occur.: il codice compila, ma siccome durante l'esecuzione non resta spazio per le variabili locali, la scheda può bloccarsi a caso o riavviarsi da sola. Sulla Uno il bootloader occupa 0,5 KB dei 32 KB di flash, per questo il limite è 32256 byte.

SchedaLimite memoria programmaRAM (memoria dinamica)Nota
Arduino Uno R332256 byte2048 byte0,5 KB riservati al bootloader
Arduino Nano (ATmega328P)30720 byte2048 byteL'IDE riserva 2 KB con entrambe le opzioni di bootloader
Arduino Leonardo28672 byte2560 byteBootloader da 4 KB; anche il codice USB occupa spazio
Arduino Mega 2560253952 byte8192 bytePassaggio semplice per i progetti che non entrano nella Uno
ESP32 (partizioni predefinite)1310720 byte327680 byteCon Huge APP sale a 3145728 byte
Raspberry Pi Pico (arduino-pico, 2MB no FS)2093056 byte262144 byteSe riservi spazio a un file system, l'area programma si riduce
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}
  • Metti i testi fissi dentro F(): Serial.println(F("Sistema pronto")); legge il testo direttamente dalla flash senza copiarlo in RAM. Lo stesso vale per i testi fissi mostrati su display LCD e OLED.
  • Sposta gli array grandi in PROGMEM: Se tabelle di note, bitmap per display e testi lunghi non cambiano mai, non serve tenerli in RAM. Per tecniche più dettagliate, leggi l'articolo Arduino: memoria insufficiente.
  • Scegli il tipo di dato giusto: Per un valore tra 0 e 255 basta byte (1 byte); sulla Uno un int occupa 2 byte, long e float 4.
  • Riduci l'uso della classe String: Gli oggetti String concatenati di continuo frammentano la RAM; gli array di char a lunghezza fissa sono più prevedibili.
  • Conosci i bisogni nascosti delle librerie per display: Adafruit SSD1306 riserva in fase di esecuzione un buffer da 1 KB per un display OLED 128×64. Questa memoria non compare nel resoconto di compilazione, quindi il display può non avviarsi anche se il resoconto dice 70 per cento.
  • Passa a una scheda più grande: Un progetto che non riesci a far stare nella Uno gira tranquillamente sulla Mega o sull'ESP32. Sull'ESP32 puoi portare l'area programma da 1,25 MB a 3 MB scegliendo Huge APP (3MB No OTA/1MB SPIFFS) in Strumenti > Partition Scheme; con questa opzione non sono disponibili gli aggiornamenti via wireless (OTA).

Errori dovuti alla scelta della scheda sbagliata

Il compilatore compila sempre il tuo codice per il processore della scheda scelta in Strumenti > Scheda (nell'IDE 2, nel selettore della scheda in alto). Lo stesso codice può compilare senza errori per la Mega e fallire con la Uno selezionata, perché ogni scheda ha hardware, nomi dei pin e librerie del proprio pacchetto diversi. Quando apri un progetto trovato online, controlla prima per quale scheda è stato scritto: un codice per l'ESP32 non compila con la Uno selezionata, e un codice per la Uno che accede direttamente ai registri del processore non compila con l'ESP32 selezionato. Se la tua scheda non compare proprio nell'elenco, il suo pacchetto non è installato; i pacchetti per ESP32 e Raspberry Pi Pico si installano dal Gestore schede. Trovi i passaggi nella guida Come installare l'Arduino IDE.

Messaggio di erroreCosa è successo?Soluzione
'Serial1' was not declared in this scopeIl codice è per la Mega o la Leonardo ma è selezionata la Uno; la Uno ha una sola porta seriale hardwareScegli la scheda giusta o usa SoftwareSerial sulla Uno
SoftwareSerial.h: No such file or directoryÈ selezionato l'ESP32; il suo pacchetto non include questa libreriaUsa le porte seriali hardware dell'ESP32 (Serial2)
'LED_BUILTIN' was not declared in this scopeAlcune definizioni di scheda come ESP32 Dev Module non definiscono la costante del LED integratoScrivi direttamente il numero del pin (GPIO 2 su molte schede DevKit)
'D5' was not declared in this scopeNomi come D0–D8 esistono sulle schede ESP8266 come NodeMCU e Wemos e su alcune altre, ma non sulla Uno né sull'ESP32 Dev ModuleSulla Uno e sull'ESP32 scrivi il numero GPIO o scegli la scheda giusta
'TCCR1A' was not declared in this scopeUn codice che accede direttamente ai registri dei timer AVR viene compilato per l'ESP32Usa le funzioni LEDC e timer dell'ESP32
WiFi.h: No such file or directory oppure 'WIFI_STA' was not declared in this scopeCodice per ESP32 compilato per la Uno; la Uno non ha il Wi-FiScegli ESP32 Dev Module in Strumenti > Scheda
'ledcSetup' was not declared in this scopeIl pacchetto ESP32 è alla versione 3.x ma il codice è stato scritto per la 2.xUsa ledcAttach() e ledcWrite() con il numero del pin
All'inizio della compilazione potresti vedere una riga come 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). Non è un errore; dice solo che l'autore della libreria non ha aggiunto l'ESP32 all'elenco delle schede supportate, e spesso la libreria funziona lo stesso. Il messaggio a cui devi davvero fare attenzione è Multiple libraries were found for "LiquidCrystal_I2C.h": se sono installate due librerie con lo stesso nome, l'IDE ne sceglie una, e se la scelta non corrisponde al tuo codice ottieni un errore come 'class LiquidCrystal_I2C' has no member named 'init'. Le righe Used e Not used sotto il messaggio mostrano quale cartella è stata usata; elimina dalla cartella libraries la copia che non usi.

Errori di compilazione sull'ESP32

Scheda di sviluppo ESP32
ESP32: si programma nello stesso linguaggio nell'Arduino IDE, ma viene compilato con un altro compilatore e un altro pacchetto scheda, quindi parte del codice che funziona sulla Uno qui fallisce.

Anche l'ESP32 si programma nel linguaggio di Arduino, ma poiché compilatore e pacchetto scheda sono diversi, un codice che compila senza errori sulla Uno può bloccarsi sull'ESP32. La causa più frequente è la versione del pacchetto: nella versione 3.x del pacchetto Arduino per ESP32 le funzioni PWM sono cambiate; ledcSetup() e ledcAttachPin() sono state rimosse e sostituite da ledcAttach() e ledcWrite(), che lavorano con il numero del pin invece che con un numero di canale. Ecco perché i vecchi esempi trovati online danno 'ledcSetup' was not declared in this scope; o converti il codice alle nuove funzioni o installi la versione 2.0.17 dal Gestore schede. La seconda differenza sono le impostazioni del compilatore. Il pacchetto della Uno compila con l'opzione -fpermissive, che trasforma alcuni errori in semplici avvisi; l'ESP32 non la usa. Per esempio, dichiarare una variabile dentro uno switch senza graffe compila sulla Uno, ma sull'ESP32 dà l'errore jump to case label. I pacchetti ESP32 attuali compilano inoltre con -Werror=return-type: se dimentichi il return in una funzione che deve restituire un valore, ottieni no return statement in function returning non-void ogni volta che i Warning del compilatore non sono impostati su Nessuno. Nella versione 2.x, con i Warning del compilatore su Altro o Tutti, la maggior parte degli avvisi diventa un errore. Per la configurazione di base della scheda, dai un'occhiata all'articolo Cos'è l'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: errori con Arduino IDE e MicroPython

Se programmi il Pico con l'Arduino IDE, cioè con il pacchetto arduino-pico di Earle Philhower, il compilatore resta GCC e tutti i messaggi di questo articolo valgono così come sono. Con MicroPython è diverso: non c'è una fase di compilazione preliminare; il Pico trasforma il file in bytecode all'avvio e lo esegue riga per riga. Per questo gli errori compaiono nel pannello Shell in basso in Thonny, in un messaggio che inizia con Traceback (most recent call last):. Leggilo dal basso verso l'alto: l'ultima riga indica il tipo di errore e la descrizione, mentre il line 7 sopra indica la riga in cui si trova. Gli errori di sintassi (SyntaxError, IndentationError) vengono segnalati prima ancora che il programma parta; gli altri compaiono solo quando il programma arriva a quella riga, quindi il tuo codice può funzionare per un po' e poi fermarsi. Per installare MicroPython e muovere i primi passi, leggi l'articolo Cos'è il Raspberry Pi Pico.

Errore MicroPythonCosa significaSoluzione
SyntaxError: invalid syntaxSintassi rotta: mancano i due punti alla fine di una riga if, while o def, oppure una parentesi non è chiusaAggiungi : alla fine della riga e conta le parentesi
IndentationError: unexpected indentRientro incoerente; spazi e tabulazioni mescolatiUsa 4 spazi in ogni blocco
NameError: name 'led' isn't definedNome scritto male o usato prima di essere definitoControlla maiuscole, minuscole e dove si trova la definizione
ImportError: no module named 'ssd1306'Il file del driver non è sul PicoSalva ssd1306.py sul Pico con Thonny
AttributeError: 'Pin' object has no attribute 'toggel'L'oggetto non ha una funzione con quel nomeCorreggi il nome della funzione: toggle()
TypeError: can't convert 'int' object to str implicitlyTesto e numero uniti con +Usa str(numero) o passa i valori a print separati da virgole
OSError: [Errno 5] EIOIl dispositivo I2C non rispondeControlla i collegamenti, l'indirizzo e i pin SDA e SCL
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)

Tabella degli errori di compilazione di Arduino e delle soluzioni

Messaggio di erroreCausaSoluzione
exit status 1 / Compilation error: exit status 1Un programma della catena di compilazione o caricamento ha fallitoScorri in alto e leggi la prima riga che contiene error:
'x' was not declared in this scopeErrore di battitura, maiuscole e minuscole, ambito o #include mancanteCorreggi il nome, rendi globale la variabile, includi la libreria
expected ';' before ...Manca un punto e virgola nella riga precedenteControlla la riga sopra quella indicata (Uno) o la fine della riga indicata (ESP32)
expected '}' at end of inputGraffa non chiusaAccoppia le graffe con Formattazione automatica (Ctrl+T)
X.h: No such file or directoryLibreria non installata o nome del file sbagliatoInstallala dal Gestore librerie con le sue dipendenze
'X' does not name a type#include mancante, nome del tipo sbagliato o comando fuori da una funzioneIncludi la libreria, controlla come scrivi String e int, sposta il comando in una funzione
redefinition of 'void setup()'Due setup() o un file .ino in più nella cartellaUnisci gli sketch, togli il vecchio file dalla cartella
stray '\342' in programVirgoletta tipografica o trattino copiato, oppure lettera accentata nel nome di una variabileRiscrivi le virgolette, usa lettere senza accenti nei nomi
'class X' has no member named 'y'Nome di funzione sbagliato o versione diversa della libreriaGuarda gli esempi della libreria, installa la versione giusta
too few arguments to function / too many arguments to functionTroppo pochi o troppi valori passati a una funzioneConfronta con la definizione nella riga note: declared here
lvalue required as left operand of assignmentAssegnazione al posto del confronto: if (digitalRead(2) = HIGH)Usa == per i confronti
jump to case labelVariabile dichiarata in un case senza graffe (errore sull'ESP32)Racchiudi il blocco case tra { }
undefined reference to `lampeggia()'La funzione ha solo il prototipo, non il corpoScrivi la funzione o correggi il nome
Sketch too big / text section exceeds available space in boardIl programma non entra nella flashRiduci il codice, usa una scheda più grande, Partition Scheme sull'ESP32
data section exceeds available space in boardLe variabili globali non entrano nella RAMMacro F(), tipi di dato più piccoli, array in PROGMEM
#error This library only supports boards with ...La libreria non supporta l'architettura della scheda sceltaInstalla una libreria adatta alla tua scheda o cambia scheda
Il modo per ridurre al minimo gli errori di compilazione è far crescere il codice a piccoli passi: parti da un esempio funzionante, premi Verifica dopo ogni nuova parte e, quando compare un errore, guarda solo le ultime righe che hai aggiunto. Attenzione anche agli sbagli che il compilatore non vede: if (stato = HIGH) scritto con una variabile compila senza errori, ma siccome assegna invece di confrontare, la condizione è sempre vera; anche il punto e virgola alla fine di if (distanza < 10); rende inutile la condizione. Se imposti i Warning del compilatore su Tutti, vedrai la maggior parte di questi errori di logica come avvisi.

Prossimi passi per scrivere codice senza errori

  • Consolida le basi: L'articolo Basi di programmazione Arduino spiega variabili, ambito, funzioni e cicli; la maggior parte degli errori di questo articolo nasce da questi argomenti.
  • Impara la scrittura esatta dei comandi: L'elenco dei comandi Arduino mostra con esempi la sintassi e i parametri di ogni comando.
  • Installa bene le librerie: La guida Come installare una libreria Arduino tratta nel dettaglio i messaggi No such file or directory e Multiple libraries were found.
  • Guarda cosa fa il codice mentre gira: Con un codice che compila ma non si comporta come ti aspetti, stampare le variabili nel Monitor seriale è il modo più rapido per fare la diagnosi.
  • Provalo senza scheda: Nei simulatori Wokwi o Tinkercad puoi compilare il codice ed eseguirlo insieme al circuito.
  • Controlla il codice scritto dall'IA: Il codice generato dai chatbot è spesso pensato per vecchie versioni delle librerie o per un'altra scheda; l'articolo Codice Arduino con l'IA spiega come scovare questi problemi.

Gli errori di compilazione all'inizio fanno paura, ma in realtà il compilatore ti dice dov'è il problema e spesso anche come risolverlo: file, riga, colonna e una breve descrizione. Leggi il primo errore, correggi solo quello, ricompila e ripeti il ciclo; dopo qualche progetto li risolverai in pochi secondi. Quando il tuo codice compila ed è sulla scheda, puoi continuare con i progetti di LED, pulsanti, sensori e display dell'app BlueGrays: per Arduino, ESP32 e Raspberry Pi Pico ogni progetto ha lo schema del circuito e un codice che compila senza errori, passo dopo passo.

Domande frequenti

Cosa significa exit status 1 su Arduino?

exit status 1 è un messaggio generico che indica che uno dei programmi eseguiti durante la compilazione o il caricamento è terminato con un errore; da solo non dice la causa. Scorri in alto nel pannello di output e cerca la prima riga con error:, lì trovi il nome del file, il numero di riga e la descrizione. Quando correggi quell'errore e ricompili, scompare anche exit status 1.

Come risolvo 'was not declared in this scope' su Arduino?

Significa che il compilatore, in quel punto, non riconosce una variabile, una funzione o una costante che hai usato. Le cause più comuni sono un errore di maiuscole (digitalwrite), una variabile dichiarata dentro un'altra funzione e una libreria non inclusa. Di solito basta controllare come è scritto il nome e dichiarare le variabili condivise fuori da tutte le funzioni.

Cosa significa "expected ';' before" su Arduino?

Questo errore indica che manca un punto e virgola. Poiché il compilatore della Uno se ne accorge solo leggendo la parola successiva, la riga del suo messaggio è di solito quella sotto: aggiungi allora il punto e virgola alla fine della riga subito sopra. Su ESP32 e Pico il messaggio indica direttamente la riga in cui manca. Usare virgole al posto dei punti e virgola nelle parentesi di un for dà lo stesso messaggio.

Perché compare l'errore 'does not name a type'?

Il compilatore si aspetta un tipo di dato all'inizio della riga ma non riconosce la parola scritta. Dimenticare la riga #include della libreria (per esempio di Servo), scrivere string invece di String e mettere un'assegnazione isolata come angolo = 90; fuori da una funzione sono le tre cause più comuni. Se in Arduino usi un tuo tipo struct, definiscilo prima della prima funzione.

Come risolvo 'Sketch too big' su Arduino?

Questo messaggio indica che il programma non entra nella memoria flash della scheda; sulla Uno il limite è 32256 byte. Togli le librerie e le righe di debug che non usi, sposta gli array costanti grandi in PROGMEM oppure passa a una scheda con più memoria come la Mega o l'ESP32. Sull'ESP32, scegliere Huge APP nel menu Partition Scheme porta l'area programma a circa 3 MB.

Lo sketch si compila ma non si carica sulla scheda: perché?

Se la compilazione riesce, vedi la riga Sketch uses con i byte occupati dal programma; gli errori successivi appartengono alla fase di caricamento e riguardano cavo, driver, porta o scelta della scheda, non il codice. Le righe che iniziano con avrdude indicano un problema di caricamento su Uno e Nano, quelle di esptool sull'ESP32. In questo caso segui in ordine i passaggi della guida sugli errori di caricamento.

Vedi tutti i progetti
LED lampeggiante
#1Principiante

LED lampeggiante

Il primissimo ciao dell'elettronica: accendere e spegnere un solo LED. L'Arduino accende e spegne il LED a intervalli brevissimi, così la luce lampeggia veloce. Vedi nel modo più semplice come la sche

4.6(179)
977
Accendere un LED con un pulsante (Push)
#9Principiante

Accendere un LED con un pulsante (Push)

Come un campanello: la luce resta accesa finché premi e si spegne quando lasci. L'Arduino ascolta il pulsante di continuo; mentre è premuto accende il LED, e appena togli il dito lo spegne. Con questo

4.9(112)
198
HC-SR04 Misura della distanza (display seriale)
#27Principiante

HC-SR04 Misura della distanza (display seriale)

Il sensore HC-SR04 funziona come un pipistrello che trova la strada al buio: manda un suono che non puoi sentire, ne ascolta l'eco e misura quanto è lontano l'oggetto davanti a sé. L'Arduino scrive qu

4.6(45)
68
Temperatura e umidità con DHT11
#55Intermedio

Temperatura e umidità con DHT11

Quanti gradi ci sono nella tua stanza, e l'aria è umida o secca? Il sensore DHT11 misura temperatura e umidità, e l'Arduino scrive i valori su uno schermo LCD a due righe, aggiornandoli ogni paio di s

4.7(47)
64
LED Lampeggiante con ESP32
#103Principiante

LED Lampeggiante con ESP32

Insegna l'uso di base delle uscite GPIO con l'ESP32. Otteniamo un effetto lampeggiante accendendo e spegnendo un LED dal pin digitale. Versione ESP32 del classico progetto blink su Arduino UNO; i comandi di base di blink nell'ambiente Arduino sono gli stessi, ma la disposizione dei pin e i livelli GPIO a 3,3 V dell'ESP32 sono diversi da quelli di Arduino UNO.

4.7(36)
96
Lampeggio LED Integrato Raspberry Pi Pico (GP25 LED Onboard)
#147Principiante

Lampeggio LED Integrato Raspberry Pi Pico (GP25 LED Onboard)

Il progetto di apertura della serie Raspberry Pi Pico! Facciamo lampeggiare il LED integrato (LED verde collegato a GP25) per verificare che la scheda funzioni — un classico primo esperimento "Hello World". NESSUN componente esterno, solo Pico e cavo USB. Il codice è scritto in **MicroPython** (il linguaggio ufficialmente supportato dalla Raspberry Pi Foundation). Impara la classe `machine.Pin`, la modalità `Pin.OUT`, i metodi `led.on()/off()` e `time.sleep()` in Thonny IDE. Segui ogni commutazi

5.0(1)
9
Utilizzo dello schermo LCD con I2C
#32Principiante
Premium

Utilizzo dello schermo LCD con I2C

Regala al tuo Arduino uno schermo tutto suo e fagli scrivere il primo messaggio. Lo schermo LCD a due righe si collega con pochi fili; prima compare un saluto nella riga in alto, poi un secondo testo

4.8(53)
70
Utilizzo del servomotore
#35Principiante
Premium

Utilizzo del servomotore

Il braccio di un piccolo servomotore ruota a turno in tre posizioni: tutto all'inizio, esattamente a metà e tutto alla fine, aspettando due secondi a ogni fermata. L'Arduino dice al motore a quale ang

4.7(48)
67