Rehberler · 13 dk okuma

Arduino exit status 1 Hatası: Derleme Hataları ve Çözümleri

Arduino exit status 1 hatası ne demek? was not declared in this scope, expected ';', No such file, does not name a type ve Sketch too big hatalarını çöz.

Arduino exit status 1 hatası, kodunun derlenemediğini, yani derleyicinin yazdığın programı işlemcinin anlayacağı makine koduna çeviremediğini söyleyen genel bir mesajdır; asıl sebep hiçbir zaman bu satırda yazmaz. Sebep, çıktı panelinde onun birkaç satır yukarısında duran ve error: kelimesini içeren ilk satırdadır: bir ismi yanlış yazmışsındır, bir noktalı virgülü unutmuşsundur, bir kütüphane kurulu değildir ya da kod başka bir kart için yazılmıştır. Arduino IDE 2'de sağ altta beliren Compilation error: exit status 1 (Türkçe arayüzde Derleme hatası: exit status 1) bildirimi de, eski 1.8 sürümündeki Arduino Uno kartı için derleme hatası satırı da aynı anlama gelir.

Bu rehberde önce derlemenin arka planda nasıl çalıştığını ve bir hata mesajını dosya, satır ve sütun bilgisine ayırarak okumayı göreceksin. Ardından en sık karşılaşılan derleme hatalarını tek tek ele alacağız: was not declared in this scope, expected ';' before, No such file or directory, does not name a type, redefinition of ve Sketch too big. Her biri için hatayı doğuran durumu, derleyicinin verdiği gerçek mesajı ve düzeltilmiş, hatasız derlenen bir örnek kodu bulacaksın. Yanlış kart seçiminden doğan hataları, ESP32 ve Raspberry Pi Pico'ya özgü durumları ve yazının sonunda hepsini bir arada gösteren bir hata-çözüm tablosunu da ekledik. Kodun hatasız derleniyor ama karta yüklenmiyorsa sorun başka bir aşamadadır; o durum için Arduino Kod Yüklenmiyor rehberine bak.

Arduino Uno R3 kartı
Arduino Uno: kod, Araçlar > Kart menüsünde seçili kartın işlemcisi (burada ATmega328P) için derlenir; yanlış kart seçimi, kod doğru olsa bile derleme hatasına yol açabilir.

Arduino exit status 1 nedir? Derleme ile yükleme arasındaki fark

Doğrula (onay işareti) ya da Yükle düğmesine bastığında Arduino IDE arka planda birkaç program çalıştırır. Önce taslak klasöründeki .ino dosyalarını birleştirir, başına Arduino.h başlık dosyasını ve fonksiyonların prototiplerini ekleyerek onu sıradan bir C++ dosyasına çevirir. Sonra Uno için avr-g++, ESP32 için xtensa-esp32-elf-g++ gibi bir derleyici bu dosyayı ve kullandığın kütüphaneleri derler, bağlayıcı (linker) bütün parçaları tek bir programda birleştirir ve en son programın karta sığıp sığmadığı kontrol edilir. Her program işini bitirince bir çıkış kodu döndürür: 0 başarı, 1 ise hata demektir. "exit status 1" tam olarak bunu söyler: zincirdeki programlardan biri başarısız oldu. Bu yüzden aynı ifade, yükleme sırasında avrdude başarısız olduğunda da görünür; hangisi olduğunu önündeki mesajdan anlarsın.

Çıktıda gördüğünAşamaNe anlama gelir?
error: ... ve en sonda exit status 1DerlemeKodunda ya da bir kütüphanede C++ hatası var; asıl sebep error: satırında
fatal error: DHT.h: No such file or directoryDerleme (ön işleme)#include ile istenen dosya bulunamadı; kütüphane eksik ya da adı yanlış
undefined reference to ... ve collect2: error: ld returned 1 exit statusBağlama (linker)Bir fonksiyon bildirilmiş ama gövdesi hiçbir yerde yok
multiple definition of ...Bağlama (linker)Aynı değişken ya da fonksiyon iki ayrı dosyada tanımlanmış
Sketch too big ve text section exceeds available space in boardBoyut kontrolüProgram kartın flaş belleğine sığmıyor
Not enough memory ve data section exceeds available space in boardBoyut kontrolüGlobal değişkenler RAM'e sığmıyor
Failed uploading: uploading error: exit status 1YüklemeKod derlendi ama karta yazılamadı; avrdude ya da esptool satırlarına bak

Arduino hata mesajı nasıl okunur?

Derleyicinin her hata satırı aynı kalıbı izler: önce dosyanın adı, sonra iki nokta üst üsteyle ayrılmış satır ve sütun numarası, ardından hatanın türü ve açıklaması gelir. Hemen üstünde çoğu zaman In function 'void loop()': gibi bir satır, hatanın hangi fonksiyonun içinde olduğunu söyler; altında ise hatalı satırın bir kopyası ve sorunlu yeri gösteren küçük bir ^ işareti bulunur. error derlemeyi durduran gerçek bir hatadır, warning yalnızca uyarıdır ve kod yine de derlenir, note ise bir önceki mesaja ek bilgi verir. Derleyici çoğu zaman bir de öneri ekler: aşağıdaki örnekte suggested alternative: 'digitalWrite' diyerek doğru yazımı kendisi gösterir.

