Guías · 18 min de lectura

Arduino exit status 1: cómo solucionar los errores de compilación

¿Qué significa exit status 1 en Arduino? Soluciona was not declared in this scope, expected ';', No such file, does not name a type y Sketch too big.

El error exit status 1 de Arduino es un mensaje genérico que te dice que tu código no se ha podido compilar, es decir, que el compilador no ha logrado convertir tu programa en el código máquina que entiende el procesador; la causa real nunca aparece en esa línea. Está en la primera línea que contiene la palabra error:, unas líneas más arriba en el panel de salida: has escrito mal un nombre, te has olvidado un punto y coma, falta una biblioteca o el código se escribió para otra placa. El aviso Compilation error: exit status 1 que aparece abajo a la derecha en Arduino IDE 2 (en español, Error de compilación: exit status 1) y la línea Error compilando para la tarjeta Arduino Uno. de la antigua versión 1.8 significan exactamente lo mismo.

En esta guía verás primero qué ocurre por detrás al compilar y cómo leer un mensaje de error separándolo en archivo, línea y columna. Después repasaremos uno a uno los errores de compilación más frecuentes: was not declared in this scope, expected ';' before, No such file or directory, does not name a type, redefinition of y Sketch too big. Para cada uno encontrarás la situación que lo provoca, el mensaje real que muestra el compilador y un ejemplo corregido que compila sin errores. También hemos incluido los errores que aparecen al elegir la placa equivocada, los casos propios del ESP32 y de la Raspberry Pi Pico y, al final, una tabla de errores y soluciones que lo reúne todo. Si tu código compila bien pero no llega a la placa, el problema está en otra fase; para eso tienes la guía Error al subir código a Arduino.

Placa Arduino Uno R3
Arduino Uno: el código se compila para el procesador de la placa elegida en Herramientas > Placa (aquí el ATmega328P); elegir la placa equivocada puede provocar un error de compilación aunque el código sea correcto.

¿Qué es exit status 1 en Arduino? Diferencia entre compilar y subir

Cuando pulsas Verificar (la marca de verificación) o Subir, el Arduino IDE ejecuta varios programas en segundo plano. Primero une los archivos .ino de la carpeta del sketch y los convierte en un archivo C++ normal, añadiendo al principio la cabecera Arduino.h y los prototipos de tus funciones. Luego un compilador, como avr-g++ para el Uno o xtensa-esp32-elf-g++ para el ESP32, compila ese archivo y las bibliotecas que usas, el enlazador (linker) junta todas las piezas en un solo programa y, por último, se comprueba si el programa cabe en la placa. Cada programa devuelve un código de salida al terminar: 0 significa éxito y 1, error. "exit status 1" dice exactamente eso: uno de los programas de la cadena ha fallado. Por eso la misma expresión aparece también cuando falla avrdude durante la carga; el mensaje que va delante te dice de cuál se trata.

Lo que ves en la salidaFaseQué significa
error: ... y al final exit status 1CompilaciónHay un error de C++ en tu código o en una biblioteca; la causa real está en la línea error:
fatal error: DHT.h: No such file or directoryCompilación (preprocesado)No se encontró el archivo pedido con #include; falta la biblioteca o el nombre está mal
undefined reference to ... y collect2: error: ld returned 1 exit statusEnlazado (linker)Una función está declarada pero su cuerpo no existe en ningún sitio
multiple definition of ...Enlazado (linker)La misma variable o función está definida en dos archivos distintos
Sketch too big y text section exceeds available space in boardControl de tamañoEl programa no cabe en la memoria flash de la placa
Not enough memory y data section exceeds available space in boardControl de tamañoLas variables globales no caben en la RAM
Failed uploading: uploading error: exit status 1CargaEl código compiló pero no se pudo escribir en la placa; mira las líneas de avrdude o esptool

¿Cómo se lee un mensaje de error de Arduino?

Todas las líneas de error del compilador siguen el mismo patrón: primero el nombre del archivo, luego los números de línea y columna separados por dos puntos y, a continuación, el tipo de error y su descripción. Justo encima suele haber una línea como In function 'void loop()': que indica en qué función está el error; debajo aparecen una copia de la línea con el fallo y un pequeño ^ que señala el punto exacto. error es un error real que detiene la compilación, warning es solo una advertencia y el código compila igualmente, y note añade información al mensaje anterior. A menudo el compilador incluye además una sugerencia: en el ejemplo de abajo muestra él mismo la forma correcta con suggested alternative: 'digitalWrite'.

