Nesnelerin İnterneti (IoT) projelerinde, akıllı tarım uygulamalarında veya endüstriyel otomasyon sistemlerinde çevremizdeki fiziksel dünyayı mikrodenetleyicilerle anlamlandırabilmek için analog büyüklükleri (sıcaklık, ışık, basınç, voltaj vb.) dijital verilere dönüştürmemiz gerekir. ESP32 Analogtan Dijitale Çevirici (ADC – Analog to Digital Converter) birimi; harici sensörlerden veya potansiyometrelerden gelen değişken voltaj sinyallerini yüksek çözünürlüklü dijital değerlere dönüştüren güçlü bir donanımdır. Bu rehberimizde, ESP32’nin dahili 12-bit SAR ADC mimarisini, giriş zayıflatma (attenuation) ayarlarını, doğrusal olmama (non-linearity) karakteristiğini, Wi-Fi ile ADC2 çatışmasını ve kararlı analog ölçümler yapabilmek için yazılımsal aşırı örnekleme (oversampling) filtreleme tekniklerini derinlemesine inceleyeceğiz.

Arduino Core kütüphanesi kullanan ESP32 projelerinde, analog verileri okumak için ilgili GPIO numarasını parametre olarak alan dahili analogRead(GPIO) fonksiyonu kullanılır. Bu fonksiyon, pindeki anlık voltaj değerine karşılık gelen dijital bir sayı üretir.
ESP32 ADC Mimarisi ve Çalışma Prensibi
ESP32 entegresi bünyesinde iki adet bağımsız 12-bit SAR (Successive Approximation Register – Ardışık Yaklaşımlı Kaydedici) ADC modülü bulundurur. Bu modüller toplamda 18 kanala kadar analog sinyal okuma kapasitesine sahiptir. SAR ADC teknolojisi, analog giriş voltajını dahili bir referans voltajıyla karşılaştırmak için ikili arama (binary search) algoritmasına benzer bir çalışma yöntemi kullanır. Dahili DAC (Dijitalden Analoga Çevirici) ve karşılaştırıcı (comparator) yardımıyla pindeki voltaj seviyesi adım adım yaklaşılarak 12 çevrimde tamamen çözümlenir.
12-bit çözünürlük sayesinde, analog bir girişten okunan voltaj değeri
farklı seviyede dijitalleştirilir. Varsayılan zayıflatma (
) ayarında, pindeki
ile
arasındaki voltaj aralığı şu şekilde eşlenir:
![]()
Burada
, uygulanan zayıflatma miktarına bağlı olan maksimum ölçüm sınırıdır. Okunan dijital değer
ise pinde tam
,
ise maksimum ölçüm limiti olan voltaj seviyesi (örn.
) mevcut demektir.

ESP32 ADC Doğrusal Olmama (Non-Linearity) Problemi
Teorik olarak bir ADC biriminden doğrusal (linear) bir tepki eğrisi beklenir; yani giriş voltajındaki her doğrusal artışın, dijital çıkışta da aynı oranda artışa yol açması gerekir. Ancak ESP32 SoC üzerindeki SAR ADC donanımı tam olarak doğrusal çalışmaz. Eğrinin alt (
) ve üst (
) limitlerinde “ölü bölgeler” (dead zones) mevcuttur. Bu durumun grafiği aşağıdaki gibidir:

