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.

¿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 salida | Fase | Qué significa |
|---|---|---|
| error: ... y al final exit status 1 | Compilación | Hay 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 directory | Compilació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 status | Enlazado (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 board | Control de tamaño | El programa no cabe en la memoria flash de la placa |
| Not enough memory y data section exceeds available space in board | Control de tamaño | Las variables globales no caben en la RAM |
| Failed uploading: uploading error: exit status 1 | Carga | El 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'.
| Parte | Valor en el ejemplo | Significado |
|---|---|---|
| Archivo | Blink.ino | El archivo con el error; si tienes varias pestañas, aquí ves cuál es |
| Línea | 6 | La línea donde el compilador detectó el error; a veces el fallo real está en la línea anterior |
| Columna | 3 | El número de carácter dentro de la línea; donde apunta el ^ |
| Tipo | error | error detiene, warning avisa, note informa |
| Mensaje | 'digitalwrite' was not declared in this scope | La parte que describe el problema; es el texto que debes buscar en internet |
| Sugerencia | note: suggested alternative: 'digitalWrite' | La suposición del compilador; muchas veces muestra la escritura correcta |
- 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.
- 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.
- 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.
- 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.
- Corrige solo ese primer error y vuelve a pulsar Verificar. Si el número de errores baja de golpe, vas por buen camino.
- 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.
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).
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}| Causa | Incorrecto | Correcto |
|---|---|---|
| Mayúsculas y minúsculas | digitalwrite(13, HIGH); | digitalWrite(13, HIGH); |
| Constante mal escrita | pinMode(13, OUPUT); | pinMode(13, OUTPUT); |
| Variable declarada en otra función | Declarar 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 usarla | int contador = 0; aparece después de la línea contador++; | Coloca la declaración antes del lugar donde se usa |
| Biblioteca no incluida | Wire.begin(); sin línea #include | Añade #include <Wire.h> al principio del archivo |
| Función que la placa no tiene | Serial1.begin(9600); con el Uno seleccionado | Elige una placa con varios puertos serie, como el Mega, o usa SoftwareSerial |
| Orden en un archivo .cpp adicional | Una función llamada antes de su definición en una pestaña .cpp | En 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.
| Mensaje | Causa más probable | Dónde mirar |
|---|---|---|
| expected ';' before 'delay' | Falta el punto y coma al final de la línea anterior | En el Uno, la línea de encima de la indicada; en el ESP32, el final de la indicada |
| expected ';' before '}' token | Falta el punto y coma en la última línea del bloque | La línea justo antes de la llave de cierre |
| expected ';' before '<' token | Comas en lugar de punto y coma en un for | Escríbelo como for (int i = 0; i < 10; i++) |
| expected '}' at end of input | Una llave no se ha cerrado | Revisa la sangría con Auto Formato; cada { necesita su } |
| a function-definition is not allowed here before '{' token | Falta la llave de cierre de la función anterior | El final de la función anterior a la indicada |
| expected ')' before ';' token | Un paréntesis abierto no se ha cerrado | Cuenta los paréntesis en las condiciones if y en las llamadas a funciones |
| expected primary-expression before ')' token | Falta un valor dentro del paréntesis | Un argumento vacío como digitalWrite(13, ) |
| expected constructor, destructor, or type conversion before '(' token | Una orden escrita fuera de cualquier función | Mueve órdenes como pinMode() dentro de setup() |
| expected unqualified-id before '{' token | Punto y coma después de la cabecera de una función | Escribe void loop() { en lugar de void loop(); { |
'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 mensaje | Busca en el Gestor de Bibliotecas | Nota |
|---|---|---|
| DHT.h | DHT sensor library (Adafruit) | Elige Instalar todo; se instala también Adafruit Unified Sensor |
| Adafruit_Sensor.h | Adafruit Unified Sensor | Dependencia que falta de otra biblioteca de Adafruit |
| LiquidCrystal_I2C.h | LiquidCrystal I2C (Frank de Brabander) | No instales varias bibliotecas con el mismo nombre; mira el aviso de más abajo |
| Adafruit_SSD1306.h | Adafruit SSD1306 | Se instala junto con Adafruit GFX y Adafruit BusIO |
| MFRC522.h | MFRC522 (GithubCommunity) | Para el módulo RFID RC522 |
| IRremote.h | IRremote | Las 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 incluye | Usa 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.
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.
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.
| Placa | Límite de memoria de programa | RAM (memoria dinámica) | Nota |
|---|---|---|---|
| Arduino Uno R3 | 32256 bytes | 2048 bytes | 0,5 KB reservados para el bootloader |
| Arduino Nano (ATmega328P) | 30720 bytes | 2048 bytes | El IDE reserva 2 KB con las dos opciones de bootloader |
| Arduino Leonardo | 28672 bytes | 2560 bytes | Bootloader de 4 KB; el código USB también ocupa espacio |
| Arduino Mega 2560 | 253952 bytes | 8192 bytes | Salto sencillo para proyectos que no caben en el Uno |
| ESP32 (particiones por defecto) | 1310720 bytes | 327680 bytes | Con Huge APP sube a 3145728 bytes |
| Raspberry Pi Pico (arduino-pico, 2MB no FS) | 2093056 bytes | 262144 bytes | Si reservas espacio para un sistema de archivos, el área de programa se reduce |
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}- 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 scope | El código es para el Mega o el Leonardo, pero está seleccionado el Uno; el Uno solo tiene un puerto serie por hardware | Elige la placa correcta o usa SoftwareSerial en el Uno |
| SoftwareSerial.h: No such file or directory | Está seleccionado el ESP32; su paquete no incluye esta biblioteca | Usa los puertos serie por hardware del ESP32 (Serial2) |
| 'LED_BUILTIN' was not declared in this scope | Algunas definiciones de placa, como ESP32 Dev Module, no definen la constante del LED integrado | Escribe directamente el número de pin (GPIO 2 en muchas placas DevKit) |
| 'D5' was not declared in this scope | Nombres 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 Module | En el Uno y el ESP32 escribe el número de GPIO o elige la placa correcta |
| 'TCCR1A' was not declared in this scope | Se está compilando para el ESP32 un código que accede directamente a los registros de temporizador del AVR | Usa las funciones LEDC y de temporizador del ESP32 |
| WiFi.h: No such file or directory o 'WIFI_STA' was not declared in this scope | Se está compilando código del ESP32 para el Uno; el Uno no tiene wifi | Elige ESP32 Dev Module en Herramientas > Placa |
| 'ledcSetup' was not declared in this scope | El paquete del ESP32 es la versión 3.x y el código se escribió para la 2.x | Usa ledcAttach() y ledcWrite() con el número de pin |
Errores de compilación en el ESP32

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.
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 MicroPython | Qué significa | Solución |
|---|---|---|
| SyntaxError: invalid syntax | Sintaxis rota: faltan los dos puntos al final de una línea if, while o def, o un paréntesis está sin cerrar | Añade : al final de la línea y cuenta los paréntesis |
| IndentationError: unexpected indent | Sangría incoherente; espacios y tabuladores mezclados | Usa 4 espacios en cada bloque |
| NameError: name 'led' isn't defined | Nombre mal escrito o usado antes de definirlo | Revisa mayúsculas, minúsculas y dónde está la definición |
| ImportError: no module named 'ssd1306' | El archivo del controlador no está en la Pico | Guarda ssd1306.py en la Pico con Thonny |
| AttributeError: 'Pin' object has no attribute 'toggel' | El objeto no tiene esa función | Corrige el nombre de la función: toggle() |
| TypeError: can't convert 'int' object to str implicitly | Texto y número unidos con + | Usa str(numero) o pasa los valores a print separados por comas |
| OSError: [Errno 5] EIO | El dispositivo I2C no responde | Revisa el cableado, la dirección y los pines SDA y 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)Tabla de errores de compilación de Arduino y sus soluciones
| Mensaje de error | Causa | Solución |
|---|---|---|
| exit status 1 / Compilation error: exit status 1 | Falló un programa de la cadena de compilación o de carga | Sube y lee la primera línea que contenga error: |
| 'x' was not declared in this scope | Errata, mayúsculas y minúsculas, ámbito o falta un #include | Corrige el nombre, haz global la variable, incluye la biblioteca |
| expected ';' before ... | Falta un punto y coma en la línea anterior | Revisa la línea de encima de la indicada (Uno) o el final de la indicada (ESP32) |
| expected '}' at end of input | Llave sin cerrar | Empareja las llaves con Auto Formato (Ctrl+T) |
| X.h: No such file or directory | Biblioteca sin instalar o nombre de archivo incorrecto | Instálala desde el Gestor de Bibliotecas con sus dependencias |
| 'X' does not name a type | Falta un #include, nombre de tipo incorrecto u orden fuera de una función | Incluye 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 carpeta | Combina los sketches, saca el archivo viejo de la carpeta |
| stray '\342' in program | Comilla tipográfica o guion copiado, o letra con tilde en un nombre de variable | Vuelve 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 biblioteca | Mira los ejemplos de la propia biblioteca, instala la versión correcta |
| too few arguments to function / too many arguments to function | Se pasan a una función menos o más valores de los necesarios | Compara con la definición de la línea note: declared here |
| lvalue required as left operand of assignment | Asignación en lugar de comparación: if (digitalRead(2) = HIGH) | Usa == para comparar |
| jump to case label | Variable 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 cuerpo | Escribe la función o corrige su nombre |
| Sketch too big / text section exceeds available space in board | El programa no cabe en la flash | Reduce el código, usa una placa mayor, Partition Scheme en el ESP32 |
| data section exceeds available space in board | Las variables globales no caben en la RAM | Macro 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 elegida | Instala una biblioteca adecuada para tu placa o cambia de placa |
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.
Proyectos para hacer después de leer esto
Ver todos los proyectos
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

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

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

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

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.

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

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

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
Más artículos
App BlueGrays
Monta este circuito paso a paso en tu teléfono
Esquema, código y lista de piezas en una sola pantalla. Más de 160 proyectos de Arduino, ESP32 y Pico listos para montar.
Escanea con tu teléfono
Apunta la cámara al código y se abrirá la tienda de apps de tu teléfono.
o ábrela en la tienda

