ESP-01 и PT6961

Всем привет. Собственно, данный код рабочий, но есть несколько НО и пока не знаю как исправить. Время берет из сервера и отображает на 7 сегментом индикаторе. Время начинает корректно отображаться только минут через 5-8. Потом стабильно все работает минут 5 -6 и часы бегают хаотитчно, показывая всякую ерунду, далее снова все норм. FLASH в 1МБ, режим памяти DOUT (compatible) , CPU -80 МГц

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

const char* ssid = "www";
const char* password = "87654321";

WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "pool.ntp.org", 10800, 60000);

#define DIN_PIN 0
#define CLK_PIN 2
#define STB_PIN 1

// Только цифры
const byte digits[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};

void sendByte(byte d) {
  for(byte i=0; i<8; i++) {
    digitalWrite(DIN_PIN, d & 1);
    d >>= 1;
    digitalWrite(CLK_PIN, HIGH);
    delayMicroseconds(5);
    digitalWrite(CLK_PIN, LOW);
    delayMicroseconds(5);
  }
}

void initDisp() {
  pinMode(DIN_PIN, OUTPUT);
  pinMode(CLK_PIN, OUTPUT);
  pinMode(STB_PIN, OUTPUT);
  
  digitalWrite(STB_PIN, HIGH);
  digitalWrite(CLK_PIN, LOW);
  
  delay(10);
  
  // Инициализация
  digitalWrite(STB_PIN, LOW);
  sendByte(0x40); // Автоинкремент
  sendByte(0xC0); // Адрес 0
  
  // Очистка
  for(byte i=0; i<12; i++) sendByte(0);
  digitalWrite(STB_PIN, HIGH);
  
  // Включение
  digitalWrite(STB_PIN, LOW);
  sendByte(0x8F); // Вкл + яркость
  digitalWrite(STB_PIN, HIGH);
}

void showDigits(byte d1, byte d2, byte d3, byte d4, bool dot) {
  digitalWrite(STB_PIN, LOW);
  sendByte(0xC0);
  
  sendByte(d1 < 10 ? digits[d1] : 0);
  sendByte(0);
  
  byte seg = digits[d2];
  if(dot) seg |= 0x80;
  sendByte(seg);
  sendByte(0);
  
  sendByte(digits[d3]);
  sendByte(0);
  
  sendByte(digits[d4]);
  sendByte(0);
  
  digitalWrite(STB_PIN, HIGH);
}

void setup() {
  initDisp();
  
  // Тест всех цифр
  for(byte i=0; i<10; i++) {
    showDigits(i, i, i, i, true);
    delay(300);
  }
  
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  
  // Ждем подключения
  byte tries = 0;
  while(WiFi.status() != WL_CONNECTED && tries++ < 20) {
    delay(500);
  }
  
  if(WiFi.status() == WL_CONNECTED) {
    timeClient.begin();
    timeClient.update();
  }
}

void loop() {
  static unsigned long timer = 0;
  static bool dot = true;
  
  if(millis() - timer >= 500) {
    timer = millis();
    dot = !dot;
    
    if(WiFi.status() == WL_CONNECTED) {
      timeClient.update();
      byte h = timeClient.getHours();
      byte m = timeClient.getMinutes();
      showDigits(h/10, h%10, m/10, m%10, dot);
    } else {
      showDigits(1, 2, 3, 4, dot);
    }
  }
  
  delay(50);

}

Спасибо что предупредил, держи нас в курсе. Вопросы появятся - задавай.

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

const char* ssid = "www";
const char* password = "87654321";

WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "pool.ntp.org", 10800, 60000);

#define DIN_PIN 14
#define CLK_PIN 13
#define STB_PIN 12

const byte digits[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};

void ICACHE_RAM_ATTR sendByte(byte d) {
for(byte i = 0; i < 8; i++) {
digitalWrite(DIN_PIN, d & 0x01);
d >>= 1;
digitalWrite(CLK_PIN, HIGH);
asm volatile ("nop; nop; nop; nop; nop; nop; nop; nop;");
digitalWrite(CLK_PIN, LOW);
asm volatile ("nop; nop; nop; nop; nop; nop; nop; nop;");
}
}

