Yazılardaki ürünleri komponentci.net'te inceleyebilir, hemen sipariş verebilirsiniz.komponentci.net →
KomponentciBlog Mağaza

ESP32 Deep Sleep: Uyandırma, RTC Belleği ve Pil Ömrü

ESP32 Deep Sleep: Uyandırma, RTC Belleği ve Pil Ömrü
Kısa cevap

ESP32 deep sleep (derin uyku), işlemciyi ve Wi-Fi'ı kapatıp yalnızca RTC bölümünü açık bırakan, çipin tüketimini yaklaşık 10 µA'e indiren bir güç modudur. Kart zamanlayıcıyla ya da bir GPIO pinindeki sinyalle uyanır ve program setup() içinden yeniden başlar. Geliştirme kartlarında regülatör ve LED kayıpları bu kazancın büyük kısmını yok edebilir.

Pille çalışan bir ESP32 projesi, hiçbir önlem alınmazsa bir 18650 pili birkaç günde bitirir. Oysa çoğu sensör projesi zamanının büyük kısmında hiçbir şey yapmaz. Bu yazıda ESP32 deep sleep modunun ne olduğunu, kartın zamanlayıcıyla ve GPIO ile nasıl uyandırıldığını, RTC belleğinde veri saklamayı ve pil ömrünün nasıl hesaplandığını anlatıyoruz. Geliştirme kartında neden beklenen tasarrufun alınamadığını da örnekle gösteriyoruz.

ESP32 deep sleep nedir?

ESP32 deep sleep, işlemci çekirdeklerini, ana belleği, Wi-Fi ve Bluetooth radyosunu kapatıp yalnızca RTC (gerçek zaman) bölümünü çalışır durumda bırakan bir derin uyku modudur. Espressif ESP32 veri sayfasına göre RTC zamanlayıcısı ve RTC belleği açıkken çipin tüketimi yaklaşık 10 µA'dir. Aynı çip Wi-Fi ile veri gönderirken 160-260 mA'e varan tepe akımlar çeker.

Derin uykudan çıkış bir yeniden başlatma gibidir. Ana bellekteki değişkenler silinir, program loop() içinde kaldığı yerden değil, setup() başından çalışır. Bu yüzden deep sleep kullanan programlar genellikle "uyan, ölç, gönder, uyu" düzeninde yazılır ve loop() boş bırakılır.

ESP32 uyku modları arasındaki fark nedir?

ESP32 uyku modları, kapalı tutulan bölümlere ve uyanma süresine göre ayrılır: kapatılan bölüm arttıkça akım düşer, ama uyandıktan sonra hazır olma süresi uzar. Aşağıdaki değerler yalnızca çipe aittir ve Espressif ESP32 veri sayfasından alınmıştır; kart üzerindeki diğer parçalar dahil değildir.

ModAçık kalan bölümlerÇipin tipik tüketimiUyanınca
Aktif (Wi-Fi gönderim)Her şey160-260 mA tepe-
Modem-sleepİşlemci açık, radyo kapalı20-68 mA (saat hızına göre)Program sürer
Light sleepBellek korunur, işlemci duraklatılıryaklaşık 0,8 mAProgram kaldığı yerden sürer
Deep sleepRTC zamanlayıcısı ve RTC belleğiyaklaşık 10 µAsetup() baştan çalışır
HibernationYalnızca RTC zamanlayıcısıyaklaşık 5 µAsetup() baştan çalışır

Ölçümü dakikada bir ya da daha seyrek yapan projeler için deep sleep en uygun seçenektir. Saniyede birkaç kez tepki vermesi gereken projelerde light sleep daha pratik olabilir, çünkü bellek ve Wi-Fi ayarları korunur.

ESP32 zamanlayıcı ile nasıl uyandırılır?

