Erro exit status 1 no Arduino: como corrigir erros de compilação
O que significa exit status 1 no Arduino? Corrija rápido os erros was not declared in this scope, expected ';', No such file, does not name a type e Sketch too big.
O erro exit status 1 do Arduino é uma mensagem genérica que diz que o seu código não pôde ser compilado, ou seja, o compilador não conseguiu transformar o programa em código de máquina que o processador entende; a causa real nunca está nessa linha. A causa está na primeira linha que contém a palavra error:, algumas linhas acima no painel de saída: você digitou um nome errado, esqueceu um ponto e vírgula, uma biblioteca não está instalada ou o código foi escrito para outra placa. A notificação Compilation error: exit status 1 (Erro de compilação) no canto inferior direito do Arduino IDE 2 e a linha Error compiling for board Arduino Uno. na antiga versão 1.8 significam exatamente a mesma coisa.
Neste guia você vai ver primeiro como a compilação funciona nos bastidores e como ler uma mensagem de erro separando-a em arquivo, linha e coluna. Depois vamos passar um por um pelos erros de compilação mais comuns: was not declared in this scope, expected ';' before, No such file or directory, does not name a type, redefinition of e Sketch too big. Para cada um, você encontra a situação que o causa, a mensagem real que o compilador mostra e um exemplo corrigido que compila sem erros. Também incluímos os erros causados pela escolha da placa errada, problemas específicos do ESP32 e do Raspberry Pi Pico e, no fim, uma tabela de erros e soluções que junta tudo. Se o seu código compila bem, mas não vai para a placa, o problema está em outra etapa; para isso, veja o guia Arduino não carrega o código.

