ESP8266, WiFi bağlantısı sağlayan ve düşük maliyetli bir mikrodenetleyicidir. Bu mikrodenetleyici, IoT (Internet of Things – Nesnelerin İnterneti) projeleri için popüler bir seçenektir. Bu makalede, ESP8266’nın Türkiye’nin resmi NTP (Network Time Protocol – Ağ Zaman Protokolü) sunucusundan gerçek zaman bilgisini nasıl alabileceğinizi adım adım açıklayacağız.

Adım 1: Gerekli Kütüphaneleri Ekleyin

İlk adım olarak, ESP8266’nın WiFi özelliklerini kullanmak için ESP8266WiFi kütüphanesini ve NTP ile zaman bilgisini almak için WiFiUdp ve TimeLib kütüphanelerini ekleyin. Bu kütüphaneler, ESP8266 ile WiFi ağına bağlanmanıza ve zaman bilgisini işlemenize olanak tanır.

#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
#include <TimeLib.h>

Adım 2: WiFi Bağlantısını Yapın

WiFi bağlantısı için SSID (WiFi ağının adı) ve şifrenizi belirtin. ESP8266, bu bilgileri kullanarak belirtilen WiFi ağına otomatik olarak bağlanacaktır.

const char* ssid     = "WIFI_SSID";
const char* password = "WIFI_PASSWORD";

Adım 3: NTP Sunucusunu Belirtin

NTP (Network Time Protocol) sunucusunu belirtin. Türkiye’nin resmi NTP sunucusu olan "tr.pool.ntp.org" kullanılabilir.

const char* ntpServerName = "tr.pool.ntp.org";

Adım 4: Zaman Dilimini Ayarlayın

Projenizin bulunduğu zaman dilimini ayarlayın. Türkiye’nin zaman dilimi UTC+3’tür.

const int timeZone = 3;

Adım 5: NTP Bağlantısını Yapın

WiFi bağlantısını kurun ve NTP sunucusuna bağlanın.

WiFiUDP Udp;
unsigned int localPort = 8888;

Adım 6: Zaman ve Tarih Bilgisini Alın

NTP sunucusuna bağlanın ve zaman bilgisini alın. Bu işlem, belirli aralıklarla tekrar edilir.

void loop() {
  sendNTPpacket();
  delay(1000);
  
  if (Udp.parsePacket()) {
    // Zaman ve tarih bilgisini işleyin
  }
}

Adım 7: Zaman Bilgisini İşleyin

Gelen zaman bilgisini işleyerek okunabilir formata dönüştürün. Bu adımda, UNIX zamanını kullanarak yerel saat bilgisine dönüşüm yapılır.

struct tm *timeinfo;
time_t rawtime = (time_t)epoch;
timeinfo = localtime(&rawtime);

Adım 8: Sonuçları Yazdırın

Elde edilen zaman ve tarih bilgilerini seri monitöre yazdırın. Bu adım, ESP8266’nın seri port üzerinden Arduino IDE’nin seri monitörüne bağlanmasını gerektirir.

Serial.print("Türkiye Saati: ");
Serial.println(formattedTime);

Bu adımları takip ederek, ESP8266’nın Türkiye’nin resmi NTP sunucusundan gerçek zaman bilgisini almasını sağlayabilirsiniz. Bu bilgi, IoT projelerinizde zamanlayıcılar, zaman damgaları veya diğer zaman odaklı işlevler için kullanılabilir.

#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
#include <TimeLib.h> // Zaman işleme kütüphanesi, Time.h olarak da bilinir

const char* ssid     = "mustafa";    // WiFi SSID
const char* password = "123456789"; // WiFi Şifre

const char* ntpServerName = "tr.pool.ntp.org"; // Türkiye NTP sunucusu
const int timeZone = 3; // Türkiye saati UTC+3

WiFiUDP Udp;
unsigned int localPort = 8888;  // NTP bağlantısı için yerel port

const int NTP_PACKET_SIZE = 48; // NTP paketinin boyutu
byte packetBuffer[NTP_PACKET_SIZE]; // NTP paketi

void setup() {
  Serial.begin(115200);
  delay(10);

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi bağlandı");
  Serial.println("IP Adresi: ");
  Serial.println(WiFi.localIP());

  Udp.begin(localPort);
}

void loop() {
  sendNTPpacket();
  delay(1000); // 1 saniye bekleyin ve tekrar zaman alın

  if (Udp.parsePacket()) {
    Serial.println("NTP paketi alındı");
    Udp.read(packetBuffer, NTP_PACKET_SIZE); // NTP paketini oku

    unsigned long secsSince1900;
    // NTP paketindeki Zamanı al
    secsSince1900 =  (unsigned long)packetBuffer[40] << 24 |
                     (unsigned long)packetBuffer[41] << 16 |
                     (unsigned long)packetBuffer[42] << 8 |
                     (unsigned long)packetBuffer[43];
    
    const unsigned long seventyYears = 2208988800UL;
    unsigned long epoch = secsSince1900 - seventyYears;
    
    // Türkiye saati düzeltmesi
    epoch += (timeZone * 3600); // TimeZone saatlik saniye cinsinden ifadesi
    
    // Zamanı okunabilir formata dönüştür
    struct tm *timeinfo;
    time_t rawtime = (time_t)epoch;
    timeinfo = localtime(&rawtime);
    
    char formattedTime[20];
    sprintf(formattedTime, "%02d-%d-%d %02d:%02d:%02d", timeinfo->tm_mday, timeinfo->tm_mon + 1, timeinfo->tm_year + 1900,
            timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec);
    
    Serial.print("Türkiye Saati: ");
    Serial.println(formattedTime);
  }
}

void sendNTPpacket() {
  memset(packetBuffer, 0, NTP_PACKET_SIZE);
  packetBuffer[0] = 0b11100011;   // NTP Başlık: Versiyon, Mode, Orj Kod: 3, 3, 0
  packetBuffer[1] = 0;     // Klasör numarası, uygun olabilir, ancak bu 0'a ayarlanır.
  packetBuffer[2] = 6;     // Orj kod, 6 için NTP sunucusu ile iletişim kurar (0x24 = 36)
  packetBuffer[3] = 0xEC;  // İstemci için NTP sunucusuna gitme maksimum zaman dilimi, 19.00 hakkında 2016, şu an için UTC
  // Tüm diğer paket değerleri 0
  // İletişimde olmayan 40 bayt olası
  // Unix zamanını almak için 1970'den bu yana geçen saniye
  packetBuffer[40] = 0;
  packetBuffer[41] = 0;
  packetBuffer[42] = 0;
  packetBuffer[43] = 0;

  Udp.beginPacket(ntpServerName, 123); // NTP sunucusunun adresine ve portuna paketi gönder
  Udp.write(packetBuffer, NTP_PACKET_SIZE);
  Udp.endPacket();
}

Mustafa KESKİN

By Mustafa KESKİN

Ölümün olduğu bu dünyada, hiçbir şey çok da ciddi değildir aslında

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Bu site, istenmeyenleri azaltmak için Akismet kullanıyor. Yorum verilerinizin nasıl işlendiği hakkında daha fazla bilgi edinin.