2025. november 28., péntek

Windows fejlődése

Windows 1.0 (1985)

Újdonságok:

  • Első grafikus felület DOS fölött

  • Egér-támogatás

  • Csempeszerű ablakok (nem lehettek átfedésben)

  • Alap alkalmazások: Paint, Write, Calculator

  • Kooperatív multitasking


Windows 2.0 (1987)

Újdonságok:

  • Átfedő ablakok lehetősége

  • Gyorsbillentyűk

  • Jobb memória-kezelés

  • 286/386 módok támogatása

  • Megjelent az első Word és Excel Windowsra


Windows 3.0 (1990)

Újdonságok:

  • Erősen modernizált GUI (Program Manager, File Manager)

  • Valódi 386 mód → virtuális memória, multitasking

  • Jó DOS-kompatibilitás

  • 16 színtől VGA 256 színig támogatás


Windows 3.1 (1992)

Újdonságok:

  • TrueType fontok → első professzionális minőségű szövegmegjelenítés

  • Megbízhatóság jelentős javulása

  • Drag & drop rendszer

  • Multimedia Extensions


Windows 3.11 (1993)

Újdonságok:

  • Windows for Workgroups 3.11 → beépített hálózati támogatás

  • Jobb 32 bites fájlkezelő driver → nagyobb sebesség

  • Peer-to-peer hálózatok támogatása (megosztott mappák, nyomtatók)

  • Stabilitási javítások

  • Még mindig 16 bites rendszer, de néhány 32 bites komponenssel


Windows NT 3.1 (1993)

Újdonságok:

  • Új, teljesen 32 bites, biztonságos NT-kernel

  • Felhasználói jogok, ACL-ek, domain-kezelés

  • Alap Active Directory-előd

  • Professzionális, nem otthoni rendszer


Windows 95 (1995)

Óriási mérföldkő – a modern Windows alapja.

Újdonságok:

  • Start menü, tálca, értesítési terület — megszületett a modern Windows

  • 32 bites desktop rendszer

  • Plug and Play hardverkezelés

  • Új fájlrendszer driver → hosszú fájlnevek (VFAT)

  • DirectX kezdete


Windows 95 OSR2 / OSR2.1 / OSR2.5 (1996–1997)

Újdonságok:

  • FAT32 támogatása (OSR2) → gyorsabb és hatékonyabb, 2GB korlát megszűnt

  • USB támogatás (OSR2.1)

  • Internet Explorer integrált verziók

  • DirectX továbbfejlődése

  • Stabilitási és sebességjavítások

  • Ezek a verziók új gépekre voltak előtelepítve, külön nem árulták őket


Windows NT 4.0 (1996)

Újdonságok:

  • Windows 95-szerű felület

  • NT megbízhatósága otthon is elérhetővé vált

  • Jobb hálózati és szerverfunkciók


Windows 98 (1998)

Újdonságok:

  • Nagyszabású USB támogatás

  • Internet Explorer beépítve

  • Web-integrált fájlkezelő (Active Desktop)

  • DirectX 6 → játékok fejlődése


Windows 98 SE (1999)

Újdonságok:

  • Sokkal stabilabb, mint az eredeti 98

  • Jobb modem/hálózatkezelés

  • Internet Connection Sharing

  • Javított USB és FAT32 kezelés


Windows ME (Millennium Edition, 2000)

Újdonságok:

  • Rendszer-visszaállítás

  • Media Player és multimédia fejlesztések

  • Gyorsabb boot
    Hátrány: instabil működés → az egyik legrosszabb Windows


Windows 2000 (2000)

Újdonságok:

  • NT 5.0 kernel

  • Active Directory teljes bevezetése

  • Nagyon stabil, vállalati alap

  • USB, ACPI jó kezelése


Windows XP (2001)

Az egyik legsikeresebb Windows.

Újdonságok:

  • Modern GUI

  • Jelentősen gyorsabb rendszerindítás

  • NT stabilitás elterjedt otthon is

  • Tűzfal, jobb hálózatkezelés

  • DirectX 9 → játékfejlődés csúcsidőszaka


Windows Vista (2007)

Újdonságok:

  • Aero Glass felület

  • Új, fejlettebb driver-modell

  • UAC (biztonsági kontroll)

  • Jobb memória-menedzsment (SuperFetch)
    Hátrány: hardverigény túl magas


