ESP-IDF ile SNTP Saat Senkronizasyonu ve Donanımsal RTC Yönetimi

Print

Uzak bir sunucuya telemetri verisi gönderirken, SSL/TLS sertifikalarını doğrularken veya dosya sistemine (SPIFFS / FATFS) zaman damgalı log kayıtları yazarken mikrodenetleyicinin yıl, ay, gün, saat ve saniye bilgisine milisaniyelik hassasiyetle sahip olması gerekir. ESP32 harici bir RTC pili (DS3231 vb.) olmasa dahi, Wi-Fi ağına bağlandığı anda ESP-IDF SNTP saat senkronizasyonu (Simple Network Time Protocol) protokolüyle atomik internet saat sunucularından zamanı alabilir ve dahili donanımsal RTC sayacını senkronize edebilir.

Bu rehberde; esp_sntp mimarisini, havuz sunucularını (pool.ntp.org), Türkiye saat dilimi (Timezone TRT-3) yapılandırmasını ve standart C time.h POSIX fonksiyonları ile güncel zamanı biçimlendirmeyi öğreneceğiz.


ESP32 Donanımsal RTC ve SNTP Nasıl Birlikte Çalışır?

  1. ESP32’nin içinde düşük güçlü bir RTC sayacı (Real-Time Clock) yer alır. Çip açıldığında bu sayaç 1 Ocak 1970 (Unix Epoch) tarihinden başlar.
  2. Wi-Fi bağlantısı kurulduğunda esp_sntp servisi dünya standartlarındaki NTP sunucularına UDP 123 portundan sorgu atar.
  3. Alınan mikrosaniye hassasiyetindeki zaman damgası donanımsal RTC sayacına yazılır.
  4. Artık Wi-Fi kapansa veya cihaz Deep Sleep moduna girse bile dahili RTC zamanı saymaya devam eder!

Adım 1: SNTP Başlatma ve Callback Tanımlama

ESP-IDF’te zaman senkronizasyonu tamamlandığında tetiklenen bir geri çağırım fonksiyonu tanımlanabilir:

#include <stdio.h>
#include <time.h>
#include <sys/time.h>
#include "esp_log.h"
#include "esp_sntp.h"

static const char *TAG = "SNTP_TIME";

// Saat senkronize edildiğinde çağrılan bildirim
void time_sync_notification_cb(struct timeval *tv) {
    ESP_LOGI(TAG, "NTP Senkronizasyonu Başarıyla Tamamlandı!");
}

void initialize_sntp(void) {
    ESP_LOGI(TAG, "SNTP servisi başlatılıyor...");
    esp_sntp_setoperatingmode(SNTP_OPMODE_POLL);
    
    // Güvenilir NTP havuz sunucuları
    esp_sntp_setservername(0, "pool.ntp.org");
    esp_sntp_setservername(1, "time.google.com");
    
    // Geri çağırım fonksiyonunu bağla
    sntp_set_time_sync_notification_cb(time_sync_notification_cb);
    
    esp_sntp_init();
}

Adım 2: Zaman Dilimi (Timezone) Ayarlamak

NTP sunucuları zamanı daima UTC (Greenwich) olarak döner. Yerel saate dönüştürmek için POSIX standart çevre değişkeni TZ ayarlanır:

void set_timezone(void) {
    // Türkiye Saat Dilimi: UTC+3 (Yaz saati uygulaması sabittir: TRT-3)
    setenv("TZ", "TRT-3", 1);
    tzset();
    ESP_LOGI(TAG, "Zaman dilimi 'TRT-3' (UTC+3) olarak ayarlandı.");
}

Adım 3: Saatin Alınmasını Beklemek ve Yazdırmak

void print_current_time(void) {
    time_t now;
    struct tm timeinfo;

    time(&now);
    localtime_r(&now, &timeinfo);

    // Eğer yıl 1970 ise henüz senkronizasyon bitmemiştir
    if (timeinfo.tm_year < (2020 - 1900)) {
        ESP_LOGW(TAG, "Saat henüz senkronize edilmedi! Bekleniyor...");
        int retry = 0;
        while (sntp_get_sync_status() == SNTP_SYNC_STATUS_RESET && ++retry < 15) {
            vTaskDelay(pdMS_TO_TICKS(1000));
        }
        time(&now);
        localtime_r(&now, &timeinfo);
    }

    char strftime_buf[64];
    // Tarih ve saati şık bir formatta metne çevir: "2026-10-12 Pazartesi 20:30:15"
    strftime(strftime_buf, sizeof(strftime_buf), "%Y-%m-%d %H:%M:%S", &timeinfo);
    ESP_LOGI(TAG, "Güncel Sistem Saati: %s", strftime_buf);
}

Neden Çok Önemlidir?

  1. HTTPS / TLS Doğrulaması: OTA rehberimizde gördüğümüz gibi, SSL sertifikalarının geçerlilik tarihi denetlenirken sistem saati yanlışsa tüm HTTPS istekleri X509BADCERTNOTYETVALID veya EXPIRED hatası verir.
  2. SD Kart ve Veritabanı: Sensör kayıtlarını doğru zaman etiketiyle indekslemek analiz için zorunludur.

Özet

esp_sntp, internete bağlı her ESP32 cihazına atomik saat doğruluğu kazandırır. Harici donanım maliyeti olmadan tüm telemetri kayıtlarınızı ve güvenlik sertifikalarınızı milisaniyelik doğrulukla güvenceye alabilirsiniz.

Tags , , , , , ,

How can we help?