ParteValor en el ejemploSignificado
ArchivoBlink.inoEl archivo con el error; si tienes varias pestañas, aquí ves cuál es
Línea6La línea donde el compilador detectó el error; a veces el fallo real está en la línea anterior
Columna3El número de carácter dentro de la línea; donde apunta el ^
Tipoerrorerror detiene, warning avisa, note informa
Mensaje'digitalwrite' was not declared in this scopeLa parte que describe el problema; es el texto que debes buscar en internet
Sugerencianote: suggested alternative: 'digitalWrite'La suposición del compilador; muchas veces muestra la escritura correcta
  1. En Archivo > Preferencias, marca la casilla compilar en la línea Mostrar salida verbosa durante. Así verás también qué archivos y qué carpetas de bibliotecas ha usado el compilador.
  2. No hace falta conectar la placa: pulsa el botón Verificar (la marca de verificación). Verificar solo compila; si el error está en la compilación, pulsar Subir solo te hace perder tiempo.
  3. Sube hasta arriba del panel de salida y busca la primera línea que contenga error:. La mayoría de los errores posteriores son consecuencia en cadena de ese primero.
  4. Ve al número de línea del mensaje. El IDE 2 subraya en rojo el carácter con el error y la versión 1.8 colorea de rojo toda la línea. Si no ves ningún problema en esa línea, mira la de arriba.
  5. Corrige solo ese primer error y vuelve a pulsar Verificar. Si el número de errores baja de golpe, vas por buen camino.
  6. Si vas a buscar en internet, quita del mensaje tus nombres de variables y las rutas de archivo: buscar was not declared in this scope en lugar de 'contador' was not declared in this scope da muchos más resultados. En cambio, cuando pidas ayuda en un foro, copia la salida completa.
Un solo fallo puede generar decenas de líneas rojas. Por ejemplo, una única línea Serial.println escrita con comillas tipográficas copiadas de una web da en el Uno seis errores stray distintos y un error was not declared. Así que no te asustes por la cantidad: corrige el primero y vuelve a compilar. Para comprobar si las llaves están emparejadas, usa Herramientas > Auto Formato (Ctrl+T): si la sangría se desplaza de forma extraña, falta cerrar una llave.

Error 'was not declared in this scope' y su solución

Este mensaje indica que el compilador no reconoce en ese punto un nombre que has usado; en español sería "no declarado en este ámbito". La causa más frecuente es una errata: Arduino distingue mayúsculas y minúsculas, así que digitalwrite, Digitalwrite y digitalWrite son tres nombres distintos. La segunda gran causa es el ámbito (scope): si declaras una variable dentro de setup(), solo existe mientras se ejecuta setup() y loop() no puede verla. Si vas a usar una variable en varias funciones, declárala fuera de todas ellas, al principio del archivo. Declarar una variable después de la línea donde la usas provoca el mismo error, porque el compilador lee el archivo de arriba abajo. Por último, este error también aparece cuando usas un objeto cuya biblioteca no has incluido (Wire, Servo) o una función que la placa seleccionada no tiene (Serial1 en el 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}
CausaIncorrectoCorrecto
Mayúsculas y minúsculasdigitalwrite(13, HIGH);digitalWrite(13, HIGH);
Constante mal escritapinMode(13, OUPUT);pinMode(13, OUTPUT);
Variable declarada en otra funciónDeclarar int led = 13; dentro de setup() y usar led en loop()Mueve la línea int led = 13; fuera de todas las funciones, arriba del todo
Variable declarada después de usarlaint contador = 0; aparece después de la línea contador++;Coloca la declaración antes del lugar donde se usa
Biblioteca no incluidaWire.begin(); sin línea #includeAñade #include <Wire.h> al principio del archivo
Función que la placa no tieneSerial1.begin(9600); con el Uno seleccionadoElige una placa con varios puertos serie, como el Mega, o usa SoftwareSerial
Orden en un archivo .cpp adicionalUna función llamada antes de su definición en una pestaña .cppEn los archivos .cpp escribe el prototipo (void parpadear();) arriba; en los .ino lo hace el IDE

'expected ';' before' y otros errores de sintaxis

En C++ cada instrucción termina con punto y coma. Cuando lo olvidas al final de una línea, el compilador solo se da cuenta al leer la palabra siguiente. Por eso, con el compilador del Uno, el número de línea de expected ';' before 'delay' señala la línea de debajo del fallo: el punto y coma que falta está al final de la línea anterior a delay. Los compiladores más recientes de los paquetes del ESP32 y de la Pico, en cambio, señalan directamente el final de la línea a la que le falta el punto y coma. Si lo olvidas en la última línea de una función, el mensaje pasa a ser expected ';' before '}' token. Los errores de llaves se comportan de forma parecida. Si no cierras la llave de un bloque if o de una función, el compilador sigue leyendo hasta el final del archivo y solo entonces dice expected '}' at end of input. Si la llave sin cerrar está dentro de setup(), aparece además a function-definition is not allowed here before '{' token, porque para el compilador loop() es ahora una función que intentas definir dentro de setup(). Usar comas en lugar de punto y coma dentro del paréntesis de un bucle for es otro clásico de esta familia.