Bu konudaki donanımsal kısıtlamaları ve geliştiricilerin paylaştığı çözüm önerilerini detaylıca incelemek isterseniz ESP32 ADC Linearity Issue on GitHub başlığı altındaki tartışmalara göz atabilirsiniz.
Mühendislik Çözümleri: ESP32 ADC’nin bu karakteristik yapısından dolayı,
ile
arasındaki fark algılanamaz ve her iki değer için de
çıkışı üretilir. Benzer şekilde,
ile
arasında da hep
değeri okunur. Yüksek hassasiyet gerektiren endüstriyel sensör projelerinde bu sorunu aşmak amacıyla şu yöntemler uygulanır:
- Dahili kalibrasyon eFuse değerlerini (fabrikada yazılan
) kullanan esp_adc_calkütüphanesi ile yazılımsal düzeltme tablosu (look-up table) uygulamak. - Dış dünyadaki voltaj sınırlarını donanımsal gerilim bölücüler veya op-amp sinyal koşullandırıcılar yardımıyla ADC’nin doğrusal olduğu
aralığına sıkıştırmak. - Çok yüksek hassasiyet durumunda I2C veri yolu üzerinden çalışan harici bir ADS1115 (16-bit) gibi yüksek çözünürlüklü delta-sigma ADC entegresi kullanmak.
analogRead() Fonksiyonu ve Donanım Kanalları
Arduino IDE ortamında analog girişleri okumak son derece basittir. Sadece ilgili GPIO numarasını argüman olarak iletmeniz yeterlidir:
analogRead(GPIO);ESP32 çipinde yer alan ADC modülleri ikiye ayrılır:
- ADC1 (8 Kanal): GPIO 32, GPIO 33, GPIO 34, GPIO 35, GPIO 36, GPIO 37, GPIO 38 ve GPIO 39 pinlerine bağlıdır.
- ADC2 (10 Kanal): GPIO 0, GPIO 2, GPIO 4, GPIO 12, GPIO 13, GPIO 14, GPIO 15, GPIO 25, GPIO 26 ve GPIO 27 pinlerine bağlıdır.
ESP32 DOIT Devkit V1 (30 pinli popüler versiyon) üzerinde bu kanallardan yalnızca 15 adedi dışarıya taşınmıştır. Aşağıdaki pin diyagramında analog giriş olarak kullanılabilen pinler kırmızı çerçeveler ile işaretlenmiştir:

ESP32’nin tüm genel amaçlı giriş/çıkış kısıtlamalarını ve bootstrapping pinlerini detaylıca öğrenmek için kapsamlı hazırladığımız ESP32 Pin Referansı Giriş ve Çıkış Pinleri kılavuzumuzu ziyaret edebilirsiniz.
KRİTİK DONANIM UYARISI (Wi-Fi ve ADC2 Çatışması): ESP32 entegresinde yer alan dahili Wi-Fi sürücüsü, kablosuz sinyal genliklerini ölçmek ve RF katını kalibre etmek için ADC2 modülünü kendi iç kaynaklarıyla ortak kullanır. Bu nedenle, ESP32 üzerinde Wi-Fi aktif olarak çalışırken (bağlantı kurulduğunda veya veri transferi esnasında) ADC2 pinlerinden analog okuma yapılamaz. Eğer Wi-Fi kullanan bir projede analog sensör okumak zorundaysanız mutlaka ADC1 (GPIO 32-39) pinlerini tercih etmelisiniz; aksi takdirde okumalarınız kilitlenecek ya da gürültülü anlamsız değerler dönecektir.
Gelişmiş ADC Kontrol ve Konfigürasyon Fonksiyonları
ESP32 SDK’sı ve Arduino Core, analog çeviriciyi projenizin ihtiyaçlarına göre şekillendirebileceğiniz gelişmiş donanımsal fonksiyonlar sunar:
- analogReadResolution(cozunurluk): ADC okuma çözünürlüğünü bit cinsinden belirler. 9 (0 – 511) ile 12 bit (0 – 4095) arasında ayarlanabilir. Varsayılan değer 12-bit’tir.
- analogSetWidth(genislik): Donanım düzeyinde örnekleme genişliğini belirler.
analogReadResolutionile aynı mantıkta çalışır. - analogSetCycles(dongu): Çevrim başına donanımsal örnekleme döngü sayısını ayarlar. Varsayılan 8’dir. 1 ile 255 arasında bir değere ayarlanarak gürültü karakteristiği optimize edilebilir.
- analogSetSamples(ornek_sayisi): ADC donanımında tek bir okuma esnasında arka planda yapılacak örnekleme adetini belirler. Hassasiyeti artırmada etkilidir.
- analogSetClockDiv(bolucu): ADC donanım saat frekansı bölücüsünü ayarlar. Varsayılan 1’dir. Örnekleme hızını sınırlayarak empedans uyumsuzluğu gürültülerini engeller.
- analogSetAttenuation(zayiflatma): Tüm ADC giriş kanalları için zayıflatma (voltaj bölücü) kademesini ayarlar. ESP32’nin dahili ADC çekirdeği aslında en fazla yaklaşık
bandında çalışabilir. Zayıflatma ayarı, bu voltajı düşürmek için dahili direnç ağlarını devreye sokar:ADC_0db: Zayıflatma uygulamaz. Giriş gerilimi en fazla
(yaklaşık
limit) olabilir.ADC_2_5db: Giriş sinyali zayıflatılarak maksimum limit yaklaşık
seviyesine taşınır.ADC_6db: Giriş sinyali zayıflatılarak maksimum limit yaklaşık
seviyesine taşınır.ADC_11db: Giriş sinyali zayıflatılarak maksimum limit yaklaşık
(pratikte VDD voltajı olan
ile sınırlıdır) seviyesine taşınır.
- analogSetPinAttenuation(pin, zayiflatma): Genel ayar yerine sadece parametre olarak belirtilen spesifik bir pinin zayıflatma kademesini konfigüre eder.
Uygulama Projesi: Potansiyometre ile Analog Okuma ve Yazılımsal Filtreleme
Bu uygulamamızda, bir potansiyometrenin orta bacağını ESP32’nin ADC1 kanallarından biri olan GPIO 34 pinine bağlayarak analog değer okuyacağız. Ayrıca, ESP32’nin RF gürültülerinden ve elektriksel dalgalanmalardan etkilenen analog okumalarını stabilize etmek amacıyla, ardışık 16 örnek alarak bunları ortalamaya sokan güçlü bir aşırı örnekleme (oversampling / moving average) filtresi uygulayacağız.
Gerekli Malzemeler
- ESP32 Geliştirme Kartı (ESP32 DOIT DEVKIT V1 veya uyumlu bir model)
Lineer Potansiyometre- Breadboard (devre tahtası)
- Bağlantı kabloları
Devre Şeması
Potansiyometrenin sol bacağını ESP32’nin
pinine, sağ bacağını GND pinine ve ayarlanabilir sinyal üreten orta bacağını ise GPIO 34 (ADC1_CH6) pinine bağlıyoruz:

