Guides · 19 min de lecture

Arduino exit status 1 : corriger les erreurs de compilation

Que veut dire exit status 1 sur Arduino ? Corrige was not declared in this scope, expected ';', No such file, does not name a type et Sketch too big.

L'erreur Arduino exit status 1 est un message générique qui t'indique que ton code n'a pas pu être compilé, autrement dit que le compilateur n'a pas réussi à transformer ton programme en code machine compréhensible par le processeur ; la vraie cause ne figure jamais sur cette ligne. Elle se trouve dans la première ligne contenant le mot error:, quelques lignes plus haut dans la zone de sortie : tu as mal écrit un nom, oublié un point-virgule, une bibliothèque n'est pas installée ou le code a été écrit pour une autre carte. La notification Compilation error: exit status 1 en bas à droite de l'Arduino IDE 2 (en français Erreur de compilation : exit status 1) et la ligne Erreur de compilation pour la carte Arduino Uno de l'ancienne version 1.8 veulent dire exactement la même chose.

Dans ce guide, tu verras d'abord ce qui se passe en coulisses pendant la compilation et comment lire un message d'erreur en le découpant en fichier, ligne et colonne. Ensuite, nous passerons en revue une par une les erreurs de compilation les plus fréquentes : was not declared in this scope, expected ';' before, No such file or directory, does not name a type, redefinition of et Sketch too big. Pour chacune, tu trouveras la situation qui la provoque, le vrai message affiché par le compilateur et un exemple corrigé qui compile sans erreur. Nous avons aussi ajouté les erreurs dues au choix d'une mauvaise carte, les cas propres à l'ESP32 et au Raspberry Pi Pico et, à la fin, un tableau erreurs et solutions qui rassemble tout. Si ton code compile bien mais n'arrive pas sur la carte, le problème se situe à une autre étape ; pour cela, consulte le guide Erreur de téléversement Arduino.