MensajeCausa más probableDónde mirar
expected ';' before 'delay'Falta el punto y coma al final de la línea anteriorEn el Uno, la línea de encima de la indicada; en el ESP32, el final de la indicada
expected ';' before '}' tokenFalta el punto y coma en la última línea del bloqueLa línea justo antes de la llave de cierre
expected ';' before '<' tokenComas en lugar de punto y coma en un forEscríbelo como for (int i = 0; i < 10; i++)
expected '}' at end of inputUna llave no se ha cerradoRevisa la sangría con Auto Formato; cada { necesita su }
a function-definition is not allowed here before '{' tokenFalta la llave de cierre de la función anteriorEl final de la función anterior a la indicada
expected ')' before ';' tokenUn paréntesis abierto no se ha cerradoCuenta los paréntesis en las condiciones if y en las llamadas a funciones
expected primary-expression before ')' tokenFalta un valor dentro del paréntesisUn argumento vacío como digitalWrite(13, )
expected constructor, destructor, or type conversion before '(' tokenUna orden escrita fuera de cualquier funciónMueve órdenes como pinMode() dentro de setup()
expected unqualified-id before '{' tokenPunto y coma después de la cabecera de una funciónEscribe void loop() { en lugar de void loop(); {
El error stray '\342' in program indica que en tu código hay un carácter que el compilador no reconoce; los números son los valores octales de los bytes UTF-8 de ese carácter. El código copiado de páginas web, archivos de Word o PDF y aplicaciones de mensajería puede traer comillas tipográficas (“ ”) en lugar de rectas ("), un guion largo en lugar del signo menos o un espacio de no separación invisible: las comillas tipográficas y los guiones aparecen como \342 y el espacio de no separación como \302. El compilador del Uno tampoco acepta letras con tilde ni la ñ en los nombres de variables: escribir int año da stray '\303' in program. La solución es volver a escribir con el teclado las comillas y los guiones de la línea indicada y usar en los nombres de variables solo letras sin tilde ni ñ. En cambio, los acentos dentro de un texto entre comillas dobles no impiden compilar.

'No such file or directory': no se encuentra la biblioteca

Las líneas fatal error: DHT.h: No such file or directory y el compilation terminated. que viene después dicen que el archivo pedido por una línea #include de tu código no se ha encontrado en el ordenador. La palabra "fatal" significa que la compilación se detiene por completo en ese punto, así que no verás los errores del resto del código hasta resolver este. La causa casi siempre es una biblioteca sin instalar. Cuando abras un proyecto de internet, lee una a una las líneas #include del principio e instala la biblioteca de cada una desde Herramientas > Gestionar bibliotecas. Si en la ventana que pregunta por las dependencias no eliges Instalar todo, se instala la biblioteca principal pero falta la segunda que necesita; en ese caso el archivo del mensaje no es uno que hayas escrito tú, sino uno que la propia biblioteca llama (por ejemplo Adafruit_Sensor.h). Las mayúsculas y minúsculas del nombre también importan: en Linux, dht.h y DHT.h son archivos distintos. Para las tres formas de instalar una biblioteca y los problemas con ZIP, consulta la guía Cómo instalar una librería en Arduino.

Archivo del mensajeBusca en el Gestor de BibliotecasNota
DHT.hDHT sensor library (Adafruit)Elige Instalar todo; se instala también Adafruit Unified Sensor
Adafruit_Sensor.hAdafruit Unified SensorDependencia que falta de otra biblioteca de Adafruit
LiquidCrystal_I2C.hLiquidCrystal I2C (Frank de Brabander)No instales varias bibliotecas con el mismo nombre; mira el aviso de más abajo
Adafruit_SSD1306.hAdafruit SSD1306Se instala junto con Adafruit GFX y Adafruit BusIO
MFRC522.hMFRC522 (GithubCommunity)Para el módulo RFID RC522
IRremote.hIRremoteLas versiones nuevas usan IrReceiver.begin(); los ejemplos antiguos pueden dar avisos o errores
SoftwareSerial.h (con el ESP32 seleccionado)No la instales; el paquete del ESP32 no la incluyeUsa el puerto serie por hardware Serial2 del ESP32 o instala la biblioteca EspSoftwareSerial

El error 'does not name a type'

does not name a type significa que el compilador esperaba un tipo de dato (como int, float, Servo o LiquidCrystal_I2C) al principio de la línea, pero no reconoce la palabra que has escrito. Tiene tres causas habituales. La primera es olvidar la línea #include de la biblioteca: si compilas Servo tapa; sin Servo.h, obtienes 'Servo' does not name a type. La segunda es escribir mal el tipo: lo correcto es String y no string, int y no Int, y el compilador suele ayudar con did you mean 'String'?. La tercera, y la más sorprendente, es escribir una orden fuera de una función. Fuera de las funciones solo puedes declarar: int angulo = 0; es válido, pero si en una línea posterior escribes solo angulo = 90;, el compilador toma angulo por un nombre de tipo y dice 'angulo' does not name a type. Hay además una trampa propia de Arduino: el IDE añade automáticamente los prototipos de tus funciones justo antes de la primera función. Si escribiste una función que devuelve un tipo struct propio y definiste el struct debajo de setup(), el prototipo queda antes del struct y aparece el mismo error. La solución es mover las definiciones de struct al principio del archivo, antes de la primera función.

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}

El error 'redefinition of': definir lo mismo dos veces

El error redefinition of 'void setup()' dice que hay dos definiciones con el mismo nombre; la línea note: 'void setup()' previously defined here justo debajo indica dónde está la primera. En principiantes, la causa más habitual es pegar dos sketches de ejemplo uno detrás de otro en un mismo archivo: acabas con dos setup() y dos loop(). La segunda causa son las pestañas. Antes de compilar, el Arduino IDE junta en uno todos los archivos .ino de la carpeta del sketch. Una copia de seguridad antigua que hayas copiado en la carpeta (por ejemplo proyecto_viejo.ino) o una segunda pestaña con su propio setup() y loop() provoca este error aunque nunca abras esa pestaña; la solución es sacar ese archivo de la carpeta. Declarar dos veces la misma variable produce un mensaje parecido: redefinition of 'int led'. El hermano de este error en el enlazador es multiple definition of; aparece cuando una variable con valor asignado en un archivo de cabecera (.h) se incluye en dos archivos .cpp distintos. Su contrario, undefined reference to, señala una función de la que escribiste el prototipo pero nunca el cuerpo, o cuyo nombre escribiste de otra forma.

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}

Al combinar, sigue este orden: primero reúne arriba las líneas #include de los dos sketches sin repetir ninguna y luego añade las variables globales y las constantes; si un nombre existe en ambos, cambia uno de ellos. Después pasa el contenido de las dos funciones setup() a un único setup() y el de los dos loop() a un único loop(). Si uno de los sketches usa un delay() largo, frenará al otro; puedes resolverlo con la técnica de millis() en lugar de delay(). Por último, comprueba si los dos sketches usan el mismo pin: el compilador no lo detecta, pero tu circuito no funcionará como esperas.

'Sketch too big' y errores de memoria insuficiente

Al final de cada compilación correcta verás dos líneas. Si compilas para el Uno el ejemplo de ámbito de arriba, la línea Sketch uses 2212 bytes (6%) of program storage space. Maximum is 32256 bytes. te dice cuánta memoria flash ocupa el programa, y Global variables use 190 bytes (9%) of dynamic memory, cuánta RAM usan las variables globales. Si el programa no cabe en la flash, supera el 100 por ciento y aparecen el aviso Sketch too big y el error text section exceeds available space in board. Si las variables globales no caben en la RAM, verás en su lugar Not enough memory y data section exceeds available space in board. Cuando el uso de RAM supera el 75 por ciento, el IDE puede mostrar el aviso Low memory available, stability problems may occur.: el código compila, pero como durante la ejecución no queda sitio para las variables locales, la placa puede colgarse al azar o reiniciarse sola. En el Uno el bootloader ocupa 0,5 KB de los 32 KB de flash, por eso el límite es de 32256 bytes.

PlacaLímite de memoria de programaRAM (memoria dinámica)Nota
Arduino Uno R332256 bytes2048 bytes0,5 KB reservados para el bootloader
Arduino Nano (ATmega328P)30720 bytes2048 bytesEl IDE reserva 2 KB con las dos opciones de bootloader
Arduino Leonardo28672 bytes2560 bytesBootloader de 4 KB; el código USB también ocupa espacio
Arduino Mega 2560253952 bytes8192 bytesSalto sencillo para proyectos que no caben en el Uno
ESP32 (particiones por defecto)1310720 bytes327680 bytesCon Huge APP sube a 3145728 bytes
Raspberry Pi Pico (arduino-pico, 2MB no FS)2093056 bytes262144 bytesSi reservas espacio para un sistema de archivos, el área de programa se reduce
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}
  • Mete los textos fijos en F(): Serial.println(F("Sistema listo")); lee el texto directamente de la flash sin copiarlo a la RAM. Lo mismo vale para los textos fijos que muestras en pantallas LCD y OLED.
  • Pasa los arrays grandes a PROGMEM: Si las tablas de notas, los bitmaps de pantalla y los textos largos no cambian nunca, no tienen por qué estar en la RAM. Para técnicas más detalladas, consulta el artículo Arduino sin memoria suficiente.
  • Elige el tipo de dato adecuado: Para un valor entre 0 y 255 basta con byte (1 byte); en el Uno un int ocupa 2 bytes, y long y float, 4.
  • Reduce el uso de la clase String: Los objetos String que se concatenan sin parar fragmentan la RAM; los arrays de char de longitud fija son más predecibles.
  • Conoce las necesidades ocultas de las bibliotecas de pantalla: Adafruit SSD1306 reserva en tiempo de ejecución un búfer de 1 KB para una pantalla OLED de 128×64. Esa memoria no aparece en el informe de compilación, así que la pantalla puede no arrancar aunque el informe diga 70 por ciento.
  • Pásate a una placa más grande: Un proyecto que no consigues meter en el Uno funciona sin problemas en el Mega o en el ESP32. En el ESP32 puedes ampliar el área de programa de 1,25 MB a 3 MB eligiendo Huge APP (3MB No OTA/1MB SPIFFS) en Herramientas > Partition Scheme; con esta opción no se pueden hacer actualizaciones inalámbricas (OTA).

