Gomulu Sistemler 2 dakika okuma

ESP32 Nedir? Mimari, GPIO, ADC, PWM, Wi-Fi ve Gerçek Projelerde Kullanımı

ESP32'nin mimarisinden GPIO, ADC ve PWM kullanımına, Wi-Fi ile MQTT üzerinden veri göndermeye kadar uçtan uca, örnek kodlu bir ESP32 rehberi.

E
Emre Cihan
· · 22 görüntüleme

ESP32 Nedir?

ESP32, Espressif Systems tarafından üretilen, Wi-Fi ve Bluetooth Low Energy (BLE) desteği entegre gelen düşük maliyetli bir mikrodenetleyicidir. Tek bir chip üzerinde hem işlem gücü hem de kablosuz haberleşme sunduğu için, IoT projelerinde en çok tercih edilen platformlardan biri haline geldi.

Popüler olmasının temel sebebi şu: STM32 gibi bir mikrodenetleyici + ayrı bir Wi-Fi modülü almak yerine, tek bir kart üzerinde ikisini birden bulabiliyorsun. Bu da hem maliyeti hem de devre karmaşıklığını ciddi şekilde azaltıyor.

Mimari: İçeride Ne Var?

ESP32'nin standart versiyonu (ESP32-D0WDQ6) şu özelliklere sahip:

  • Dual-core Xtensa LX6, 240 MHz'e kadar çalışabilir
  • 520 KB SRAM, harici SPI flash ile 4MB'tan başlayan program belleği
  • Wi-Fi 802.11 b/g/n ve Bluetooth 4.2 (Classic + BLE)
  • 34 adet GPIO pini, bunların bir kısmı ADC/DAC/dokunmatik sensör olarak da kullanılabilir
  • Donanımsal şifreleme birimleri (AES, SHA, RSA) — güvenli IoT iletişimi için

Dual-core olması önemli bir detay: genelde bir çekirdek Wi-Fi/BLE stack'ini (protokol yığınını) yönetirken, diğer çekirdek senin uygulama kodunu çalıştırır. Bu sayede Wi-Fi bağlantısı kurulurken bile sensör okuma gibi işler kesintiye uğramaz.

GPIO Kullanımı

ESP32'de GPIO pinleri dijital giriş/çıkış için kullanılır. Arduino IDE ile basit bir örnek:

#define LED_PIN 2

void setup() {
  pinMode(LED_PIN, OUTPUT);
}

void loop() {
  digitalWrite(LED_PIN, HIGH);
  delay(500);
  digitalWrite(LED_PIN, LOW);
  delay(500);
}

Dikkat edilmesi gereken önemli bir nokta: GPIO 6-11 arası pinler dahili SPI flash'a bağlı olduğu için genel amaçlı kullanılmamalı. GPIO 34-39 ise sadece giriş olarak çalışır, dahili pull-up/pull-down direnci yoktur.

ADC: Analog Okumanın İncelikleri

ESP32'nin 12-bit çözünürlüklü ADC'si var (0-4095 arası değer), ancak burada bilinmesi gereken önemli bir sınırlama var: ESP32'nin ADC'si doğrusal değil, özellikle 0-0.1V ve 3.2-3.3V aralıklarında sapma gösteriyor. Hassas ölçüm gerektiren projelerde (örneğin bir enerji izleme sisteminde) mutlaka kalibrasyon yapman gerekiyor.

#define SENSOR_PIN 34

void setup() {
  Serial.begin(115200);
  analogSetAttenuation(ADC_11db); // 0-3.3V aralığı için
}

void loop() {
  int raw = analogRead(SENSOR_PIN);
  float voltage = (raw / 4095.0) * 3.3;
  Serial.println(voltage);
  delay(1000);
}

PWM (LEDC) ile Motor/LED Kontrolü

ESP32'de klasik analogWrite() yerine LEDC (LED Control) çevre birimi kullanılıyor. Bu, aslında genel amaçlı bir PWM üretecidir, sadece LED değil motor sürücü, servo kontrol gibi işlerde de kullanılır:

#define PWM_PIN     5
#define PWM_CHANNEL 0
#define PWM_FREQ    5000
#define PWM_RES     8  // 8-bit: 0-255

void setup() {
  ledcSetup(PWM_CHANNEL, PWM_FREQ, PWM_RES);
  ledcAttachPin(PWM_PIN, PWM_CHANNEL);
}

void loop() {
  for (int duty = 0; duty <= 255; duty++) {
    ledcWrite(PWM_CHANNEL, duty);
    delay(10);
  }
}

Wi-Fi: Station ve AP Modu

ESP32 iki temel Wi-Fi modunda çalışabilir: Station (STA) modunda mevcut bir ağa bağlanır, Access Point (AP) modunda kendisi bir ağ yayınlar. Basit bir web sunucusu örneği:

#include <WiFi.h>
#include <WebServer.h>

const char* ssid = "AgAdiniz";
const char* password = "SifreNiz";
WebServer server(80);

void setup() {
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) delay(500);

  server.on("/", []() {
    server.send(200, "text/plain", "ESP32 calisiyor!");
  });
  server.begin();
}

