Guias · 18 min de leitura

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.

Placa Arduino Uno R3
Arduino Uno: o código é compilado para o processador da placa selecionada em Ferramentas > Placa (aqui, o ATmega328P); escolher a placa errada pode causar um erro de compilação mesmo quando o código está certo.

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ídaEtapaO que significa
error: ... e exit status 1 no fimCompilaçãoHá 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 statusLinkagemUma função está declarada, mas o corpo dela não existe em lugar nenhum
multiple definition of ... (definição múltipla)LinkagemA mesma variável ou função está definida em dois arquivos separados
Sketch too big e text section exceeds available space in boardVerificação de tamanhoO programa não cabe na memória flash da placa
Not enough memory e data section exceeds available space in boardVerificação de tamanhoAs variáveis globais não cabem na RAM
Failed uploading: uploading error: exit status 1 (falha no carregamento)CarregamentoO 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'.

ParteValor no exemploSignificado
ArquivoBlink.inoO arquivo que contém o erro; se você tem várias abas, isso diz qual delas
Linha6A linha em que o compilador percebeu o erro; às vezes o erro real está na linha de cima
Coluna3Qual caractere da linha é; para onde aponta o marcador ^
Tipoerrorerror 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ãonote: suggested alternative: 'digitalWrite' (alternativa sugerida)O palpite do compilador; muitas vezes mostra a grafia correta
  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. Corrija só esse primeiro erro e aperte Verificar de novo. Se o número de erros cair de repente, você está no caminho certo.
  6. 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.
Um único erro pode gerar dezenas de linhas vermelhas. Por exemplo, uma única linha Serial.println escrita com aspas curvas copiadas de uma página da web gera seis erros stray separados e um erro was not declared no Uno. Então não se assuste com a quantidade de erros; corrija o de cima e compile de novo. Para conferir se as chaves estão casando, use Ferramentas > Autoformatação (Ctrl+T): se a indentação se deslocar de forma inesperada, falta uma chave em algum lugar.

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).

C++ (Arduino IDE)
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}
CausaErradoCerto
Maiúsculas e minúsculasdigitalwrite(13, HIGH);digitalWrite(13, HIGH);
Constante escrita erradopinMode(13, OUPUT);pinMode(13, OUTPUT);
Variável declarada em outra funçãoDeclarar 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 usadaint counter = 0; vindo depois da linha counter++;Suba a declaração para antes do lugar onde ela é usada
Biblioteca não incluídaWire.begin(); sem uma linha #includeAcrescente #include <Wire.h> no topo do arquivo
Recurso que a placa não temSerial1.begin(9600); com o Uno selecionadoSelecione uma placa com várias portas seriais, como o Mega, ou use SoftwareSerial
Ordem em um arquivo .cpp extraUma função chamada antes da sua definição em uma aba .cppEscreva 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.

