Arduino "was not declared in this scope" hatası, derleyicinin kullandığın değişken veya fonksiyon adını o satırdaki kapsam içinde tanımadığı anlamına gelir. Çözüm için önce adın yazımını ve büyük küçük harflerini, ardından bildirimin bulunup bulunmadığını, süslü parantezlerin oluşturduğu kapsamı ve tanımın kullanımdan önce görünür olup olmadığını kontrol et.
Bu hata, çoğunlukla sensör değerinden veya kart bağlantısından değil, kodun belirli bir noktada hangi adı görebildiğinden kaynaklanır. Derleyici bir ismi tanımıyorsa önce değerin yanlış olup olmadığını değil, adın o satırda görünür olup olmadığını kontrol et.
Arduino "was not declared in this scope" Hatası Ne Anlama Gelir?

Derleyici bir değişkeni ya da fonksiyonu kullanıldığı satırda tanımıyorsa bu hatayı verir. Bunun ilk nedeni yazım hatasıdır. C++ tabanlı Arduino kodlarında büyük ve küçük harfler farklı kabul edilir. Bu nedenle ledPin ile ledpin, sensorValue ile sensorvalue aynı ad değildir.
Aşağıdaki örnekte değişken tanımlanmış olsa da kullanım sırasında farklı yazıldığı için hata oluşur:
int sensorValue = 42;
void setup() {
Serial.begin(9600);
Serial.println(sensorvalue);
}
void loop() {
}
Buradaki sensorvalue ifadesini sensorValue olarak düzeltirsen derleyici doğru bildirimi bulabilir:
int sensorValue = 42;
void setup() {
Serial.begin(9600);
Serial.println(sensorValue);
}
void loop() {
}
Düzeltilmiş kod çalıştığında seri çıktıda 42 değerini görürsün. Aynı kontrolü fonksiyon adlarında da yapmalısın. Bir fonksiyonun bildirimi bulunmuyorsa veya kullanım noktasında görünür değilse benzer hata oluşabilir. Değişken ya da fonksiyon bildiriminin, kullanıldığı noktaya göre görünür olması gerekir.
İlk teşhis sırasını şu şekilde kurabilirsin: Önce adın her yerde aynı yazıldığını kontrol et. Sonra ilgili değişken veya fonksiyonun gerçekten bildirildiğine bak. Ardından süslü parantezlerin bu adı başka bir kapsamın içine kapatıp kapatmadığını ve bildirimin kullanımdan önce görünüp görünmediğini incele.
Global ve Yerel Değişkenlerde Kapsam Nasıl Çalışır?
Kapsam, bir değişkenin veya fonksiyonun kodun hangi bölümünde kullanılabileceğini belirler. Fonksiyonların dışında tanımlanan bir değişken daha geniş, dosya kapsamına sahip olabilir. Fonksiyonun ya da süslü parantezlerle çevrili bir bloğun içinde tanımlanan değişken ise yereldir ve yalnızca o bölümde kullanılabilir.
Örneğin setup() içinde tanımlanan bir değişken, setup() tamamlandıktan sonra loop() içinde görünmez. Benzer şekilde bir if bloğunun içinde tanımlanan ad, kapanan süslü parantezden sonra kullanılamaz. Süslü parantezleri yalnızca kodu düzenleyen işaretler olarak değil, kapsam sınırı oluşturan yapılar olarak düşünmelisin.
İç blokta dışarıdakiyle aynı ada sahip yeni bir değişken tanımlanırsa, o blok içinde daha dar kapsamlı olan bildirim kullanılır. Blok sona erdiğinde dışarıdaki değişken yeniden görünür. Bu durum her zaman derleme hatası oluşturmaz, ancak hangi değerin kullanıldığını karıştırabilir. Aynı adı farklı kapsam düzeylerinde tekrar kullanmak yerine açıklayıcı ve farklı adlar seçmek teşhisi kolaylaştırır.
Global değişkeni her hatada çözüm olarak kullanmak doğru değildir. Değer yalnızca tek bir fonksiyonda kullanılacaksa en dar uygun kapsamda yerel tutulması daha anlaşılır olabilir. Başka bir fonksiyonun bu değere ihtiyacı varsa değeri parametre olarak geçirebilir, hesaplanan sonucu da dönüş değeriyle geri alabilirsin. Birden fazla fonksiyonun gerçekten paylaşması gereken veri varsa global değişken bilinçli bir tasarım tercihi olarak kullanılabilir.
Fonksiyon Prototipi ve Sketch Sekmeleri Nasıl Kontrol Edilir?