Errores por elegir la placa equivocada

El compilador siempre compila tu código para el procesador de la placa elegida en Herramientas > Placa (en el IDE 2, en el selector de placa de arriba). El mismo código puede compilar sin errores para el Mega y fallar con el Uno seleccionado, porque cada placa tiene su propio hardware, sus propios nombres de pines y las bibliotecas que trae su paquete. Cuando abras un proyecto encontrado en internet, comprueba primero para qué placa se escribió: un código para el ESP32 no compila con el Uno seleccionado, y un código para el Uno que accede directamente a los registros del procesador no compila con el ESP32 seleccionado. Si tu placa ni siquiera aparece en la lista, su paquete no está instalado; los paquetes del ESP32 y de la Raspberry Pi Pico se instalan desde el Gestor de placas. Tienes los pasos en la guía Cómo instalar el Arduino IDE.

Mensaje de error¿Qué ha pasado?Solución
'Serial1' was not declared in this scopeEl código es para el Mega o el Leonardo, pero está seleccionado el Uno; el Uno solo tiene un puerto serie por hardwareElige la placa correcta o usa SoftwareSerial en el Uno
SoftwareSerial.h: No such file or directoryEstá seleccionado el ESP32; su paquete no incluye esta bibliotecaUsa los puertos serie por hardware del ESP32 (Serial2)
'LED_BUILTIN' was not declared in this scopeAlgunas definiciones de placa, como ESP32 Dev Module, no definen la constante del LED integradoEscribe directamente el número de pin (GPIO 2 en muchas placas DevKit)
'D5' was not declared in this scopeNombres como D0–D8 existen en placas ESP8266 como NodeMCU y Wemos y en algunas otras, pero no en el Uno ni en el ESP32 Dev ModuleEn el Uno y el ESP32 escribe el número de GPIO o elige la placa correcta
'TCCR1A' was not declared in this scopeSe está compilando para el ESP32 un código que accede directamente a los registros de temporizador del AVRUsa las funciones LEDC y de temporizador del ESP32
WiFi.h: No such file or directory o 'WIFI_STA' was not declared in this scopeSe está compilando código del ESP32 para el Uno; el Uno no tiene wifiElige ESP32 Dev Module en Herramientas > Placa
'ledcSetup' was not declared in this scopeEl paquete del ESP32 es la versión 3.x y el código se escribió para la 2.xUsa ledcAttach() y ledcWrite() con el número de pin
Al empezar a compilar puede que veas una línea como 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). No es un error; solo dice que el autor de la biblioteca no añadió el ESP32 a la lista de placas compatibles, y muchas veces la biblioteca funciona igualmente. El mensaje al que sí debes prestar atención es Multiple libraries were found for "LiquidCrystal_I2C.h": si hay dos bibliotecas con el mismo nombre instaladas, el IDE elige una, y si esa elección no encaja con tu código obtendrás un error como 'class LiquidCrystal_I2C' has no member named 'init'. Las líneas Used y Not used debajo del mensaje indican qué carpeta se ha usado; borra de la carpeta libraries la copia que no utilizas.

