1. ünite / 10
ESP32'ye giriş: Uno'dan bağlı karta
Çift çekirdek, 3,3 V mantık, Wi-Fi ve BLE: ESP32'yi Uno ile karşılaştır, pinlerinin kurallarını öğren, ilk kodu Arduino ve MicroPython ile yaz.
Bu ünitenin sonunda
- ESP32 ile Arduino Uno'yu işlemci, bellek, gerilim ve bağlantı açısından karşılaştırmak
- Flash, yalnız-giriş, açılış (strapping) ve ADC2 pinlerinin kısıtlarını açıklamak
- Bir projenin pin planını kısıtlara uyarak yapmak
- Aynı devreyi Arduino çekirdeği ve MicroPython ile programlamak
Ders notları
Uno, bir ATmega328P etrafında kurulu basit ve sağlam bir karttır: 16 MHz, 2 KB RAM, 5 V mantık. Bir sensörü okumak ve bir motoru sürmek için yeterlidir ama tek başına internete çıkamaz. ESP32 ise Wi-Fi ve Bluetooth radyosunu aynı çipe koyar; Nesnelerin İnterneti (IoT) projelerinin en yaygın kalbi olmasının nedeni budur.
Uno ile ESP32 yan yana
- İşlemci: Uno 8 bit, 16 MHz; ESP32 iki çekirdekli 32 bit Xtensa, 240 MHz'e kadar. Bir çekirdek Wi-Fi yığınına, öbürü senin koduna ayrılabilir.
- Bellek: Uno 2 KB RAM ve 32 KB flash; ESP32 yaklaşık 520 KB RAM ve kartta genellikle 4 MB flash.
- Gerilim: Uno 5 V; ESP32 3,3 V. ESP32 pinleri 5 V'a dayanıklı değildir: 5 V'luk bir sensör çıkışı seviye dönüştürücü ya da gerilim bölücü ister.
- ADC: Uno 10 bit (0..1023); ESP32 12 bit (0..4095), iki birim: ADC1 ve ADC2.
- Bağlantı: Uno'da yok; ESP32'de 2,4 GHz Wi-Fi ve Bluetooth (klasik ve BLE).
Pinler: her GPIO her işi yapmaz
ESP32 DevKit üzerinde 30 ya da 38 bacak vardır ama hepsi serbest değildir. Pin planı yapmadan lehim yapmak, "kart açılmıyor" ya da "Wi-Fi açılınca sensör sıfır okuyor" gibi sinsi hatalara yol açar. Bu ünitenin simülasyonu bu kuralları bir checkPin fonksiyonuyla denetler.
- GPIO 6–11: kartın flash belleğine bağlıdır. Dokunursan kod çalışmaz.
- GPIO 34, 35, 36, 39: yalnız giriştir ve iç pull-up/pull-down dirençleri yoktur. Düğme bağlayacaksan dış direnç gerekir.
- Açılış pinleri 0, 2, 5, 12, 15: açılışta düzeyleri önyükleme kipini seçer. GPIO 12 açılışta yüksekse flash gerilimi yanlış seçilir ve kart açılmaz.
- ADC2 (GPIO 0, 2, 4, 12–15, 25–27): Wi-Fi sürücüsü bu birimi kullanır. Wi-Fi açıkken analog okuma için ADC1 pinlerini (32–39) seç.
Arduino çekirdeği mi, MicroPython mı?
Espressif'in Arduino çekirdeği tanıdık setup() / loop() yapısını, WiFi.h ve binlerce kütüphaneyi getirir; derlenmiş C++ hızlıdır ve bellekte küçüktür. MicroPython ise karta bir Python yorumlayıcısı yükler: kodu derlemeden REPL'de satır satır denersin. Bu derste her konu iki dilde de yazılır; ürün kodu için genellikle C++, hızlı deneme için MicroPython seçilir.
Donanımın yoksa Wokwi'de yeni bir ESP32 projesi aç: kart, LED, LDR ve DHT22 sanal olarak bağlanır, Wi-Fi bile benzetilir.
Simülasyon
ESP32 pin planlayıcı
Bir projenin her bağlantısı için pin ve görev seç (çıkış, giriş, ADC, PWM, I²C, DAC, dokunma). Planlayıcı flash pinlerini, yalnız-giriş pinlerini, açılış (strapping) pinlerini ve Wi-Fi açıkken çalışmayan ADC2'yi işaretler.
| Bağlantı | Görev | GPIO | Denetim |
|---|---|---|---|
| DHT22 veri | Uygun | ||
| LDR (ışık) | Uygun | ||
| Toprak nemi | Çalışmaz ADC2 kanalı: Wi-Fi açıkken analogRead çalışmaz. ADC1 (32–39) kullan. | ||
| Pompa rölesi | Uygun | ||
| Pencere servosu | Dikkat GPIO 12 açılışta HIGH ise flash gerilimi 1,8 V seçilir, kart açılmayabilir. | ||
| BME280 / OLED SDA | Uygun | ||
| BME280 / OLED SCL | Uygun |
Kod
// ESP32 DevKit: GPIO 2 kart LED'i, GPIO 34 LDR bölücüsü
const int LED_PIN = 2; // çıkış; açılış pini, LED yalnız sürüş için uygun
const int LDR_PIN = 34; // ADC1_CH6, yalnız giriş, iç pull-up yok
void setup() {
Serial.begin(115200);
pinMode(LED_PIN, OUTPUT);
analogReadResolution(12); // 0..4095
analogSetAttenuation(ADC_11db); // yaklaşık 0..3,1 V ölçüm aralığı
}
void loop() {
int raw = analogRead(LDR_PIN);
float v = raw * 3.1f / 4095.0f; // doğrusal yaklaşım; uçlarda ADC doğrusal değil
digitalWrite(LED_PIN, raw < 1200 ? HIGH : LOW); // karanlıkta LED yanar
Serial.printf("raw=%d V=%.2f\n", raw, v);
delay(500);
}from machine import Pin, ADC
import time
led = Pin(2, Pin.OUT)
ldr = ADC(Pin(34)) # ADC1: Wi-Fi açıkken de çalışır
ldr.atten(ADC.ATTN_11DB) # yaklaşık 0..3,1 V
ldr.width(ADC.WIDTH_12BIT) # 0..4095
while True:
raw = ldr.read()
led.value(1 if raw < 1200 else 0) # karanlıkta yan
print(raw, round(raw * 3.1 / 4095, 2))
time.sleep_ms(500)Kendin dene
Pin planlayıcıda bir sera düğümü planla: LED, LDR (analog), DHT22 (veri), I²C OLED (SDA, SCL) ve bir düğme. Önce LDR'yi GPIO 4'e koy ve Wi-Fi'yi aç: hangi uyarı çıktı? LDR'yi GPIO 34'e taşı. Düğmeyi GPIO 35'e bağlayınca ne söylüyor, neden dış direnç gerekir? Bir LED'i GPIO 12'ye koyup açılış uyarısını oku. Sonra Wokwi'de aynı devreyi kur ve iki kodu da çalıştır.
Sık yapılan hatalar
- ESP32 pinine 5 V sensör çıkışı bağlamak: pin zarar görebilir, seviye dönüştürücü ya da bölücü kullan.
- Wi-Fi açıkken ADC2 pinlerinden analog okumak: değer sabit kalır ya da hata döner.
- GPIO 34–39'a düğme bağlayıp iç pull-up beklemek: bu pinlerde yoktur, giriş havada kalır.
- Flash pinlerine (6–11) ya da açılışta yüksek kalan bir devreyi GPIO 12'ye bağlamak: kart açılmaz.
- ESP32 ADC'sini hassas ölçüm aleti sanmak: uçlarda doğrusal değildir, kalibrasyon gerekir.
Yazılım mühendisliği bağlantısı
Pin planı, donanımın arayüz sözleşmesidir. Onu kodun içine dağıtma; tek bir başlık dosyasında topla.
pins.hiçinde her pin bir sabit olsun ve yanında görevi yazsın. Kart değişince yalnız bu dosya değişir.- Planlayıcıdaki kurallar bir statik denetleyicidir: aynı denetimi derleme öncesi bir betikle (ya da
static_assertile) çalıştırabilirsin. - Uno ve ESP32 için aynı uygulama kodunu yazıp donanım katmanını ayırmak (HAL), ileride kart değiştirmeyi ucuzlatır.
Kendini sına
Wi-Fi açıkken bir LDR'yi analog okumak için hangi pin uygundur?
5 V ile çalışan bir sensörün dijital çıkışını ESP32'ye bağlamak için ne yaparsın?
Kart, GPIO 12'ye bağlı bir devre yüzünden açılmıyor. En olası neden nedir?
MicroPython'un bu derste hızlı deneme için seçilmesinin nedeni nedir?