void initDisp() {
pinMode(DIN_PIN, OUTPUT);
pinMode(CLK_PIN, OUTPUT);
pinMode(STB_PIN, OUTPUT);

digitalWrite(STB_PIN, HIGH);
digitalWrite(CLK_PIN, LOW);
digitalWrite(DIN_PIN, LOW);

delay(100);

digitalWrite(STB_PIN, LOW);
sendByte(0x40);
sendByte(0xC0);

for(byte i = 0; i < 12; i++) {
sendByte(0x00);
}
digitalWrite(STB_PIN, HIGH);

digitalWrite(STB_PIN, LOW);
sendByte(0x8F);
digitalWrite(STB_PIN, HIGH);

delay(100);
}

void showDigits(byte d1, byte d2, byte d3, byte d4, bool dot) {
digitalWrite(STB_PIN, LOW);
sendByte(0xC0);

sendByte(d1 < 10 ? digits[d1] : 0x00);
sendByte(0x00);

byte seg = digits[d2];
if(dot) seg |= 0x80;
sendByte(seg);
sendByte(0x00);

sendByte(digits[d3]);
sendByte(0x00);

sendByte(digits[d4]);
sendByte(0x00);

digitalWrite(STB_PIN, HIGH);
}

void setup() {
Serial.begin(115200);
Serial.println("\nStarting...");

initDisp();

for(byte i = 0; i < 10; i++) {
showDigits(i, i, i, i, true);
delay(200);
}

showDigits(10, 10, 10, 10, false);

WiFi.mode(WIFI_STA);
WiFi.setSleepMode(WIFI_NONE_SLEEP);
WiFi.begin(ssid, password);

Serial.print("Connecting to WiFi");

int tries = 0;
while(WiFi.status() != WL_CONNECTED && tries++ < 30) {
Serial.print(".");
delay(1000);
}
Serial.println();

if(WiFi.status() == WL_CONNECTED) {
Serial.print("Connected! IP: ");
Serial.println(WiFi.localIP());

timeClient.begin();
timeClient.setUpdateInterval(60000);
timeClient.setTimeout(5000);

if(timeClient.update()) {
Serial.println("NTP time updated successfully");
} else {
Serial.println("Failed to update NTP time");
}
} else {
Serial.println("WiFi connection failed");
showDigits(8, 8, 8, 8, false);
}
}

void loop() {
static unsigned long lastBlink = 0;
static unsigned long lastNTPUpdate = 0;
static bool dot = true;
static bool timeSynced = false;

unsigned long currentMillis = millis();

if(currentMillis - lastBlink >= 500) {
lastBlink = currentMillis;
dot = !dot;
}

if(currentMillis - lastNTPUpdate >= 60000) {
if(WiFi.status() == WL_CONNECTED) {
if(timeClient.update()) {
Serial.println("Time updated");
timeSynced = true;
} else {
Serial.println("Time update failed");
timeSynced = false;
}
lastNTPUpdate = currentMillis;
}
}

if(WiFi.status() == WL_CONNECTED && timeSynced) {
byte h = timeClient.getHours();
byte m = timeClient.getMinutes();

showDigits(h / 10, h % 10, m / 10, m % 10, dot);

static unsigned long lastPrint = 0;
if(currentMillis - lastPrint >= 10000) {
Serial.printf("Time: %02d:%02d:%02d\n", h, m, timeClient.getSeconds());
lastPrint = currentMillis;
}
} else if(WiFi.status() != WL_CONNECTED) {
showDigits(1, 0, 0, 1, dot);
Serial.println("WiFi disconnected");

static unsigned long lastReconnect = 0;
if(currentMillis - lastReconnect >= 10000) {
Serial.println("Attempting to reconnect WiFi...");
WiFi.reconnect();
lastReconnect = currentMillis;
}
} else {
showDigits(8, 8, 8, 8, dot);
}

delay(10);
}