Arduino Proje Kodu
Aşağıdaki kod bloğunda, hem ham (noisy) okuma yapıp hem de çoklu örnekleme kullanarak stabilize edilmiş temiz analog verileri seri port üzerinden bilgisayara aktarıyoruz:
// Potansiyometrenin bağlı olduğu pin (ADC1 kanalı olması kritik)
const int potPin = 34;
// Filtre için örnek sayısı (2'nin kuvveti olması bölme işlemini hızlandırır)
const int ornekSayisi = 16;
void setup() {
Serial.begin(115200);
delay(1000);
// ADC çözünürlüğünü 12-bit olarak konfigüre et (0 - 4095)
analogReadResolution(12);
// Maksimum 3.3V okuyabilmek için 11dB zayıflatma ayarla
analogSetPinAttenuation(potPin, ADC_11db);
Serial.println("ESP32 Kararlı ADC Okuma Uygulaması Başlatıldı...");
}
void loop() {
// Ham tekli okuma (Gürültüye maruz kalabilir)
int hamOkuma = analogRead(potPin);
// Yazılımsal Oversampling / Filtreleme Uygulaması
long toplamDefer = 0;
for (int i = 0; i < ornekSayisi; i++) {
toplamDefer += analogRead(potPin);
delayMicroseconds(50); // ADC örnekleme kapasitörünün şarj olması için ufak bekleme
}
int filtrelenmisOkuma = toplamDefer / ornekSayisi;
// Okunan dijital değeri voltaj karşılığına dönüştür
// 11dB altında pratik maksimum voltaj limitimiz 3.3V
float voltaj = (filtrelenmisOkuma / 4095.0) * 3.3;
// Seri Monitör ve Çizici formatında verileri yazdır
Serial.print("Ham_Deger:");
Serial.print(hamOkuma);
Serial.print("\tFiltreli_Deger:");
Serial.print(filtrelenmisOkuma);
Serial.print("\tHesaplanan_Voltaj:");
Serial.println(voltaj, 3);
delay(200); // 200 ms aralıklarla güncelle
}
Kod yükleme işleminin ardından potansiyometreyi yavaşça çevirerek Seri Monitör veya Seri Çizici (Serial Plotter) ekranlarında gürültünün yazılımsal filtre yardımıyla nasıl sönümlendiğini ve çizginin ne kadar pürüzsüzleştiğini gözlemleyebilirsiniz.

Özetle; ESP32’nin dahili analog modülü, pratik filtreleme teknikleri ve doğru kanal seçimiyle (ADC1) birleştiğinde son derece kararlı ve başarılı ölçümler sunar. Gürültü hassasiyetine dikkat ederek tasarlanan pürüzsüz devreler, projelerinizin doğruluğunu üst seviyeye taşıyacaktır.
Yorum yapma özelliği, forum tarafından gelen istek sebebiyle kapatılmıştır. Lütfen tartışmalar ve sorularınız için topluluk forumumuza katılın.

