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.

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 | Étape | Ce que ça veut dire |
|---|---|---|
| error: ... puis exit status 1 à la fin | Compilation | Il 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 directory | Compilation (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 liens | Une fonction est déclarée mais son corps n'existe nulle part |
| multiple definition of ... | Édition de liens | La même variable ou fonction est définie dans deux fichiers |
| Sketch too big et text section exceeds available space in board | Contrôle de taille | Le programme ne tient pas dans la mémoire flash de la carte |
| Not enough memory et data section exceeds available space in board | Contrôle de taille | Les variables globales ne tiennent pas dans la RAM |
| Failed uploading: uploading error: exit status 1 | Téléversement | Le 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'.
| Partie | Valeur dans l'exemple | Signification |
|---|---|---|
| Fichier | Blink.ino | Le fichier qui contient l'erreur ; si tu as plusieurs onglets, c'est ici que tu vois lequel |
| Ligne | 6 | La ligne où le compilateur a remarqué l'erreur ; la vraie faute est parfois sur la ligne du dessus |
| Colonne | 3 | Le numéro du caractère dans la ligne ; là où pointe le ^ |
| Type | error | error arrête, warning avertit, note complète |
| Message | 'digitalwrite' was not declared in this scope | La partie qui décrit le problème ; c'est le texte à chercher sur internet |
| Suggestion | note: suggested alternative: 'digitalWrite' | La supposition du compilateur ; elle montre souvent la bonne orthographe |
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.
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).
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}| Cause | Faux | Correct |
|---|---|---|
| Majuscules et minuscules | digitalwrite(13, HIGH); | digitalWrite(13, HIGH); |
| Constante mal écrite | pinMode(13, OUPUT); | pinMode(13, OUTPUT); |
| Variable déclarée dans une autre fonction | Dé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 utilisation | int compteur = 0; placé après la ligne compteur++; | Place la déclaration avant l'endroit où elle est utilisée |
| Bibliothèque non incluse | Wire.begin(); sans ligne #include | Ajoute #include <Wire.h> au début du fichier |
| Fonction absente de la carte | Serial1.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émentaire | Une fonction appelée avant sa définition dans un onglet .cpp | Dans 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.
| Message | Cause la plus probable | Où regarder ? |
|---|---|---|
| expected ';' before 'delay' | Il manque un point-virgule à la fin de la ligne précédente | Sur l'Uno, la ligne au-dessus de celle indiquée ; sur l'ESP32, la fin de la ligne indiquée |
| expected ';' before '}' token | Il manque un point-virgule sur la dernière ligne du bloc | La ligne juste avant l'accolade fermante |
| expected ';' before '<' token | Des virgules au lieu de points-virgules dans un for | Écris for (int i = 0; i < 10; i++) |
| expected '}' at end of input | Une accolade n'a jamais été fermée | Vérifie l'indentation avec Formatage automatique ; chaque { a besoin de sa } |
| a function-definition is not allowed here before '{' token | L'accolade fermante de la fonction précédente manque | La fin de la fonction qui précède celle indiquée |
| expected ')' before ';' token | Une parenthèse ouverte n'a pas été fermée | Compte les parenthèses dans les conditions if et les appels de fonction |
| expected primary-expression before ')' token | Une valeur manque entre les parenthèses | Un argument vide comme digitalWrite(13, ) |
| expected constructor, destructor, or type conversion before '(' token | Une commande écrite en dehors de toute fonction | Déplace les commandes comme pinMode() dans setup() |
| expected unqualified-id before '{' token | Un point-virgule après l'en-tête d'une fonction | Écris void loop() { au lieu de void loop(); { |
'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èques | Remarque |
|---|---|---|
| DHT.h | DHT sensor library (Adafruit) | Choisis Tout installer ; Adafruit Unified Sensor est installée avec |
| Adafruit_Sensor.h | Adafruit Unified Sensor | Dépendance manquante d'une autre bibliothèque Adafruit |
| LiquidCrystal_I2C.h | LiquidCrystal I2C (Frank de Brabander) | N'installe pas plusieurs bibliothèques du même nom ; voir l'avertissement plus bas |
| Adafruit_SSD1306.h | Adafruit SSD1306 | S'installe avec Adafruit GFX et Adafruit BusIO |
| MFRC522.h | MFRC522 (GithubCommunity) | Pour le module RFID RC522 |
| IRremote.h | IRremote | Les 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 pas | Utilise 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.
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.
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.
| Carte | Limite de mémoire programme | RAM (mémoire dynamique) | Remarque |
|---|---|---|---|
| Arduino Uno R3 | 32256 octets | 2048 octets | 0,5 Ko réservé au bootloader |
| Arduino Nano (ATmega328P) | 30720 octets | 2048 octets | L'IDE réserve 2 Ko pour les deux options de bootloader |
| Arduino Leonardo | 28672 octets | 2560 octets | Bootloader de 4 Ko ; le code USB prend aussi de la place |
| Arduino Mega 2560 | 253952 octets | 8192 octets | Passage facile pour les projets trop gros pour l'Uno |
| ESP32 (partitionnement par défaut) | 1310720 octets | 327680 octets | Passe à 3145728 octets avec Huge APP |
| Raspberry Pi Pico (arduino-pico, 2MB no FS) | 2093056 octets | 262144 octets | Réserver de la place pour un système de fichiers réduit la zone programme |
1// RAM tasarrufu: F() ve PROGMEM / Saving RAM: F() and PROGMEM
2const char mesaj[] PROGMEM = "Bu uzun metin RAM yerine flasta durur"; // flaşta saklanır / stored in flash
3const byte notalar[] PROGMEM = {60, 62, 64, 65, 67, 69, 71, 72}; // byte: int'in yarısı / byte: half of an int
4
5void setup() {
6 Serial.begin(9600);
7 Serial.println(F("Merhaba! Bu metin de flastan okunur")); // F(): RAM harcamaz / F(): uses no RAM
8 char tampon[48]; // geçici RAM tamponu / temporary RAM buffer
9 strcpy_P(tampon, mesaj); // flaştan RAM'e kopyala / copy from flash to RAM
10 Serial.println(tampon);
11 for (byte i = 0; i < sizeof(notalar); i++) {
12 Serial.print(pgm_read_byte(¬alar[i])); // flaştan bir bayt oku / read one byte from flash
13 Serial.print(' ');
14 }
15 Serial.println();
16}
17
18void loop() {
19}- 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'erreur | Que s'est-il passé ? | Solution |
|---|---|---|
| 'Serial1' was not declared in this scope | Le 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ériel | Choisis la bonne carte ou utilise SoftwareSerial sur l'Uno |
| SoftwareSerial.h: No such file or directory | L'ESP32 est sélectionné ; son paquet ne contient pas cette bibliothèque | Utilise les ports série matériels de l'ESP32 (Serial2) |
| 'LED_BUILTIN' was not declared in this scope | Certaines 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 scope | Les 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 Module | Sur l'Uno et l'ESP32, écris le numéro de GPIO ou choisis la bonne carte |
| 'TCCR1A' was not declared in this scope | Un code qui accède directement aux registres de timer de l'AVR est compilé pour l'ESP32 | Utilise les fonctions LEDC et timer de l'ESP32 |
| WiFi.h: No such file or directory ou 'WIFI_STA' was not declared in this scope | Du code ESP32 est compilé pour l'Uno ; l'Uno n'a pas de Wi-Fi | Choisis ESP32 Dev Module dans Outils > Carte |
| 'ledcSetup' was not declared in this scope | Le paquet ESP32 est en version 3.x alors que le code a été écrit pour la 2.x | Utilise ledcAttach() et ledcWrite() avec le numéro de broche |
Erreurs de compilation sur l'ESP32

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.
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 MicroPython | Ce que ça veut dire | Solution |
|---|---|---|
| SyntaxError: invalid syntax | Syntaxe cassée : il manque les deux-points à la fin d'une ligne if, while ou def, ou une parenthèse n'est pas fermée | Ajoute : en fin de ligne et compte les parenthèses |
| IndentationError: unexpected indent | Indentation incohérente ; espaces et tabulations mélangés | Utilise 4 espaces dans chaque bloc |
| NameError: name 'led' isn't defined | Nom mal écrit ou utilisé avant d'être défini | Vé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 Pico | Enregistre ssd1306.py sur le Pico avec Thonny |
| AttributeError: 'Pin' object has no attribute 'toggel' | L'objet n'a pas de fonction de ce nom | Corrige le nom de la fonction : toggle() |
| TypeError: can't convert 'int' object to str implicitly | Texte et nombre assemblés avec + | Utilise str(nombre) ou passe les valeurs à print séparées par des virgules |
| OSError: [Errno 5] EIO | Le périphérique I2C ne répond pas | Vérifie le câblage, l'adresse et les broches SDA et SCL |
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'erreur | Cause | Solution |
|---|---|---|
| exit status 1 / Compilation error: exit status 1 | Un 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 scope | Faute de frappe, majuscules et minuscules, portée ou #include manquant | Corrige le nom, rends la variable globale, inclus la bibliothèque |
| expected ';' before ... | Il manque un point-virgule sur la ligne précédente | Vérifie la ligne au-dessus de celle indiquée (Uno) ou la fin de la ligne indiquée (ESP32) |
| expected '}' at end of input | Accolade non fermée | Fais correspondre les accolades avec Formatage automatique (Ctrl+T) |
| X.h: No such file or directory | Bibliothè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 fonction | Inclus 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 dossier | Fusionne les croquis, retire l'ancien fichier du dossier |
| stray '\342' in program | Guillemet typographique ou tiret copié, ou lettre accentuée dans un nom de variable | Retape 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èque | Regarde les exemples de la bibliothèque, installe la bonne version |
| too few arguments to function / too many arguments to function | Trop peu ou trop de valeurs passées à une fonction | Compare avec la définition de la ligne note: declared here |
| lvalue required as left operand of assignment | Affectation au lieu de comparaison : if (digitalRead(2) = HIGH) | Utilise == pour comparer |
| jump to case label | Variable 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 board | Le programme ne tient pas dans la flash | Allège le code, prends une carte plus grande, Partition Scheme sur l'ESP32 |
| data section exceeds available space in board | Les variables globales ne tiennent pas dans la RAM | Macro 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 choisie | Installe une bibliothèque adaptée à ta carte ou change de carte |
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.
Projets à réaliser après cet article
Voir tous les projets
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

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

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

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

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.

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

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

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 à
Autres articles
Application BlueGrays
Réalise ce montage pas à pas sur ton téléphone
Schéma, code et liste des composants sur un seul écran. Plus de 160 projets Arduino, ESP32 et Pico à réaliser.
Scanne avec ton téléphone
Pointe l’appareil photo vers le code : la boutique d’applications de ton téléphone s’ouvre.
ou ouvre la boutique

