2025. október 19., vasárnap

Pontos idő

#include <WiFi.h>
#include <NTPClient.h>
#include <TimeLib.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>
#include "secrets.h" 
// --- Nyilvános Konfiguráció ---
const char* NTP_SERVER      = "pool.ntp.org";
const char* WEATHER_API_URL = "http://api.openweathermap.org/data/2.5/weather?";
const char* LATITUDE        = "47.4979"; // Budapest
const char* LONGITUDE       = "19.0402"; // Budapest
// --- Állapot Változók ---
bool synced_today = false;
long timezone_sec = 0;
long local_sunrise_epoch = 0;
long local_sunset_epoch = 0;
WiFiUDP ntpUDP;
NTPClient utc(ntpUDP, NTP_SERVER);
void fetchWeatherData() {
  HTTPClient http;
  Serial.println("Napkelte, napnyugta, időzóna eltolás lekérdezés.");
  String url = String(WEATHER_API_URL) + "lat=" + LATITUDE + "&lon=" + LONGITUDE + "&units=metric&appid=" + API_KEY;
    
  http.begin(url);
  int httpCode = http.GET();
  Serial.print("HTTP kód: ");
  Serial.println(httpCode);
  if (httpCode > 0) {
    String JSON_Data = http.getString();
   
    DynamicJsonDocument doc(2048);
   
    DeserializationError error = deserializeJson(doc, JSON_Data);
    if (error) {
      Serial.print(F("deserializeJson() hiba: "));
      Serial.println(error.f_str());
      http.end();
      return;
    }
   
    JsonObject obj = doc.as<JsonObject>();
    
    timezone_sec = obj["timezone"].as<long>();
    local_sunrise_epoch = timezone_sec + obj["sys"]["sunrise"].as<long>();
    local_sunset_epoch = timezone_sec + obj["sys"]["sunset"].as<long>();
   
  } else {
    Serial.println("\n--- Hiba az adatok lekérésekor! ---");
    Serial.print("HTTP hiba kód: ");
    Serial.println(httpCode);
  }
  http.end();
}
void synchronization() {
  Serial.print("Kapcsolódás a WiFihez (");
  Serial.print(WIFI_SSID);
  Serial.print(")...");
  WiFi.mode(WIFI_STA); 
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  if (WiFi.waitForConnectResult(10000) != WL_CONNECTED) {
    Serial.println("\nWiFi csatlakozás sikertelen!");
    synced_today = false;
    return;
    }
  Serial.println("WiFi csatlakoztatva!");
  Serial.print("IP cím: ");
  Serial.println(WiFi.localIP());
  utc.begin();
  Serial.print("Idő szinkronizálása...");
  
  if (utc.forceUpdate()) {
    Serial.println(" SIKERES!");
    fetchWeatherData();
    setTime(utc.getEpochTime() + timezone_sec);
    synced_today = true;
  } else {
    Serial.println(" SIKERTELEN!");
    synced_today = false;
  }
  
  utc.end();
  WiFi.disconnect(true); 
  WiFi.mode(WIFI_OFF);
  Serial.println("WiFi kapcsolat bontva!");
}
void printTime(long ido) {
    tmElements_t tm;
    breakTime(ido, tm); 
    Serial.printf("%d:%02d\n", tm.Hour, tm.Minute);
}
void setup() {
  Serial.begin(115200);
  synchronization();
  Serial.print("Napkelte: ");
  printTime(local_sunrise_epoch);
  
  Serial.print("Napnyugta: ");
  printTime(local_sunset_epoch);
}  

void loop() {
  if ((utc.getHours()==0) && synced_today) synced_today = false;  
  if ((utc.getHours()==1) && (utc.getMinutes()==1) && !synced_today) synchronization();
  Serial.printf("UTC idő: %02d:%02d:%02d Helyi idő: %d:%02d:%02d\n",
  utc.getHours(), utc.getMinutes(), utc.getSeconds(),
  hour(), minute(), second());
  
  delay(1000);
}