ESP32'yi belirli bir süre sonra uyandırmak için esp_sleep_enable_timer_wakeup() fonksiyonuna süreyi mikrosaniye olarak verip esp_deep_sleep_start() çağırırsınız. Süre 64 bitlik bir sayıdır; 10 dakika 600.000.000 µs eder ve bu değer 32 bitlik bir tamsayıya sığmaz. Çarpımı ULL ekiyle yazmak taşmayı önler.

  • Uyumadan önce Serial.flush() ile seri porttaki son yazıların gönderilmesini bekleyin.
  • RTC zamanlayıcısı hassas bir kristal kullanmaz; uzun uykularda birkaç yüzde sapma olabilir. Saat gerekiyorsa uyanınca NTP ile ya da bir RTC modülüyle eşitleyin.
  • Wi-Fi bağlantısı kurmak ölçümden çok daha uzun sürer; aktif süreyi kısaltmak pil ömrünü en çok etkileyen adımdır.

ESP32 GPIO ile nasıl uyandırılır?

ESP32'yi bir buton ya da sensör sinyaliyle uyandırmak için esp_sleep_enable_ext0_wakeup() ile tek bir pinin seviyesini izletirsiniz. Bu iş yalnızca RTC bölümüne bağlı pinlerle yapılabilir: GPIO 0, 2, 4, 12-15, 25-27 ve 32-39. Örnek devrede buton GPIO33 ile 3,3V arasına bağlanır, GPIO33 ayrıca 10 kΩ dirençle GND'ye çekilir. Butona basılınca pin HIGH olur ve kart uyanır.

Birden fazla pinle uyandırmak için esp_sleep_enable_ext1_wakeup() kullanılır. Bu fonksiyon pinleri bir bit maskesiyle alır. Klasik ESP32'de iki seçenek vardır: pinlerden herhangi biri HIGH olunca (ESP_EXT1_WAKEUP_ANY_HIGH) ya da hepsi LOW olunca (ESP_EXT1_WAKEUP_ALL_LOW) uyanma. GPIO34-39 arasındaki pinlerde dahili pull-up ve pull-down direnci yoktur, bu pinlerde dış direnç şarttır. Dokunmatik pinlerle uyandırma için de esp_sleep_enable_touchpad_wakeup() bulunur.

RTC belleği ile veri nasıl korunur?

Derin uykudan sonra kaybolmaması gereken değişkenler RTC_DATA_ATTR ile işaretlenir; bu değişkenler ESP32'nin 8 KB'lık RTC yavaş belleğinde tutulur. Uyanma sayacı, son ölçüm değeri ya da gönderilemeyen veriler için uygundur. Güç tamamen kesilirse RTC belleği de silinir; kalıcı kayıt için flash bellekteki Preferences kütüphanesini kullanın.

Kartın neden uyandığını esp_sleep_get_wakeup_cause() söyler. Böylece aynı programda zamanlayıcıyla uyanınca ölçüm yapıp, butonla uyanınca örneğin ekranı açabilirsiniz. Aşağıdaki örnek iki uyandırma yöntemini ve RTC sayacını birlikte kullanır:

#define UYKU_SN 600                     // 10 dakika
RTC_DATA_ATTR int uyanmaSayisi = 0;     // uykuda korunur

void setup() {
  Serial.begin(115200);
  uyanmaSayisi++;
  esp_sleep_wakeup_cause_t neden = esp_sleep_get_wakeup_cause();
  if (neden == ESP_SLEEP_WAKEUP_EXT0)  Serial.println("Buton ile uyandı");
  if (neden == ESP_SLEEP_WAKEUP_TIMER) Serial.println("Zamanlayıcı ile uyandı");
  Serial.printf("Uyanma sayısı: %d\n", uyanmaSayisi);

  // ... ölçüm ve gönderim burada ...

  esp_sleep_enable_timer_wakeup(UYKU_SN * 1000000ULL);
  esp_sleep_enable_ext0_wakeup(GPIO_NUM_33, 1);   // GPIO33 HIGH olunca
  Serial.flush();
  esp_deep_sleep_start();
}

void loop() {}

ESP32 pil ömrü nasıl hesaplanır?