O que é exit status 1 no Arduino? Compilar vs carregar
Quando você aperta Verificar (o visto) ou Carregar, o Arduino IDE roda vários programas nos bastidores. Primeiro ele junta os arquivos .ino da pasta do sketch e os transforma em um arquivo C++ comum, acrescentando no topo o cabeçalho Arduino.h e os protótipos das suas funções. Depois, um compilador como o avr-g++ no Uno ou o xtensa-esp32-elf-g++ no ESP32 compila esse arquivo e as bibliotecas que você usa, o linker junta todas as partes em um só programa e, por fim, o IDE verifica se o programa cabe na placa. Todo programa retorna um código de saída quando termina: 0 significa sucesso e 1 significa falha. “exit status 1” diz exatamente isso: um dos programas da cadeia falhou. É por isso que a mesma frase também aparece quando o avrdude falha durante um carregamento; a mensagem antes dela diz qual dos dois é.
| O que você vê na saída | Etapa | O que significa |
|---|---|---|
| error: ... e exit status 1 no fim | Compilação | Há um erro de C++ no seu código ou em uma biblioteca; a causa real está na linha error: |
| fatal error: DHT.h: No such file or directory (arquivo não encontrado) | Compilação (pré-processamento) | O arquivo pedido com #include não foi encontrado; a biblioteca está faltando ou o nome está errado |
| undefined reference to ... e collect2: error: ld returned 1 exit status | Linkagem | Uma função está declarada, mas o corpo dela não existe em lugar nenhum |
| multiple definition of ... (definição múltipla) | Linkagem | A mesma variável ou função está definida em dois arquivos separados |
| Sketch too big e text section exceeds available space in board | Verificação de tamanho | O programa não cabe na memória flash da placa |
| Not enough memory e data section exceeds available space in board | Verificação de tamanho | As variáveis globais não cabem na RAM |
| Failed uploading: uploading error: exit status 1 (falha no carregamento) | Carregamento | O código compilou, mas não pôde ser gravado na placa; veja as linhas do avrdude ou do esptool |
Como ler uma mensagem de erro do Arduino
Toda linha de erro do compilador segue o mesmo padrão: primeiro o nome do arquivo, depois os números da linha e da coluna separados por dois-pontos, seguidos do tipo de erro e da descrição. Logo acima costuma haver uma linha como In function 'void loop()':, que diz em qual função está o erro; abaixo, há uma cópia da linha com problema e um pequeno marcador ^ apontando para o problema. error é um erro de verdade que interrompe a compilação, warning é só um aviso e o código continua compilando, e note acrescenta informações à mensagem anterior. O compilador muitas vezes também dá uma sugestão: no exemplo abaixo, ele mesmo mostra a grafia correta com suggested alternative: 'digitalWrite'.
| Parte | Valor no exemplo | Significado |
|---|---|---|
| Arquivo | Blink.ino | O arquivo que contém o erro; se você tem várias abas, isso diz qual delas |
| Linha | 6 | A linha em que o compilador percebeu o erro; às vezes o erro real está na linha de cima |
| Coluna | 3 | Qual caractere da linha é; para onde aponta o marcador ^ |
| Tipo | error | error interrompe a compilação, warning avisa, note acrescenta informação |
| Mensagem | 'digitalwrite' was not declared in this scope (não declarado neste escopo) | A parte que descreve o problema; é esse o texto para buscar na internet |
| Sugestão | note: suggested alternative: 'digitalWrite' (alternativa sugerida) | O palpite do compilador; muitas vezes mostra a grafia correta |
- Em Arquivo > Preferências, marque compilação ao lado de Mostrar saída detalhada durante. Assim você também vê quais arquivos e quais pastas de bibliotecas o compilador usou.
- A placa não precisa estar conectada: aperte o botão Verificar (o visto). Verificar só compila; se o erro está na etapa de compilação, apertar Carregar só faz perder tempo.
- Role o painel de saída até o topo e encontre a primeira linha que contém error:. A maioria dos erros depois dela é efeito em cascata desse primeiro.
- Vá até o número da linha da mensagem. O IDE 2 sublinha em vermelho o caractere com erro, enquanto a versão 1.8 pinta a linha inteira de vermelho. Se você não vê problema nessa linha, olhe a linha de cima.
- Corrija só esse primeiro erro e aperte Verificar de novo. Se o número de erros cair de repente, você está no caminho certo.
- Se for buscar na internet, tire da mensagem os nomes das suas variáveis e os caminhos de arquivos: buscar was not declared in this scope em vez de 'counter' was not declared in this scope traz muito mais resultados. Já quando for pedir ajuda em um fórum, copie a saída inteira.
O erro 'was not declared in this scope' e como corrigi-lo
Essa mensagem significa que o compilador não reconhece, naquele ponto, um nome que você usou. A causa mais comum é um erro de digitação: o Arduino diferencia maiúsculas de minúsculas, então digitalwrite, Digitalwrite e digitalWrite são três nomes diferentes. A segunda grande causa é o escopo: se você declara uma variável dentro do setup(), ela só existe enquanto o setup() roda e o loop() não a enxerga. Se você vai usar uma variável em mais de uma função, declare-a fora de todas as funções, no topo do arquivo. Declarar uma variável depois da linha em que você a usa dá o mesmo erro, porque o compilador lê o arquivo de cima para baixo. Por fim, esse erro também aparece quando você usa um objeto cuja biblioteca não incluiu (Wire, Servo) ou um recurso que a placa selecionada não tem (Serial1 no 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 | Errado | Certo |
|---|---|---|
| Maiúsculas e minúsculas | digitalwrite(13, HIGH); | digitalWrite(13, HIGH); |
| Constante escrita errado | pinMode(13, OUPUT); | pinMode(13, OUTPUT); |
| Variável declarada em outra função | Declarar int led = 13; dentro do setup() e usar led dentro do loop() | Leve a linha int led = 13; para fora de todas as funções, no topo |
| Variável declarada depois de ser usada | int counter = 0; vindo depois da linha counter++; | Suba a declaração para antes do lugar onde ela é usada |
| Biblioteca não incluída | Wire.begin(); sem uma linha #include | Acrescente #include <Wire.h> no topo do arquivo |
| Recurso que a placa não tem | Serial1.begin(9600); com o Uno selecionado | Selecione uma placa com várias portas seriais, como o Mega, ou use SoftwareSerial |
| Ordem em um arquivo .cpp extra | Uma função chamada antes da sua definição em uma aba .cpp | Escreva o protótipo (void blink();) no topo dos arquivos .cpp; nos arquivos .ino o IDE faz isso por você |
'expected ';' before' e outros erros de sintaxe
Em C++, todo comando termina com ponto e vírgula. Quando você esquece o ponto e vírgula no fim de uma linha, o compilador só percebe quando lê a próxima palavra. Por isso, com o compilador do Uno, o número da linha em expected ';' before 'delay' aponta para a linha abaixo do erro: o ponto e vírgula que falta está no fim da linha antes do delay. Os compiladores mais novos dos cores do ESP32 e do Pico apontam direto para o fim da linha em que falta o ponto e vírgula. Se você o esquecer na última linha de uma função, a mensagem vira expected ';' before '}' token. Os erros de chaves e parênteses se comportam de forma parecida. Se você esquecer de fechar a chave de um bloco if ou de uma função, o compilador lê até o fim do arquivo e só então diz expected '}' at end of input. Se a chave não fechada estiver dentro do setup(), você também recebe a function-definition is not allowed here before '{' token, porque, para o compilador, o loop() agora é uma função que você está tentando definir dentro do setup(). Usar vírgulas em vez de pontos e vírgulas dentro dos parênteses de um laço for é outro clássico dessa família.
| Mensagem | Causa mais provável | Onde olhar |
|---|---|---|
| expected ';' before 'delay' (falta ponto e vírgula) | Falta ponto e vírgula no fim da linha anterior | No Uno, a linha acima da indicada na mensagem; no ESP32, o fim da linha indicada |
| expected ';' before '}' token (falta ponto e vírgula) | Falta ponto e vírgula na última linha do bloco | A linha logo antes da chave de fechamento |
| expected ';' before '<' token (falta ponto e vírgula) | Vírgulas em vez de pontos e vírgulas em um for | Escreva assim: for (int i = 0; i < 10; i++) |
| expected '}' at end of input (falta fechar uma chave) | Uma chave nunca foi fechada | Confira a indentação com a Autoformatação; cada { precisa de um } |
| a function-definition is not allowed here before '{' token (definição de função fora do lugar) | Falta a chave de fechamento da função anterior | O fim da função antes da indicada na mensagem |
| expected ')' before ';' token (falta fechar parêntese) | Um parêntese aberto nunca foi fechado | Conte os parênteses em condições if e chamadas de função |
| expected primary-expression before ')' token (falta um valor) | Falta um valor dentro dos parênteses | Um argumento vazio, como digitalWrite(13, ) |
| expected constructor, destructor, or type conversion before '(' token (comando fora de função) | Um comando foi escrito fora de qualquer função | Leve comandos como pinMode() para dentro do setup() |
| expected unqualified-id before '{' token (ponto e vírgula a mais) | Um ponto e vírgula depois do cabeçalho de uma função | Escreva void loop() { em vez de void loop(); { |
'No such file or directory': biblioteca não encontrada
As linhas fatal error: DHT.h: No such file or directory e o compilation terminated. que vem em seguida dizem que o arquivo pedido por uma linha #include do seu código não foi encontrado no computador. A palavra “fatal” significa que a compilação parou por completo nesse ponto, então você não vai ver os erros do resto do código até corrigir este. A causa é quase sempre uma biblioteca não instalada. Quando abrir um projeto da internet, leia uma por uma as linhas #include do topo e instale a biblioteca de cada uma em Ferramentas > Gerenciar Bibliotecas. Se você não escolher Instalar tudo na janela que pergunta sobre as dependências, a biblioteca principal é instalada, mas a segunda biblioteca de que ela precisa continua faltando; nesse caso, o nome do arquivo na mensagem não é um que você escreveu, e sim um arquivo chamado de dentro da biblioteca (por exemplo, Adafruit_Sensor.h). Maiúsculas e minúsculas no nome do arquivo também importam: no Linux, dht.h e DHT.h são arquivos diferentes. Para os três jeitos de instalar uma biblioteca e os problemas com ZIP, veja o guia Como instalar uma biblioteca no Arduino.
| Arquivo na mensagem | Busque no Gerenciador de Bibliotecas | Observação |
|---|---|---|
| DHT.h | DHT sensor library (Adafruit) | Escolha Instalar tudo; a Adafruit Unified Sensor vem junto |
| Adafruit_Sensor.h | Adafruit Unified Sensor | A dependência que falta de outra biblioteca da Adafruit |
| LiquidCrystal_I2C.h | LiquidCrystal I2C (Frank de Brabander) | Não instale várias bibliotecas com o mesmo nome; veja o aviso abaixo |
| Adafruit_SSD1306.h | Adafruit SSD1306 | Instalada junto com a Adafruit GFX e a Adafruit BusIO |
| MFRC522.h | MFRC522 (GithubCommunity) | Para o módulo RFID RC522 |
| IRremote.h | IRremote | As versões novas usam IrReceiver.begin(); exemplos antigos podem dar avisos ou erros |
| SoftwareSerial.h (com o ESP32 selecionado) | Não instale; o core do ESP32 não a inclui | Use a porta serial de hardware Serial2 do ESP32 ou instale a biblioteca EspSoftwareSerial |
O erro 'does not name a type'
does not name a type significa que o compilador esperava um tipo de dado (como int, float, Servo ou LiquidCrystal_I2C) no início de uma linha, mas não reconheceu a palavra que você escreveu. Há três causas comuns. A primeira é esquecer a linha #include da biblioteca: se Servo lid; for compilado sem o Servo.h, você recebe 'Servo' does not name a type. A segunda é escrever o tipo errado: o certo é String, não string, e int, não Int, e o compilador muitas vezes ajuda com did you mean 'String'?. A terceira, e a mais surpreendente, é escrever um comando fora de uma função. Fora das funções você só pode declarar coisas: int angle = 0; é válido, mas se você escrever angle = 90; sozinho em uma linha mais abaixo, o compilador toma angle por um nome de tipo e informa 'angle' does not name a type. Há mais uma armadilha específica do Arduino: o IDE acrescenta automaticamente os protótipos das suas funções logo antes da primeira função. Se você escreveu uma função que retorna um tipo struct seu e declarou a struct abaixo do setup(), o protótipo fica antes da struct e você recebe o mesmo erro. A solução é levar as definições de struct para o topo do arquivo, antes da primeira função.
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}O erro 'redefinition of': definir a mesma coisa duas vezes
O erro redefinition of 'void setup()' diz que há duas definições com o mesmo nome; a linha note: 'void setup()' previously defined here, logo abaixo, mostra onde está a primeira. Para iniciantes, a causa mais comum é colar dois sketches de exemplo um depois do outro em um só arquivo: você acaba com duas funções setup() e duas loop(). A segunda causa são as abas. Antes de compilar, o Arduino IDE junta em um só todos os arquivos .ino da pasta do sketch. Um backup antigo que você copiou para a pasta (por exemplo, project_old.ino) ou uma segunda aba com seus próprios setup() e loop() causa esse erro mesmo que você nunca abra essa aba; a solução é tirar esse arquivo da pasta. Declarar a mesma variável duas vezes gera uma mensagem parecida: redefinition of 'int led'. O irmão desse erro no linker é o multiple definition of; ele aparece quando uma variável que recebe um valor em um arquivo de cabeçalho (.h) é incluída em dois arquivos .cpp separados. O oposto dele, undefined reference to, aponta para uma função cujo protótipo você escreveu, mas cujo corpo nunca escreveu, ou cujo nome você escreveu diferente.
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}Siga esta ordem ao juntar: primeiro reúna no topo as linhas #include dos dois sketches, sem repetir, depois acrescente as variáveis globais e as constantes; se o mesmo nome existir nos dois, renomeie um deles. Em seguida, coloque o conteúdo dos dois setup() em um único setup() e o conteúdo dos dois loop() em um único loop(). Se um dos sketches usa um delay() longo, ele segura o outro; dá para resolver isso com a técnica de temporização millis() em vez de delay(). Por fim, confira se os dois sketches usam o mesmo pino: o compilador não vai perceber, mas o seu circuito não vai funcionar como esperado.
Erros 'Sketch too big' e de memória insuficiente
No fim de toda compilação bem-sucedida você vê duas linhas. Quando você compila o exemplo de escopo acima para o Uno, a linha O sketch usa 2212 bytes (6%) de espaço de armazenamento para programas. O máximo são 32256 bytes. (em inglês, Sketch uses ... of program storage space) diz quanto de memória flash o programa ocupa, e Variáveis globais usam 190 bytes (9%) de memória dinâmica diz quanto da RAM as variáveis globais usam. Se o programa não couber na flash, passa de 100 por cento, seguido do aviso Sketch too big e do erro text section exceeds available space in board. Se as variáveis globais não couberem na RAM, você vê Not enough memory e data section exceeds available space in board. Quando o uso de RAM passa de 75 por cento, o IDE pode mostrar o aviso Low memory available, stability problems may occur.: o código compila, mas, como não sobra espaço para as variáveis locais durante a execução, a placa pode travar aleatoriamente ou reiniciar sozinha. No Uno, o bootloader usa 0,5 KB dos 32 KB de flash, e é por isso que o limite é de 32256 bytes.
| Placa | Limite de memória de programa | RAM (memória dinâmica) | Observação |
|---|---|---|---|
| Arduino Uno R3 | 32256 bytes | 2048 bytes | 0,5 KB é reservado para o bootloader |
| Arduino Nano (ATmega328P) | 30720 bytes | 2048 bytes | O IDE reserva 2 KB nas duas opções de bootloader |
| Arduino Leonardo | 28672 bytes | 2560 bytes | Bootloader de 4 KB; o código USB também ocupa espaço |
| Arduino Mega 2560 | 253952 bytes | 8192 bytes | Um passo fácil para projetos que não cabem no Uno |
| ESP32 (esquema de partição padrão) | 1310720 bytes | 327680 bytes | Sobe para 3145728 bytes com Huge APP |
| Raspberry Pi Pico (arduino-pico, 2MB no FS) | 2093056 bytes | 262144 bytes | Reservar espaço para um sistema de arquivos encolhe a área de programa |
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}- Coloque textos fixos dentro de F(): Serial.println(F("System ready")); lê o texto direto da flash, sem copiá-lo para a RAM. O mesmo vale para textos fixos que você mostra em displays LCD e OLED.
- Leve arrays grandes para a PROGMEM: se tabelas de notas, bitmaps de display e textos longos nunca mudam, eles não precisam ficar na RAM. Para técnicas mais detalhadas, veja o artigo memória insuficiente no Arduino.
- Escolha o tipo de dado certo: para um valor entre 0 e 255, byte (1 byte) basta; no Uno, um int ocupa 2 bytes, enquanto long e float ocupam 4.
- Use menos a classe String: objetos String que vivem sendo concatenados fragmentam a RAM; arrays de char de tamanho fixo são mais previsíveis.
- Conheça as necessidades ocultas das bibliotecas de display: a Adafruit SSD1306 aloca, durante a execução, um buffer de 1 KB para um display OLED de 0,96 polegada de 128×64. Essa memória não aparece no relatório de compilação, então o display pode não iniciar mesmo quando o relatório diz 70 por cento.
- Passe para uma placa maior: um projeto que não cabe no Uno roda tranquilo no Mega ou no ESP32. No ESP32, você pode aumentar a área de programa de 1,25 MB para 3 MB escolhendo Huge APP (3MB No OTA/1MB SPIFFS) em Ferramentas > Partition Scheme; com essa opção, as atualizações sem fio (OTA) não ficam disponíveis.
Erros causados pela escolha da placa errada
O compilador sempre compila o seu código para o processador da placa selecionada em Ferramentas > Placa (no IDE 2, no seletor de placa no topo). O mesmo código pode compilar sem problemas para o Mega e falhar com o Uno selecionado, porque cada placa tem hardware, nomes de pinos e bibliotecas diferentes, que vêm com o pacote da placa. Quando abrir um projeto que encontrou na internet, confira primeiro para qual placa ele foi escrito: código escrito para o ESP32 não compila com o Uno selecionado, e código escrito para o Uno que acessa os registradores do processador diretamente não compila com o ESP32 selecionado. Se você nem vê a sua placa na lista, o pacote dela não está instalado; você precisa instalar os pacotes do ESP32 e do Raspberry Pi Pico pelo Gerenciador de Placas. Para os passos, veja o guia Como instalar o Arduino IDE.
| Mensagem de erro | O que aconteceu? | Solução |
|---|---|---|
| 'Serial1' was not declared in this scope (Serial1 não declarado) | O código foi escrito para o Mega ou o Leonardo, mas o Uno está selecionado; o Uno só tem uma porta serial de hardware | Selecione a placa certa ou use SoftwareSerial no Uno |
| SoftwareSerial.h: No such file or directory (arquivo não encontrado) | O ESP32 está selecionado; essa biblioteca não faz parte do core do ESP32 | Use as portas seriais de hardware do ESP32 (Serial2) |
| 'LED_BUILTIN' was not declared in this scope (LED_BUILTIN não declarado) | Algumas definições de placa, como a ESP32 Dev Module, não definem a constante do LED da placa | Escreva o número do pino diretamente (GPIO 2 em muitas placas DevKit) |
| 'D5' was not declared in this scope (D5 não declarado) | Nomes como D0–D8 existem em placas ESP8266 como a NodeMCU e a Wemos e em algumas outras, mas não no Uno nem na ESP32 Dev Module | Use o número do GPIO no Uno e no ESP32, ou selecione a placa certa |
| 'TCCR1A' was not declared in this scope (TCCR1A não declarado) | Código que acessa diretamente os registradores de timer do AVR está sendo compilado para o ESP32 | Use as funções LEDC e de timer do ESP32 |
| WiFi.h: No such file or directory ou 'WIFI_STA' was not declared in this scope | Código do ESP32 está sendo compilado para o Uno; o Uno não tem Wi-Fi | Selecione ESP32 Dev Module em Ferramentas > Placa |
| 'ledcSetup' was not declared in this scope (ledcSetup não declarado) | O core do ESP32 está na versão 3.x, mas o código foi escrito para a 2.x | Use ledcAttach() e ledcWrite() com o número do pino |
Erros de compilação no ESP32