Windows 7 (2009)

Vista kijavítása és kiteljesítése.

Újdonságok:

  • Sokkal gyorsabb minden téren

  • Új tálca “pin” funkciókkal

  • Jump listák

  • DirectX 11

  • Nagy stabilitás → sokáig tartotta magát


Windows 8 (2012)

Újdonságok:

  • Metro UI / Modern UI

  • Csempék, érintésre optimalizálva

  • Új Windows Store

  • Gyors hibrid boot
    Hátrány: Start menü eltűnt → óriási felháborodás


Windows 8.1 (2013)

Újdonságok:

  • Start gomb vissza

  • Jobb többmonitoros támogatás

  • Kevesebb UI-ütközés az asztali felhasználókkal


Windows 10 (2015)

Újdonságok:

  • Start menü visszatérése → csempékkel kombinálva

  • “Windows as a service” → folyamatos frissítés

  • DirectX 12

  • WSL (Linux alrendszer)

  • Erősebb biztonság (Secure Boot, Device Guard)


Windows 11 (2021)

Újdonságok:

  • Teljesen új GUI, lekerekített ablakok

  • Középre igazított Start és tálca

  • Új Microsoft Store

  • TPM 2.0 kötelező → erősebb biztonság

  • Snap Layouts fejlett ablakrendezés

  • Android alkalmazások támogatása

  • Egységesebb grafikus felület
    Hátrány: több animáció → néha „lustábbnak” érződik


A Start menü evolúciója

Windows 95 → Windows ME

  • Klasszikus Start menü

  • Programok listája, Vezérlőpult, Futtatás, Keresés

Windows XP

  • Kétoszlopos Start menü

  • Gyors elérés a dokumentumokhoz

  • Rögzíthető programok

Windows Vista / Windows 7

  • Keresősáv a Start menüben → óriási előrelépés

  • Rendezettebb programlista

  • Elegáns dizájn (Aero)

Windows 8

  • Klasszikus Start megszűnt

  • Teljes képernyős csempés felület (Start Screen)

  • Nagyon megosztó döntés

Windows 8.1

  • Start gomb vissza

  • De még mindig csempés felület maradt

Windows 10

  • Klasszikus + modern hibrid

  • Bal oldalt lista, jobb oldalt csempék

  • Jó kompromisszum

Windows 11

  • Középre igazított ikonok

  • Letisztított Start menü → rögzített appok + “Recommended”

  • Kevesebb testreszabási lehetőség, de szép dizájn


    TELJES „NÉPSZERŰSÉGI” WINDOWS RANGSOR

    🥇 1. Windows 7 (2009)

    Miért itt?
    Stabil, gyors, szép – a „kész Windows” érzés.


    🥈 2. Windows XP (2001)

    Miért?
    Ikonikus, hosszú életű, nosztalgikus.


    🥉 3. Windows 10 (2015)

    Miért?
    Nem legendás, de megbízható „munkásló”.


    4️⃣ Windows 98 (1998)

    Miért?
    Az első igazán jól használható otthoni Windows.


    5️⃣ Windows 2000 (2000)

    Miért?
    Stabil „üzleti XP előtti XP”, de kevesebb érzelem.


    6️⃣ Windows 95 (1995)

    Miért?
    Forradalmi volt, de ma inkább történelmi jelentőségű.


    7️⃣ Windows 3.1 (1992)

    Miért?
    Inkább grafikus felület volt DOS fölött, nem „igazi Windows” a mai értelemben.


    8️⃣ Windows 11 (2021– )

    Miért ilyen „lent”?
    Nem rossz, csak kevésbé szerethető.


    9️⃣ Windows Vista (2007)

    Miért?
    Túl nehéz volt a kor hardvereihez képest.


    🔟 Windows 8 / 8.1 (2012–2013)

    Miért utolsó?
    A legtöbb ember szerint ez volt a legkevésbé szeretett verzió.

2025. november 2., vasárnap

BKK Futár - ESP32


#include <WiFi.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>
#include <time.h>

static const char* WIFI_SSID     = "YOUR_WIFI_SSID";
static const char* WIFI_PASSWORD = "YOUR_WIFI_PASSWORD";
static const char* BKK_API_KEY   = "YOUR_BKK_API_KEY";
static const char* LOCAL_TIMEZONE  = "CET-1CEST,M3.5.0/2,M10.5.0/3";
const char* stopId         = "F04166";
const int   minutesAfter = 30;