ESP32 pil ömrü, pilin kullanılabilir kapasitesinin (mAh) devrenin ortalama akımına (mA) bölünmesiyle bulunur. Ortalama akımı bulmak için aktif ve uyku sürelerini akımlarıyla ağırlıklandırırsınız. Aşağıdaki sayılar yalnızca hesabı göstermek için seçilmiş örnek değerlerdir; kendi devrenizin akımlarını multimetreyle ölçerek yerine koyun.

  1. Döngüyü belirleyin. Örnek: kart 10 dakikada bir uyanır, 5 saniye Wi-Fi ile çalışır, sonra uyur.
  2. Aktif akımı ölçün. Örnek: Wi-Fi açıkken ortalama 120 mA. Saatte 6 uyanma × 5 sn = 30 sn aktif süre eder; 120 mA × 30/3600 saat = 1,0 mAh.
  3. Uyku akımını ölçün. Örnek: çıplak modülde 10 µA. Kalan 3570 sn boyunca 0,010 mA × 3570/3600 ≈ 0,01 mAh.
  4. Toplayın. Saatte yaklaşık 1,01 mAh harcanır; ortalama akım 1,01 mA'dir.
  5. Kapasiteye bölün. Örnek: 2200 mAh pilin %80'ini kullanılabilir sayarsak 1760 mAh / 1,01 mA ≈ 1740 saat, yani yaklaşık 72 gün.
ESP32 pil ömrü örnek hesabı: kart 10 dakikada bir 5 saniye 120 mA ile çalışıyor; uyku akımı 10 µA iken ortalama 1,01 mA ve 1760 mAh ile yaklaşık 72 gün, uyku akımı 8 mA olan geliştirme kartında ortalama 8,9 mA ve yaklaşık 8 gün
Örnek değerlerle: aktif süre aynı kalsa da uyku akımı 10 µA'den 8 mA'e çıkınca pil ömrü yaklaşık 72 günden 8 güne düşer.

Aynı hesabı uyku akımı 8 mA olan bir geliştirme kartıyla yaparsanız ortalama akım yaklaşık 8,9 mA'e çıkar ve pil yaklaşık 8 günde biter. Örnekteki %20 pay; regülatör kaybı, düşük sıcaklık ve pilin yaşlanması için bırakılan güvenlik payıdır. Örnekte kullanılan kapasitede bir hücre arıyorsanız Orion 18650 3,7V 2200 mAh Li-ion pile bakabilirsiniz; pil seçimi ve güvenli kullanımı için 18650 Li-ion pil rehberimizi okuyun.

Geliştirme kartında deep sleep neden pili çabuk bitirir?

Geliştirme kartında ESP32 uyusa bile kart üzerindeki regülatör, güç LED'i ve USB-seri dönüştürücü çalışmaya devam eder; bu yüzden kartın toplam uyku akımı mikroamper yerine miliamper düzeyinde kalır. Örneğin pek çok kartta kullanılan AMS1117 regülatörünün kendi tüketimi, veri sayfasına göre tipik 5 mA civarındadır. Bu tek başına çipin uyku akımının yaklaşık 500 katıdır.

  • Regülatör: AMS1117 gibi doğrusal regülatörler hem kendi akımını çeker hem de 3,7V Li-ion pilde düşük gerilim farkıyla zorlanır.
  • Güç LED'i: Sürekli yanan LED birkaç miliamper harcar. Gerekirse LED'in direncini sökmek tek başına belirgin fark yaratır.
  • USB-seri çip: CP2102 ya da CH340 çipi bazı kartlarda 3,3V hattından beslenir ve uykuda da akım çeker.
  • Bağlı modüller: Sensörler ve ekran ESP32 uyurken açık kalır; beslemelerini bir MOSFET ya da GPIO ile kesin.

Deneme ve yazılım geliştirme için ESP32 30 pin geliştirme kartı rahattır; uzun pil ömrü gereken son üründe ise çıplak ESP32 modülü ve düşük tüketimli bir regülatör tercih edilir. MCP1700 3,3V LDO regülatörünün ürün sayfasına göre kendi tüketimi 1,6 µA'dir. En fazla 250 mA verdiği için Wi-Fi'ın 260 mA'e varan tepe akımlarında sınıra dayanır; çıkışına yeterli kondansatör koyun ya da daha yüksek akımlı bir düşük kayıplı regülatör seçin. Pil girişi ve 500 mA şarj desteği olan ESP32 Lite kartı de pilli projeler için bir başlangıç noktasıdır; yine de uyku akımını kendiniz ölçün.