MensagemCausa mais provávelOnde olhar
expected ';' before 'delay' (falta ponto e vírgula)Falta ponto e vírgula no fim da linha anteriorNo 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 blocoA 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 forEscreva assim: for (int i = 0; i < 10; i++)
expected '}' at end of input (falta fechar uma chave)Uma chave nunca foi fechadaConfira 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 anteriorO fim da função antes da indicada na mensagem
expected ')' before ';' token (falta fechar parêntese)Um parêntese aberto nunca foi fechadoConte 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êntesesUm 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çãoLeve 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çãoEscreva void loop() { em vez de void loop(); {
O erro stray '\342' in program diz que há no seu código um caractere que o compilador não reconhece; os números são os valores octais dos bytes UTF-8 desse caractere. Códigos copiados de páginas da web, de arquivos Word ou PDF e de apps de mensagens podem trazer aspas curvas (“ ”) em vez de aspas retas ("), um travessão em vez do sinal de menos ou um espaço invisível não separável: aspas curvas e travessões aparecem como \342, e o espaço não separável como \302. O compilador do Uno também rejeita letras acentuadas em nomes de variáveis: escrever int größe ou int año dá stray '\303' in program. A solução é digitar de novo, no seu teclado, as aspas e os traços da linha indicada na mensagem e usar só letras sem acento nos nomes de variáveis. Já caracteres acentuados dentro de textos entre aspas duplas não quebram a compilação.

'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 mensagemBusque no Gerenciador de BibliotecasObservação
DHT.hDHT sensor library (Adafruit)Escolha Instalar tudo; a Adafruit Unified Sensor vem junto
Adafruit_Sensor.hAdafruit Unified SensorA dependência que falta de outra biblioteca da Adafruit
LiquidCrystal_I2C.hLiquidCrystal I2C (Frank de Brabander)Não instale várias bibliotecas com o mesmo nome; veja o aviso abaixo
Adafruit_SSD1306.hAdafruit SSD1306Instalada junto com a Adafruit GFX e a Adafruit BusIO
MFRC522.hMFRC522 (GithubCommunity)Para o módulo RFID RC522
IRremote.hIRremoteAs 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 incluiUse 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.

C++ (Arduino IDE)
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.

C++ (Arduino IDE)
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.

PlacaLimite de memória de programaRAM (memória dinâmica)Observação
Arduino Uno R332256 bytes2048 bytes0,5 KB é reservado para o bootloader
Arduino Nano (ATmega328P)30720 bytes2048 bytesO IDE reserva 2 KB nas duas opções de bootloader
Arduino Leonardo28672 bytes2560 bytesBootloader de 4 KB; o código USB também ocupa espaço
Arduino Mega 2560253952 bytes8192 bytesUm passo fácil para projetos que não cabem no Uno
ESP32 (esquema de partição padrão)1310720 bytes327680 bytesSobe para 3145728 bytes com Huge APP
Raspberry Pi Pico (arduino-pico, 2MB no FS)2093056 bytes262144 bytesReservar espaço para um sistema de arquivos encolhe a área de programa
C++ (Arduino IDE)
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}
  • 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 erroO 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 hardwareSelecione 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 ESP32Use 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 placaEscreva 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 ModuleUse 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 ESP32Use as funções LEDC e de timer do ESP32
WiFi.h: No such file or directory ou 'WIFI_STA' was not declared in this scopeCódigo do ESP32 está sendo compilado para o Uno; o Uno não tem Wi-FiSelecione 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.xUse ledcAttach() e ledcWrite() com o número do pino
No início de uma compilação, você pode ver uma linha 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). Isso não é um erro; diz que o autor da biblioteca não incluiu o ESP32 na lista de placas suportadas, e muitas vezes a biblioteca funciona mesmo assim. A mensagem que você realmente precisa vigiar é Multiple libraries were found for "LiquidCrystal_I2C.h": se duas bibliotecas com o mesmo nome estiverem instaladas, o IDE escolhe uma delas e, se essa escolha não combinar com o seu código, você recebe um erro como 'class LiquidCrystal_I2C' has no member named 'init'. As linhas Used e Not used abaixo da mensagem mostram qual pasta foi usada; apague da pasta libraries a cópia que você não usa.

Erros de compilação no ESP32

Placa de desenvolvimento ESP32
ESP32: ele é programado na mesma linguagem no Arduino IDE, mas, como é compilado com outro compilador e outro pacote de placa, alguns códigos que funcionam no Uno falham aqui.

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.

C++ (Arduino IDE)
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 MicroPythonO que significaSolução
SyntaxError: invalid syntaxSintaxe quebrada: faltam os dois-pontos no fim de uma linha if, while ou def, ou há um parêntese não fechadoAcrescente : no fim da linha e conte os parênteses
IndentationError: unexpected indentIndentação inconsistente; espaços e tabs misturadosUse 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 definidoConfira 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 PicoSalve o ssd1306.py no Pico com o Thonny
AttributeError: 'Pin' object has no attribute 'toggel' (atributo inexistente)O objeto não tem essa funçãoCorrija 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] EIOO dispositivo I2C não respondeConfira a ligação, o endereço e os pinos SDA e 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)

Tabela de erros de compilação do Arduino e soluções

Mensagem de erroCausaSolução
exit status 1 / Compilation error: exit status 1 (erro de compilação)Um programa da cadeia de compilação ou de carregamento falhouRole 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 faltandoCorrija 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 anteriorConfira 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 fechadaCase 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á erradoInstale-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çãoInclua 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 pastaJunte 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ávelDigite 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 bibliotecaVeja 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çãoCompare 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 corpoEscreva 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 flashDiminua 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 RAMMacro 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 selecionadaInstale uma biblioteca feita para a sua placa ou troque a placa
O jeito de reduzir ao mínimo os erros de compilação é fazer o código crescer em passos pequenos: comece por um exemplo que funciona, aperte Verificar depois de acrescentar cada parte nova e, quando der erro, olhe só as últimas linhas que acrescentou. Cuidado também com os erros que o compilador não consegue pegar: if (state = HIGH) escrito com uma variável compila sem erros, mas, como atribui em vez de comparar, a condição é sempre verdadeira; o ponto e vírgula no fim de if (distance < 10); também torna a condição inútil. Se você colocar Avisos do compilador em Todos, vai ver a maioria desses erros de lógica como avisos.

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.

Ver todos os projetos
LED piscante
#1Iniciante

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

4.6(188)
1125
Controle de LED com botão (momentâneo)
#9Iniciante

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

4.8(113)
229
Medição de distância com HC-SR04 (Monitor Serial)
#27Iniciante

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

4.6(46)
71
Temperatura e umidade com DHT11
#55Intermediário

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

4.7(47)
73
LED piscando com ESP32
#103Iniciante

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.

4.7(37)
99
Piscar o LED integrado do Raspberry Pi Pico (Pico e Pico W)
#147Iniciante

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.

5.0(1)
10
Uso do display LCD com I2C
#32Iniciante
Premium

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

4.8(53)
70
Uso de servo motor
#35Iniciante
Premium

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

4.7(48)
67