O ESP32 também é programado na linguagem do Arduino, mas, como o compilador e o pacote de placa são diferentes, um código que compila sem problemas no Uno pode empacar no ESP32. O motivo mais comum é a versão do core: na versão 3.x do core Arduino do ESP32 as funções de PWM mudaram; ledcSetup() e ledcAttachPin() foram removidas e substituídas por ledcAttach() e ledcWrite(), que trabalham com o número do pino em vez de um número de canal. É por isso que exemplos antigos da internet dão 'ledcSetup' was not declared in this scope; converta o código para as funções novas ou instale a versão 2.0.17 pelo Gerenciador de Placas. A segunda diferença são as opções do compilador. O core do Uno compila o código com a opção -fpermissive, que transforma alguns erros em simples avisos; o ESP32 não a usa. Por exemplo, declarar uma variável dentro de um switch sem chaves compila no Uno, mas dá o erro jump to case label no ESP32. Os cores atuais do ESP32 também compilam com -Werror=return-type: se você esquecer o return em uma função que precisa retornar um valor, recebe no return statement in function returning non-void sempre que Avisos do compilador estiver em qualquer opção diferente de Nenhum. Na versão 2.x, colocar Avisos do compilador em Mais ou Todos transforma a maioria dos avisos em erros. Para a configuração básica da placa, dê uma olhada no artigo O que é o 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: erros no Arduino IDE e no MicroPython
Se você programa o Pico com o Arduino IDE, ou seja, com o core arduino-pico de Earle Philhower, o compilador continua sendo o GCC e todas as mensagens deste artigo valem do jeito que estão. O MicroPython é diferente: não há uma etapa de compilação separada antes; o Pico transforma o arquivo em bytecode quando começa e o executa linha por linha. Por isso os erros aparecem no painel Shell, na parte de baixo do Thonny, em uma mensagem que começa com Traceback (most recent call last):. Leia essa mensagem de baixo para cima: a última linha diz o tipo de erro e a descrição, e a parte line 7 acima dela diz em qual linha ele está. Erros de sintaxe (SyntaxError, IndentationError) são informados antes mesmo de o programa começar; os outros erros só aparecem quando o programa chega naquela linha, então o código pode funcionar bem por um tempo e depois parar. Para instalar o MicroPython e dar os primeiros passos, veja o artigo O que é o Raspberry Pi Pico.
| Erro do MicroPython | O que significa | Solução |
|---|---|---|
| SyntaxError: invalid syntax | Sintaxe quebrada: faltam os dois-pontos no fim de uma linha if, while ou def, ou há um parêntese não fechado | Acrescente : no fim da linha e conte os parênteses |
| IndentationError: unexpected indent | Indentação inconsistente; espaços e tabs misturados | Use 4 espaços em todo bloco |
| NameError: name 'led' isn't defined (nome não definido) | O nome está escrito errado ou é usado antes de ser definido | Confira as maiúsculas e minúsculas e onde ele é definido |
| ImportError: no module named 'ssd1306' (módulo não encontrado) | O arquivo do driver não está no Pico | Salve o ssd1306.py no Pico com o Thonny |
| AttributeError: 'Pin' object has no attribute 'toggel' (atributo inexistente) | O objeto não tem essa função | Corrija o nome da função: toggle() |
| TypeError: can't convert 'int' object to str implicitly (tipos incompatíveis) | Texto e número juntados com + | Use str(numero) ou passe os valores ao print separados por vírgulas |
| OSError: [Errno 5] EIO | O dispositivo I2C não responde | Confira a ligação, o endereço e os pinos SDA e 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)Tabela de erros de compilação do Arduino e soluções
| Mensagem de erro | Causa | Solução |
|---|---|---|
| exit status 1 / Compilation error: exit status 1 (erro de compilação) | Um programa da cadeia de compilação ou de carregamento falhou | Role para cima e leia a primeira linha que contém error: |
| 'x' was not declared in this scope (não declarado neste escopo) | Erro de digitação, maiúsculas e minúsculas, escopo ou #include faltando | Corrija o nome, torne a variável global, inclua a biblioteca |
| expected ';' before ... (falta ponto e vírgula) | Falta um ponto e vírgula na linha anterior | Confira a linha acima da indicada (Uno) ou o fim da linha indicada (ESP32) |
| expected '}' at end of input (falta fechar uma chave) | Uma chave nunca foi fechada | Case as chaves com a Autoformatação (Ctrl+T) |
| X.h: No such file or directory (arquivo não encontrado) | A biblioteca não está instalada ou o nome do arquivo está errado | Instale-a pelo Gerenciador de Bibliotecas junto com as dependências |
| 'X' does not name a type (não é um tipo) | #include faltando, nome de tipo errado ou comando fora de função | Inclua a biblioteca, confira a grafia de String e int, leve o comando para dentro de uma função |
| redefinition of 'void setup()' (definição duplicada) | Duas funções setup() ou um arquivo .ino a mais na pasta | Junte os sketches, tire o arquivo antigo da pasta |
| stray '\342' in program (caractere inválido) | Aspas curvas ou travessão copiados, ou letra acentuada em nome de variável | Digite as aspas de novo, use só letras sem acento nos nomes |
| 'class X' has no member named 'y' (membro inexistente) | Nome de função errado ou outra versão da biblioteca | Veja os exemplos da própria biblioteca, instale a versão certa |
| too few arguments to function / too many arguments to function (argumentos de menos / demais) | Valores de menos ou demais passados a uma função | Compare com a definição na linha note: declared here |
| lvalue required as left operand of assignment (atribuição inválida) | Atribuição em vez de comparação: if (digitalRead(2) = HIGH) | Use == para comparações |
| jump to case label (salto para rótulo case) | Variável declarada em um case sem chaves (erro no ESP32) | Envolva o bloco do case em { } |
| undefined reference to `blink()' (função sem corpo) | A função só tem protótipo, sem corpo | Escreva a função ou corrija o nome dela |
| Sketch too big / text section exceeds available space in board (programa grande demais) | O programa não cabe na flash | Diminua o código, escolha uma placa maior, Partition Scheme no ESP32 |
| data section exceeds available space in board (RAM insuficiente) | As variáveis globais não cabem na RAM | Macro F(), tipos de dado menores, arrays na PROGMEM |
| #error This library only supports boards with ... (placa não suportada) | A biblioteca não suporta a arquitetura da placa selecionada | Instale uma biblioteca feita para a sua placa ou troque a placa |
Próximos passos para escrever código sem erros
- Reforce o básico: o artigo fundamentos da programação Arduino explica variáveis, escopo, funções e laços; a maioria dos erros deste artigo vem desses temas.
- Aprenda a grafia correta dos comandos: a lista de comandos do Arduino mostra a sintaxe e os parâmetros de cada comando com exemplos.
- Instale as bibliotecas do jeito certo: o guia Como instalar uma biblioteca no Arduino trata em detalhes das mensagens No such file or directory e Multiple libraries were found.
- Veja o que o seu código faz enquanto roda: para um código que compila, mas não se comporta como você espera, mostrar as variáveis no Monitor Serial é o jeito mais rápido de diagnosticar.
- Teste sem placa: nos simuladores Wokwi ou Tinkercad, você pode compilar o código e rodá-lo junto com o circuito.
- Confira o código escrito por IA: o código gerado por chatbots muitas vezes é escrito para versões antigas de bibliotecas ou para outra placa; o artigo código Arduino com IA explica como pegar esses problemas.
Os erros de compilação podem assustar no começo, mas o compilador na verdade diz onde está o problema e muitas vezes como resolvê-lo: arquivo, linha, coluna e uma descrição curta. Leia o primeiro erro, corrija só ele, compile de novo e repita o ciclo; depois de alguns projetos, você vai se pegar resolvendo erros em segundos. Quando o seu código compilar e carregar, você pode seguir com os projetos de LED, botão, sensor e display do app BlueGrays: cada projeto para Arduino, ESP32 e Raspberry Pi Pico vem com esquema do circuito e código que compila sem erros, passo a passo.
Perguntas frequentes
O que significa exit status 1 no Arduino?
exit status 1 é uma mensagem genérica que diz que um dos programas executados na compilação ou no carregamento terminou com erro, e ela mesma não diz a causa. Role para cima no painel de saída e encontre a primeira linha que contém error:; o nome do arquivo, o número da linha e a descrição estão ali. Quando você corrige esse erro e compila de novo, o exit status 1 também some.
Como corrijo 'was not declared in this scope' no Arduino?
Significa que o compilador não reconhece, naquele ponto, uma variável, função ou constante que você usou. As causas mais comuns são um erro de maiúscula e minúscula (digitalwrite), uma variável declarada dentro de outra função e uma biblioteca que não foi incluída. Conferir a grafia e declarar as variáveis compartilhadas fora de todas as funções normalmente basta.
O que significa “expected ';' before” no Arduino?
Esse erro diz que falta um ponto e vírgula. Como o compilador do Uno só percebe quando lê a próxima palavra, a linha da mensagem costuma estar uma abaixo, então coloque o ponto e vírgula no fim da linha logo acima. No ESP32 e no Pico, a mensagem aponta direto para a linha em que falta o ponto e vírgula. Usar vírgulas em vez de pontos e vírgulas dentro dos parênteses de um laço for dá a mesma mensagem.
Por que recebo 'does not name a type' no Arduino?
O compilador espera um tipo de dado no início da linha, mas não reconhece a palavra que você escreveu. Esquecer a linha #include da biblioteca (do Servo, por exemplo), escrever string em vez de String e colocar uma atribuição solta como angle = 90; fora de uma função são as três causas mais comuns. Se você usa um tipo struct próprio no Arduino, defina-o antes da primeira função.
Como corrijo 'Sketch too big' no Arduino?
Essa mensagem significa que o programa não cabe na memória flash da placa; no Uno, o limite é de 32256 bytes. Remova bibliotecas e linhas de depuração que você não usa, leve arrays constantes grandes para a PROGMEM ou passe para uma placa com mais memória, como o Mega ou o ESP32. No ESP32, escolher Huge APP no menu Partition Scheme aumenta a área de programa para cerca de 3 MB.
Por que meu código compila, mas não carrega no Arduino?
Se a compilação deu certo, você vê a linha “O sketch usa” (Sketch uses), que mostra quantos bytes o programa ocupa; os erros depois disso pertencem à etapa de carregamento e têm a ver com o cabo, o driver, a porta ou a escolha da placa, e não com o código. Linhas que começam com avrdude apontam para um problema de carregamento no Uno e no Nano, e linhas do esptool, no ESP32. Nesse caso, siga em ordem os passos do guia sobre o Arduino que não carrega o código.
Projetos para montar depois desta leitura
Ver todos os projetos
LED piscante
O primeiro contato com a eletrônica: acender e apagar um único LED. O Arduino acende e apaga o LED em intervalos curtos, fazendo a luz piscar rapidamente. Você vê da forma mais simples como a placa co

Controle de LED com botão (momentâneo)
É como uma campainha: a luz fica acesa enquanto você pressiona o botão e apaga quando você solta. O Arduino monitora o botão continuamente; enquanto ele está pressionado, o LED fica aceso e apaga assi

Medição de distância com HC-SR04 (Monitor Serial)
O sensor HC-SR04 funciona como um morcego que se orienta no escuro: emite um som que você não consegue ouvir, escuta o eco e mede a distância até o objeto à sua frente. O Arduino escreve essa distânci

Temperatura e umidade com DHT11
Qual é a temperatura do seu quarto? O ar está úmido ou seco? O sensor DHT11 mede a temperatura e a umidade, e o Arduino mostra os valores em um display LCD de duas linhas, atualizando a cada poucos se

LED piscando com ESP32
Ensina o uso básico de uma saída GPIO no ESP32. Fazemos um LED piscar ligando e desligando um pino digital. É a versão para ESP32 do clássico projeto blink do Arduino UNO: os comandos básicos de blink no ambiente Arduino são os mesmos, mas a disposição dos pinos e os níveis de 3,3 V dos GPIOs do ESP32 diferem dos do Arduino UNO.

Piscar o LED integrado do Raspberry Pi Pico (Pico e Pico W)
O primeiro projeto da série Raspberry Pi Pico! Fazemos o LED verde integrado piscar para verificar se a placa funciona — um primeiro experimento no estilo clássico "Hello World". SEM componentes externos, apenas o Pico e um cabo USB. O código foi escrito em MicroPython (a linguagem com suporte oficial da Raspberry Pi Foundation). Aprenda a usar a classe machine.Pin, o modo Pin.OUT, os métodos led.on()/off() e time.sleep() no Thonny IDE.

Uso do display LCD com I2C
Dê ao seu Arduino um display próprio e faça-o escrever sua primeira mensagem. O display LCD de duas linhas é conectado com poucos fios; primeiro aparece uma saudação na linha de cima, depois uma segun

Uso de servo motor
O braço de um pequeno servo motor gira para três posições em sequência: o início, o meio e o fim do percurso, esperando dois segundos em cada parada. O Arduino informa ao motor em qual ângulo ficar, e
Mais artigos
App BlueGrays
Monte este circuito passo a passo pelo celular
Esquema do circuito, código e lista de componentes em uma só tela. Mais de 200 projetos com Arduino, ESP32 e Pico prontos para montar.
Escaneie com seu celular
Aponte a câmera para o código para abrir a loja de aplicativos do seu celular.
ou abrir a loja

