ESP32 Projeleri
#07Orta

Deep Sleep + RTC Memory ile Aylarca Pil Ömürlü Sensör İstasyonu

~1,5 saat (pil ömrü testi ayrıca günler sürer)Temel breadboard deneyimi

Proje Amacı

ESP32'yi çoğu zaman µA (mikroamper) seviyesinde akım çeken 'deep sleep' modunda tutup, sadece belirli aralıklarla uyanarak sensör okuyup WiFi ile veri gönderdikten sonra tekrar uyutmayı öğretir — bu tek teknik, pille çalışan bir sensörün ömrünü günlerden aylara çıkarabilecek kadar etkilidir. RTC memory (RTC_DATA_ATTR) ana işlemci ve RAM kapansa bile belirli veriyi (örneğin bir okuma sayacını) korur, böylece cihaz her uyanışta kaldığı yerden devam edebilir. Bu düzeydeki enerji verimliliği Arduino Uno'da yakalanamaz: kartın kendi USB-seri çipi ve gerilim regülatörü sürekli mA seviyesinde akım çeker (en 'derin' Uno uykusu bile ESP32 deep sleep'inin binlerce katı akım harcar) ve Uno'nun ana işlemcisi kapandığında hayatta kalan bir RTC memory kavramı da bulunmaz.

Gerekli Malzemeler

  • ESP32 DevKit V1 (38 pin)
  • DHT22 sıcaklık/nem sensörü
  • 10kΩ direnç (pull-up)
  • 18650 Li-ion pil + tutucu (veya güç ölçüm için USB ampermetre)
  • Breadboard
  • Jumper kablolar

Gerekli Kütüphaneler

esp_sleep.h, WiFi.h, driver/rtc_io.h (hepsi ESP32 core ile gelir). DHT sensor library (Adafruit, >= 1.4.4).

Pin Bağlantıları

Bileşen PiniBağlantı
DHT22 VCC
3V3
DHT22 GND
GND
DHT22 DATA (10kΩ pull-up ile 3V3'e)
GPIO27

Devre Şeması

ESP32 Kodu

esp32-07-deep-sleep-rtc-memory-ile-aylarca-pil-omurlu-sensor-istasyonu.ino
1#include <WiFi.h>
2#include <DHT.h>
3
4#define DHTPIN 27
5#define DHTTYPE DHT22
6#define UYKU_SURESI_SN 600 // 10 dakikada bir uyan (üretimde 1800-3600 sn tipik)
7
8DHT dht(DHTPIN, DHTTYPE);
9
10// RTC_DATA_ATTR: deep sleep'te SRAM kapansa da bu değişken RTC belleğinde
11// korunur, cihaz uyandığında kaldığı yerden devam eder.
12RTC_DATA_ATTR int uyanmaSayaci = 0;
13
14const char* ssid = "WIFI_ADINIZ";
15const char* password = "WIFI_SIFRENIZ";
16
17void veriGonderVeUyu() {
18 dht.begin();
19 delay(2000); // DHT22'nin ilk okuma için ısınma süresi
20 float sicaklik = dht.readTemperature();
21 float nem = dht.readHumidity();
22
23 if (!isnan(sicaklik) && !isnan(nem)) {
24 WiFi.begin(ssid, password);
25 unsigned long baslangic = millis();
26 while (WiFi.status() != WL_CONNECTED && millis() - baslangic < 10000) delay(200);
27
28 if (WiFi.status() == WL_CONNECTED) {
29 // Burada gerçek projede HTTP POST / MQTT publish yapılır.
30 Serial.printf("Gönderildi -> Sicaklik: %.1f Nem: %.1f (uyanma #%d)\n",
31 sicaklik, nem, uyanmaSayaci);
32 WiFi.disconnect(true);
33 } else {
34 Serial.println("WiFi zaman aşımı, veri gönderilemedi.");
35 }
36 } else {
37 Serial.println("DHT22 okunamadı.");
38 }
39
40 uyanmaSayaci++;
41 Serial.printf("Deep sleep'e geçiliyor (%d saniye)...\n", UYKU_SURESI_SN);
42 Serial.flush();
43 esp_sleep_enable_timer_wakeup((uint64_t)UYKU_SURESI_SN * 1000000ULL); // mikrosaniye cinsinden
44 esp_deep_sleep_start(); // bu satırdan sonrası ÇALIŞMAZ, cihaz kapanıp yeniden başlar gibi uyanır
45}
46
47void setup() {
48 Serial.begin(115200);
49 delay(200);
50 Serial.printf("Uyanma nedeni kontrol ediliyor... (toplam uyanma: %d)\n", uyanmaSayaci);
51 veriGonderVeUyu();
52}
53
54void loop() {
55 // Deep sleep sonrası her uyanışta setup() baştan çalıştığı için loop()
56 // asla çalışmaz — bu normaldir ve enerji tasarrufunun bir parçasıdır.
57}

Çalışma Açıklaması

esp_deep_sleep_start() çağrıldıktan sonraki hiçbir kod çalışmaz — cihaz donanımsal olarak kapanıp timer dolunca setup()'tan yeniden başlar, loop()'a hiç girmez; bu ESP32'nin deep sleep mimarisinin doğal ve beklenen bir sonucudur. Gerçek pil ömrü hesaplanırken DHT22'nin kendi bekleme akımı (tipik 1-2mA, bazı ucuz klonlarda daha yüksek) toplam tüketime eklenmelidir; en uzun pil ömrü için sensörü de bir MOSFET veya röle ile sadece uyanma anında beslemek (yük anahtarlama) önerilir.

Test Bilgisi

USB ampermetre veya multimetre ile pil hattındaki akımı ölçün: aktif okuma/gönderim anında birkaç yüz mA, deep sleep sırasında ise 10-150µA aralığında olmalı (DHT22 gibi harici sensörlerin kendi bekleme akımı toplam tüketimi biraz artırabilir). Seri Monitör'de her 10 dakikada bir 'uyanma #N' sayısının arttığını doğrulayın; RESET düğmesine basmadan cihazı uzun süre bekletin, sayaç RTC memory sayesinde sıfırlanmamalı (sadece elektriği tamamen kesip yeniden vermek sayacı sıfırlar) — bu, deep sleep ile normal reset arasındaki temel farkı gözle görmenizi sağlar.

Olası Sorunlar ve Çözümleri

Cihaz her uyanışta WiFi'ye bağlanamıyorsa (zaman aşımı): router'ın DHCP kiralama süresini kontrol edin, sık bağlanıp kopan cihazlar bazı router'larda geçici olarak yavaşlatılabilir; statik IP kullanmak bağlanma süresini gözle görülür şekilde kısaltır. Pil beklenenden çok daha hızlı bitiyorsa: DHT22 gibi sensörlerin uyku sırasında da güç çektiğini unutmayın, harici bir P-MOSFET ile sensörün VCC hattını tamamen kesin. Uyanma sayacı her seferinde sıfırlanıyorsa: RTC_DATA_ATTR değişkeninin global scope'ta tanımlandığından ve cihazın gerçekten deep sleep'ten (Reset düğmesi veya elektrik kesintisiyle değil) uyandığından emin olun.

Alternatif Çözümler

Zamanlayıcı yerine veya yanında esp_sleep_enable_ext0_wakeup() ile harici bir butona basıldığında da anlık uyanma eklenebilir, örneğin bir acil durum bildirimi için. Her uyanışta WiFi'ye tam bağlanmak yerine ESP-NOW (proje #09) kullanmak, bağlantı kurma süresini ve dolayısıyla toplam enerji tüketimini önemli ölçüde azaltır. Güneş paneli ve bir şarj kontrolcüsü (örn. TP4056) eklenerek, hiç pil değiştirmeden yıllarca çalışabilen tamamen bağımsız bir istasyon kurulabilir.

Bu projenin kodunu AI ile özelleştir

Farklı pin, ek özellik ya da başka bir sensör mü istiyorsun?

Benzer Projeler

Orta

TLS/SSL ile Şifreli MQTT Veri Yayını

Sıcaklık/nem verisini, sertifika tabanlı TLS/SSL şifrelemesiyle (WiFiClientSecure) bir MQTT broker'a güvenli şekilde yayınlamayı öğretir — düz metin (plaintext) MQTT'nin aksine veri yolda kimse tarafından okunamaz veya değiştirilemez. ESP32'nin donanımsal AES/SHA kripto hızlandırıcısı, TLS el sıkışmasını (handshake) makul bir sürede tamamlayacak işlem gücünü sağlar; 520KB SRAM'i ise TLS oturum arabelleklerini, sertifika zincirini ve şifreleme durumunu aynı anda bellekte tutabilir. Bu kapasite Arduino Uno'da bulunmaz: kartın sadece 2KB SRAM'i vardır ve tek bir TLS sertifikası bile bu belleğe sığmaz; kripto hızlandırma donanımı ve WiFi radyosu da zaten mevcut değildir, dolayısıyla şifreli bir ağ bağlantısı kurmanın önünde temel bir donanım sınırı vardır.

Orta

OTA Kablosuz Firmware Güncelleme Sistemi

ESP32'nin dahili çift OTA (Over-The-Air) flash partisyon şemasını kullanarak, sahaya kurulmuş bir cihaza tekrar USB kablosu takmadan tamamen kablosuz şekilde yeni firmware yüklemeyi öğretir — özellikle tavana, duvara veya erişimi zor bir noktaya monte edilmiş onlarca cihazı yönetirken zaman ve emek kazandıran pratik bir yetenektir. ESP32'nin flash belleği kalkınma sırasında bir 'factory' bölümü ile iki ayrı OTA partisyonuna bölünebilir; cihaz yeni kodu ağdan indirip o an boş olan partisyona yazar, bütünlük kontrolünden geçerse oradan açılış yapar ve önceki çalışan sürüm otomatik olarak yedek konumunda kalır, böylece yarım kalan veya bozuk bir güncelleme cihazı kullanılamaz hale getirmez. Bu iki katmanlı flash mimarisi ESP32'ye özgüdür: Arduino Uno'nun ATmega328P'sinde toplam flash belleği zaten 32KB'dir ve sketch kodunun kendisi bu alanın büyük bölümünü kapladığından ikinci bir tam firmware kopyasına yer kalmaz; kartta WiFi donanımı da bulunmadığından ağ üzerinden güncelleme almak zaten söz konusu değildir.

Orta

Watchdog + Otomatik Yeniden Bağlanma ile Endüstriyel Güvenilirlik

ESP-IDF'in görev bazlı donanımsal Task Watchdog Timer'ını (TWDT) kullanarak, ana döngü belirli bir süre 'nefes almazsa' (donarsa) cihazı otomatik olarak yeniden başlatmayı; ayrıca WiFi bağlantısı koptuğunda üstel geri çekilmeyle (exponential backoff) otomatik yeniden bağlanmayı öğretir — insansız çalışan sahadaki bir cihazın kendi kendini toparlaması için endüstriyel projelerde standart kabul edilen bir güvenilirlik desenidir. ESP32'nin FreeRTOS çekirdeği, her görevi (task) ayrı ayrı izleyebilen donanım destekli bir watchdog mekanizması sunar. Bu düzeyde bir izleme Arduino Uno'da kurulamaz: Uno'nun donanımsal watchdog'u (WDT) çok daha kaba bir genel zamanlayıcıdır, görev/task kavramı yoktur (bir RTOS çalıştıramaz) ve zaten yeniden bağlanacak bir WiFi bağlantısı da bulunmaz.