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?
- 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.
- Wi-Fi bağlantısı kurulduğunda
esp_sntpservisi dünya standartlarındaki NTP sunucularına UDP 123 portundan sorgu atar. - Alınan mikrosaniye hassasiyetindeki zaman damgası donanımsal RTC sayacına yazılır.
- 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?
- 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
X509BADCERTNOTYETVALIDveyaEXPIREDhatası verir. - 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.