Li-ion pili şarj ederken korumasız devre kullanmayın. TP4056 Type-C korumalı şarj devresi aşırı şarj, aşırı deşarj ve kısa devreye karşı koruma sağlar. Li-ion hücreyi kısa devre etmek ya da delmek yangına yol açabilir. Diğer kart seçenekleri için geliştirme kartları kategorisine göz atabilirsiniz; güneşle şarj edilen bir uygulama için güneş enerjili ESP32 sensör istasyonu yazımız da deep sleep kullanır.

Sık sorulan sorular

ESP32 deep sleep'te kaç mA çeker?

ESP32 çipi deep sleep'te, RTC zamanlayıcısı ve RTC belleği açıkken yaklaşık 10 µA, yani 0,01 mA çeker. Bu değer yalnızca çipe aittir. Geliştirme kartında regülatör, LED ve USB-seri çip eklendiği için toplam akım birkaç miliampere çıkabilir. Gerçek değeri öğrenmek için multimetreyi mikroamper kademesinde pile seri bağlayıp kartın uyumasını bekleyin.

Deep sleep'ten sonra değişkenler neden sıfırlanıyor?

Deep sleep sırasında ana bellek kapatıldığı için sıradan değişkenler silinir ve program setup() başından çalışır. Korumak istediğiniz değişkeni RTC_DATA_ATTR ile tanımlarsanız RTC belleğinde saklanır ve uyanınca kaldığı değerle gelir. Güç tamamen kesildiğinde bu bellek de silinir; elektrik kesintisinden sonra da kalması gereken veriler için flash belleği kullanın.

Deep sleep'teki ESP32'ye program yüklenebilir mi?

Hayır, derin uykudaki ESP32 USB'den program almaz, çünkü işlemci kapalıdır. Yükleme için kartın EN (reset) düğmesine basıp hemen yüklemeyi başlatın; gerekirse BOOT düğmesini basılı tutun. Geliştirme sırasında uyku süresini kısa tutmak ya da setup() başına birkaç saniyelik bekleme koymak bu işi kolaylaştırır.

Her GPIO pini ESP32'yi uyandırabilir mi?

Hayır, deep sleep'ten yalnızca RTC bölümüne bağlı pinler uyandırabilir: GPIO 0, 2, 4, 12-15, 25-27 ve 32-39. Bunların bir kısmı açılışta önemli görevler üstlenir; örneğin GPIO0 ve GPIO2 açılış modunu etkiler. Buton gibi sinyaller için GPIO32 ve GPIO33 güvenli seçeneklerdir. GPIO34-39'da dahili direnç olmadığından dış pull-up ya da pull-down kullanın.

Wi-Fi bağlantısı pil ömrünü ne kadar etkiler?

Wi-Fi bağlantısı pilli ESP32 projelerinde en büyük tüketim kalemidir, çünkü radyo açıkken akım 100 mA'in üzerine çıkar. Modeme bağlanmak bazen birkaç saniye sürer. Sabit IP adresi kullanmak, ölçümü bağlantıdan önce yapmak ve gönderimden hemen sonra uyumak aktif süreyi kısaltır. Kartlar arası kısa veri için ESP-NOW da bağlantı süresini azaltır.

Özet

  • ESP32 deep sleep, RTC bölümü dışındaki her şeyi kapatır ve çipin tüketimini yaklaşık 10 µA'e indirir.
  • Kart zamanlayıcıyla, RTC pinlerindeki bir sinyalle ya da dokunmatik pinle uyanır; program setup() başından çalışır.
  • Uykudan sonra lazım olan değişkenler RTC_DATA_ATTR ile RTC belleğinde saklanır.
  • Pil ömrü = kullanılabilir kapasite / ortalama akım; aktif süreyi kısaltmak en büyük kazancı sağlar.
  • Geliştirme kartındaki regülatör ve LED uyku akımını miliampere çıkarır; uzun ömür için çıplak modül ve düşük tüketimli regülatör kullanın.

Bu yazıdaki ürünler

Diğer yazılar