Раз в минуту вывожу бегущей строкой день недели и дату с годом, или температуру в доме и на улице.
Раз в 5 минут получаю и парсю температуры со своего уличного датчика на народном мониторинге
Раз в секунду с помощью SimpleTimer timer получаю время от NTP и вывожу на экран
void DisplayTime(){
//Получаем время
timeClient.update();
hh = timeClient.getHours();
mm = timeClient.getMinutes();
ss = timeClient.getSeconds();
day = timeClient.getDay();
// Выводим время
matrix.drawChar(x... ит.д.
Всё работает отлично, если бы не периодическое отставание до 5 минут с последующим восстановление точного времени.
Один раз минуты совпали, но часы отставали на час. Вывел информацию о полученном времени раз минуту в WebSerial для контроля.
timeClient.update();
Time = String(timeClient.getFormattedTime());
String date_time = timeClient.getFormattedDate();
Date = date_time.substring(0, 10);
WebSerial.print(hh); WebSerial.print(":"); WebSerial.print(mm);
WebSerial.print(":"); WebSerial.println(ss);
WebSerial.println(date_time);
Так по нему получается, что такое отстающее время я получаю от NTP.
Пробовал библиотеку GyverNTP, тоже самое. Что то я совсем ничего не понимаю. Как работает сервер NTP, может разъясните.
Полный код не вывожу, он состоит из 6 вкладок. Не знаю как вывести.
Сократить до десятка-другого строк, так, чтобы проблема сохранилась и привести.
Каждый раз поражаюсь этому. Смысл постить такие запросы? Без кода сказать определённо нельзя ничего, кроме самых наипростейших случаев.
Кстати, пока будете сокращать код, весьма вероятно, что сами и выявите проблему (заметите где она появляется и при каких условиях исчезает). Тогда и посты не понадобятся.
Если оставить только работу с временем, то получится такой код
[code]
#include <ESP8266WiFi.h>
#include <NTPClient.h>
#include <WiFiUdp.h>
//**************************************************************
//const char* ssid = ""; // название и пароль точки доступа
const char* ssid = "";
const char* password = "";
const char* host = "narodmon.ru";
const int httpPort = 8283;
//**************************************************************
#define t0_interval 1000 // через время (1*1000) милисекунд многократно выполнять функцию DisplayTime
#define t2_interval 300000 // через время (5*60*1000) милисекунд многократно выполнять функцию jsonGet
//**************************************************************
int day,dd,hh,mm,ss; // день,дата,час,мин,сек
String Date = "";
String Time = "";
unsigned int timer0, timer1, timer2;
//**************************************************************
WiFiUDP ntpUDP;
SimpleTimer timer;
NTPClient timeClient(ntpUDP, "europe.pool.ntp.org",14400,60000); // 14400 - временной сдвиг в секундах от UTC
//**************************************************************
void setup(){
// Запускаем WIFI
ConnectWiFi();
// Получаем данные из сети
timeClient.begin();
// Запускаем таймеры
timer0 = timer.setInterval(t0_interval, DisplayTime);
timer2 = timer.setInterval(t2_interval, jsonGet);
}
//**************************************************************
void Scroll(){
// Получение текущего времени
Time_init();
// запускаем бегущую строку
if(FLAG){ // выводим дни недели.....
}
else { // температура в доме и на улице
}
FLAG = !FLAG;
DisplayTime();
}
//**************************************************************
void loop(){
timer.run();
timeClient.update();
yield();
}
//**************************************************************
// Получаем время и день
void DisplayTime(){
timeClient.update();
hh = timeClient.getHours();
mm = timeClient.getMinutes();
ss = timeClient.getSeconds();
day = timeClient.getDay();
// Определяем момент для бегущей строки
if(ss == 0) Scroll();
// Выводим время на Max7219
matrix.fillScreen(LOW);
..............................
..............................
}
//**************************************************************
void Time_init(){
// Получение текущего времени
timeClient.update();
Time = String(timeClient.getFormattedTime());
String date_time = timeClient.getFormattedDate();
Date = date_time.substring(0, 10);
// выводим в Serial
Serial.println(Time);
WebSerial.print(hh); WebSerial.print(":"); WebSerial.print(mm);
WebSerial.print(":"); WebSerial.println(ss);
WebSerial.println(date_time);
}
//**************************************************************
void jsonGet(){
// Получаем температуру из сети и в доме
}
//END***********************************************************
[/code]
а потому давайте ссылки на гитхаб или где Вы их там брали.
Вы поймите, цель всего этого дать желающему возможность, запустить код у себя, увидеть проблему, решить её и рассказать Вам. Вот из этого и исходите - если Вы выложили не всё, что для этого требуется, значит Вам не помогут при всём желании.
Меньше последнего кода, уже некуда. Там я оставил только работу со временем, и описание, того, что есть в исходном коде.
Что значит нестандартные? Самые стандартные. А ссыль на них я дал в самом первом посте.
Повторю, что использую библиотеку NTPClient
Достаточно открыть ссылку и посмотреть пример. По нему и делал. По большому счету, у меня вопрос не по коду, а по работе c NTP сервером. Почему получая от него каждую секунду время, мои часы могут убегать? Как такое может быть?
А ежесекундно бомбардировать NTP сервер - это нормально?
Он, вообще-то, служит для того, чтобы время от времени (например, раз в сутки) подкорректировать часы.
Ну не знаю. Я как то верю автору библиотеки, тем более она довольно популярная. Пойду на форуме esp8266ипоспрашиваю. Профильный форум, должны знать. Спасибо всем.