ParçaÖrnekteki değerAnlamı
DosyaBlink.inoHatanın bulunduğu dosya; birden çok sekmen varsa hangisi olduğunu buradan anlarsın
Satır6Derleyicinin hatayı fark ettiği satır; asıl hata bazen bir üst satırdadır
Sütun3Satırın kaçıncı karakteri olduğu; ^ işaretinin gösterdiği yer
Türerrorerror derlemeyi durdurur, warning uyarır, note ek bilgi verir
Mesaj'digitalwrite' was not declared in this scopeSorunu anlatan kısım; internette aratacağın metin budur
Önerinote: suggested alternative: 'digitalWrite'Derleyicinin tahmini; çoğu zaman doğru yazımı gösterir
  1. Dosya > Tercihler penceresinde Ayrıntılı çıktıyı görüntüle satırındaki derle kutusunu işaretle. Böylece derleyicinin hangi dosyaları ve hangi kütüphane klasörlerini kullandığını da görürsün.
  2. Kartın takılı olmasına gerek yok: Doğrula (onay işareti) düğmesine bas. Doğrula yalnızca derler; hata derleme aşamasındaysa Yükle'ye basmak sadece zaman kaybettirir.
  3. Çıktı panelini en üste kaydır ve error: geçen ilk satırı bul. Ondan sonraki hataların çoğu bu ilk hatanın zincirleme sonucudur.
  4. Mesajdaki satır numarasına git. IDE 2 hatanın olduğu karakterin altını kırmızıyla çizer, 1.8 sürümü bütün satırı kırmızıya boyar. O satırda bir sorun göremiyorsan bir üst satıra bak.
  5. Yalnızca o ilk hatayı düzelt ve yeniden Doğrula'ya bas. Hata sayısı bir anda azalıyorsa doğru yoldasın.
  6. İnternette arayacaksan mesajı kendi değişken adlarından ve dosya yollarından arındır: 'sayac' was not declared in this scope yerine was not declared in this scope aratmak çok daha fazla sonuç getirir. Bir forumda yardım isterken ise çıktının tamamını kopyala.
Tek bir hata onlarca kırmızı satır üretebilir. Örneğin bir web sayfasından kopyalanmış kıvrık tırnaklarla yazılmış tek bir Serial.println satırı, Uno'da altı ayrı stray hatası ve bir was not declared hatası verir. Bu yüzden hata sayısına bakıp paniğe kapılma; en üstteki hatayı düzelt ve yeniden derle. Süslü parantezlerin eşleşip eşleşmediğini görmek için Araçlar > Otomatik Biçimlendir (Ctrl+T) kullan: girintiler beklenmedik biçimde kayıyorsa kapanmamış bir parantez vardır.

'was not declared in this scope' hatası ve çözümü