Bir fonksiyon çağrısında bu hata görünüyorsa derleyici, adı kullanım noktasında tanımıyordur. Fonksiyon adının doğru yazıldığını, tanımın bulunduğunu, doğru süslü parantez kapsamında olduğunu ve çağrıdan önce görünür hâle geldiğini kontrol et.
Fonksiyon prototipi, fonksiyonun nasıl çağrılacağını gövde olmadan bildirir. Örneğin void showValue(int value); bir prototiptir. Fonksiyon tanımı ise aynı bildirime ek olarak süslü parantezler arasındaki çalışma kodunu içerir. Dönüş türü, fonksiyon adı, parametre türleri ve parametre sırası prototiple uyumlu olmalıdır.
İki güvenli yaklaşım kullanabilirsin: Fonksiyon tanımını çağrıdan önce taşıyabilir veya eşleşen prototipi çağrıdan önce yazabilirsin. Arduino'nun resmî sketch derleme süreci belgesine göre aynı sketch klasöründeki .ino dosyaları, ana dosyadan başlanıp diğerleri alfabetik sırayla eklenerek tek C++ kaynağına dönüştürülür. .ino dosyaları için otomatik prototip üretilebilse de .h dosyaları kendiliğinden eklenmez ve .cpp dosyaları aynı ön işlemden geçmez. Bu nedenle sekmelerin yan yana görünmesi, her adın çağrı noktasında görünür olduğu anlamına gelmez.
- Fonksiyon tanımının gerçekten aynı sketch klasöründe bulunduğunu doğrula.
- Dosyanın amacına göre
.ino,.hveya.cppuzantısını kontrol et. - Ayrı dosya düzeninde bildirimi
.hdosyasına, tanımı.cppdosyasına koy ve başlık dosyasını çağıran yerde ekle. - Aynı fonksiyonun yinelenen, eksik veya büyük küçük harf farkıyla yazılmış tanımlarını ara.
Bozuk Koddan Çalışan Koda: Adım Adım Teşhis
Aşağıdaki sketch iki farklı ad tanıma sorunu içerir. sensorValue yalnızca setup() içinde tanımlanmıştır, çağrıda ise farklı büyük küçük harf düzeniyle yazılmıştır.
void setup() {
int sensorValue = 42;
showValue(sensorvalue);
}
void loop() {
}
void showValue(int value) {
sensorValue = value;
}
sensorvalue ile sensorValue aynı ad değildir. Ayrıca setup() içindeki yerel değişkenin kapsamı, bu fonksiyonun süslü parantezleriyle sınırlıdır. Bu yüzden showValue() içinden doğrudan kullanılamaz. İlk sketch, was not declared in this scope türünde ad tanıma hataları nedeniyle derlenmez.
Düzeltilmiş sürümde prototip çağrıdan önce yer alır, değişken adı doğru yazılır ve değer fonksiyona parametreyle aktarılır:
void showValue(int value);
void setup() {
int sensorValue = 42;
showValue(sensorValue);
}
void loop() {
}
void showValue(int value) {
if (value > 0) {
return;
}
}
Bu sketch derleme hatası vermez. Donanımsal bir işlem yapmaz, yalnızca doğru isimlendirme, görünür bildirim ve parametreyle değer aktarma düzenini gösterir.
Kısa teşhis akışı
- Hata satırındaki adı karakter karakter karşılaştır.
- Değişkenin veya fonksiyonun tanım satırını bul.
- Süslü parantezleri izleyerek kapsamı belirle.
- Prototipi veya tanımı kullanımın önüne al.
- Sketch sekmelerini, uzantıları ve dosya düzenini kontrol et.
- Tek bir değişiklik yapıp yeniden derle.
Evet veya hayır kontrol listesi
- Ad, büyük küçük harfler dâhil tamamen aynı mı?
- Tanım doğru süslü parantez kapsamında mı?
- Bildirim çağrıdan önce görünür mü?
- Gerekli başlık dosyası eklenmiş mi?
- Dosya doğru sketch klasöründe ve doğru uzantıda mı?
- Son değişiklikten sonra yeniden derleme yaptın mı?
Sık Sorulan Sorular
Bir değişkeni global yapmak bu hatayı her zaman çözer mi?
Hayır. Global değişken kapsam sorununu bazı durumlarda giderebilir ancak yazım hatasını, eksik fonksiyon bildirimini veya yanlış dosya düzenini düzeltmez. Değere yalnızca belirli bir fonksiyon ihtiyaç duyuyorsa parametreyle aktarmak daha kontrollü bir seçenektir.
Fonksiyon prototipi ile fonksiyon tanımı arasındaki fark nedir?
Prototip, fonksiyonun dönüş türünü, adını ve parametrelerini bildirir ve noktalı virgülle biter. Tanım ise bunlara ek olarak fonksiyonun çalıştıracağı kod gövdesini içerir.
Başka bir Arduino sketch sekmesindeki tanım neden görünmeyebilir?
Dosya aynı sketch klasöründe olmayabilir, uzantısı beklenenden farklı olabilir veya bildirim kullanım noktasına ulaşmıyor olabilir. Özellikle .h ve .cpp dosyalarında gerekli başlık ekleme düzenini kurmalı, adları birebir eşleştirmelisin.
Bu hatayı çözerken adı karşılaştırmak, kapsamı süslü parantezlerle izlemek ve bildirimi kullanımdan önce görünür kılmak genellikle doğru sorun noktasını bulmanı sağlar.