unsigned long lastApiCall = 0;
const long apiCallInterval = 60000;

void wifi_connect() {
  if (WiFi.status() == WL_CONNECTED) return;

  Serial.printf("Kapcsolódás a WiFihez (%s)...", WIFI_SSID);
  WiFi.mode(WIFI_STA);
  WiFi.disconnect();
  WiFi.setAutoReconnect(true);
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);

  unsigned long start = millis();
  while (WiFi.status() != WL_CONNECTED && millis() - start < 10000) {
    delay(250);
    Serial.print(".");
    yield();
  }

  if (WiFi.status() == WL_CONNECTED) {
    Serial.println(" SIKERES!");
    Serial.print("IP cím: ");
    Serial.println(WiFi.localIP());
  } else {
    Serial.println(" SIKERTELEN!");
  }
}

void wifi_disconnect() {
  if (WiFi.status() == WL_CONNECTED) WiFi.disconnect(false);
  WiFi.mode(WIFI_OFF);
  Serial.println("WiFi kapcsolat bontva!");
}

size_t formatLocalHHMM(long epochSec, char* buffer, size_t bufferSize) {
  time_t t = (time_t)epochSec;
  struct tm lt;
  localtime_r(&t, &lt);

  return snprintf(buffer, bufferSize, "%d:%02d", lt.tm_hour, lt.tm_min);
}


void fetchBKKData(const char* stopId);

void setup() {
  Serial.begin(115200);
  delay(500);
  Serial.println("BKK Menetrend Indítása...");

  wifi_connect();
 
  if (WiFi.status() != WL_CONNECTED) {
    Serial.println("Kritikus hiba: Wi-Fi kapcsolat nélkül nem folytatható.");
    while (true) {
      delay(1000);
    }
  }

  setenv("TZ", LOCAL_TIMEZONE, 1);
  tzset();

  fetchBKKData("F04165");
  fetchBKKData(stopId);
}

void loop() {
  if (millis() - lastApiCall > apiCallInterval) {
    lastApiCall = millis();
    Serial.printf("\n--- Frissítés ---\n");
    fetchBKKData(stopId);
  }
}

void parseBKKJson(const String& jsonString,const char* stopId) {
  DynamicJsonDocument doc(24576);
  DeserializationError error = deserializeJson(doc, jsonString);
  if (error) { Serial.print("JSON hiba: "); Serial.println(error.c_str()); return; }

  long long serverTimeMs = doc["currentTime"].as<long long>();
  long serverTimeSec = (long)(serverTimeMs / 1000LL);

  char timeBuffer[6];
  formatLocalHHMM(serverTimeSec, timeBuffer, sizeof(timeBuffer));
  Serial.print("Lekérdezés ideje: ");
  Serial.println(timeBuffer);

  JsonObject routes = doc["data"]["references"]["routes"];
  JsonObject trips  = doc["data"]["references"]["trips"];
  JsonArray stopTimes = doc["data"]["entry"]["stopTimes"];

  Serial.printf("Érkező járatok (Mesgye utca %s):\n",stopId);
  if (stopTimes.size() == 0) { Serial.println("Jelenleg nincsenek érkező járatok."); return; }

  for (JsonObject st : stopTimes) {
    const char* tripId    = st["tripId"];
    const char* routeId   = trips[tripId]["routeId"];
    const char* shortName = routes[routeId]["shortName"];
    const char* headsign  = st["stopHeadsign"];

    long predictedTimeSec = st["predictedDepartureTime"] | 0;
    if (predictedTimeSec == 0) predictedTimeSec = st["departureTime"] | 0;

    long diffSeconds = predictedTimeSec - serverTimeSec;

    long adj = (diffSeconds >= 0) ? (diffSeconds + 30) : (diffSeconds - 30);
    int minutes = (int)(adj / 60);

    char arrivalBuffer[6];
    formatLocalHHMM(predictedTimeSec, arrivalBuffer, sizeof(arrivalBuffer));

    int minutesShown = (minutes < 1) ? 0 : minutes;
    Serial.printf("%5s %2d' %4s %s\n",
      arrivalBuffer,
      minutesShown,
      shortName ? shortName : "?",
      headsign ? headsign : "?"
    );
  }

}

