ESP-01 имеет только 8 выводов, из которых цифровых пинов всего 4, да и те 2 отвечают за RS232, а из оставшихся один нельзя при включении на землю подключать. 

Потому часы автоматические, сами стучатся к серверу времени, сами переходят на летнее/зимнее время (теоретически, перехода еще не было, проверить не удалось).

В конструкции ничего сложного, соединения на фото, черный - земля, красный - 3,3В питание, остальные CLK - 2 и DIO - 0. 

Время с корректным часовым поясом получается с сервера worldtimeapi.org 

У меня указана зона Европ/Киев, есть для всех поясов. Один минус запросов к этому серверу - почему-то не каждый запрос проходит, есть версия что это из-за запроса по http:// но по https:// может не хватить места в памяти.

Это одна из промежуточных версий нашей с ChatGPT работы, я думаю он будет вам интересен. Окончательная версия получает время немного по другому, а смещение лето/зима только один раз при запуске.

#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <ArduinoJson.h>
#include <TM1637Display.h>

#define CLK 2
#define DIO 0

const char* ssid = "YOUR_SSID";
const char* password = "YOUR_PASS";

TM1637Display display(CLK, DIO);

unsigned long lastUpdate = 0;
const unsigned long updateInterval = 60000; // раз в минуту
int hh = 0, mm = 0;

void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password);
Serial.print("Connecting");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi connected");
display.setBrightness(7);
}


void loop() {

// проверяем WiFi и переподключаем при необходимости
if (WiFi.status() != WL_CONNECTED) {
WiFi.begin(ssid, password);
delay(1000);
return;
}

// обновляем время раз в минуту
if (millis() - lastUpdate > updateInterval) {
lastUpdate = millis();

WiFiClient client;
HTTPClient http;
http.begin(client, "http://worldtimeapi.org/api/timezone/Europe/Kyiv");

int httpCode = http.GET();
if (httpCode == HTTP_CODE_OK) {
String payload = http.getString();
StaticJsonDocument<1024> doc;
deserializeJson(doc, payload);

String datetime = doc["datetime"]; // "2025-10-04T13:03:45.123456+03:00"
hh = datetime.substring(11, 13).toInt();
mm = datetime.substring(14, 16).toInt();


Serial.printf("Kyiv: %02d:%02d\n", hh, mm);
}

http.end();
}

// авто-затемнение с 23 часов и до 7
if (hh >= 23 || hh < 7) {
display.setBrightness(1);
} else {
display.setBrightness(7);
}

// обновляем дисплей каждую секунду
int displayValue = hh * 100 + mm;
display.showNumberDecEx(displayValue, 0b01000000, true);

delay(1000);

// простая симуляция тиканья минут (чтобы дисплей не застывал между запросами)
static unsigned long lastTick = 0;
if (millis() - lastTick > 60000) {
lastTick = millis();
mm++;
if (mm >= 60) { mm = 0; hh = (hh + 1) % 24; }
}

}