Errores de compilación en el ESP32

Placa de desarrollo ESP32
ESP32: se programa con el mismo lenguaje en el Arduino IDE, pero se compila con otro compilador y otro paquete de placa, así que parte del código que funciona en el Uno falla aquí.

El ESP32 también se programa en el lenguaje de Arduino, pero como su compilador y su paquete de placa son distintos, un código que compila sin errores en el Uno puede atascarse en el ESP32. La causa más habitual es la versión del paquete: en la versión 3.x del paquete Arduino para ESP32 cambiaron las funciones PWM; ledcSetup() y ledcAttachPin() se eliminaron y las sustituyeron ledcAttach() y ledcWrite(), que trabajan con el número de pin en lugar de un número de canal. Por eso los ejemplos antiguos de internet dan 'ledcSetup' was not declared in this scope; o adaptas el código a las nuevas funciones o instalas la versión 2.0.17 desde el Gestor de placas. La segunda diferencia son los ajustes del compilador. El paquete del Uno compila con la opción -fpermissive, que convierte algunos errores en simples avisos; el ESP32 no la usa. Por ejemplo, declarar una variable dentro de un switch sin llaves compila en el Uno, pero en el ESP32 da el error jump to case label. Además, los paquetes actuales del ESP32 compilan con -Werror=return-type: si olvidas el return en una función que debe devolver un valor, obtendrás no return statement in function returning non-void siempre que las alertas de compilación no estén en Ninguno. En la versión 2.x, con las alertas de compilación en Más o Todo, la mayoría de los avisos se convierten en errores. Para la configuración básica de la placa, echa un vistazo al artículo Qué es el 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: errores en Arduino IDE y MicroPython