void fetchBKKData(const char* stopId) {
  if (WiFi.status() != WL_CONNECTED) { Serial.println("WiFi kapcsolat megszakadt."); return; }
 
  char urlBuffer[200];

  snprintf(urlBuffer, sizeof(urlBuffer),
    "https://futar.bkk.hu/api/query/v1/ws/otp/api/where/"
"arrivals-and-departures-for-stop.json?"
"key=%s&stopId=BKK_%s&minutesAfter=%d",
    BKK_API_KEY, stopId, minutesAfter);

  HTTPClient http;
  http.begin(urlBuffer);
  int httpCode = http.GET();
 
 
  if (httpCode > 0) {
    if (httpCode == HTTP_CODE_OK) parseBKKJson(http.getString(),stopId);
    else Serial.printf("Hiba a BKK API hívásakor. HTTP kód: %d\n", httpCode);
  } else {
    Serial.printf("HTTP GET hiba: %s\n", http.errorToString(httpCode).c_str());
  }
  http.end();
}

2025. október 27., hétfő

Tolmács program távirányítóhoz

//Arduino Nano - YS-IRTM tolmács program távírányítóhoz

#include <SoftwareSerial.h>

int incomingByte = 0;
SoftwareSerial ir_mod(3, 2);
byte command1[5] = {0xA1, 0xF1, 0x06, 0x57, 0x60};
byte command2[5] = {0xA1, 0xF1, 0x06, 0x57, 0x0F};

// Puffer a beérkező bájtoknak
byte buffer[3];
int bufferIndex = 0;

void setup() {
  Serial.begin(9600);
  while(!Serial){}
  Serial.println("Setup IR Serial");
  ir_mod.begin(9600);
  while(!ir_mod){}
  Serial.println("IR Serial Ready");
}

void loop() {
    if (ir_mod.available() > 0) {
      // Beolvassuk az aktuális bájtot
      incomingByte = ir_mod.read();

      // Hozzáadjuk a pufferhez
      if (bufferIndex < 3) {
        if (incomingByte==241) bufferIndex=2;
        buffer[bufferIndex] = incomingByte;
        bufferIndex++;
      }

      // Ha a puffer tele van (3 bájt beérkezett)
      if (bufferIndex == 3) {
        Serial.print("Teljes csomag erkezett: ");
        for (int i = 0; i < 3; i++) {
          Serial.print(buffer[i], HEX);
          Serial.print(" ");
        }
        Serial.println();

        // Itt dolgozzuk fel a teljes csomagot
        // Például a 3. bájtra reagálunk, ahogy az eredeti kódban
        if (buffer[0] == 6 && buffer[1] == 87 && buffer[2] == 48 ) { // A harmadik bájt, ami 48
          ir_mod.write(command1, 5);
          Serial.println("Elkuldve: command1");
        }
        if (buffer[0] == 6 && buffer[1] == 87 && buffer[2] == 49 ) { // Ha 49 lenne a harmadik bájt
          ir_mod.write(command2, 5);
          Serial.println("Elkuldve: command2");
        }

        // Végül ürítjük a puffert a következő üzenethez
        bufferIndex = 0;
        buffer[0]=buffer[1]=buffer[2]=0;
      }
    }
}

2025. október 26., vasárnap

Számítógépes nyelvek