Carte Arduino Uno R3
Arduino Uno : le code est compilé pour le processeur de la carte choisie dans Outils > Carte (ici l'ATmega328P) ; choisir la mauvaise carte peut provoquer une erreur de compilation même si le code est correct.

Qu'est-ce que exit status 1 sur Arduino ? Compilation et téléversement

Quand tu cliques sur Vérifier (la coche) ou Téléverser, l'Arduino IDE lance plusieurs programmes en arrière-plan. Il commence par réunir les fichiers .ino du dossier du croquis et les transforme en un fichier C++ ordinaire en ajoutant en tête le fichier d'en-tête Arduino.h et les prototypes de tes fonctions. Ensuite, un compilateur comme avr-g++ pour l'Uno ou xtensa-esp32-elf-g++ pour l'ESP32 compile ce fichier et les bibliothèques utilisées, l'éditeur de liens (linker) assemble tous les morceaux en un seul programme et, pour finir, l'IDE vérifie que le programme tient sur la carte. Chaque programme renvoie un code de sortie en se terminant : 0 signifie succès et 1 échec. « exit status 1 » dit exactement cela : l'un des programmes de la chaîne a échoué. C'est pourquoi la même expression apparaît aussi quand avrdude échoue pendant le téléversement ; le message qui la précède te dit de quel cas il s'agit.

Ce que tu vois dans la sortieÉtapeCe que ça veut dire
error: ... puis exit status 1 à la finCompilationIl y a une erreur C++ dans ton code ou dans une bibliothèque ; la vraie cause est sur la ligne error:
fatal error: DHT.h: No such file or directoryCompilation (préprocesseur)Le fichier demandé par #include est introuvable ; la bibliothèque manque ou le nom est faux
undefined reference to ... et collect2: error: ld returned 1 exit statusÉdition de liensUne fonction est déclarée mais son corps n'existe nulle part
multiple definition of ...Édition de liensLa même variable ou fonction est définie dans deux fichiers
Sketch too big et text section exceeds available space in boardContrôle de tailleLe programme ne tient pas dans la mémoire flash de la carte
Not enough memory et data section exceeds available space in boardContrôle de tailleLes variables globales ne tiennent pas dans la RAM
Failed uploading: uploading error: exit status 1TéléversementLe code a été compilé mais n'a pas pu être écrit sur la carte ; regarde les lignes avrdude ou esptool

Comment lire un message d'erreur Arduino ?

Chaque ligne d'erreur du compilateur suit le même schéma : d'abord le nom du fichier, puis les numéros de ligne et de colonne séparés par des deux-points, et enfin le type d'erreur et sa description. Juste au-dessus, une ligne comme In function 'void loop()': indique souvent dans quelle fonction se trouve l'erreur ; en dessous viennent une copie de la ligne fautive et un petit ^ qui pointe l'endroit exact. error est une vraie erreur qui arrête la compilation, warning n'est qu'un avertissement et le code compile quand même, et note complète le message précédent. Souvent, le compilateur ajoute aussi une suggestion : dans l'exemple ci-dessous, il donne lui-même la bonne orthographe avec suggested alternative: 'digitalWrite'.

PartieValeur dans l'exempleSignification
FichierBlink.inoLe fichier qui contient l'erreur ; si tu as plusieurs onglets, c'est ici que tu vois lequel
Ligne6La ligne où le compilateur a remarqué l'erreur ; la vraie faute est parfois sur la ligne du dessus
Colonne3Le numéro du caractère dans la ligne ; là où pointe le ^
Typeerrorerror arrête, warning avertit, note complète
Message'digitalwrite' was not declared in this scopeLa partie qui décrit le problème ; c'est le texte à chercher sur internet
Suggestionnote: suggested alternative: 'digitalWrite'La supposition du compilateur ; elle montre souvent la bonne orthographe
  1. Dans Fichier > Préférences, coche compiler à la ligne Afficher la sortie de débogage verbeuse pendant. Tu verras ainsi aussi quels fichiers et quels dossiers de bibliothèques le compilateur a utilisés.
  2. Pas besoin de brancher la carte : clique sur le bouton Vérifier (la coche). Vérifier ne fait que compiler ; si l'erreur se produit à la compilation, cliquer sur Téléverser te fait juste perdre du temps.
  3. Remonte tout en haut de la zone de sortie et repère la première ligne qui contient error:. La plupart des erreurs suivantes sont des conséquences en cascade de cette première.
  4. Va au numéro de ligne indiqué. L'IDE 2 souligne en rouge le caractère fautif, la version 1.8 colore toute la ligne en rouge. Si tu ne vois aucun problème sur cette ligne, regarde celle du dessus.
  5. Corrige seulement cette première erreur et clique de nouveau sur Vérifier. Si le nombre d'erreurs chute d'un coup, tu es sur la bonne voie.
  6. Si tu cherches sur internet, retire du message tes noms de variables et les chemins de fichiers : chercher was not declared in this scope plutôt que 'compteur' was not declared in this scope donne beaucoup plus de résultats. En revanche, quand tu demandes de l'aide sur un forum, copie toute la sortie.
Une seule faute peut produire des dizaines de lignes rouges. Par exemple, une seule ligne Serial.println écrite avec des guillemets typographiques copiés depuis une page web donne sur l'Uno six erreurs stray distinctes et une erreur was not declared. Ne te laisse donc pas impressionner par leur nombre : corrige celle du haut et recompile. Pour vérifier que tes accolades vont bien par paires, utilise Outils > Formatage automatique (Ctrl+T) : si l'indentation se décale bizarrement, une accolade n'est pas fermée.

L'erreur 'was not declared in this scope' et sa solution

Ce message signifie que le compilateur ne reconnaît pas, à cet endroit, un nom que tu as utilisé ; en français, « non déclaré dans cette portée ». La cause la plus fréquente est une faute de frappe : Arduino distingue majuscules et minuscules, donc digitalwrite, Digitalwrite et digitalWrite sont trois noms différents. La deuxième grande cause est la portée (scope) : si tu déclares une variable dans setup(), elle n'existe que pendant l'exécution de setup() et loop() ne peut pas la voir. Si tu utilises une variable dans plusieurs fonctions, déclare-la en dehors de toutes, en haut du fichier. Déclarer une variable après la ligne où tu l'utilises provoque la même erreur, car le compilateur lit le fichier de haut en bas. Enfin, cette erreur apparaît aussi quand tu utilises un objet dont tu n'as pas inclus la bibliothèque (Wire, Servo) ou une fonction que la carte choisie ne possède pas (Serial1 sur l'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}
CauseFauxCorrect
Majuscules et minusculesdigitalwrite(13, HIGH);digitalWrite(13, HIGH);
Constante mal écritepinMode(13, OUPUT);pinMode(13, OUTPUT);
Variable déclarée dans une autre fonctionDéclarer int led = 13; dans setup() et utiliser led dans loop()Déplace la ligne int led = 13; hors de toutes les fonctions, tout en haut
Variable déclarée après son utilisationint compteur = 0; placé après la ligne compteur++;Place la déclaration avant l'endroit où elle est utilisée
Bibliothèque non incluseWire.begin(); sans ligne #includeAjoute #include <Wire.h> au début du fichier
Fonction absente de la carteSerial1.begin(9600); avec l'Uno sélectionnéChoisis une carte avec plusieurs ports série comme la Mega, ou utilise SoftwareSerial
Ordre dans un fichier .cpp supplémentaireUne fonction appelée avant sa définition dans un onglet .cppDans les fichiers .cpp, écris le prototype (void clignoter();) en haut ; dans les .ino, l'IDE s'en charge

'expected ';' before' et autres erreurs de syntaxe

En C++, chaque instruction se termine par un point-virgule. Quand tu l'oublies en fin de ligne, le compilateur ne s'en aperçoit qu'en lisant le mot suivant. C'est pourquoi, avec le compilateur de l'Uno, le numéro de ligne de expected ';' before 'delay' désigne la ligne située sous la faute : le point-virgule manquant se trouve à la fin de la ligne qui précède delay. Les compilateurs plus récents des paquets ESP32 et Pico, eux, pointent directement la fin de la ligne où manque le point-virgule. Si tu l'oublies sur la dernière ligne d'une fonction, le message devient expected ';' before '}' token. Les erreurs d'accolades se comportent de la même façon. Si tu oublies de fermer l'accolade d'un bloc if ou d'une fonction, le compilateur lit jusqu'à la fin du fichier et ne dit qu'à ce moment-là expected '}' at end of input. Si l'accolade non fermée se trouve dans setup(), tu obtiens en plus a function-definition is not allowed here before '{' token, car pour le compilateur loop() est désormais une fonction que tu essaies de définir à l'intérieur de setup(). Mettre des virgules au lieu de points-virgules dans les parenthèses d'une boucle for est un autre classique de cette famille.