Si programas la Pico con el Arduino IDE, es decir, con el paquete arduino-pico de Earle Philhower, el compilador sigue siendo GCC y todos los mensajes de este artículo valen tal cual. En MicroPython la cosa cambia: no hay un paso de compilación previo; la Pico convierte el archivo en bytecode al arrancar y lo ejecuta línea a línea. Por eso los errores aparecen en el panel Shell de la parte inferior de Thonny, en un mensaje que empieza por Traceback (most recent call last):. Léelo de abajo arriba: la última línea indica el tipo de error y su descripción, y el line 7 de encima, la línea en la que está. Los errores de sintaxis (SyntaxError, IndentationError) se notifican antes de que el programa llegue a arrancar; los demás solo aparecen cuando el programa alcanza esa línea, así que tu código puede funcionar un rato y luego detenerse. Para instalar MicroPython y dar los primeros pasos, consulta el artículo Qué es la Raspberry Pi Pico.

Error de MicroPythonQué significaSolución
SyntaxError: invalid syntaxSintaxis rota: faltan los dos puntos al final de una línea if, while o def, o un paréntesis está sin cerrarAñade : al final de la línea y cuenta los paréntesis
IndentationError: unexpected indentSangría incoherente; espacios y tabuladores mezcladosUsa 4 espacios en cada bloque
NameError: name 'led' isn't definedNombre mal escrito o usado antes de definirloRevisa mayúsculas, minúsculas y dónde está la definición
ImportError: no module named 'ssd1306'El archivo del controlador no está en la PicoGuarda ssd1306.py en la Pico con Thonny
AttributeError: 'Pin' object has no attribute 'toggel'El objeto no tiene esa funciónCorrige el nombre de la función: toggle()
TypeError: can't convert 'int' object to str implicitlyTexto y número unidos con +Usa str(numero) o pasa los valores a print separados por comas
OSError: [Errno 5] EIOEl dispositivo I2C no respondeRevisa el cableado, la dirección y los pines SDA y 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)

Tabla de errores de compilación de Arduino y sus soluciones