Nyelv Év Rövid jellemzés
Gépi kód1940 körülA processzor által közvetlenül végrehajtható bináris utasítások számsor formájában.
Assembly1949Gépi utasítások közvetlen programozása.
Fortran1957Tudományos és mérnöki számításokra használt nyelv.
Lisp1958Mesterséges intelligencia kutatásban használt rugalmas nyelv.
Algol1958Blokkszerkezetet bevezető nyelv.
COBOL1959Üzleti és pénzügyi rendszerek fejlesztésére szolgál.
Basic1964Oktatási célú nyelv.
Logo1967Oktatási nyelv teknős grafikával.
Pascal1970Strukturált programozást támogató nyelv.
Smalltalk1972Objektorientált fejlesztés alapnyelve.
C1972Rendszerszoftver fejlesztésére alkalmas nyelv.
Prolog1972Logikai programozás nyelve.
SQL1974Lekérdezőnyelv adatbázishoz.
Scheme1975A Lisp család egyszerű változata.
Ada1980Biztonságkritikus rendszerekben használt nyelv.
C++1985Objektumorientált nagy teljesítményű nyelv.
Erlang1986Megbízható kommunikációs rendszerekhez használt nyelv.
Perl1987Szöveges feldolgozás és webes feladatok nyelve.
Haskell1990Funkcionális programozás nyelve.
Python1991Általános célú jól olvasható nyelv.
Visual Basic1991Windows alkalmazások vizuális fejlesztéséhez.
HTML1993Jelölőnyelv weboldalak szerkezetének leírására.
R1993Statisztikai számítások és adatvizualizáció.
Lua1993Beágyazott szkriptek és játékfejlesztés.
Java1995Platformfüggetlen alkalmazások fejlesztése.
JavaScript1995Webes interakciók megvalósítása.
PHP1995Szerveroldali webfejlesztés nyelve.
Ruby1995Gyors webfejlesztés egyszerű szintaxissal.
Delphi1995Windows alkalmazások vizuális fejlesztése.
CSS1996Stílusleíró nyelv weboldalak megjelenéséhez.
XML1998Jelölőnyelv adatok struktúrált leírásához.
C#2000Modern objektumorientált nyelv.
Scratch2007Blokkalapú oktatási nyelv.
Go2009Skálázható szerveralkalmazások fejlesztése.
TypeScript2012A JavaScript típusos kiterjesztése.
Swift2014Apple platformokra fejlesztett nyelv.
Rust2015Memóriabiztonság és teljesítmény.
Kotlin2016Android fejlesztés modern nyelve.

2025. október 19., vasárnap

Pontos idő - ESP32

// --- Hálózat / Internet ---
#include <WiFi.h>
#include <WiFiUdp.h>
#include <WiFiClientSecure.h>
#include <HTTPClient.h>

// --- Időkezelés ---
#include <NTPClient.h>
#include <time.h>
#include <sys/time.h>

// --- JSON feldolgozás ---
#include <ArduinoJson.h>

// Wi-Fi és API adatok
static const char* WIFI_SSID       = "YOUR_WIFI_SSID";
static const char* WIFI_PASSWORD   = "YOUR_WIFI_PASSWORD";
static const char* NTP_SERVER      = "pool.ntp.org";
static const char* WEATHER_API_URL = "https://api.openweathermap.org/data/2.5/weather?";
static const char* API_KEY         = "YOUR_API_KEY";
static const char* LATITUDE        = "47.4979";
static const char* LONGITUDE       = "19.0402";
static const char* LOCAL_TIMEZONE  = "CET-1CEST,M3.5.0/2,M10.5.0/3";

// Csak egyszer frissítünk naponta
bool synced_today = false;

// Legutóbb letöltött napkelte/napnyugta idő
static struct tm sunrise_local_tm = {};
static struct tm sunset_local_tm  = {};

WiFiUDP ntpUDP;
NTPClient utc(ntpUDP, NTP_SERVER);

// Kiírja az aktuális UTC és helyi időt
void printNowBoth() {
  time_t now_utc = time(nullptr);
  struct tm lt, gt;
  localtime_r(&now_utc, &lt);
  gmtime_r(&now_utc, &gt);

  Serial.printf(
    "UTC idő: %02d:%02d:%02d | Helyi idő: %02d:%02d:%02d\n",
    gt.tm_hour, gt.tm_min, gt.tm_sec,
    lt.tm_hour, lt.tm_min, lt.tm_sec
  );
}

// Wi-Fi csatlakozás
void wifi_connect() {
  if (WiFi.status() == WL_CONNECTED) return;

  Serial.printf("Kapcsolódás a WiFihez (%s)...", WIFI_SSID);
  WiFi.mode(WIFI_STA);
  WiFi.disconnect();
  WiFi.setAutoReconnect(true);
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);

  // Timeout 10 másodperc
  unsigned long start = millis();
  while (WiFi.status() != WL_CONNECTED && millis() - start < 10000) {
    delay(250);
    Serial.print(".");
    yield();
  }

  if (WiFi.status() == WL_CONNECTED) {
    Serial.println(" SIKERES!");
    Serial.print("IP cím: ");
    Serial.println(WiFi.localIP());
  } else {
    Serial.println(" SIKERTELEN!");
  }
}

