ESP32 Nedir?
ESP32, ESP8266’nın halefidir ve hobi elektroniğinde bulabileceğiniz en güçlü mikrodenetleyicilerden biridir. Wi-Fi’ye ek olarak Bluetooth taşır, çift çekirdeklidir ve çok daha fazla çevre birimi sunar.
Arduino IDE ile programlanır; Arduino kodlarının çoğu küçük değişikliklerle çalışır.
Teknik Özellikler
| Özellik | Değer |
|---|---|
| İşlemci | Xtensa LX6 çift çekirdek, 240 MHz |
| Flash bellek | 4 MB (tipik) |
| SRAM | 520 KB |
| Wi-Fi | 802.11 b/g/n, 2,4 GHz |
| Bluetooth | Classic + BLE 4.2 |
| Lojik seviye | 3,3 V |
| GPIO | ~34 (hepsi kullanılabilir değil) |
| ADC | 18 kanal, 12 bit (0–4095) |
| DAC | 2 kanal (GPIO25, GPIO26) |
| Dokunmatik sensör | 10 kanal |
| PWM (LEDC) | 16 kanal |
| Donanımsal seri port | 3 |
| Hall sensörü | Dahili |
Arduino Uno ve ESP8266 ile Karşılaştırma
| Uno | ESP8266 | ESP32 | |
|---|---|---|---|
| Hız | 16 MHz | 80–160 MHz | 240 MHz |
| Çekirdek | 1 | 1 | 2 |
| RAM | 2 KB | 80 KB | 520 KB |
| Wi-Fi | ✘ | ✔ | ✔ |
| Bluetooth | ✘ | ✘ | ✔ |
| Analog giriş | 6 | 1 | 18 |
| DAC | ✘ | ✘ | 2 |
| Lojik | 5 V | 3,3 V | 3,3 V |
ESP8266’ya göre en belirgin kazanımlar: Bluetooth, 18 analog giriş ve çift çekirdek.
Pin Haritası ve Tuzaklar
ESP32’de pin isimleri doğrudan GPIO numaralarıdır — NodeMCU’daki D1/D2 karışıklığı yoktur. Ancak bazı pinlerin özel kısıtları vardır.
Kullanılamayan pinler
| GPIO | Sorun |
|---|---|
| 6, 7, 8, 9, 10, 11 | Dahili SPI flash belleğe bağlı — kesinlikle kullanmayın |
Sadece giriş olan pinler
| GPIO | Not |
|---|---|
| 34, 35, 36 (VP), 39 (VN) | Yalnızca giriş; çıkış veremez, dahili pull-up/pull-down yok |
Bu dört pin analog sensörler için idealdir ama buraya LED bağlayamazsınız.
Boot (strapping) pinleri
| GPIO | Kısıt |
|---|---|
| 0 | Açılışta LOW olursa flash moduna girer (BOOT butonu) |
| 2 | Açılışta LOW olmalı (bazı kartlarda dahili LED) |
| 12 | Açılışta HIGH olursa kart başlamayabilir |
| 15 | Açılışta LOW olmalı |
Röle veya pull-up dirençli bir modül bağlayacaksanız bu pinlerden kaçının.
Güvenli genel amaçlı pinler
GPIO 4, 5, 13, 14, 16, 17, 18, 19, 21, 22, 23, 25, 26, 27, 32, 33
Bu pinler hem giriş hem çıkış olarak sorunsuz kullanılabilir.
Varsayılan protokol pinleri
| Protokol | Pinler |
|---|---|
| I2C | SDA = GPIO21, SCL = GPIO22 |
| SPI (VSPI) | MOSI 23, MISO 19, SCK 18, SS 5 |
| UART0 | TX 1, RX 3 (USB’ye bağlı) |
| UART2 | TX 17, RX 16 |
I2C pinleri değiştirilebilir:
Wire.begin(SDA_PIN, SCL_PIN);ADC Kısıtları — Bilinmesi Şart
ESP32’nin 18 analog girişi vardır ama iki önemli sorunu vardır.
1. ADC2, Wi-Fi ile çakışır
ADC kanalları ikiye ayrılır:
- ADC1: GPIO 32–39 → her zaman çalışır
- ADC2: GPIO 0, 2, 4, 12–15, 25–27 → Wi-Fi açıkken kullanılamaz
Wi-Fi kullanan bir projede analog okuma yapacaksanız mutlaka ADC1 pinlerini (32–39) kullanın. ADC2’den okumaya çalışırsanız fonksiyon hata döndürür veya rastgele değer verir.
2. Doğrusal değildir
ESP32’nin ADC’si özellikle uçlarda doğrusal değildir. 0,1 V’un altında ve 3,1 V’un üzerinde okuma sıkışır.
Hassas ölçüm gerekiyorsa:
- Ölçüm aralığını 0,15 – 2,45 V arasında tutun
- Kalibrasyon tablosu kullanın
- Veya harici bir ADC (ADS1115) tercih edin
const int SENSOR_PIN = 34; // ADC1, sadece giris
void setup() {
Serial.begin(115200);
analogReadResolution(12); // 0 - 4095
analogSetAttenuation(ADC_11db); // 0 - ~3.3 V araligi
}
void loop() {
int ham = analogRead(SENSOR_PIN);
float volt = ham * (3.3 / 4095.0);
Serial.print(ham);
Serial.print(" ");
Serial.print(volt, 3);
Serial.println(" V");
delay(500);
}PWM (LEDC)
ESP32’de analogWrite() yerine LEDC birimi kullanılır. Frekans ve çözünürlük ayarlanabilir olduğu için Arduino’dan daha esnektir.
const int LED_PIN = 5;
const int KANAL = 0;
const int FREKANS = 5000;
const int COZUNURLUK = 12; // 12 bit -> 0-4095
void setup() {
ledcSetup(KANAL, FREKANS, COZUNURLUK);
ledcAttachPin(LED_PIN, KANAL);
}
void loop() {
for (int i = 0; i <= 4095; i += 16) {
ledcWrite(KANAL, i);
delay(5);
}
}16 bağımsız PWM kanalı vardır ve bunlar herhangi bir GPIO’ya atanabilir.
DAC — Gerçek Analog Çıkış
ESP32’nin GPIO25 ve GPIO26 pinlerinde gerçek 8 bit DAC bulunur. PWM’den farklı olarak bu pinler gerçekten ara gerilim değerleri üretir.
dacWrite(25, 128); // yaklasik 1.65 V
dacWrite(25, 255); // yaklasik 3.3 VSes üretimi, referans gerilim ve analog kontrol sinyalleri için kullanılır.
Dokunmatik Pinler
10 GPIO pini kapasitif dokunma algılayabilir. Bir metal parçaya veya iletken banda bağlanan pin, parmak temasında değer düşüşü gösterir.
const int TOUCH_PIN = T0; // GPIO4
void setup() {
Serial.begin(115200);
}
void loop() {
int deger = touchRead(TOUCH_PIN);
Serial.println(deger);
if (deger < 30) { // esik deneyerek bulunur
Serial.println("Dokunuldu!");
}
delay(200);
}Fiziksel buton olmadan dokunmatik panel yapmanın en kolay yoludur.
Çift Çekirdek Kullanımı
ESP32’nin iki çekirdeği vardır ve FreeRTOS üzerinde çalışır. Varsayılan olarak setup() ve loop() Core 1’de çalışır; Core 0 Wi-Fi yığınıyla meşguldür.
Ağır bir işi ayrı çekirdeğe atayabilirsiniz:
TaskHandle_t gorev1;
void agirIs(void *parametre) {
for (;;) {
// Bu kod Core 0'da calisir
Serial.print("Core 0 calisiyor: ");
Serial.println(xPortGetCoreID());
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
}
void setup() {
Serial.begin(115200);
xTaskCreatePinnedToCore(
agirIs, // fonksiyon
"AgirIs", // isim
10000, // yigin boyutu
NULL, // parametre
1, // oncelik
&gorev1, // gorev tanitici
0 // cekirdek numarasi (0)
);
}
void loop() {
Serial.print("Core 1 calisiyor: ");
Serial.println(xPortGetCoreID());
delay(1500);
}Sensör okuma ve ağ iletişimini ayrı çekirdeklere dağıtmak, ikisinin birbirini yavaşlatmasını önler.
Deep Sleep
ESP32’nin uyku modu ESP8266’dan daha esnektir; birden fazla uyandırma kaynağı destekler.
#define uS_TO_S 1000000ULL
#define UYKU_SURESI 30 // saniye
RTC_DATA_ATTR int uyanmaSayisi = 0; // uykuda korunur
void setup() {
Serial.begin(115200);
delay(1000);
uyanmaSayisi++;
Serial.print("Uyanma sayisi: ");
Serial.println(uyanmaSayisi);
// Isinizi burada yapin
esp_sleep_enable_timer_wakeup(UYKU_SURESI * uS_TO_S);
Serial.println("Uykuya geciliyor...");
esp_deep_sleep_start();
}
void loop() {
}RTC_DATA_ATTR ile işaretlenen değişkenler derin uyku boyunca korunur — bu, ESP8266’da olmayan kullanışlı bir özelliktir.
Uyandırma kaynakları: zamanlayıcı, GPIO (ext0/ext1), dokunmatik pin, ULP yardımcı işlemci.
Deep sleep tüketimi yaklaşık 10 µA’dir.
Kart Desteği Ekleme
- Dosya → Tercihler → Ek Kart Yöneticisi URL’leri:
https://espressif.github.io/arduino-esp32/package_esp32_index.json - Araçlar → Kart → Kart Yöneticisi’nden
esp32aratıp kurun. - Araçlar → Kart → ESP32 Arduino → ESP32 Dev Module seçin.
Bazı kartlarda kod yüklerken BOOT butonuna basılı tutmak gerekir. “Connecting…” yazısı görününce butona basın ve yükleme başlayınca bırakın.
Besleme
| Durum | Akım |
|---|---|
| Deep sleep | ~10 µA |
| Boşta (Wi-Fi bağlı) | ~80 mA |
| Wi-Fi tepe | ~500 mA |
ESP8266’dan daha çok akım çeker. En az 1 A verebilen bir kaynak kullanın ve besleme hattına 470–1000 µF kondansatör ekleyin.
Özet
ESP32, çift çekirdekli, Wi-Fi ve Bluetooth taşıyan güçlü bir mikrodenetleyicidir. 18 analog giriş, gerçek DAC, dokunmatik pinler ve esnek uyku modları sunar.
Bu derste şunları öğrendik:
- ESP32’nin ESP8266 ve Uno’ya göre üstünlüklerini
- GPIO 6–11’in kullanılamayacağını, 34–39’un sadece giriş olduğunu
- Boot (strapping) pinlerini ve güvenli pin listesini
- Wi-Fi açıkken ADC2 pinlerinin çalışmadığını
- LEDC ile PWM ve
dacWrite()ile gerçek analog çıkışı - Dokunmatik pin kullanımını
- Çift çekirdeğe görev atamayı ve
RTC_DATA_ATTRile deep sleep’i