Mensaje de errorCausaSolución
exit status 1 / Compilation error: exit status 1Falló un programa de la cadena de compilación o de cargaSube y lee la primera línea que contenga error:
'x' was not declared in this scopeErrata, mayúsculas y minúsculas, ámbito o falta un #includeCorrige el nombre, haz global la variable, incluye la biblioteca
expected ';' before ...Falta un punto y coma en la línea anteriorRevisa la línea de encima de la indicada (Uno) o el final de la indicada (ESP32)
expected '}' at end of inputLlave sin cerrarEmpareja las llaves con Auto Formato (Ctrl+T)
X.h: No such file or directoryBiblioteca sin instalar o nombre de archivo incorrectoInstálala desde el Gestor de Bibliotecas con sus dependencias
'X' does not name a typeFalta un #include, nombre de tipo incorrecto u orden fuera de una funciónIncluye la biblioteca, revisa cómo escribes String e int, mueve la orden a una función
redefinition of 'void setup()'Dos setup() o un archivo .ino de más en la carpetaCombina los sketches, saca el archivo viejo de la carpeta
stray '\342' in programComilla tipográfica o guion copiado, o letra con tilde en un nombre de variableVuelve a escribir las comillas, usa letras sin tilde en los nombres
'class X' has no member named 'y'Nombre de función incorrecto u otra versión de la bibliotecaMira los ejemplos de la propia biblioteca, instala la versión correcta
too few arguments to function / too many arguments to functionSe pasan a una función menos o más valores de los necesariosCompara con la definición de la línea note: declared here
lvalue required as left operand of assignmentAsignación en lugar de comparación: if (digitalRead(2) = HIGH)Usa == para comparar
jump to case labelVariable declarada en un case sin llaves (error en el ESP32)Encierra el bloque case entre { }
undefined reference to `parpadear()'La función solo tiene prototipo, no cuerpoEscribe la función o corrige su nombre
Sketch too big / text section exceeds available space in boardEl programa no cabe en la flashReduce el código, usa una placa mayor, Partition Scheme en el ESP32
data section exceeds available space in boardLas variables globales no caben en la RAMMacro F(), tipos de datos más pequeños, arrays en PROGMEM
#error This library only supports boards with ...La biblioteca no admite la arquitectura de la placa elegidaInstala una biblioteca adecuada para tu placa o cambia de placa
La forma de reducir al mínimo los errores de compilación es hacer crecer el código poco a poco: parte de un ejemplo que funcione, pulsa Verificar después de añadir cada parte nueva y, cuando aparezca un error, mira solo las últimas líneas que has añadido. Ojo también con los fallos que el compilador no detecta: if (estado = HIGH) escrito con una variable compila sin errores, pero como asigna en lugar de comparar, la condición siempre es verdadera; y el punto y coma al final de if (distancia < 10); deja la condición sin efecto. Si pones las alertas de compilación en Todo, verás la mayoría de estos errores de lógica como avisos.

Próximos pasos para escribir código sin errores

  • Afianza lo básico: El artículo Fundamentos de programación de Arduino explica variables, ámbito, funciones y bucles; la mayoría de los errores de este artículo nacen de esos temas.
  • Aprende a escribir bien los comandos: La lista de comandos de Arduino muestra con ejemplos la sintaxis y los parámetros de cada comando.
  • Instala bien las bibliotecas: La guía Cómo instalar una librería en Arduino trata a fondo los mensajes No such file or directory y Multiple libraries were found.
  • Mira qué hace tu código mientras se ejecuta: Con un código que compila pero no se comporta como esperas, mostrar las variables en el Monitor Serie es la forma más rápida de diagnosticarlo.
  • Pruébalo sin placa: En los simuladores Wokwi o Tinkercad puedes compilar tu código y ejecutarlo junto con el circuito.
  • Revisa el código escrito por IA: El código que generan los chatbots suele estar pensado para versiones antiguas de las bibliotecas o para otra placa; el artículo Código de Arduino con IA explica cómo detectar estos fallos.

Los errores de compilación pueden asustar al principio, pero en realidad el compilador te dice dónde está el problema y muchas veces cómo resolverlo: archivo, línea, columna y una breve descripción. Lee el primer error, corrige solo ese, vuelve a compilar y repite el ciclo; tras unos cuantos proyectos verás que los resuelves en segundos. Cuando tu código compile y esté en la placa, puedes seguir con los proyectos de LED, pulsadores, sensores y pantallas de la app BlueGrays: para Arduino, ESP32 y Raspberry Pi Pico, cada proyecto trae su esquema de circuito y un código que compila sin errores, paso a paso.

Preguntas frecuentes

¿Qué significa exit status 1 en Arduino?

exit status 1 es un mensaje genérico que indica que uno de los programas que se ejecutan al compilar o al subir terminó con un error; por sí mismo no dice la causa. Sube en el panel de salida y busca la primera línea con error:, ahí están el nombre del archivo, el número de línea y la descripción. Cuando corrijas ese error y vuelvas a compilar, exit status 1 también desaparecerá.

¿Cómo soluciono 'was not declared in this scope' en Arduino?

Significa que el compilador no reconoce en ese punto una variable, función o constante que has usado. Las causas más comunes son un fallo de mayúsculas (digitalwrite), una variable declarada dentro de otra función y una biblioteca sin incluir. Normalmente basta con revisar cómo está escrito y declarar las variables compartidas fuera de todas las funciones.

¿Qué significa "expected ';' before" en Arduino?

Este error indica que falta un punto y coma. Como el compilador del Uno solo se da cuenta al leer la palabra siguiente, la línea de su mensaje suele ser la de debajo; en ese caso, añade el punto y coma al final de la línea justo encima. En el ESP32 y la Pico, el mensaje señala directamente la línea a la que le falta. Usar comas en lugar de punto y coma dentro del paréntesis de un for produce el mismo mensaje.

¿Por qué aparece 'does not name a type' en Arduino?

El compilador espera un tipo de dato al principio de la línea, pero no reconoce la palabra que has escrito. Olvidar la línea #include de la biblioteca (por ejemplo, de Servo), escribir string en lugar de String y poner una asignación suelta como angulo = 90; fuera de una función son las tres causas más habituales. Si usas un tipo struct propio en Arduino, defínelo antes de la primera función.

¿Cómo soluciono 'Sketch too big' en Arduino?

Este mensaje indica que el programa no cabe en la memoria flash de la placa; en el Uno el límite es de 32256 bytes. Quita las bibliotecas y las líneas de depuración que no uses, pasa los arrays constantes grandes a PROGMEM o cámbiate a una placa con más memoria, como el Mega o el ESP32. En el ESP32, elegir Huge APP en el menú Partition Scheme amplía el área de programa a unos 3 MB.

¿Por qué mi código compila pero no se sube al Arduino?

Si la compilación termina bien, verás la línea Sketch uses con los bytes que ocupa el programa; los errores posteriores pertenecen a la fase de carga y tienen que ver con el cable, el driver, el puerto o la placa elegida, no con el código. Las líneas que empiezan por avrdude apuntan a un problema de carga en el Uno y el Nano, y las de esptool, en el ESP32. En ese caso, sigue en orden los pasos de la guía sobre errores al subir código.

Ver todos los proyectos
Parpadeo de LED
#1Principiante

Parpadeo de LED

El primer hola de la electrónica: encender y apagar un solo LED. El Arduino enciende y apaga el LED a intervalos cortos, así que la luz parpadea rápido. Ves de la forma más sencilla cómo la placa cont

4.6(179)
977
Encender un LED con pulsador (Push)
#9Principiante

Encender un LED con pulsador (Push)

Como un timbre: la luz se enciende mientras pulsas y se apaga cuando sueltas. El Arduino escucha el botón todo el rato; mientras está pulsado enciende el LED, y en cuanto levantas el dedo lo apaga. Co

4.9(112)
198
HC-SR04 Medición de distancia (pantalla en serie)
#27Principiante

HC-SR04 Medición de distancia (pantalla en serie)

El sensor HC-SR04 funciona igual que un murciélago que se orienta en la oscuridad: emite un sonido que no puedes oír, escucha el eco y mide a qué distancia está el objeto que tiene delante. El Arduino

4.6(45)
68
Temperatura y humedad con DHT11
#55Intermedio

Temperatura y humedad con DHT11

¿Qué temperatura hace en tu habitación, y el aire está húmedo o seco? El sensor DHT11 mide la temperatura y la humedad, y el Arduino escribe los valores en una pantalla LCD de dos líneas, actualizándo

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

LED Parpadeante con ESP32

Enseña el uso básico de la salida GPIO con ESP32. Conseguimos un efecto de parpadeo encendiendo y apagando un LED desde el pin digital. Versión para ESP32 del clásico proyecto blink en Arduino UNO; los comandos básicos de blink en el entorno Arduino son los mismos, pero la distribución de pines y los niveles GPIO de 3,3 V del ESP32 difieren de los del Arduino UNO.

4.7(36)
96
Parpadeo LED Integrado Raspberry Pi Pico (GP25 LED Onboard)
#147Principiante

Parpadeo LED Integrado Raspberry Pi Pico (GP25 LED Onboard)

¡El proyecto de apertura de la serie Raspberry Pi Pico! Hacemos parpadear el LED integrado (LED verde conectado a GP25) para verificar que la placa funciona — un experimento clásico "Hello World". SIN componentes externos, solo Pico y cable USB. El código está escrito en **MicroPython** (el lenguaje oficialmente respaldado por la Raspberry Pi Foundation). Aprende la clase `machine.Pin`, el modo `Pin.OUT`, los métodos `led.on()/off()` y `time.sleep()` en Thonny IDE. Sigue cada cambio en vivo en l

5.0(1)
9
Uso de la pantalla LCD con I2C
#32Principiante
Premium

Uso de la pantalla LCD con I2C

Dale a tu Arduino su propia pantalla y haz que escriba su primer mensaje. La pantalla LCD de dos líneas se conecta con solo unos pocos cables; primero aparece un saludo en la línea de arriba, luego un

4.8(53)
70
Uso del servomotor
#35Principiante
Premium

Uso del servomotor

El brazo de un pequeño servomotor gira por turnos a tres posiciones: al principio del todo, justo al centro y al final del todo, esperando dos segundos en cada parada. El Arduino le dice al motor en q

4.7(48)
67