MessageCause la plus probableOù regarder ?
expected ';' before 'delay'Il manque un point-virgule à la fin de la ligne précédenteSur l'Uno, la ligne au-dessus de celle indiquée ; sur l'ESP32, la fin de la ligne indiquée
expected ';' before '}' tokenIl manque un point-virgule sur la dernière ligne du blocLa ligne juste avant l'accolade fermante
expected ';' before '<' tokenDes virgules au lieu de points-virgules dans un forÉcris for (int i = 0; i < 10; i++)
expected '}' at end of inputUne accolade n'a jamais été ferméeVérifie l'indentation avec Formatage automatique ; chaque { a besoin de sa }
a function-definition is not allowed here before '{' tokenL'accolade fermante de la fonction précédente manqueLa fin de la fonction qui précède celle indiquée
expected ')' before ';' tokenUne parenthèse ouverte n'a pas été ferméeCompte les parenthèses dans les conditions if et les appels de fonction
expected primary-expression before ')' tokenUne valeur manque entre les parenthèsesUn argument vide comme digitalWrite(13, )
expected constructor, destructor, or type conversion before '(' tokenUne commande écrite en dehors de toute fonctionDéplace les commandes comme pinMode() dans setup()
expected unqualified-id before '{' tokenUn point-virgule après l'en-tête d'une fonctionÉcris void loop() { au lieu de void loop(); {
L'erreur stray '\342' in program signale un caractère que le compilateur ne reconnaît pas dans ton code ; les nombres sont les valeurs octales des octets UTF-8 de ce caractère. Le code copié depuis des pages web, des fichiers Word ou PDF et des messageries peut contenir des guillemets typographiques (« » ou “ ”) au lieu de guillemets droits ("), un tiret au lieu du signe moins ou une espace insécable invisible : les guillemets “ ” et les tirets apparaissent sous la forme \342, les guillemets « » et l'espace insécable sous la forme \302. Le compilateur de l'Uno refuse aussi les lettres accentuées dans les noms de variables : écrire int température donne stray '\303' in program. La solution consiste à retaper au clavier les guillemets et les tirets de la ligne indiquée et à n'utiliser que des lettres sans accent dans les noms de variables. Les accents à l'intérieur d'un texte entre guillemets doubles, eux, n'empêchent pas la compilation.

'No such file or directory' : bibliothèque introuvable

Les lignes fatal error: DHT.h: No such file or directory et le compilation terminated. qui suit indiquent que le fichier demandé par une ligne #include de ton code est introuvable sur ton ordinateur. Le mot « fatal » signifie que la compilation s'arrête complètement à cet endroit ; tu ne verras donc pas les erreurs du reste du code tant que celle-ci n'est pas réglée. La cause est presque toujours une bibliothèque non installée. Quand tu ouvres un projet trouvé sur internet, lis une à une les lignes #include du début et installe la bibliothèque de chacune depuis Outils > Gérer les bibliothèques. Si, dans la fenêtre qui parle des dépendances, tu ne choisis pas Tout installer, la bibliothèque principale s'installe mais la seconde dont elle a besoin reste absente ; le fichier du message n'est alors pas un fichier que tu as écrit, mais un fichier appelé depuis la bibliothèque elle-même (par exemple Adafruit_Sensor.h). Les majuscules et minuscules du nom comptent aussi : sous Linux, dht.h et DHT.h sont deux fichiers différents. Pour les trois façons d'installer une bibliothèque et les problèmes de ZIP, consulte le guide Installer une bibliothèque Arduino.

Fichier du messageÀ chercher dans le gestionnaire de bibliothèquesRemarque
DHT.hDHT sensor library (Adafruit)Choisis Tout installer ; Adafruit Unified Sensor est installée avec
Adafruit_Sensor.hAdafruit Unified SensorDépendance manquante d'une autre bibliothèque Adafruit
LiquidCrystal_I2C.hLiquidCrystal I2C (Frank de Brabander)N'installe pas plusieurs bibliothèques du même nom ; voir l'avertissement plus bas
Adafruit_SSD1306.hAdafruit SSD1306S'installe avec Adafruit GFX et Adafruit BusIO
MFRC522.hMFRC522 (GithubCommunity)Pour le module RFID RC522
IRremote.hIRremoteLes versions récentes utilisent IrReceiver.begin() ; les anciens exemples peuvent donner des avertissements ou des erreurs
SoftwareSerial.h (avec l'ESP32 sélectionné)Ne l'installe pas ; le paquet ESP32 ne la contient pasUtilise le port série matériel Serial2 de l'ESP32 ou installe la bibliothèque EspSoftwareSerial

L'erreur 'does not name a type'

does not name a type signifie que le compilateur attendait un type de donnée (comme int, float, Servo ou LiquidCrystal_I2C) en début de ligne, mais ne reconnaît pas le mot que tu as écrit. Il y a trois causes courantes. La première est l'oubli de la ligne #include de la bibliothèque : si tu compiles Servo trappe; sans Servo.h, tu obtiens 'Servo' does not name a type. La deuxième est un type mal orthographié : on écrit String et non string, int et non Int, et le compilateur aide souvent avec did you mean 'String'?. La troisième, la plus surprenante, consiste à écrire une commande en dehors d'une fonction. Hors des fonctions, tu ne peux que déclarer : int angle = 0; est valide, mais si tu écris seulement angle = 90; sur une ligne suivante, le compilateur prend angle pour un nom de type et affiche 'angle' does not name a type. Il existe aussi un piège propre à Arduino : l'IDE ajoute automatiquement les prototypes de tes fonctions juste avant la première fonction. Si tu as écrit une fonction qui renvoie ton propre type struct et défini ce struct sous setup(), le prototype se retrouve avant le struct et la même erreur apparaît. La solution est de placer les définitions de struct tout en haut du fichier, avant la première fonction.

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'erreur 'redefinition of' : définir deux fois la même chose

L'erreur redefinition of 'void setup()' indique qu'il existe deux définitions portant le même nom ; la ligne note: 'void setup()' previously defined here juste en dessous montre où se trouve la première. Chez les débutants, la cause la plus fréquente est d'avoir collé deux croquis d'exemple l'un après l'autre dans un même fichier : on se retrouve avec deux setup() et deux loop(). La deuxième cause, ce sont les onglets. Avant de compiler, l'Arduino IDE fusionne tous les fichiers .ino du dossier du croquis en un seul. Une ancienne sauvegarde copiée dans le dossier (par exemple projet_ancien.ino) ou un deuxième onglet avec ses propres setup() et loop() provoque cette erreur même si tu n'ouvres jamais cet onglet ; la solution est de retirer ce fichier du dossier. Déclarer deux fois la même variable produit un message similaire : redefinition of 'int led'. Le cousin de cette erreur à l'édition de liens est multiple definition of ; il apparaît quand une variable initialisée dans un fichier d'en-tête (.h) est incluse dans deux fichiers .cpp différents. Son contraire, undefined reference to, désigne une fonction dont tu as écrit le prototype mais jamais le corps, ou dont tu as écrit le nom autrement.

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}

Pour fusionner, suis cet ordre : rassemble d'abord en haut les lignes #include des deux croquis sans doublon, puis ajoute les variables globales et les constantes ; si un nom existe dans les deux, renomme l'un d'eux. Ensuite, place le contenu des deux fonctions setup() dans un seul setup() et celui des deux loop() dans un seul loop(). Si l'un des croquis utilise un long delay(), il bloque l'autre ; tu peux régler cela avec la méthode millis() au lieu de delay(). Enfin, vérifie que les deux croquis n'utilisent pas la même broche : le compilateur ne le remarque pas, mais ton montage ne fonctionnera pas comme prévu.

'Sketch too big' et erreurs de mémoire insuffisante

À la fin de chaque compilation réussie, tu vois deux lignes. Si tu compiles pour l'Uno l'exemple sur la portée ci-dessus, la ligne Sketch uses 2212 bytes (6%) of program storage space. Maximum is 32256 bytes. t'indique combien de mémoire flash occupe le programme, et Global variables use 190 bytes (9%) of dynamic memory, quelle part de la RAM utilisent les variables globales. Si le programme ne tient pas dans la flash, il dépasse 100 %, suivi de l'avertissement Sketch too big et de l'erreur text section exceeds available space in board. Si ce sont les variables globales qui ne tiennent pas dans la RAM, tu verras à la place Not enough memory et data section exceeds available space in board. Quand l'utilisation de la RAM dépasse 75 %, l'IDE peut afficher l'avertissement Low memory available, stability problems may occur. : le code compile, mais comme il ne reste plus de place pour les variables locales pendant l'exécution, la carte peut se figer au hasard ou redémarrer toute seule. Sur l'Uno, le bootloader occupe 0,5 Ko des 32 Ko de flash, d'où la limite de 32256 octets.

CarteLimite de mémoire programmeRAM (mémoire dynamique)Remarque
Arduino Uno R332256 octets2048 octets0,5 Ko réservé au bootloader
Arduino Nano (ATmega328P)30720 octets2048 octetsL'IDE réserve 2 Ko pour les deux options de bootloader
Arduino Leonardo28672 octets2560 octetsBootloader de 4 Ko ; le code USB prend aussi de la place
Arduino Mega 2560253952 octets8192 octetsPassage facile pour les projets trop gros pour l'Uno
ESP32 (partitionnement par défaut)1310720 octets327680 octetsPasse à 3145728 octets avec Huge APP
Raspberry Pi Pico (arduino-pico, 2MB no FS)2093056 octets262144 octetsRéserver de la place pour un système de fichiers réduit la zone programme
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}
  • Mets les textes fixes dans F() : Serial.println(F("Systeme pret")); lit le texte directement en flash sans le copier en RAM. C'est valable aussi pour les textes fixes affichés sur les écrans LCD et OLED.
  • Déplace les grands tableaux en PROGMEM : Si les tables de notes, les bitmaps d'écran et les longs textes ne changent jamais, ils n'ont rien à faire en RAM. Pour des techniques plus détaillées, consulte l'article Arduino : mémoire insuffisante.
  • Choisis le bon type de donnée : Pour une valeur entre 0 et 255, byte (1 octet) suffit ; sur l'Uno, un int occupe 2 octets, long et float en occupent 4.
  • Limite la classe String : Les objets String concaténés en permanence fragmentent la RAM ; les tableaux de char de longueur fixe sont plus prévisibles.
  • Connais les besoins cachés des bibliothèques d'écran : Adafruit SSD1306 réserve à l'exécution un tampon de 1 Ko pour un écran OLED 128×64. Cette mémoire n'apparaît pas dans le rapport de compilation ; l'écran peut donc refuser de démarrer même si le rapport indique 70 %.
  • Passe à une carte plus grande : Un projet que tu n'arrives pas à faire tenir sur l'Uno tourne sans problème sur la Mega ou l'ESP32. Sur l'ESP32, tu peux faire passer la zone programme de 1,25 Mo à 3 Mo en choisissant Huge APP (3MB No OTA/1MB SPIFFS) dans Outils > Partition Scheme ; avec cette option, les mises à jour sans fil (OTA) ne sont plus possibles.

Erreurs dues au choix d'une mauvaise carte

Le compilateur compile toujours ton code pour le processeur de la carte choisie dans Outils > Carte (dans l'IDE 2, dans le sélecteur de carte en haut). Le même code peut compiler sans erreur pour la Mega et échouer avec l'Uno sélectionné, car chaque carte a son propre matériel, ses propres noms de broches et les bibliothèques fournies avec son paquet. Quand tu ouvres un projet trouvé en ligne, vérifie d'abord pour quelle carte il a été écrit : un code pour l'ESP32 ne compile pas avec l'Uno sélectionné, et un code pour l'Uno qui accède directement aux registres du processeur ne compile pas avec l'ESP32 sélectionné. Si ta carte n'apparaît même pas dans la liste, son paquet n'est pas installé ; les paquets de l'ESP32 et du Raspberry Pi Pico s'installent depuis le Gestionnaire de cartes. Tu trouveras les étapes dans le guide Installer l'Arduino IDE.

Message d'erreurQue s'est-il passé ?Solution
'Serial1' was not declared in this scopeLe code a été écrit pour la Mega ou la Leonardo mais l'Uno est sélectionné ; l'Uno n'a qu'un port série matérielChoisis la bonne carte ou utilise SoftwareSerial sur l'Uno
SoftwareSerial.h: No such file or directoryL'ESP32 est sélectionné ; son paquet ne contient pas cette bibliothèqueUtilise les ports série matériels de l'ESP32 (Serial2)
'LED_BUILTIN' was not declared in this scopeCertaines définitions de carte comme ESP32 Dev Module ne définissent pas la constante de la LED intégréeÉcris directement le numéro de broche (GPIO 2 sur beaucoup de cartes DevKit)
'D5' was not declared in this scopeLes noms comme D0–D8 existent sur les cartes ESP8266 comme la NodeMCU et la Wemos et sur quelques autres, mais pas sur l'Uno ni sur l'ESP32 Dev ModuleSur l'Uno et l'ESP32, écris le numéro de GPIO ou choisis la bonne carte
'TCCR1A' was not declared in this scopeUn code qui accède directement aux registres de timer de l'AVR est compilé pour l'ESP32Utilise les fonctions LEDC et timer de l'ESP32
WiFi.h: No such file or directory ou 'WIFI_STA' was not declared in this scopeDu code ESP32 est compilé pour l'Uno ; l'Uno n'a pas de Wi-FiChoisis ESP32 Dev Module dans Outils > Carte
'ledcSetup' was not declared in this scopeLe paquet ESP32 est en version 3.x alors que le code a été écrit pour la 2.xUtilise ledcAttach() et ledcWrite() avec le numéro de broche
Au début de la compilation, tu verras peut-être une ligne comme 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). Ce n'est pas une erreur ; elle indique seulement que l'auteur de la bibliothèque n'a pas ajouté l'ESP32 à la liste des cartes prises en charge, et la bibliothèque fonctionne souvent quand même. Le message auquel tu dois vraiment faire attention est Multiple libraries were found for "LiquidCrystal_I2C.h" : si deux bibliothèques du même nom sont installées, l'IDE en choisit une, et si ce choix ne correspond pas à ton code, tu obtiens une erreur comme 'class LiquidCrystal_I2C' has no member named 'init'. Les lignes Used et Not used sous le message indiquent quel dossier a été utilisé ; supprime du dossier libraries la copie dont tu ne te sers pas.

Erreurs de compilation sur l'ESP32

Carte de développement ESP32
ESP32 : il se programme dans le même langage dans l'Arduino IDE, mais il est compilé avec un autre compilateur et un autre paquet de carte, si bien qu'une partie du code qui fonctionne sur l'Uno échoue ici.

L'ESP32 se programme lui aussi dans le langage Arduino, mais comme son compilateur et son paquet de carte sont différents, un code qui compile sans erreur sur l'Uno peut bloquer sur l'ESP32. La raison la plus fréquente est la version du paquet : dans la version 3.x du paquet Arduino pour ESP32, les fonctions PWM ont changé ; ledcSetup() et ledcAttachPin() ont été supprimées et remplacées par ledcAttach() et ledcWrite(), qui utilisent le numéro de broche au lieu d'un numéro de canal. C'est pourquoi les anciens exemples trouvés en ligne donnent 'ledcSetup' was not declared in this scope ; soit tu adaptes le code aux nouvelles fonctions, soit tu installes la version 2.0.17 depuis le Gestionnaire de cartes. La deuxième différence concerne les options du compilateur. Le paquet de l'Uno compile avec l'option -fpermissive, qui transforme certaines erreurs en simples avertissements ; l'ESP32 ne l'utilise pas. Par exemple, déclarer une variable dans un switch sans accolades compile sur l'Uno mais donne l'erreur jump to case label sur l'ESP32. Les paquets ESP32 actuels compilent en outre avec -Werror=return-type : si tu oublies le return dans une fonction qui doit renvoyer une valeur, tu obtiens no return statement in function returning non-void dès que les Avertissements du compilateur sont réglés sur autre chose que Aucun. En version 2.x, avec les Avertissements du compilateur sur Plus ou Tout, la plupart des avertissements deviennent des erreurs. Pour la configuration de base de la carte, jette un œil à l'article Qu'est-ce que 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 : erreurs avec l'Arduino IDE et MicroPython

Si tu programmes le Pico avec l'Arduino IDE, c'est-à-dire avec le paquet arduino-pico d'Earle Philhower, le compilateur reste GCC et tous les messages de cet article s'appliquent tels quels. Avec MicroPython, c'est différent : il n'y a pas d'étape de compilation préalable ; le Pico transforme le fichier en bytecode au démarrage et l'exécute ligne par ligne. Les erreurs apparaissent donc dans le panneau Shell en bas de Thonny, dans un message qui commence par Traceback (most recent call last):. Lis ce message de bas en haut : la dernière ligne donne le type d'erreur et sa description, et le line 7 juste au-dessus indique la ligne concernée. Les erreurs de syntaxe (SyntaxError, IndentationError) sont signalées avant même que le programme démarre ; les autres n'apparaissent que lorsque le programme atteint la ligne en question, si bien que ton code peut tourner un moment avant de s'arrêter. Pour installer MicroPython et faire tes premiers pas, consulte l'article Qu'est-ce que le Raspberry Pi Pico.

Erreur MicroPythonCe que ça veut direSolution
SyntaxError: invalid syntaxSyntaxe cassée : il manque les deux-points à la fin d'une ligne if, while ou def, ou une parenthèse n'est pas ferméeAjoute : en fin de ligne et compte les parenthèses
IndentationError: unexpected indentIndentation incohérente ; espaces et tabulations mélangésUtilise 4 espaces dans chaque bloc
NameError: name 'led' isn't definedNom mal écrit ou utilisé avant d'être définiVérifie les majuscules, les minuscules et l'endroit de la définition
ImportError: no module named 'ssd1306'Le fichier du pilote n'est pas sur le PicoEnregistre ssd1306.py sur le Pico avec Thonny
AttributeError: 'Pin' object has no attribute 'toggel'L'objet n'a pas de fonction de ce nomCorrige le nom de la fonction : toggle()
TypeError: can't convert 'int' object to str implicitlyTexte et nombre assemblés avec +Utilise str(nombre) ou passe les valeurs à print séparées par des virgules
OSError: [Errno 5] EIOLe périphérique I2C ne répond pasVérifie le câblage, l'adresse et les broches SDA et 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)

Tableau des erreurs de compilation Arduino et de leurs solutions

Message d'erreurCauseSolution
exit status 1 / Compilation error: exit status 1Un programme de la chaîne de compilation ou de téléversement a échouéRemonte et lis la première ligne contenant error:
'x' was not declared in this scopeFaute de frappe, majuscules et minuscules, portée ou #include manquantCorrige le nom, rends la variable globale, inclus la bibliothèque
expected ';' before ...Il manque un point-virgule sur la ligne précédenteVérifie la ligne au-dessus de celle indiquée (Uno) ou la fin de la ligne indiquée (ESP32)
expected '}' at end of inputAccolade non ferméeFais correspondre les accolades avec Formatage automatique (Ctrl+T)
X.h: No such file or directoryBibliothèque non installée ou nom de fichier erronéInstalle-la depuis le gestionnaire de bibliothèques avec ses dépendances
'X' does not name a type#include manquant, nom de type erroné ou commande hors d'une fonctionInclus la bibliothèque, vérifie l'écriture de String et int, déplace la commande dans une fonction
redefinition of 'void setup()'Deux setup() ou un fichier .ino en trop dans le dossierFusionne les croquis, retire l'ancien fichier du dossier
stray '\342' in programGuillemet typographique ou tiret copié, ou lettre accentuée dans un nom de variableRetape les guillemets, utilise des lettres sans accent dans les noms
'class X' has no member named 'y'Mauvais nom de fonction ou autre version de la bibliothèqueRegarde les exemples de la bibliothèque, installe la bonne version
too few arguments to function / too many arguments to functionTrop peu ou trop de valeurs passées à une fonctionCompare avec la définition de la ligne note: declared here
lvalue required as left operand of assignmentAffectation au lieu de comparaison : if (digitalRead(2) = HIGH)Utilise == pour comparer
jump to case labelVariable déclarée dans un case sans accolades (erreur sur l'ESP32)Entoure le bloc case de { }
undefined reference to `clignoter()'La fonction n'a qu'un prototype, pas de corpsÉcris la fonction ou corrige son nom
Sketch too big / text section exceeds available space in boardLe programme ne tient pas dans la flashAllège le code, prends une carte plus grande, Partition Scheme sur l'ESP32
data section exceeds available space in boardLes variables globales ne tiennent pas dans la RAMMacro F(), types de données plus petits, tableaux en PROGMEM
#error This library only supports boards with ...La bibliothèque ne prend pas en charge l'architecture de la carte choisieInstalle une bibliothèque adaptée à ta carte ou change de carte
Pour limiter au maximum les erreurs de compilation, fais grandir ton code par petites étapes : pars d'un exemple qui fonctionne, clique sur Vérifier après chaque nouvel ajout et, en cas d'erreur, regarde seulement les dernières lignes ajoutées. Méfie-toi aussi des fautes que le compilateur ne voit pas : if (etat = HIGH) écrit avec une variable compile sans erreur, mais comme il affecte au lieu de comparer, la condition est toujours vraie ; le point-virgule à la fin de if (distance < 10); rend aussi la condition inutile. Si tu règles les Avertissements du compilateur sur Tout, tu verras la plupart de ces erreurs de logique sous forme d'avertissements.

Prochaines étapes pour écrire du code sans erreur

  • Consolide les bases : L'article Les bases de la programmation Arduino explique variables, portée, fonctions et boucles ; la plupart des erreurs de cet article viennent de ces sujets.
  • Apprends l'écriture exacte des commandes : La liste des commandes Arduino présente la syntaxe et les paramètres de chaque commande avec des exemples.
  • Installe correctement les bibliothèques : Le guide Installer une bibliothèque Arduino traite en détail les messages No such file or directory et Multiple libraries were found.
  • Vois ce que fait ton code pendant l'exécution : Pour un code qui compile mais ne se comporte pas comme prévu, afficher les variables dans le moniteur série est le moyen de diagnostic le plus rapide.
  • Essaie sans carte : Dans les simulateurs Wokwi ou Tinkercad, tu peux compiler ton code et l'exécuter avec le circuit.
  • Vérifie le code écrit par une IA : Le code produit par les chatbots vise souvent d'anciennes versions de bibliothèques ou une autre carte ; l'article Du code Arduino avec l'IA explique comment repérer ces problèmes.

Les erreurs de compilation font peur au début, mais en réalité le compilateur te dit où se trouve le problème et souvent comment le résoudre : fichier, ligne, colonne et une courte description. Lis la première erreur, corrige seulement celle-là, recompile et recommence ; après quelques projets, tu les régleras en quelques secondes. Une fois ton code compilé et téléversé, tu peux continuer avec les projets de LED, boutons, capteurs et écrans de l'application BlueGrays : pour Arduino, ESP32 et Raspberry Pi Pico, chaque projet est accompagné d'un schéma de câblage et d'un code qui compile sans erreur, étape par étape.

Questions fréquentes

Que signifie exit status 1 sur Arduino ?

exit status 1 est un message générique indiquant que l'un des programmes lancés pendant la compilation ou le téléversement s'est terminé par une erreur ; il ne donne pas la cause lui-même. Remonte dans la zone de sortie et cherche la première ligne contenant error: ; tu y trouveras le nom du fichier, le numéro de ligne et la description. Une fois cette erreur corrigée et le code recompilé, exit status 1 disparaît aussi.

Comment corriger 'was not declared in this scope' sur Arduino ?

Cela signifie que le compilateur ne reconnaît pas, à cet endroit, une variable, une fonction ou une constante que tu as utilisée. Les causes les plus fréquentes sont une erreur de majuscules (digitalwrite), une variable déclarée dans une autre fonction et une bibliothèque non incluse. Vérifier l'orthographe et déclarer les variables partagées en dehors de toutes les fonctions suffit généralement.

Que veut dire "expected ';' before" sur Arduino ?

Cette erreur signale un point-virgule manquant. Comme le compilateur de l'Uno ne s'en aperçoit qu'en lisant le mot suivant, la ligne de son message est en général celle du dessous : ajoute alors le point-virgule à la fin de la ligne juste au-dessus. Sur l'ESP32 et la Pico, le message pointe directement la ligne où il manque. Des virgules à la place des points-virgules dans les parenthèses d'un for donnent le même message.

Pourquoi l'erreur 'does not name a type' apparaît-elle ?

Le compilateur attend un type de donnée en début de ligne mais ne reconnaît pas le mot écrit. Oublier la ligne #include de la bibliothèque (par exemple pour Servo), écrire string au lieu de String et placer une affectation isolée comme angle = 90; hors d'une fonction sont les trois causes les plus courantes. Si tu utilises ton propre type struct dans Arduino, définis-le avant la première fonction.

Comment résoudre 'Sketch too big' sur Arduino ?

Ce message signifie que le programme ne tient pas dans la mémoire flash de la carte ; sur l'Uno, la limite est de 32256 octets. Supprime les bibliothèques et les lignes de débogage inutiles, déplace les grands tableaux constants en PROGMEM ou passe à une carte dotée de plus de mémoire, comme la Mega ou l'ESP32. Sur l'ESP32, choisir Huge APP dans le menu Partition Scheme porte la zone programme à environ 3 Mo.

Mon code compile mais ne se téléverse pas : pourquoi ?

Si la compilation réussit, tu vois la ligne Sketch uses avec la taille du programme ; les erreurs qui suivent relèvent du téléversement et concernent le câble, le pilote, le port ou le choix de la carte, pas le code. Les lignes qui commencent par avrdude indiquent un problème de téléversement sur l'Uno et la Nano, les lignes esptool sur l'ESP32. Dans ce cas, suis dans l'ordre les étapes du guide sur les erreurs de téléversement Arduino.

Voir tous les projets
Clignotement d'une LED
#1Débutant

Clignotement d'une LED

Le tout premier bonjour de l'électronique : allumer et éteindre une seule LED. L'Arduino allume et éteint la LED à intervalles très courts, la lumière clignote donc rapidement. Tu vois de la façon la

4.6(179)
977
Allumer une LED avec un bouton-poussoir (Push)
#9Débutant

Allumer une LED avec un bouton-poussoir (Push)

Comme une sonnette : la lumière reste allumée tant que tu appuies et s'éteint quand tu relâches. L'Arduino surveille le bouton en permanence ; tant qu'il est enfoncé la LED est allumée, et dès que tu

4.9(112)
198
HC-SR04 Mesure de la distance (affichage en série)
#27Débutant

HC-SR04 Mesure de la distance (affichage en série)

Le capteur HC-SR04 fonctionne comme une chauve-souris qui trouve son chemin dans le noir : il envoie un son que tu ne peux pas entendre, écoute l'écho et mesure à quelle distance se trouve l'objet dev

4.6(45)
68
Température et humidité avec DHT11
#55Intermédiaire

Température et humidité avec DHT11

Quelle température fait-il dans ta chambre, et l'air est-il humide ou sec ? Le capteur DHT11 mesure la température et l'humidité, et l'Arduino affiche les valeurs sur un écran LCD à deux lignes, mises

4.7(47)
64
Clignotement LED avec ESP32
#103Débutant

Clignotement LED avec ESP32

Enseigne l'utilisation de base des sorties GPIO avec l'ESP32. Nous obtenons un effet de clignotement en allumant et éteignant une LED à partir de la broche numérique. Version ESP32 du projet blink classique sur Arduino UNO ; les commandes de base de blink dans l'environnement Arduino restent les mêmes, mais le brochage et les niveaux GPIO de 3,3 V de l'ESP32 diffèrent de ceux de l'Arduino UNO.

4.7(36)
96
Clignotement LED Intégrée Raspberry Pi Pico (GP25 LED Onboard)
#147Débutant

Clignotement LED Intégrée Raspberry Pi Pico (GP25 LED Onboard)

Le projet d'ouverture de la série Raspberry Pi Pico ! Nous faisons clignoter la LED intégrée (LED verte connectée à GP25) pour vérifier que la carte fonctionne — une première expérience classique "Hello World". AUCUN composant externe, juste Pico et câble USB. Le code est écrit en **MicroPython** (le langage officiellement soutenu par la Raspberry Pi Foundation). Apprends la classe `machine.Pin`, le mode `Pin.OUT`, les méthodes `led.on()/off()` et `time.sleep()` dans Thonny IDE. Suis chaque basc

5.0(1)
9
Utilisation de l'écran LCD avec I2C
#32Débutant
Premium

Utilisation de l'écran LCD avec I2C

Offre un écran à ton Arduino et fais-lui écrire son premier message. L'écran LCD à deux lignes se branche avec seulement quelques fils ; un bonjour s'affiche sur la ligne du haut, puis un deuxième tex

4.8(53)
70
Utilisation du servomoteur
#35Débutant
Premium

Utilisation du servomoteur

Le bras d'un petit servomoteur tourne tour à tour vers trois positions : tout au début, pile au milieu et tout au bout, en attendant deux secondes à chaque arrêt. L'Arduino indique au moteur l'angle à

4.7(48)
67