Всем привет. Собственно, данный код рабочий, но есть несколько НО и пока не знаю как исправить. Время берет из сервера и отображает на 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);
}