void loop() {
  server.handleClient();
}

MQTT ile Sensör Verisi Gönderme

Gerçek bir IoT projesinde genelde ESP32'nin topladığı veriyi bir MQTT broker'a (örneğin Mosquitto) göndermesi gerekir. PubSubClient kütüphanesiyle basit bir örnek:

#include <WiFi.h>
#include <PubSubClient.h>

WiFiClient espClient;
PubSubClient client(espClient);

void setup() {
  WiFi.begin("AgAdiniz", "SifreNiz");
  while (WiFi.status() != WL_CONNECTED) delay(500);

  client.setServer("broker-ip-adresi", 1883);
  while (!client.connected()) {
    client.connect("esp32-sensor-1");
    delay(1000);
  }
}

void loop() {
  float sicaklik = 24.5; // sensörden okunan değer
  char payload[10];
  dtostrf(sicaklik, 4, 1, payload);
  client.publish("ev/oda1/sicaklik", payload);
  delay(5000);
}

Gerçek Projede Kullanım

Bu parçaları bir araya getirdiğinde ortaya IoT Energy Monitor gibi bir sistem çıkıyor: ESP32, bir akım sensöründen (örneğin ACS712 veya SCT-013) ADC üzerinden veri okur, bu veriyi belirli aralıklarla MQTT üzerinden bir broker'a gönderir, broker'a bağlı bir dashboard (Node-RED, Home Assistant vb.) da bu veriyi görselleştirir.

Bu mimarinin güzelliği, her parçanın (sensör okuma, iletişim, görselleştirme) birbirinden bağımsız olması — MQTT sayesinde ESP32'nin kendisi hiçbir zaman veritabanına veya dashboard'a doğrudan bağlanmak zorunda kalmıyor, sadece bir konuya (topic) yayın yapıyor.

Özet

ESP32'yi güçlü kılan şey, tek bir chip üzerinde hesaplama gücü + kablosuz iletişimi bir araya getirmesi. GPIO, ADC ve PWM temel giriş/çıkış ihtiyaçlarını karşılarken, Wi-Fi ve MQTT ile de cihazını gerçek dünyaya bağlayabiliyorsun. Bir sonraki adım olarak, düşük güç tüketimi gerektiren projelerde deep sleep modlarını ve BLE kullanımını incelemeni öneririm.

ESP32 LEDC/PWM Çalışmıyor mu? Yaygın Sorunlar ve Çözümleri

PWM çıkışı beklendiği gibi çalışmıyorsa, sırasıyla şu noktaları kontrol et:

  • Kanal çakışması: Aynı ledcSetup() kanalını iki farklı pinde kullanmaya çalışıyor olabilirsin. ESP32'de her PWM kanalı tek bir pine atanmalı; aynı kanalı ikinci bir pine bağlamaya çalışırsan ilk pin sinyali kaybeder.
  • Frekans/çözünürlük uyumsuzluğu: Yüksek çözünürlük (ledcSetup(kanal, frekans, 16) gibi 16-bit) ile yüksek frekansı birlikte istemek donanımsal olarak mümkün değil — ESP32'nin PWM zamanlayıcısı bu ikisi arasında bir denge kurmak zorunda. Frekansı düşürüp çözünürlüğü koruyabilir, ya da tam tersini yapabilirsin.
  • Yanlış pin seçimi: GPIO 34-39 sadece giriş olarak çalışır, bu pinlerden PWM çıkışı almak mümkün değil. PWM için çıkış destekleyen bir GPIO (örneğin 2, 4, 5, 12-19, 21-23 gibi) seçtiğinden emin ol.
  • ledcAttachPin() çağrısını unutmak: ledcSetup() sadece kanalı yapılandırır, pini fiilen o kanala bağlamaz — ledcAttachPin(pin, kanal) çağrısı atlanırsa pinde hiçbir sinyal çıkmaz.
  • Kütüphane sürüm farkı: ESP32 Arduino core'un yeni sürümlerinde (3.x) LEDC API'si değişti — ledcSetup/ledcAttachPin yerine doğrudan ledcAttach(pin, frekans, çözünürlük) kullanılıyor. Eski kod yeni core ile derlenirken hata veriyorsa, kurulu core sürümünü kontrol et.

Bu beş noktayı sırayla elediğinde, PWM sorunlarının büyük çoğunluğu çözülüyor — sorun genelde donanımsal değil, kanal/pin eşleştirmesindeki küçük bir tutarsızlıktan kaynaklanıyor.

Paylaş: Twitter / X
E
Emre Cihan
Sistem Yöneticisi · Maker · Elektronik Meraklısı

İlgili yazılar

Gomulu Sistemler
STM32 Nedir? ESP32'den Farkı ve Ne Zaman Tercih Edilmeli
4 dk
Gomulu Sistemler
I2C Nedir? Çoklu Sensör Bağlantısında Neden Tercih Edilir?
4 dk
Gomulu Sistemler
RS485 Nedir? Endüstriyel Haberleşmede Neden Hâlâ Kullanılıyor?
4 dk
Gomulu Sistemler
MQTT Nedir? IoT Projelerinde Neden Bu Kadar Popüler?
4 dk