Bu mesaj, derleyicinin kullandığın bir ismi o noktada tanımadığını söyler; Türkçesiyle "bu kapsamda tanımlanmamış". En sık sebep yazım hatasıdır: Arduino büyük-küçük harfe duyarlıdır ve digitalwrite, Digitalwrite ve digitalWrite üç farklı isimdir. İkinci büyük sebep kapsamdır (scope): bir değişkeni setup() içinde tanımlarsan o değişken yalnızca setup() çalışırken yaşar ve loop() onu göremez. Bir değişkeni birden çok fonksiyonda kullanacaksan bütün fonksiyonların dışında, dosyanın en üstünde tanımla. Değişkeni kullandığın satırdan sonra tanımlamak da aynı hatayı verir, çünkü derleyici dosyayı yukarıdan aşağıya okur. Son olarak bu hata, kütüphanesini eklemediğin bir nesneyi (Wire, Servo) ya da seçili kartta bulunmayan bir özelliği (Uno'da Serial1) kullandığında da çıkar.

Arduino (C++)
1// Kapsam (scope) örneği / Scope example
2const int LED_PIN = 13;   // global: her fonksiyon görür / global: every function can see it
3int yanmaSayisi = 0;      // setup() içine taşırsan loop() göremez / move it into setup() and loop() can't see it
4
5void setup() {
6  pinMode(LED_PIN, OUTPUT);
7  Serial.begin(9600);
8}
9
10void loop() {
11  int sure = 500;                // yerel: yalnız loop() içinde / local: only inside loop()
12  digitalWrite(LED_PIN, HIGH);   // digitalwrite yazarsan: was not declared / typing digitalwrite: was not declared
13  delay(sure);
14  digitalWrite(LED_PIN, LOW);
15  delay(sure);
16  yanmaSayisi++;
17  Serial.println(yanmaSayisi);   // kaç kez yandı / how many times it blinked
18}
SebepHatalı yazımDoğrusu
Büyük-küçük harfdigitalwrite(13, HIGH);digitalWrite(13, HIGH);
Sabitin adı yanlışpinMode(13, OUPUT);pinMode(13, OUTPUT);
Değişken başka fonksiyonda tanımlısetup() içinde int led = 13; tanımlayıp loop() içinde led kullanmakint led = 13; satırını bütün fonksiyonların dışına, en üste taşı
Değişken kullanıldıktan sonra tanımlanmışsayac++; satırından sonra gelen int sayac = 0;Tanımı kullanıldığı yerden önceye al
Kütüphane eklenmemiş#include satırı olmadan Wire.begin();Dosyanın başına #include <Wire.h> ekle
Kartta olmayan özellikUno seçiliyken Serial1.begin(9600);Mega gibi birden çok seri portu olan kartı seç ya da SoftwareSerial kullan
Ek .cpp dosyasında sıralamaBir .cpp sekmesinde, tanımından önce çağrılan fonksiyon.cpp dosyalarında prototipi (void yak();) en üste yaz; bunu .ino'da IDE kendisi yapar

'expected ';' before' ve diğer söz dizimi hataları

C++'ta her ifade noktalı virgülle biter. Bir satırın sonunda noktalı virgülü unuttuğunda derleyici bunu ancak bir sonraki kelimeyi okuduğunda fark eder. Bu yüzden Uno'nun derleyicisinde expected ';' before 'delay' mesajındaki satır numarası hatanın bir alt satırını gösterir: eksik noktalı virgül, delay'den önceki satırın sonundadır. ESP32 ve Pico paketlerindeki daha yeni derleyiciler ise doğrudan noktalı virgülün eksik olduğu satırın sonunu gösterir. Fonksiyonun son satırında unutursan mesaj expected ';' before '}' token olur. Parantez hataları da benzer davranır. Bir if bloğunun ya da fonksiyonun süslü parantezini kapatmayı unutursan derleyici kodu dosyanın sonuna kadar okur ve ancak orada expected '}' at end of input der. Kapanmamış parantez setup() içindeyse bir de a function-definition is not allowed here before '{' token mesajı gelir, çünkü derleyiciye göre loop() artık setup()'ın içinde tanımlanmaya çalışılan bir fonksiyondur. for döngüsünün parantezinde noktalı virgül yerine virgül kullanmak da bu ailenin klasik hatasıdır.

MesajEn olası sebepNereye bakmalı?
expected ';' before 'delay'Bir önceki satırın sonunda noktalı virgül yokUno'da mesajdaki satırın bir üstü, ESP32'de mesajdaki satırın sonu
expected ';' before '}' tokenBloğun son satırında noktalı virgül yokKapanış parantezinden hemen önceki satır
expected ';' before '<' tokenfor parantezinde noktalı virgül yerine virgül varfor (int i = 0; i < 10; i++) biçiminde yaz
expected '}' at end of inputBir süslü parantez kapatılmamışOtomatik Biçimlendir ile girintilere bak; her { için bir } olmalı
a function-definition is not allowed here before '{' tokenÖnceki fonksiyonun kapanış parantezi eksikMesajdaki fonksiyondan önceki fonksiyonun sonu
expected ')' before ';' tokenAçılan normal parantez kapanmamışif koşullarındaki ve fonksiyon çağrılarındaki parantez sayısı
expected primary-expression before ')' tokenParantez içinde bir değer eksikdigitalWrite(13, ) gibi boş bırakılmış bir argüman
expected constructor, destructor, or type conversion before '(' tokenBir komut fonksiyonların dışına yazılmışpinMode() gibi komutları setup() içine taşı
expected unqualified-id before '{' tokenFonksiyon başlığından sonra noktalı virgül konmuşvoid loop(); { yerine void loop() { yaz
stray '\342' in program hatası, kodunda derleyicinin tanımadığı bir karakter olduğunu söyler; sayılar o karakterin UTF-8 baytlarının sekizlik gösterimidir. Web sayfalarından, Word ya da PDF dosyalarından ve mesajlaşma uygulamalarından kopyalanan kodlarda düz tırnak (") yerine kıvrık tırnak (“ ”), eksi işareti yerine uzun tire ya da görünmez bir bölünemez boşluk gelebilir: kıvrık tırnak ve tireler \342, bölünemez boşluk \302 olarak görünür. Uno'nun derleyicisi değişken adlarındaki Türkçe harfleri de kabul etmez: int sıcaklık yazmak stray '\304' in program hatası verir (ç, ö ve ü için \303, ş için \305). Çözüm, mesajdaki satırda tırnakları ve tireleri klavyeden yeniden yazmak ve değişken adlarında yalnızca İngilizce harfler kullanmaktır. Çift tırnak arasındaki metinlerde Türkçe karakter kullanmak ise derlemeyi bozmaz.

'No such file or directory': kütüphane bulunamadı

fatal error: DHT.h: No such file or directory ve hemen ardından gelen compilation terminated. satırları, kodundaki bir #include satırının istediği dosyanın bilgisayarda bulunamadığını söyler. "fatal" kelimesi derlemenin o noktada tamamen durduğunu anlatır; bu yüzden bu hatayı çözmeden kodun geri kalanındaki hataları göremezsin. Sebep neredeyse her zaman kütüphanenin kurulmamış olmasıdır. İnternetten aldığın bir projeyi açtığında kodun başındaki #include satırlarını tek tek oku ve her birinin kütüphanesini Araçlar > Kütüphaneleri Yönet ekranından kur. Bağımlılıkları soran pencerede Tümünü kur seçeneğini seçmezsen ana kütüphane kurulur ama onun ihtiyaç duyduğu ikinci kütüphane eksik kalır; bu durumda mesajdaki dosya adı senin yazdığın değil, kütüphanenin içinden çağrılan bir dosya olur (örneğin Adafruit_Sensor.h). Dosya adındaki büyük-küçük harfler de önemlidir: Linux'ta dht.h ile DHT.h farklı dosyalardır. Kütüphane kurmanın üç yolu ve ZIP sorunları için Arduino Kütüphane Ekleme rehberine bakabilirsin.

Mesajdaki dosyaKütüphane Yöneticisi'nde araNot
DHT.hDHT sensor library (Adafruit)Kurarken Tümünü kur seç; Adafruit Unified Sensor da gelir
Adafruit_Sensor.hAdafruit Unified SensorBaşka bir Adafruit kütüphanesinin eksik kalan bağımlılığı
LiquidCrystal_I2C.hLiquidCrystal I2C (Frank de Brabander)Aynı adlı birden çok kütüphane kurma; aşağıdaki uyarıya bak
Adafruit_SSD1306.hAdafruit SSD1306Adafruit GFX ve Adafruit BusIO ile birlikte kurulur
MFRC522.hMFRC522 (GithubCommunity)RC522 RFID modülü için
IRremote.hIRremoteYeni sürümler IrReceiver.begin() kullanır; eski örnekler uyarı ya da hata verebilir
SoftwareSerial.h (ESP32 seçiliyken)Kurma; ESP32 paketinde yokESP32'nin donanım seri portu Serial2'yi kullan ya da EspSoftwareSerial kütüphanesini kur

'does not name a type' hatası

does not name a type, derleyicinin bir satırın başında bir veri türü (int, float, Servo, LiquidCrystal_I2C gibi) beklediğini ama yazdığın kelimeyi tanıyamadığını söyler. Üç yaygın sebebi vardır. Birincisi, kütüphanenin #include satırını unutmaktır: Servo kapak; satırı Servo.h eklenmeden derlenirse 'Servo' does not name a type hatası çıkar. İkincisi, türün adını yanlış yazmaktır: string yerine String, Int yerine int doğrudur ve derleyici çoğu zaman did you mean 'String'? diye yardım eder. Üçüncüsü ve en şaşırtıcı olanı, fonksiyonların dışına bir komut yazmaktır. Fonksiyon dışında yalnızca tanım yapılabilir: int aci = 0; geçerlidir, ama sonraki bir satırda tek başına aci = 90; yazarsan derleyici aci kelimesini bir tür sanır ve 'aci' does not name a type der. Arduino'ya özgü bir tuzak daha var: IDE, fonksiyonlarının prototiplerini otomatik olarak ilk fonksiyonun hemen önüne ekler. Kendi tanımladığın bir struct türünü döndüren bir fonksiyon yazdıysan ve struct'ı setup()'ın altında tanımladıysan prototip struct'tan önce kalır ve aynı hata çıkar. Çözüm, struct tanımlarını dosyanın en üstüne, ilk fonksiyondan önceye taşımaktır.

Arduino (C++)
1#include <Servo.h>   // bu satır yoksa: 'Servo' does not name a type / without it: 'Servo' does not name a type
2
3struct Olcum {       // struct'ı ilk fonksiyondan önce tanımla / define structs before the first function
4  int ham;
5  float volt;
6};
7
8Servo kapak;         // tür adı büyük harfle başlar / the type name starts with a capital letter
9int aci = 0;         // dışarıda tanım ve ilk değer serbest / declaring with a value outside is fine
10// aci = 90;         // dışarıda tek başına atama: 'aci' does not name a type / bare assignment outside: error
11
12Olcum potOku() {
13  Olcum o;
14  o.ham = analogRead(A0);           // potansiyometre A0'da / potentiometer on A0
15  o.volt = o.ham * 5.0 / 1023.0;    // 0-1023 değerini volta çevir / convert 0-1023 to volts
16  return o;
17}
18
19void setup() {
20  Serial.begin(9600);
21  kapak.attach(9);   // servo sinyali D9 / servo signal on D9
22}
23
24void loop() {
25  Olcum o = potOku();
26  aci = map(o.ham, 0, 1023, 0, 180);   // atama fonksiyonun içinde / assignment inside a function
27  kapak.write(aci);
28  Serial.println(o.volt);
29  delay(20);
30}

'redefinition of' hatası: aynı şeyi iki kez tanımlamak

redefinition of 'void setup()' hatası, aynı isimde iki tanım olduğunu söyler; hemen altındaki note: 'void setup()' previously defined here satırı da ilk tanımın yerini gösterir. Yeni başlayanlarda bunun en sık sebebi iki örnek kodu tek dosyaya art arda yapıştırmaktır: ortaya iki setup() ve iki loop() çıkar. İkinci sebep sekmelerdir. Arduino IDE, taslak klasöründeki bütün .ino dosyalarını derlemeden önce tek bir dosyada birleştirir. Klasöre kopyaladığın eski bir yedek (örneğin proje_eski.ino) ya da kendi setup() ve loop() fonksiyonlarını içeren ikinci bir sekme, sen o sekmeyi hiç açmasan bile bu hatayı verir; çözüm o dosyayı klasörden çıkarmaktır. Aynı değişkeni iki kez tanımlamak da benzer bir mesaj üretir: redefinition of 'int led'. Bu hatanın bağlayıcıdaki kardeşi multiple definition of mesajıdır; bir başlık (.h) dosyasında değer atanmış bir değişken iki ayrı .cpp dosyasına eklendiğinde çıkar. Tersi olan undefined reference to ise prototipini yazdığın ama gövdesini hiç yazmadığın ya da adını farklı yazdığın bir fonksiyonu işaret eder.

Arduino (C++)
1// İki örneği birleştirmek: tek setup(), tek loop() / Merging two sketches: one setup(), one loop()
2const int LED_PIN = 13;          // 1. örnek: Blink / sketch 1: Blink
3const int POT_PIN = A0;          // 2. örnek: potansiyometre / sketch 2: potentiometer
4unsigned long oncekiZaman = 0;   // millis() zamanlayıcısı / millis() timer
5bool ledDurum = false;
6
7void setup() {
8  pinMode(LED_PIN, OUTPUT);      // 1. örneğin setup içeriği / setup body of sketch 1
9  Serial.begin(9600);            // 2. örneğin setup içeriği / setup body of sketch 2
10}
11
12void loop() {
13  // 1. örnek: delay yerine millis ile yanıp sönme / sketch 1: blink with millis instead of delay
14  if (millis() - oncekiZaman >= 500) {
15    oncekiZaman = millis();
16    ledDurum = !ledDurum;
17    digitalWrite(LED_PIN, ledDurum);
18  }
19  // 2. örnek: potansiyometreyi oku ve yaz / sketch 2: read and print the potentiometer
20  int deger = analogRead(POT_PIN);   // 0-1023 arası / between 0 and 1023
21  Serial.println(deger);
22  delay(50);
23}

Birleştirirken şu sırayı izle: önce iki koddaki #include satırlarını tekrarsız olarak en üste topla, sonra global değişkenleri ve sabitleri ekle; aynı isim iki kodda da varsa birini yeniden adlandır. Ardından iki setup() fonksiyonunun içini tek bir setup()'a, iki loop()'un içini de tek bir loop()'a yerleştir. Kodlardan biri uzun delay() kullanıyorsa diğerini bekletir; bunu delay() yerine millis() ile zamanlama yöntemiyle çözebilirsin. Son olarak iki kodun aynı pini kullanıp kullanmadığını kontrol et: derleyici bunu fark etmez ama devren beklediğin gibi çalışmaz.

'Sketch too big' ve bellek yetersiz hataları

Her başarılı derlemenin sonunda iki satır görürsün. Yukarıdaki kapsam örneğini Uno için derlediğinde Sketch uses 2212 bytes (6%) of program storage space. Maximum is 32256 bytes. satırı programın flaş bellekte ne kadar yer kapladığını, Global variables use 190 bytes (9%) of dynamic memory satırı da global değişkenlerin RAM'in ne kadarını kullandığını söyler. Program flaşa sığmazsa yüzde 100'ü geçer, ardından Sketch too big uyarısı ve text section exceeds available space in board hatası gelir. Global değişkenler RAM'e sığmazsa bu kez Not enough memory ve data section exceeds available space in board görürsün. RAM kullanımı yüzde 75'i geçtiğinde IDE Low memory available, stability problems may occur. uyarısını verebilir: kod derlenir ama çalışırken yerel değişkenlere yer kalmadığı için kart rastgele donabilir ya da kendi kendine yeniden başlayabilir. Uno'da 32 KB flaşın 0,5 KB'ını bootloader kullandığı için üst sınır 32256 bayttır.

KartProgram belleği üst sınırıRAM (dinamik bellek)Not
Arduino Uno R332256 bayt2048 bayt0,5 KB bootloader'a ayrılır
Arduino Nano (ATmega328P)30720 bayt2048 baytIDE iki bootloader seçeneğinde de 2 KB ayırır
Arduino Leonardo28672 bayt2560 bayt4 KB bootloader; USB kodu da yer kaplar
Arduino Mega 2560253952 bayt8192 baytUno'ya sığmayan projeler için kolay geçiş
ESP32 (varsayılan bölümleme)1310720 bayt327680 baytHuge APP seçilirse 3145728 bayta çıkar
Raspberry Pi Pico (arduino-pico, 2MB no FS)2093056 bayt262144 baytDosya sistemine yer ayırırsan program alanı küçülür
Arduino (C++)
1// RAM tasarrufu: F() ve PROGMEM / Saving RAM: F() and PROGMEM
2const char mesaj[] PROGMEM = "Bu uzun metin RAM yerine flasta durur";   // flaşta saklanır / stored in flash
3const byte notalar[] PROGMEM = {60, 62, 64, 65, 67, 69, 71, 72};      // byte: int'in yarısı / byte: half of an int
4
5void setup() {
6  Serial.begin(9600);
7  Serial.println(F("Merhaba! Bu metin de flastan okunur"));   // F(): RAM harcamaz / F(): uses no RAM
8  char tampon[48];                                            // geçici RAM tamponu / temporary RAM buffer
9  strcpy_P(tampon, mesaj);                                    // flaştan RAM'e kopyala / copy from flash to RAM
10  Serial.println(tampon);
11  for (byte i = 0; i < sizeof(notalar); i++) {
12    Serial.print(pgm_read_byte(&notalar[i]));                 // flaştan bir bayt oku / read one byte from flash
13    Serial.print(' ');
14  }
15  Serial.println();
16}
17
18void loop() {
19}
  • Sabit metinleri F() içine al: Serial.println(F("Sistem hazir")); metni RAM'e kopyalamadan doğrudan flaştan okur. LCD ve OLED ekranlara yazdırılan sabit metinler için de aynısı geçerlidir.
  • Büyük dizileri PROGMEM'e taşı: Nota tabloları, ekran bitmap'leri ve uzun metinler değişmiyorsa RAM'de durmalarına gerek yoktur. Ayrıntılı teknikler için Arduino bellek yetersiz yazısına bak.
  • Doğru veri türünü seç: 0 ile 255 arasındaki bir değer için byte (1 bayt) yeterlidir; int Uno'da 2, long ve float 4 bayt yer kaplar.
  • String sınıfını azalt: Sürekli birleştirilen String nesneleri RAM'i parçalar; sabit uzunlukta char dizileri daha öngörülebilirdir.
  • Ekran kütüphanelerinin gizli ihtiyacını bil: Adafruit SSD1306, 128×64 OLED ekran için 1 KB'lık tamponu çalışma anında ayırır. Bu bellek derleme raporunda görünmez; rapor yüzde 70 dese bile ekran açılmayabilir.
  • Daha büyük bir karta geç: Uno'ya sığdıramadığın bir proje Mega'da ya da ESP32'de rahatça çalışır. ESP32'de Araçlar > Partition Scheme menüsünden Huge APP (3MB No OTA/1MB SPIFFS) seçerek program alanını 1,25 MB'tan 3 MB'a çıkarabilirsin; bu seçenekte kablosuz güncelleme (OTA) kullanılamaz.

Yanlış kart seçimiyle gelen hatalar

Derleyici kodunu her zaman Araçlar > Kart menüsünde (IDE 2'de üstteki kart seçicide) seçili kartın işlemcisi için derler. Aynı kod Mega için hatasız derlenirken Uno seçiliyken hata verebilir, çünkü her kartın donanımı, pin adları ve kart paketiyle gelen kütüphaneleri farklıdır. İnternetten bulduğun bir projeyi açtığında önce hangi kart için yazıldığına bak: ESP32 için yazılmış bir kod Uno seçiliyken, Uno için yazılmış ve işlemcinin yazmaçlarına doğrudan erişen bir kod da ESP32 seçiliyken derlenmez. Kartını listede hiç göremiyorsan kart paketi kurulu değildir; ESP32 ve Raspberry Pi Pico paketlerini Kart Yöneticisi'nden kurman gerekir. Adımlar için Arduino IDE kurulumu rehberine bakabilirsin.

Hata mesajıNe oldu?Çözüm
'Serial1' was not declared in this scopeKod Mega ya da Leonardo için yazılmış, Uno seçili; Uno'nun tek donanım seri portu varDoğru kartı seç ya da Uno'da SoftwareSerial kullan
SoftwareSerial.h: No such file or directoryESP32 seçili; ESP32 paketinde bu kütüphane yokESP32'nin donanım seri portlarını (Serial2) kullan
'LED_BUILTIN' was not declared in this scopeESP32 Dev Module gibi bazı kart tanımlarında dahili LED sabiti yokPin numarasını doğrudan yaz (birçok DevKit kartında GPIO 2)
'D5' was not declared in this scopeD0–D8 gibi adlar NodeMCU ve Wemos gibi ESP8266 kartlarında ve bazı başka kartlarda tanımlı; Uno'da ve ESP32 Dev Module'de yokUno ve ESP32'de GPIO numarasını yaz ya da doğru kartı seç
'TCCR1A' was not declared in this scopeAVR zamanlayıcı yazmaçlarına doğrudan erişen kod ESP32 için derleniyorESP32'nin LEDC ve zamanlayıcı fonksiyonlarını kullan
WiFi.h: No such file or directory ya da 'WIFI_STA' was not declared in this scopeESP32 kodu Uno için derleniyor; Uno'da Wi-Fi yokAraçlar > Kart menüsünden ESP32 Dev Module seç
'ledcSetup' was not declared in this scopeESP32 paketi 3.x sürümünde, kod 2.x için yazılmışledcAttach() ve pin numarasıyla ledcWrite() kullan
Derlemenin başında 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). gibi bir satır görebilirsin. Bu bir hata değildir; kütüphanenin yazarının ESP32'yi desteklenen kartlar listesine eklemediğini söyler ve kütüphane çoğu zaman yine de çalışır. Asıl dikkat etmen gereken mesaj Multiple libraries were found for "LiquidCrystal_I2C.h" satırıdır: aynı adlı iki kütüphane kuruluysa IDE bunlardan birini seçer ve bu seçim kodunla uyuşmazsa 'class LiquidCrystal_I2C' has no member named 'init' gibi bir hata alırsın. Mesajın altındaki Used ve Not used satırları hangi klasörün kullanıldığını gösterir; kullanmadığın kopyayı libraries klasöründen sil.

ESP32'de derleme hataları

ESP32 geliştirme kartı
ESP32: Arduino IDE ile aynı dilde programlanır, ama farklı bir derleyici ve kart paketiyle derlendiği için Uno'da geçen bazı kodlar burada hata verir.

ESP32 de Arduino diliyle programlanır, ama derleyicisi ve kart paketi farklı olduğu için Uno'da hatasız derlenen bir kod ESP32'de takılabilir. En sık karşılaşılan sebep paket sürümüdür: ESP32 Arduino paketinin 3.x sürümünde PWM fonksiyonları değişti; ledcSetup() ve ledcAttachPin() kaldırıldı, yerlerine kanal numarası yerine pin numarasıyla çalışan ledcAttach() ve ledcWrite() geldi. İnternetteki eski örnekler bu yüzden 'ledcSetup' was not declared in this scope hatası verir; ya kodu yeni fonksiyonlara çevirirsin ya da Kart Yöneticisi'nden 2.0.17 sürümünü kurarsın. İkinci fark derleyici ayarlarıdır. Uno'nun paketi kodu -fpermissive seçeneğiyle derler ve bazı hataları yalnızca uyarıya çevirir; ESP32'de bu seçenek yoktur. Örneğin switch içinde süslü parantez kullanmadan değişken tanımlamak Uno'da derlenirken ESP32'de jump to case label hatası verir. Güncel ESP32 paketleri ayrıca -Werror=return-type ile derler: değer döndürmesi gereken bir fonksiyonda return unutulursa, Derleyici uyarıları ayarı Hiçbiri dışında bir seviyedeyken no return statement in function returning non-void hatası alırsın. 2.x sürümünde ise Derleyici uyarıları Daha fazla ya da Tümü yapıldığında uyarıların çoğu hataya dönüşür. Kartın temel ayarları için ESP32 nedir yazısına göz atabilirsin.

Arduino (C++)
1// ESP32 Arduino paketi 3.x / ESP32 Arduino core 3.x
2const int LED_PIN = 2;        // birçok DevKit kartında dahili LED / onboard LED on many DevKit boards
3const int FREKANS = 5000;     // PWM frekansı 5 kHz / PWM frequency 5 kHz
4const int COZUNURLUK = 8;     // 8 bit: 0-255 arası / 8 bits: range 0-255
5
6int parlaklik(int adim) {
7  return (adim % 32) * 8;     // return unutulursa 3.x'te derleme hatası olabilir / a missing return can fail to compile on 3.x
8}
9
10void setup() {
11  Serial.begin(115200);
12  // eski 2.x kodu / old 2.x code: ledcSetup(0, FREKANS, COZUNURLUK); ledcAttachPin(LED_PIN, 0);
13  ledcAttach(LED_PIN, FREKANS, COZUNURLUK);   // 3.x: kanal otomatik seçilir / channel is picked automatically
14}
15
16void loop() {
17  for (int adim = 0; adim < 32; adim++) {
18    ledcWrite(LED_PIN, parlaklik(adim));      // 3.x: pin numarasıyla yaz / write using the pin number
19    delay(30);
20  }
21  if (Serial.available()) {
22    switch (Serial.read()) {
23      case 'h': {                             // case içinde değişken varsa süslü parantez şart / braces needed if a case declares a variable
24        int deger = ledcRead(LED_PIN);
25        Serial.println(deger);
26        break;
27      }
28      default:
29        break;
30    }
31  }
32}

Raspberry Pi Pico: Arduino IDE ve MicroPython hataları

Pico'yu Arduino IDE ile, yani Earle Philhower'ın arduino-pico paketiyle programlıyorsan derleyici yine GCC'dir ve bu yazıdaki bütün mesajlar aynen geçerlidir. MicroPython'da ise durum farklıdır: kodun önceden bir derleme adımı yoktur; Pico dosyayı açılışta bayt koduna çevirir ve satır satır çalıştırır. Bu yüzden hatalar Thonny'nin alt kısmındaki Shell (Kabuk) penceresinde, Traceback (most recent call last): ile başlayan bir mesajla ortaya çıkar. Bu mesajı sondan başa doğru oku: en alttaki satır hatanın türünü ve açıklamasını, onun üstündeki line 7 gibi ifade de hatanın satırını söyler. Söz dizimi hataları (SyntaxError, IndentationError) program hiç başlamadan bildirilir; diğer hatalar ise program o satıra geldiği anda ortaya çıkar, yani kodun bir süre sorunsuz çalışıp sonra durması mümkündür. MicroPython kurulumu ve ilk adımlar için Raspberry Pi Pico nedir yazısına bakabilirsin.

MicroPython hatasıNe anlama gelir?Çözüm
SyntaxError: invalid syntaxSöz dizimi bozuk: if, while ya da def satırının sonunda iki nokta yok veya parantez kapanmamışSatırın sonuna : ekle, parantezleri say
IndentationError: unexpected indentGirinti tutarsız; boşluk ve sekme karışmışHer blokta 4 boşluk kullan
NameError: name 'led' isn't definedİsim yanlış yazılmış ya da tanımlanmadan kullanılmışBüyük-küçük harfi ve tanımın yerini kontrol et
ImportError: no module named 'ssd1306'Sürücü dosyası Pico'da yokssd1306.py dosyasını Thonny ile Pico'ya kaydet
AttributeError: 'Pin' object has no attribute 'toggel'Nesnede böyle bir fonksiyon yokFonksiyon adını düzelt: toggle()
TypeError: can't convert 'int' object to str implicitlyMetin ile sayı + işaretiyle birleştirilmişstr(sayi) kullan ya da değerleri print'e virgülle ver
OSError: [Errno 5] EIOI2C cihazı cevap vermiyorBağlantıyı, adresi ve SDA ile SCL pinlerini kontrol et
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)

Arduino derleme hataları ve çözümleri tablosu

Hata mesajıSebepÇözüm
exit status 1 / Compilation error: exit status 1Derleme ya da yükleme zincirindeki bir program başarısız olduYukarı kaydır, error: geçen ilk satırı oku
'x' was not declared in this scopeYazım hatası, büyük-küçük harf, kapsam ya da eksik #includeİsmi düzelt, değişkeni global yap, kütüphaneyi ekle
expected ';' before ...Bir önceki satırda noktalı virgül eksikUno'da mesajdaki satırın bir üstüne, ESP32'de o satırın sonuna bak
expected '}' at end of inputKapanmamış süslü parantezOtomatik Biçimlendir (Ctrl+T) ile parantezleri eşleştir
X.h: No such file or directoryKütüphane kurulu değil ya da dosya adı yanlışKütüphane Yöneticisi'nden bağımlılıklarıyla birlikte kur
'X' does not name a type#include eksik, tür adı yanlış ya da fonksiyon dışında komutKütüphaneyi ekle, String ve int yazımına bak, komutu fonksiyona taşı
redefinition of 'void setup()'İki setup() var ya da klasörde fazladan bir .ino dosyası duruyorKodları birleştir, eski dosyayı klasörden çıkar
stray '\342' in programKopyalanan kıvrık tırnak ya da tire, değişken adında Türkçe harfTırnakları yeniden yaz, adlarda İngilizce harf kullan
'class X' has no member named 'y'Fonksiyon adı yanlış ya da kütüphane sürümü farklıKütüphanenin kendi örneklerine bak, doğru sürümü kur
too few arguments to function / too many arguments to functionFonksiyona eksik ya da fazla değer verilmişnote: declared here satırındaki tanımla karşılaştır
lvalue required as left operand of assignmentKarşılaştırma yerine atama: if (digitalRead(2) = HIGH)Karşılaştırmada == kullan
jump to case labelcase içinde süslü parantezsiz değişken tanımı (ESP32'de hata)case bloğunu { } içine al
undefined reference to `yak()'Fonksiyonun yalnızca prototipi var, gövdesi yokFonksiyonu yaz ya da adını düzelt
Sketch too big / text section exceeds available space in boardProgram flaşa sığmıyorKodu küçült, büyük kart seç, ESP32'de Partition Scheme
data section exceeds available space in boardGlobal değişkenler RAM'e sığmıyorF() makrosu, küçük veri türleri, dizileri PROGMEM'e taşı
#error This library only supports boards with ...Kütüphane seçili kartın mimarisini desteklemiyorKartına uygun kütüphaneyi kur ya da kartı değiştir
Derleme hatalarını en aza indirmenin yolu, kodu küçük adımlarla büyütmektir: çalışan bir örnekle başla, her yeni parçayı ekledikten sonra Doğrula'ya bas ve hata aldığında yalnızca son eklediğin birkaç satıra bak. Derleyicinin yakalayamadığı hatalara da dikkat et: if (durum = HIGH) bir değişkenle yazıldığında hatasız derlenir ama karşılaştırma değil atama yaptığı için koşul her zaman doğru çıkar; if (mesafe < 10); satırının sonundaki noktalı virgül de koşulu boşa çıkarır. Derleyici uyarıları ayarını Tümü yaparsan bu tür mantık hatalarının çoğunu uyarı olarak görürsün.

Hatasız kod yazmak için sonraki adımlar

  • Temelleri sağlamlaştır: Arduino programlama temelleri yazısı değişkenleri, kapsamı, fonksiyonları ve döngüleri anlatıyor; bu yazıdaki hataların çoğu bu konulardan doğar.
  • Komutların doğru yazımını öğren: Arduino komutları listesi her komutun söz dizimini ve parametrelerini örneklerle gösteriyor.
  • Kütüphaneleri doğru kur: Arduino kütüphane ekleme rehberi No such file or directory ve Multiple libraries were found mesajlarını ayrıntılı ele alıyor.
  • Kodun çalışırken ne yaptığını gör: Derlenen ama beklediğin gibi çalışmayan kodlarda değişkenleri Seri Monitör ile ekrana yazdırmak en hızlı teşhis yoludur.
  • Kartı bağlamadan dene: Wokwi ya da Tinkercad simülatörlerinde kodunu derleyip devreyle birlikte çalıştırabilirsin.
  • Yapay zekâyla yazılan kodu kontrol et: Sohbet botlarının ürettiği kodlar sık sık eski kütüphane sürümlerine ya da başka bir karta göre yazılmış olur; yapay zekâ ile Arduino kodu yazısı bunları nasıl yakalayacağını anlatıyor.

Derleme hataları ilk bakışta korkutucu görünse de derleyici aslında sana sorunun yerini ve çoğu zaman çözümünü söyler: dosya, satır, sütun ve kısa bir açıklama. İlk hatayı oku, yalnızca onu düzelt, yeniden derle ve bu döngüyü tekrarla; birkaç projeden sonra hataları saniyeler içinde çözdüğünü göreceksin. Kodun derlenip karta yüklendiğinde BlueGrays uygulamasındaki LED, buton, sensör ve ekran projeleriyle devam edebilirsin: Arduino, ESP32 ve Raspberry Pi Pico için her projede devre şeması ve hatasız derlenen kod adım adım hazır.

Sıkça sorulan sorular

Arduino exit status 1 hatası nedir, nasıl düzeltilir?

exit status 1, derleme ya da yükleme sırasında çalışan programlardan birinin hatayla kapandığını söyleyen genel bir mesajdır ve sebebi kendisi söylemez. Çıktı panelini yukarı kaydır ve error: kelimesi geçen ilk satırı bul; dosya adı, satır numarası ve açıklama oradadır. O hatayı düzeltip yeniden derlediğinde exit status 1 de kaybolur.

Arduino 'was not declared in this scope' hatası ne demek?

Derleyicinin kullandığın bir değişkeni, fonksiyonu ya da sabiti o noktada tanımadığı anlamına gelir. En sık sebepler büyük-küçük harf hatası (digitalwrite), başka bir fonksiyonun içinde tanımlanmış bir değişken ve eklenmemiş bir kütüphanedir. Yazımı kontrol etmek ve ortak değişkenleri bütün fonksiyonların dışında tanımlamak çoğu zaman yeter.

Arduino "expected ';' before" hatası nasıl çözülür?

Bu hata bir noktalı virgülün eksik olduğunu söyler. Uno'nun derleyicisi bunu ancak sonraki kelimeyi okuyunca fark ettiği için mesajdaki satır genellikle bir alttadır; noktalı virgülü gösterilen satırın hemen üstündeki satırın sonuna ekle. ESP32 ve Pico'da ise mesaj doğrudan noktalı virgülün eksik olduğu satırı gösterir. for döngüsünün parantezinde noktalı virgül yerine virgül kullanmak da aynı mesajı verir.

'does not name a type' hatası neden çıkar?

Derleyici satırın başında bir veri türü bekler ama yazdığın kelimeyi tanımaz. Kütüphanenin #include satırını unutmak (örneğin Servo), String yerine string yazmak ve fonksiyonların dışına aci = 90; gibi tek başına bir atama yazmak en yaygın üç sebeptir. Arduino'da kendi struct türünü kullanıyorsan onu ilk fonksiyondan önce tanımla.

Arduino 'Sketch too big' hatası nasıl giderilir?

Bu mesaj programın kartın flaş belleğine sığmadığını söyler; Uno'da üst sınır 32256 bayttır. Kullanmadığın kütüphaneleri ve hata ayıklama satırlarını çıkar, büyük sabit dizileri PROGMEM'e taşı ya da Mega veya ESP32 gibi daha büyük belleği olan bir karta geç. ESP32'de Partition Scheme menüsünden Huge APP seçmek program alanını yaklaşık 3 MB'a çıkarır.

Kodum derleniyor ama karta yüklenmiyor, neden?

Derleme başarılıysa çıktıda programın kaç bayt kapladığını gösteren Sketch uses satırını görürsün; bundan sonra çıkan hatalar yükleme aşamasına aittir ve kodla değil kablo, sürücü, port ya da kart seçimiyle ilgilidir. avrdude ile başlayan satırlar Uno ve Nano'da, esptool satırları ESP32'de yükleme sorununa işaret eder. Bu durumda Arduino kod yüklenmiyor rehberindeki adımları sırayla uygula.

Tüm projeleri gör
Led Yakma
#1Başlangıç

Led Yakma

Elektroniğin ilk merhabası: tek bir LED'i yakıp söndürmek. Arduino LED'i çok kısa aralıklarla yakıp söndürür, ışık hızlı hızlı göz kırpar. Kartın bir ışığı nasıl yönettiğini en sade haliyle görür, son

4.6(179)
977
Buton İle Led Yakma (Push)
#9Başlangıç

Buton İle Led Yakma (Push)

Kapı zili gibi: bastığın sürece ışık yanar, bırakınca söner. Arduino butonu sürekli dinler; butona basılıyken LED'i yakar, elini çektiğin an söndürür. Kartın dışarıdan gelen bir dokunuşu nasıl hissett

4.9(112)
197
HC-SR04 Mesafe Ölçme (Serial Ekran)
#27Başlangıç

HC-SR04 Mesafe Ölçme (Serial Ekran)

Yarasalar karanlıkta yollarını nasıl buluyorsa HC-SR04 sensörü de öyle çalışır: duyamadığın bir ses gönderir, yankısını dinler ve önündeki cismin ne kadar uzakta olduğunu ölçer. Arduino bu mesafeyi sa

4.6(45)
68
DHT11 İle Sıcaklık Ve Nem
#55Orta

DHT11 İle Sıcaklık Ve Nem

Odan kaç derece, hava nemli mi, kuru mu? DHT11 sensörü sıcaklığı ve nemi ölçer, Arduino da bu değerleri iki satırlık LCD ekrana yazar ve birkaç saniyede bir yeniler. Sensöre bir şey olursa ekranda hat

4.7(47)
64
ESP32 ile LED Yakma
#103Başlangıç

ESP32 ile LED Yakma

ESP32 ile temel GPIO çıkışı kullanımını öğretir. Bir LED'i dijital pinden açıp kapatarak yanıp sönme efekti elde ederiz. Arduino UNO'daki klasik blink projesinin ESP32 versiyonu; Arduino ortamındaki temel blink komutları aynıdır, ancak ESP32'nin pin yerleşimi ve 3,3 V GPIO seviyeleri Arduino UNO'dan farklıdır.

4.7(36)
96
Raspberry Pi Pico Dahili LED Yakma (GP25 Onboard LED)
#147Başlangıç

Raspberry Pi Pico Dahili LED Yakma (GP25 Onboard LED)

Raspberry Pi Pico serisinin açılış projesi! Pico'nun üzerindeki dahili LED'i (GP25 pinine bağlı yeşil LED) yakıp söndürerek kartın çalıştığını doğruluyoruz — klasik "Hello World" tarzı ilk deney. Harici bileşene ihtiyaç YOK, sadece Pico ve USB kablosu yeterli. Kod **MicroPython** ile yazıldı (Raspberry Pi Vakfı'nın resmi olarak desteklediği dil). Thonny IDE ile Pico'yu programlarken `machine.Pin` sınıfı, `Pin.OUT` mode, `led.on()/off()` metodları ve `time.sleep()` fonksiyonlarını kavrarsın. Seri

5.0(1)
9
I2C İle LCD Ekran Kullanımı
#32Başlangıç
Premium

I2C İle LCD Ekran Kullanımı

Arduino'ya kendi ekranını kazandır ve ilk mesajını yazdır. İki satırlık LCD ekran yalnızca birkaç kabloyla bağlanır; önce üst satıra bir selam, ardından alt satıra ikinci bir yazı gelir, ekran temizle

4.8(53)
70
Servo Motor Kullanım
#35Başlangıç
Premium

Servo Motor Kullanım

Küçük bir servo motorun kolu sırayla üç konuma döner: en başa, tam ortaya ve en sona, her durakta iki saniye bekleyerek. Arduino motora hangi açıda durması gerektiğini söyler, motor da oraya gidip ora

4.7(48)
67