// Wi-Fi bontás energiatakarékossághoz
void wifi_disconnect() {
  if (WiFi.status() == WL_CONNECTED) WiFi.disconnect(false);
  WiFi.mode(WIFI_OFF);
  Serial.println("WiFi kapcsolat bontva!");
}

// Rendszeridő beállítása UTC epoch szerint
void setSystemTimeUTC(uint32_t epoch_utc) {
  struct timeval tv { (time_t)epoch_utc, 0 };
  settimeofday(&tv, nullptr);
}

// NTP-ről pontos idő frissítése
bool syncTimeWithNTP() {
  Serial.print("NTP frissítés...");
  utc.begin();
  bool ok = utc.forceUpdate();
  Serial.println(ok ? " SIKERES!" : " SIKERTELEN!");
  if (ok) setSystemTimeUTC(utc.getEpochTime());
  utc.end();
  return ok;
}

// Napkelte/napnyugta letöltése az internetről és helyi idővé konvertálás
bool updateSunriseSunset() {
  // Napló kedvéért aktuális dátum kiírása
  time_t now_utc = time(nullptr);
  struct tm lt_now;
  localtime_r(&now_utc, &lt_now);
  Serial.printf("Dátum: %04d-%02d-%02d\n",
                lt_now.tm_year + 1900, lt_now.tm_mon + 1, lt_now.tm_mday);

  WiFiClientSecure client;
  client.setInsecure(); // Nem ellenőrizzük a tanúsítványt (egyszerűbb)

  HTTPClient http;
  String url = String(WEATHER_API_URL) +
               "lat=" + LATITUDE +
               "&lon=" + LONGITUDE +
               "&units=metric&appid=" + API_KEY;

  http.setTimeout(8000);
  http.begin(client, url);
  int httpCode = http.GET();

  if (httpCode == HTTP_CODE_OK) {
    // JSON válasz beolvasása
    String body = http.getString();
    DynamicJsonDocument doc(4096);

    // JSON pars-olása
    DeserializationError err = deserializeJson(doc, body);
    if (err) {
      Serial.printf("JSON parse hiba: %s\n", err.f_str());
      http.end();
      return false;
    }

    // Mezők ellenőrzése
    if (!doc.containsKey("sys") || !doc["sys"].containsKey("sunrise")) {
      Serial.println("JSON parse hiba: hiányzó sunrise mező.");
      http.end();
      return false;
    }
    if (!doc["sys"].containsKey("sunset")) {
      Serial.println("JSON parse hiba: hiányzó sunset mező.");
      http.end();
      return false;
    }

    // Epoch → helyi idő konverzió
    time_t sr_utc = doc["sys"]["sunrise"].as<long>();
    time_t ss_utc = doc["sys"]["sunset"].as<long>();

    localtime_r(&sr_utc, &sunrise_local_tm);
    localtime_r(&ss_utc, &sunset_local_tm);

    Serial.printf("Napkelte: %02d:%02d\n", sunrise_local_tm.tm_hour, sunrise_local_tm.tm_min);
    Serial.printf("Napnyugta: %02d:%02d\n", sunset_local_tm.tm_hour, sunset_local_tm.tm_min);

    http.end();
    return true;
  }

  // Ha a HTTP nem OK
  Serial.printf("HTTP hiba: %d\n", httpCode);
  http.end();
  return false;
}

// Mindent egyszer frissít: NTP + napkelte/napnyugta
void synchronization() {
  wifi_connect();
  if (WiFi.status() != WL_CONNECTED) { wifi_disconnect(); return; }

  bool ntp_ok = syncTimeWithNTP();
  bool wx_ok  = updateSunriseSunset();

  synced_today = ntp_ok && wx_ok;
  wifi_disconnect();
}

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

  // Helyi időzóna beállítása az RTC-nek
  setenv("TZ", LOCAL_TIMEZONE, 1);
  tzset();

  // Induláskor idő + napkelte/nyugta frissítés
  synchronization();
}

void loop() {
  time_t now_utc = time(nullptr);
  struct tm gt;
  gmtime_r(&now_utc, &gt);

  // Naponta egyszer 01:00 után frissítünk
  if ((gt.tm_hour == 0) && synced_today) synced_today = false;
  if ((gt.tm_hour == 1) && (gt.tm_min == 0) &&
      (gt.tm_sec > 29) && !synced_today) synchronization();

  printNowBoth(); // Debug: kiírás minden mp-ben
  delay(1000);
}