{"id":475915,"date":"2026-04-14T13:25:56","date_gmt":"2026-04-14T13:25:56","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=475915"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=475915","title":{"rendered":"DIY: \u0410\u0440\u0434\u0443\u0438\u043d\u043e \u0438 \u0441\u0435\u0440\u0432\u0435\u0440 \u0442\u043e\u0447\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041c\u044b \u0443\u0436\u0435 \u043f\u0440\u0438\u0432\u044b\u043a\u043b\u0438 \u0436\u0438\u0442\u044c \u0432 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u043c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u043c \u043c\u0438\u0440\u0435, \u0433\u0434\u0435, \u0441 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0432\u0430\u0436\u043d\u043e \u0437\u043d\u0430\u0442\u044c \u0442\u043e\u0447\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f, \u0430 \u0441 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b &#8212; \u043b\u0435\u0433\u043a\u043e \u0435\u0433\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c, \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043d\u0430 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0435 NTP, \u0434\u0430 \u0432\u043e\u0442 \u0445\u043e\u0442\u044f \u0431\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u0442\u0438\u043f\u0430 <strong>ntpdate pool.ntp.org<\/strong>.<\/p>\n<p>\u041d\u043e \u0435\u0441\u0442\u044c \u043d\u044e\u0430\u043d\u0441: \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u044d\u0442\u0438\u043c\u0438 \u0437\u0430\u043c\u0435\u0434\u043b\u0435\u043d\u0438\u044f\u043c\u0438, \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430\u043c\u0438 \u0438 &#171;\u0431\u0435\u043b\u044b\u043c\u0438 \u0441\u043f\u0438\u0441\u043a\u0430\u043c\u0438&#187; \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435\u0442 \u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0438, \u0447\u0442\u043e \u043a\u0430\u043a \u0440\u0430\u0437 \u0432 \u043d\u0443\u0436\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 <em>\u043e\u043d\u0438<\/em> \u043d\u0435 \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0442 \u043d\u0430\u043c \u0438 NTP \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b, \u0432\u0435\u0434\u044c \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0435 \u043c\u0438\u0440\u043e\u0432\u044b\u0435 NTP-\u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0432\u0440\u044f\u0434 \u043b\u0438 \u0431\u0443\u0434\u0443\u0442 \u0432 \u0431\u0435\u043b\u044b\u0445 \u0441\u043f\u0438\u0441\u043a\u0430\u0445, \u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a\u0438\u0435-\u043d\u0438\u0431\u0443\u0434\u044c <em>\u0434\u0440\u0443\u0433\u0438\u0435<\/em> &#8212; \u043d\u0443, \u0432\u0441\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0438\u0441\u0442\u043e\u0440\u0438\u044f \u043f\u0440\u043e\u043f\u0430\u0434\u0430\u043d\u0438\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0434\u043e\u043c\u0435\u043d\u043d\u044b\u0445 \u0438\u043c\u0435\u043d \u0438\u0437 \u041d\u0421\u0414\u0418, \u0438 \u0432\u0432\u043e\u0434 \u043f\u043b\u0430\u0442\u044b &#171;\u0437\u0430 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0447\u0430\u0441\u0430\u043c \u0442\u043e\u0447\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438&#187;, \u0447\u0442\u043e \u0431\u044b \u043f\u043e\u0434 \u044d\u0442\u0438\u043c \u043d\u0435 \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u043b\u043e\u0441\u044c.<\/p>\n<p>\u0412 \u043e\u0431\u0449\u0435\u043c, \u0441\u043f\u0430\u0441\u0435\u043d\u0438\u0435 \u0443\u0442\u043e\u043f\u0430\u044e\u0449\u0438\u0445&#8230; <br \/>\u041a \u0442\u043e\u043c\u0443 \u0436\u0435, \u043a\u0430\u043a \u0433\u043e\u0432\u043e\u0440\u044f\u0442, &#171;\u043b\u044e\u0431\u043e\u0439, \u043a\u0442\u043e \u0443\u0432\u0438\u0434\u0435\u043b \u0410\u0440\u0434\u0443\u0438\u043d\u043e &#8212; \u0440\u0430\u043d\u043e \u0438\u043b\u0438 \u043f\u043e\u0437\u0434\u043d\u043e \u0434\u0435\u043b\u0430\u0435\u0442 \u0447\u0430\u0441\u044b \u0438\u043b\u0438 \u043c\u0435\u0442\u0435\u043e\u0441\u0442\u0430\u043d\u0446\u0438\u044e&#187;. <br \/>\u041f\u0440\u043e\u0441\u0442\u044b\u0435 \u0447\u0430\u0441\u044b \u043c\u044b \u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435 \u0431\u0443\u0434\u0435\u043c, \u0430 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0432\u043f\u043e\u043b\u043d\u0435 IT-\u0448\u043d\u044b\u0439 NTP-\u0441\u0435\u0440\u0432\u0435\u0440.<\/p>\n<p>\u0417\u0430 \u043e\u0441\u043d\u043e\u0432\u0443 \u0431\u0435\u0440\u0435\u043c \u0447\u0438\u043f ESP8266, \u0442\u043e\u0447\u043d\u0435\u0435 \u0435\u0433\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442 ESP12-F. \u0421\u0435\u0439\u0447\u0430\u0441 \u043e\u043d\u0438 \u0441\u0447\u0438\u0442\u0430\u044e\u0442\u0441\u044f \u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0438\u043c\u0438, \u0432\u0441\u0435 \u0434\u0430\u0432\u043d\u043e \u0441\u0431\u0435\u0436\u0430\u043b\u0438 \u043d\u0430 ESP32, \u043d\u043e \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0447\u0438\u043f \u0445\u043e\u0440\u043e\u0448\u0438\u0439, \u0430 \u0435\u0433\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0442\u0443\u0442 \u0431\u043e\u043b\u0435\u0435 \u0447\u0435\u043c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e. <br \/>\u0415\u0441\u043b\u0438 \u043a\u0442\u043e \u0434\u043e \u0441\u0438\u0445 \u043f\u043e\u0440 \u043d\u0435 \u0437\u043d\u0430\u043b &#8212; \u043e\u043d \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u043c\u0438 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430\u043c\u0438 Arduino, \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0430 \u043f\u0438\u0448\u0435\u0442\u0441\u044f \u043d\u0430 \u0432\u043f\u043e\u043b\u043d\u0435 \u043e\u0431\u044b\u0447\u043d\u043e\u043c C++ (\u043a\u0430\u043a\u0438\u043c \u043e\u043d \u0431\u044b\u043b \u0433\u043e\u0434\u0443 \u0432 99, \u0431\u0435\u0437 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043d\u0430\u0432\u043e\u0440\u043e\u0442\u043e\u0432).<\/p>\n<p>\u041e\u0431\u0449\u0430\u044f \u0438\u0434\u0435\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f: \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a WiFi \u0441\u0435\u0442\u0438, \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0432\u043d\u0443\u0442\u0440\u0438 NTP-\u0441\u0435\u0440\u0432\u0435\u0440 \u0438 \u0440\u0430\u0437\u0434\u0430\u0435\u043c \u0442\u043e\u0447\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043f\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u043c \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432 \u0438\u0437 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0435\u0442\u0438. <br \/>\u0418 \u0441\u0440\u0430\u0437\u0443 \u0436\u0435 \u0432\u043e\u043f\u0440\u043e\u0441 &#8212; \u0433\u0434\u0435 \u0435\u0433\u043e \u0431\u0440\u0430\u0442\u044c, \u044d\u0442\u043e \u0442\u043e\u0447\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f? <br \/>\u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0438\u0441\u0445\u043e\u0434\u0438\u043c \u0438\u0437 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0434\u043e\u0441\u0442\u0443\u043f \u043a\u0443\u0434\u0430-\u0442\u043e \u0431\u0443\u0434\u0435\u0442 &#8212; \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435\u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u044b\u0439, \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u043a\u0430\u043a \u0432 \u0434\u043e\u0441\u0442\u043e\u0441\u043b\u0430\u0432\u043d\u044b\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0430 \u0434\u0438\u0430\u043b\u0430\u043f\u0430 &#8212; \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0443\u0436\u043d\u043e <em>\u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u043a \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0443<\/em>, \u043f\u043e\u0442\u043e\u043c \u043f\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c, \u043f\u043e\u0442\u043e\u043c <em>\u043e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f<\/em>. <br \/>\u0410 \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0432\u0441\u0451 \u0442\u043e\u0442 \u0436\u0435 NTP, \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u0440\u0435\u043c\u044f, \u043f\u043e\u0442\u043e\u043c \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0438 \u043a\u0430\u043a\u043e\u0433\u043e-\u0442\u043e \u043f\u0435\u0440\u0438\u043e\u0434\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f, \u043f\u043e\u0442\u043e\u043c \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438 \u0430\u043a\u0442\u0443\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u043f\u0440\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438.<\/p>\n<p>\u0412 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0445 \u043f\u0430\u043a\u0435\u0442\u0430\u0445 \u0434\u043b\u044f ESP \u0443\u0436\u0435 \u0435\u0441\u0442\u044c &#171;\u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f&#187; &#8212; \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c, \u0437\u0430\u0442\u0435\u043c \u043e\u043d\u043e &#171;\u0438\u0434\u0451\u0442&#187; \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u0442\u0438\u043a\u0430\u043c\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430. \u0422\u043e\u0442 \u0436\u0435 \u0441\u0430\u043c\u044b\u0439 \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u0447\u0442\u043e \u0438 \u0432 \u043b\u044e\u0431\u043e\u0439 \u041e\u0421. <br \/>\u0418 \u0442\u043e\u0436\u0435 \u043a\u0430\u043a \u0432 \u043b\u044e\u0431\u043e\u0439 \u041e\u0421 &#8212; \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c \u0445\u043e\u0434\u0430 \u044d\u0442\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0442\u043e\u0433\u043e, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e &#171;\u041e\u0421&#187; \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u043e\u0446\u0435\u043d\u0438\u0432\u0430\u0435\u0442 \u0447\u0430\u0441\u0442\u043e\u0442\u0443 \u0442\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u0430 \u044d\u0442\u0430 \u0447\u0430\u0441\u0442\u043e\u0442\u0430, \u0438 \u0442.\u0434. \u0412 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435, \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u043d\u043e\u0433\u0434\u0430 \u043f\u043e\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0435\u0433\u043e &#8212; \u044d\u0442\u043e\u0433\u043e \u0443\u0436\u0435 \u0432\u043f\u043e\u043b\u043d\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e.<\/p>\n<p>\u0412 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u0445 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u0445 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0438 \u043a \u0432\u043d\u0435\u0448\u043d\u0438\u043c NTP-\u0441\u0435\u0440\u0432\u0435\u0440\u0430\u043c:<\/p>\n<pre><code class=\"cpp\">#include &lt;time.h&gt;configTime(0, 0, \"pool.ntp.org\");<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:87px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0420\u0430\u0437 \u0432 3600 \u0441\u0435\u043a\u0443\u043d\u0434 &#171;\u041e\u0421&#187; \u0431\u0443\u0434\u0435\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0434\u0435\u043b\u0430\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441 \u0438 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c \u0432\u0440\u0435\u043c\u044f. <br \/>\u041a\u043e\u0433\u0434\u0430 \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0442\u0435\u0443\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f &#8212; \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u043c \u0435\u0433\u043e:<\/p>\n<pre><code class=\"cpp\">time_t now = time(nullptr);<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u043e \u0444\u0430\u043a\u0442\u0443 &#8212; \u044d\u0442\u043e \u043e\u0431\u044b\u0447\u043d\u044b\u0439 unixtime, \u0432\u0440\u0435\u043c\u044f \u0441 \u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445 \u0441 01.01.1970.<br \/>\u0422\u043e \u0435\u0441\u0442\u044c, \u0432\u0440\u0435\u043c\u044f \u0442\u0443\u0442 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0430\u0435\u0442\u0441\u044f \u0441 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c\u044e \u0434\u043e \u0441\u0435\u043a\u0443\u043d\u0434. \u041e\u0431\u044b\u0447\u043d\u043e \u044d\u0442\u043e\u0433\u043e \u0432\u043f\u043e\u043b\u043d\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e. \u043d\u043e \u0432\u0435\u0434\u044c \u043c\u044b \u0445\u043e\u0442\u0435\u043b\u0438 \u0441\u0435\u0440\u0432\u0435\u0440 \u0422\u041e\u0427\u041d\u041e\u0413\u041e \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u0447\u0442\u043e\u0431\u044b \u0440\u0430\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u043f\u043e NTP, \u0430 \u0442\u0430\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0441\u043e\u0442\u044b\u0435 \u0438 \u0442\u044b\u0441\u044f\u0447\u043d\u044b\u0435 \u0434\u043e\u043b\u0438 \u0441\u0435\u043a\u0443\u043d\u0434\u044b.<\/p>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0435\u0436\u0434\u0435 \u0432\u0441\u0435\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u0441\u0447\u0435\u0442\u0447\u0438\u043a \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u0441 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u043a\u0443\u043d\u0434\u0430\u043c\u0438. <br \/>\u041f\u0440\u0438\u043d\u0446\u0438\u043f \u043f\u0440\u043e\u0441\u0442\u043e\u0439: \u043f\u0440\u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0435 \u0442\u043e\u0447\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0438 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0441\u0447\u0435\u0442\u0447\u0438\u043a \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u043a\u0443\u043d\u0434 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430, \u043f\u0440\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0435 \u043a \u043d\u0435\u043c\u0443 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u043a\u0443\u043d\u0434, \u043f\u0440\u043e\u0448\u0435\u0434\u0448\u0438\u0445 \u043c\u0435\u0436\u0434\u0443 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u043e\u0439 \u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u043c, \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u043e\u0432\u043e\u0435 \u0432\u0440\u0435\u043c\u044f. <br \/>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u0432\u0440\u0435\u043c\u044f &#171;\u0448\u043b\u043e&#187; &#8212; \u0435\u0433\u043e \u043d\u0430\u0434\u043e \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0442\u044c, \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c &#8212; \u0434\u043e \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u043a\u0443\u043d\u0434, \u0430 \u043f\u043e\u0433\u0440\u0435\u0448\u043d\u043e\u0441\u0442\u044c &#8212; \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0437\u0430\u043f\u0440\u043e\u0441\u0430, \u043e\u043a\u043e\u043b\u043e 20-30 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u043a\u0443\u043d\u0434. \u041d\u0435\u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e, \u043d\u043e \u0441\u043e\u0439\u0434\u0435\u0442.<\/p>\n<pre><code class=\"cpp\">#ifndef jb_time#define jb_time#include &lt;stdint.h&gt;#define JB_TIME_MAX_AGE  600class JbTime {private:  uint64_t _last ;    \/\/ last change time  uint64_t _sec ;     \/\/ seconds  uint32_t _usec ;    \/\/ microseconds  uint32_t _mark ;    \/\/ mark uS for time updatepublic:  bool ok;  bool fresh;  JbTime(){    _sec = 0;    _usec = 0;    _mark = 0;    _last = 0;    ok = false;    fresh = false;  }  inline bool old() {    if(_sec == 0) return true;    if((_sec - _last) &gt; JB_TIME_MAX_AGE) return true;    return false;  }  inline void copy(JbTime * src) {    uint64_t sec;    uint32_t usec;    src-&gt;gettime(&amp;sec, &amp;usec);    _mark = micros();    _sec = sec;    _usec = usec;    ok = src-&gt;ok;    _last = sec;  }    inline void settime(uint64_t sec, uint32_t usec, uint32_t mark = micros() ){    _mark = mark;    _sec = sec;    _sec += usec \/ 1000000;    _usec = usec % 1000000;    _usec = usec;    ok = true;    _last = sec;  }  inline void gettime(uint64_t *o_sec, uint32_t *o_usec){    if(ok){      uint32_t now = micros();      uint32_t delta = now - _mark;      _mark = now;      uint64_t total = (uint64_t)_usec + delta;      _sec += total \/ 1000000;      _usec = total % 1000000;      *o_sec = _sec;      *o_usec = _usec;    }else{      *o_sec = 0;      *o_usec = 0;    }  }  inline uint64_t synced(){    return _last;  }};#endif<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0418 \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u044d\u0442\u043e \u043a\u043b\u0430\u0441\u0441 &#8212; \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437\u043d\u044b\u0445 \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u043e\u0432 \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u043f\u043e\u0434 \u0440\u0430\u0437\u043d\u044b\u0435 \u0446\u0435\u043b\u0438.<\/p>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a \u0448\u0442\u0430\u0442\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e \u0441 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c\u044e \u0434\u043e \u0441\u0435\u043a\u0443\u043d\u0434 &#8212; \u0442\u043e \u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043a NTP \u0441\u0435\u0440\u0432\u0435\u0440\u0430\u043c \u0438\u0437 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0432\u044b\u0434\u0430\u0432\u0430\u043b\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0441 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c\u044e \u0434\u043e \u0441\u0435\u043a\u0443\u043d\u0434, \u0430 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0442\u043e\u0447\u043d\u0435\u0435.<br \/>\u041f\u0440\u043e\u0442\u043e\u043a\u043e\u043b NTP \u043e\u043f\u0438\u0441\u0430\u043d \u0432 RFC 5905: \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b, \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 \u043e\u0431\u043c\u0435\u043d\u0435 \u043f\u0430\u043a\u0435\u0442\u0430\u043c\u0438 \u043c\u0435\u0436\u0434\u0443 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u043c \u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c, \u0433\u0434\u0435 \u0441\u0435\u0440\u0432\u0435\u0440 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442 \u0441\u0432\u043e\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u043e \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438.<br \/>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f UDP, 123 \u043f\u043e\u0440\u0442, \u0432\u0440\u0435\u043c\u044f \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445 \u0441 1900 \u0433\u043e\u0434\u0430.<br \/>\u041a\u043b\u044e\u0447\u0435\u0432\u043e\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432 \u0444\u043e\u0440\u043c\u0443\u043b\u0435 \u0440\u0430\u0441\u0447\u0435\u0442\u0430 \u0441\u0435\u0442\u0435\u0432\u043e\u0439 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0438, \u0442\u0430\u043a \u043a\u0430\u043a \u0441\u0435\u0440\u0432\u0435\u0440 \u043d\u0435 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u043d\u0430 \u0437\u0430\u043f\u0440\u043e\u0441 \u043c\u0433\u043d\u043e\u0432\u0435\u043d\u043d\u043e, \u0438 \u0432\u0440\u0435\u043c\u044f \u043d\u0435\u043b\u044c\u0437\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u0442\u0430\u043a \u0432\u0437\u044f\u0442\u044c \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c.<\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u0432\u043e\u0439 NTP-\u0441\u0435\u0440\u0432\u0435\u0440 \u0442\u043e\u0436\u0435 \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0441\u043b\u043e\u0436\u043d\u043e, \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043d\u0430 \u0437\u0430\u043f\u0440\u043e\u0441 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c UDP-\u043f\u0430\u043a\u0435\u0442 \u0441 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438. \u0412\u0440\u0435\u043c\u044f \u0431\u0435\u0440\u0435\u043c \u0441\u0432\u043e\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0435.<\/p>\n<p>\u041d\u0430\u043f\u0438\u0448\u0435\u043c \u0441\u0432\u043e\u0439 \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 NTP, \u0434\u043b\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0438 \u043e\u0442\u0432\u0435\u0442\u043e\u0432 \u0441\u0440\u0430\u0437\u0443: <\/p>\n<pre><code class=\"cpp\">#ifndef jb_ntp#define jb_ntp#include &lt;ESP8266WiFi.h&gt;#include &lt;WiFiUdp.h&gt;#include &lt;time.h&gt;#include &lt;JbTime.h&gt;#define ntpPort   123#define NTP_UNIX_EPOCH_DIFF 2208988800UL#define MINIMAL_UNIXTIME    1767225600UL\/\/ \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 NTP \u043f\u0430\u043a\u0435\u0442\u0430 (48 \u0431\u0430\u0439\u0442)struct NTPPacket {  uint8_t li_vn_mode;      \/\/ leap indicator, version, mode  uint8_t stratum;          \/\/ \u0441\u0442\u0440\u0430\u0442\u0443\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0430  uint8_t poll;             \/\/ \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u043e\u043f\u0440\u043e\u0441\u0430  uint8_t precision;        \/\/ \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c \u0447\u0430\u0441\u043e\u0432  uint32_t rootDelay;       \/\/ \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430  uint32_t rootDispersion;  \/\/ \u0434\u0438\u0441\u043f\u0435\u0440\u0441\u0438\u044f  uint32_t refId;           \/\/ id \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430  uint32_t refTm_s;         \/\/ \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 (\u0441\u0435\u043a\u0443\u043d\u0434\u044b)  uint32_t refTm_f;         \/\/ \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 (\u0434\u0440\u043e\u0431\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c)  uint32_t origTm_s;        \/\/ \u0432\u0440\u0435\u043c\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u043c (T1) - \u0441\u0435\u043a\u0443\u043d\u0434\u044b  uint32_t origTm_f;        \/\/ \u0432\u0440\u0435\u043c\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u043c (T1) - \u0434\u0440\u043e\u0431\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c  uint32_t rxTm_s;          \/\/ \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c (T2) - \u0441\u0435\u043a\u0443\u043d\u0434\u044b  uint32_t rxTm_f;          \/\/ \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c (T2) - \u0434\u0440\u043e\u0431\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c  uint32_t txTm_s;          \/\/ \u0432\u0440\u0435\u043c\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u043e\u0442\u0432\u0435\u0442\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c (T3) - \u0441\u0435\u043a\u0443\u043d\u0434\u044b  uint32_t txTm_f;          \/\/ \u0432\u0440\u0435\u043c\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u043e\u0442\u0432\u0435\u0442\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c (T3) - \u0434\u0440\u043e\u0431\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c} __attribute__((packed));#define JB_NTPCLIENT_NOINIT     1#define JB_NTPCLIENT_NODNS      2#define JB_NTPCLIENT_NOSEND     3#define JB_NTPCLIENT_NOREPLY    4#define JB_NTPCLIENT_BADPACKET  5#define JB_NTPCLIENT_ZEROTIME   6class JbNTPClient {private:  WiFiUDP udp;  int _error;  bool _success;  double _networkDelay;  JbTime * systime;  \/\/ \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 32-\u0431\u0438\u0442\u043d\u043e\u0433\u043e NTP \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432 double (\u0441\u0435\u043a\u0443\u043d\u0434\u044b + \u0434\u0440\u043e\u0431\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c)  inline double ntpToDouble(uint32_t sec, uint32_t frac) {    return sec + frac \/ 4294967296.0; \/\/ 2^32  }  inline double ntpToDouble(uint64_t sec, uint32_t frac) {    uint32_t x_sec = (uint32_t)(sec &amp; 0xFFFFFFFF);    return x_sec + frac \/ 4294967296.0; \/\/ 2^32  }  \/\/ \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 NTP-\u0437\u0430\u043f\u0440\u043e\u0441\u0430  void createRequest(NTPPacket &amp;packet, uint64_t sec, uint32_t frac) {    memset(&amp;packet, 0, sizeof(NTPPacket));    packet.li_vn_mode = 0x23; \/\/ LI=0, VN=4, Mode=3 (client)    uint32_t x_sec = (uint32_t)(sec &amp; 0xFFFFFFFF);    packet.txTm_s = htonl(x_sec);    packet.txTm_f = htonl(frac);  }public:  JbNTPClient(JbTime * src) {    _success = false;    _error  = JB_NTPCLIENT_NOINIT;    _networkDelay = 0;    systime = src;  }  bool begin() {    return udp.begin(ntpPort);  }  WiFiUDP port() { return udp; }  bool success() { return _success; }  bool error() { return _error; }  double netDelay() { return _networkDelay; }  \/\/ \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043a NTP-\u0441\u0435\u0440\u0432\u0435\u0440\u0443  \/\/ \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u0442 mytime  bool requestTime(const char* server, JbTime * mytime) {    _success = false;    _error  = JB_NTPCLIENT_NOINIT;    _networkDelay = 0;    mytime-&gt;ok = false;    IPAddress timeServerIP;    if (!WiFi.hostByName(server, timeServerIP)) {      _error  = JB_NTPCLIENT_NODNS;      return false;    }    NTPPacket packet;    \/\/ T1: \u0432\u0440\u0435\u043c\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u043f\u0430\u043a\u0435\u0442\u0430    uint64_t t1_sec = 0;    uint32_t t1_usec = 0;    systime-&gt;gettime(&amp;t1_sec, &amp;t1_usec);    t1_sec += NTP_UNIX_EPOCH_DIFF;    uint32_t t1_frac = (uint32_t)((t1_usec * (uint64_t)0x100000000ULL) \/ 1000000ULL);    createRequest(packet, t1_sec, t1_frac);    \/\/ \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u043f\u0440\u043e\u0441    udp.beginPacket(timeServerIP, ntpPort);    udp.write((uint8_t*)&amp;packet, sizeof(NTPPacket));    udp.endPacket();    \/\/ \u043e\u0436\u0438\u0434\u0430\u0435\u043c \u043e\u0442\u0432\u0435\u0442 \u0441 \u0442\u0430\u0439\u043c\u0430\u0443\u0442\u043e\u043c    unsigned long timeout = millis() + 2000; \/\/ 2 \u0441\u0435\u043a\u0443\u043d\u0434\u044b \u0442\u0430\u0439\u043c\u0430\u0443\u0442    while (udp.parsePacket() == 0) {      if (millis() &gt; timeout) {        _error  = JB_NTPCLIENT_NOREPLY;        return false;      }      delay(10);    }    \/\/ T4: \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043e\u0442\u0432\u0435\u0442\u0430     uint64_t t4_sec;    uint32_t t4_usec;    systime-&gt;gettime(&amp;t4_sec, &amp;t4_usec);    t4_sec += NTP_UNIX_EPOCH_DIFF;    uint32_t t4_frac = (uint32_t)((t4_usec * (uint64_t)0x100000000ULL) \/ 1000000ULL);    uint32_t t4_mark = micros();    \/\/ \u0447\u0438\u0442\u0430\u0435\u043c \u043e\u0442\u0432\u0435\u0442    int len = udp.read((uint8_t*)&amp;packet, sizeof(NTPPacket));    if (len &lt; sizeof(NTPPacket)) {      _error  = JB_NTPCLIENT_BADPACKET;      return false;    }    uint8_t mode = packet.li_vn_mode &amp; 0x07;    if (mode != 4) {      _error  = JB_NTPCLIENT_BADPACKET;      return false;    }    \/\/ \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u043c \u043c\u0435\u0442\u043a\u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0438\u0437 \u043f\u0430\u043a\u0435\u0442\u0430    uint32_t t2_sec = ntohl(packet.rxTm_s);    uint32_t t2_frac = ntohl(packet.rxTm_f);    uint32_t t3_sec = ntohl(packet.txTm_s);    uint32_t t3_frac = ntohl(packet.txTm_f);    \/\/ \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e \u0441\u0435\u0440\u0432\u0435\u0440 \u0432\u0435\u0440\u043d\u0443\u043b \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043c\u0435\u0442\u043a\u0438    if (t2_sec == 0 || t3_sec == 0) {      _error  = JB_NTPCLIENT_ZEROTIME;      return false;    }    \/\/ \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u043c \u0432\u0441\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0430 \u0432 double     double t1 = ntpToDouble(t1_sec, t1_frac);    double t2 = ntpToDouble(t2_sec, t2_frac);    double t3 = ntpToDouble(t3_sec, t3_frac);    double t4 = ntpToDouble(t4_sec, t4_frac);   \/\/ \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0441\u0435\u0442\u0438 (round-trip delay)    _networkDelay = (t4 - t1) - (t3 - t2);    \/\/ \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 (offset) \u043f\u043e \u0444\u043e\u0440\u043c\u0443\u043b\u0435 RFC 5905    double offset = ((t2 - t1) + (t3 - t4)) \/ 2;    \/\/ \u0442\u043e\u0447\u043d\u043e\u0435 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043e\u0442\u0432\u0435\u0442\u0430 (t4)    double newtime = t4 + offset;    \/\/ \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u044d\u0440\u0443    if(newtime &lt; (MINIMAL_UNIXTIME + NTP_UNIX_EPOCH_DIFF)){      newtime += (1ULL&lt;&lt;32);    }    \/\/ \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u0432 Unix-\u0432\u0440\u0435\u043c\u044f (\u0441\u0435\u043a\u0443\u043d\u0434\u044b \u0441 1970)     uint64_t sec = (uint32_t)newtime - NTP_UNIX_EPOCH_DIFF;    uint32_t usec = (newtime - (uint32_t)newtime) * 1000000;    _success = true;    _error = 0;    mytime-&gt;settime(sec, usec, t4_mark);    return true;  }  \/\/ \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432 \u0435\u0441\u043b\u0438 \u043e\u043d\u0438 \u0435\u0441\u0442\u044c  void serve(){    int packetSize = udp.parsePacket();    if (packetSize) {      NTPPacket packet;      int len = udp.read((uint8_t*)&amp;packet, sizeof(NTPPacket));      if (len &lt; sizeof(NTPPacket)) {        return ;      }      \/\/ \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0440\u0435\u0436\u0438\u043c\u0430      uint8_t mode = packet.li_vn_mode &amp; 0x07;      if (mode == 3) {        \/\/ \u044d\u0442\u043e \u0437\u0430\u043f\u0440\u043e\u0441 \u043a\u043b\u0438\u0435\u043d\u0442\u0430         if(systime-&gt;ok){          uint64_t sec;          uint32_t usec;          systime-&gt;gettime(&amp;sec, &amp;usec);          sec += NTP_UNIX_EPOCH_DIFF;          uint32_t frac = (uint32_t)((usec * (uint64_t)0x100000000ULL) \/ 1000000ULL);          packet.li_vn_mode = 0b00100100;          packet.stratum    = 1;          packet.poll       = 0;          packet.precision  = 0xEC;          packet.rootDelay  = 0;          packet.rootDispersion  = 0;          packet.refId      = 0;          packet.refTm_s    = htonl((uint32_t)sec);          packet.refTm_f    = htonl(frac);          packet.origTm_s   = packet.txTm_s;          packet.origTm_f   = packet.txTm_f;          packet.rxTm_s    = htonl((uint32_t)sec);          packet.rxTm_f    = htonl(frac);          packet.txTm_s    = htonl((uint32_t)sec);          packet.txTm_f    = htonl(frac);          udp.beginPacket(udp.remoteIP(), udp.remotePort());          udp.write((uint8_t*)&amp;packet, sizeof(NTPPacket));          udp.endPacket();        }      }    }  }};#endif<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0412 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435, \u0447\u0430\u0441\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u0430: \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u0438 \u0442\u043e\u0447\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u043f\u043e NTP \u0441 \u0434\u0440\u0443\u0433\u0438\u0445 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432, \u0438 \u0440\u0430\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0441\u0430\u043c\u0438.<br \/>\u041d\u043e \u043a\u0430\u043a \u0443\u0436\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u043b\u043e\u0441\u044c &#8212; \u043d\u0435 \u0444\u0430\u043a\u0442, \u0447\u0442\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0431\u0443\u0434\u0443\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b. <\/p>\n<h4>\u0414\u043e\u0431\u0430\u0432\u0438\u043c \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043a\u043e\u0441\u043c\u043e\u0441\u0430<\/h4>\n<p>\u0415\u0441\u0442\u044c \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0442\u043e\u0447\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0437\u0430\u0431\u044b\u0432\u0430\u044e\u0442: \u044d\u0442\u043e GPS.<br \/>\u0421\u0430\u043c \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u0440\u0430\u0431\u043e\u0442\u044b GPS \u043e\u0441\u043d\u043e\u0432\u0430\u043d \u043d\u0430 \u0442\u043e\u043c, \u0447\u0442\u043e \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e \u0442\u043e\u0447\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0438 \u0432\u0440\u0435\u043c\u044f \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0438 \u043f\u043e\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u044f \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432 \u0441 \u0440\u0430\u0437\u043d\u044b\u0445 \u0441\u043f\u0443\u0442\u043d\u0438\u043a\u043e\u0432, \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0442\u044c \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0434\u043e \u043d\u0438\u0445 \u0441 \u0432\u044b\u0441\u043e\u043a\u043e\u0439 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c\u044e \u0438 \u0432\u044b\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u043a\u0430\u0440\u0442\u0438\u043d\u0443, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u0435\u0441\u0442\u043e \u043f\u0440\u0438\u0435\u043c\u043d\u0438\u043a\u0430 \u0442\u043e\u0447\u043d\u043e \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e. <br \/>\u041c\u0435\u0441\u0442\u043e \u0441\u0435\u0439\u0447\u0430\u0441 \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0432\u0430\u0436\u043d\u043e, \u043f\u0440\u0438\u0435\u043c\u043d\u0438\u043a \u0441\u0442\u0430\u0446\u0438\u043e\u043d\u0430\u0440\u043d\u044b\u0439 &#8212; \u0430 \u0432\u043e\u0442 \u0432\u0440\u0435\u043c\u044f \u0434\u0430. <\/p>\n<p>\u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u043c\u043e\u0434\u0443\u043b\u044c GPS Neo-6M<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/a02\/959\/793\/a029597936f93cd4c5cf739efdbd45ea.png\" width=\"562\" height=\"507\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/a02\/959\/793\/a029597936f93cd4c5cf739efdbd45ea.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/a02\/959\/793\/a029597936f93cd4c5cf739efdbd45ea.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p><em>\u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u0432 \u0410\u0440\u0434\u0443\u0438\u043d\u043e-\u0441\u0442\u0438\u043b\u0435: \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u043e\u043d &#171;\u043a\u0440\u0430\u0441\u043d\u0435\u043d\u044c\u043a\u0438\u0439&#187;!<br \/>\u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0435\u0441\u0442\u044c \u0435\u0449\u0435 \u0434\u0440\u0443\u0433\u0438\u0435, \u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u0441\u0438\u043d\u0435\u0433\u043e \u0446\u0432\u0435\u0442\u0430, \u043d\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f \u043e\u043d\u0438 \u043d\u0435 \u0446\u0432\u0435\u0442\u043e\u043c, \u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u0435\u043c \u0432\u044b\u0432\u043e\u0434\u0430 PPS: \u0437\u0434\u0435\u0441\u044c 5 \u043a\u043e\u043d\u0442\u0430\u043a\u0442\u043e\u0432, \u043e\u0434\u0438\u043d \u0438\u0437 \u043d\u0438\u0445 PPS, \u0430 \u0442\u0430\u043c 4, \u0438 PPS \u043d\u0435\u0442.<br \/>\u041d\u043e \u043e\u043d \u043d\u0430\u043c \u043d\u0443\u0436\u0435\u043d.<\/em><\/p>\n<p>\u042d\u0442\u043e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0441\u0430\u043c\u043e\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u0430\u043c \u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u0438\u0441\u043a\u0430\u0442\u044c \u0441\u0438\u0433\u043d\u0430\u043b\u044b \u0441\u043f\u0443\u0442\u043d\u0438\u043a\u043e\u0432, \u0441\u0430\u043c \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u0433\u0435\u043e\u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0438 \u0442.\u0434., \u0438 \u0432\u044b\u0434\u0430\u0435\u0442 \u0443\u0436\u0435 \u0433\u043e\u0442\u043e\u0432\u044b\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0432 \u0432\u0438\u0434\u0435 \u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e TTL serial. \u0422\u043e \u0435\u0441\u0442\u044c, \u0434\u043e\u0441\u0442\u043e\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0447\u0438\u0442\u0430\u0442\u044c \u0447\u0442\u043e \u043e\u043d \u043f\u0438\u0448\u0435\u0442 &#8212; \u0438 \u0441\u0440\u0435\u0434\u0438 \u0441\u0442\u0440\u043e\u043a \u0440\u0430\u0437\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0435\u0441\u0442\u044c \u0442\u0430\u043a\u0430\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u0441 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c\u044e \u0434\u043e \u0441\u0435\u043a\u0443\u043d\u0434\u044b, \u0438 \u0434\u0430\u0442\u0443.<\/p>\n<p>\u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0435\u043f\u043b\u043e\u0445\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 GPRMC, \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a:<\/p>\n<blockquote>\n<p>$GPRMC,050603.00,A,2236.91423,N,11403.34555,E,0.13,303.34,020126,D*7F<\/p>\n<\/blockquote>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 &#8212; <br \/>050603 \u044d\u0442\u043e \u0432\u0440\u0435\u043c\u044f, 05:06:03 UTC <br \/>020126 &#8212; \u0434\u0430\u0442\u0430, 2026.01.02 <br \/>A &#8212; \u0434\u0430\u043d\u043d\u044b\u0435 \u0432\u0430\u043b\u0438\u0434\u043d\u044b <br \/>2236.91423,N,11403.34555,E &#8212; \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b <br \/>0.13 &#8212; \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0432 \u0443\u0437\u043b\u0430\u0445 (\u043c\u0438\u043b\u0438 \u0432 \u0447\u0430\u0441), <br \/>303.34 &#8212; \u0430\u0437\u0438\u043c\u0443\u0442 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f (\u043a\u0430\u043a \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e &#8212; \u0432\u0441\u0435\u0433\u0434\u0430 \u0435\u0441\u0442\u044c \u043f\u043e\u0433\u0440\u0435\u0448\u043d\u043e\u0441\u0442\u044c \u043f\u043e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438, \u0430 \u043d\u0435\u043f\u043e\u0434\u0432\u0438\u0436\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u201c\u043a\u0440\u0443\u0442\u0438\u0442\u0441\u044f\u201d \u0432 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0445 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f\u0445)<\/p>\n<p>\u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0443\u0437\u043d\u0430\u0442\u044c \u0432\u0440\u0435\u043c\u044f &#8212; \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u044d\u0442\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435, \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c \u0435\u0433\u043e, \u0438 \u0432\u044b\u0442\u0430\u0449\u0438\u0442\u044c \u0434\u0430\u0442\u0443 \u0438 \u0432\u0440\u0435\u043c\u044f.<br \/>\u041d\u043e \u0432\u0440\u0435\u043c\u044f \u0442\u0443\u0442 \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445, \u0430 \u043d\u0443\u0436\u043d\u043e \u0422\u041e\u0427\u041d\u0415\u0415.<br \/>\u0418\u043c\u0435\u043d\u043d\u043e \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0438 \u043d\u0443\u0436\u0435\u043d \u0432\u044b\u0432\u043e\u0434 PPS:<\/p>\n<p>PPS (Pulse Per Second): \u044d\u0442\u043e \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e &#171;\u043c\u043e\u0440\u0433\u0430\u043b\u043a\u0430 \u0441\u0432\u0435\u0442\u043e\u0434\u0438\u043e\u0434\u043e\u043c \u0440\u0430\u0437 \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0443&#187;, \u0442\u0443\u0442 \u043b\u043e\u0433\u0438\u043a\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u0442\u0430\u043a\u0430\u044f, \u0447\u0442\u043e \u043a\u043e\u0433\u0434\u0430 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u0430\u044f \u0441\u0435\u043a\u0443\u043d\u0434\u0430 &#8212; \u043d\u0430 \u044d\u0442\u043e\u043c \u0432\u044b\u0432\u043e\u0434\u0435 \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0438\u043c\u043f\u0443\u043b\u044c\u0441. \u0422\u043e\u0447\u043d\u043e\u0441\u0442\u044c &#8212; \u0435\u0434\u0438\u043d\u0438\u0446\u044b \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u043a\u0443\u043d\u0434. \u0418 \u0443\u0436\u0435 \u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e &#8212; \u0432 serial \u0438\u0434\u0443\u0442 \u0441\u0442\u0440\u043e\u043a\u0438 \u0441 \u043d\u043e\u0432\u044b\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c, \u043a\u0430\u043a\u0430\u044f \u0438\u043c\u0435\u043d\u043d\u043e \u0441\u0435\u043a\u0443\u043d\u0434\u0430 \u043d\u0430\u0447\u0430\u043b\u0430\u0441\u044c. <\/p>\n<p>\u0415\u0441\u043b\u0438 \u043e\u0442\u0441\u043b\u0435\u0434\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442, \u0438 \u043f\u043e\u0442\u043e\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443 \u0441\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c &#8212; \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0442\u043e\u0447\u043d\u043e \u0437\u043d\u0430\u0442\u044c, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0443\u0436\u0435 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u043a\u0443\u043d\u0434 \u043f\u0440\u043e\u0448\u043b\u043e, \u0438 \u043c\u043e\u0436\u0435\u043c \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0442\u043e\u0447\u043d\u043e. <br \/>\u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0435, \u043e\u0442\u043c\u0435\u0447\u0430\u0435\u043c \u043c\u043e\u043c\u0435\u043d\u0442 \u0438\u043c\u043f\u0443\u043b\u044c\u0441\u0430 &#8212; \u0437\u0430\u0442\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u0435\u043a\u0443\u043d\u0434\u044b \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0430\u0447\u0430\u043b\u0430\u0441\u044c, \u0430 \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043d\u0430 \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u043c \u0440\u0430\u0437\u043d\u0438\u0446\u0443 \u0438 \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u043f\u043e\u0447\u0442\u0438 \u0442\u043e\u0447\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f.<\/p>\n<p>\u041d\u043e \u0435\u0441\u0442\u044c \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u043d\u044e\u0430\u043d\u0441:<br \/>\u0412 \u043d\u0430\u0448\u0435 \u0432\u0440\u0435\u043c\u044f \u043c\u043e\u0433\u0443\u0442 \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e NTP, \u043d\u043e \u0438 \u0437\u0430\u0433\u043b\u0443\u0448\u0438\u0442\u044c GPS. \u0422\u043e\u0447\u043d\u0435\u0435, \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442\u0441\u044f \u0441\u043f\u0443\u0444\u0438\u043d\u0433\u043e\u043c, \u0437\u0430\u0431\u0438\u0432\u0430\u044f \u044d\u0444\u0438\u0440 \u043b\u043e\u0436\u043d\u044b\u043c\u0438 \u0441\u0438\u0433\u043d\u0430\u043b\u0430\u043c\u0438 &#8212; \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043f\u0440\u0438\u0435\u043c\u043d\u0438\u043a \u043b\u0438\u0431\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0439\u043c\u0430\u0442\u044c \u043b\u043e\u043a\u0430\u0446\u0438\u044e (\u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432\u0440\u0435\u043c\u044f), \u043b\u0438\u0431\u043e \u043b\u043e\u0432\u0438\u0442 \u043e\u0431\u043c\u0430\u043d\u043a\u0443, \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044f \u0447\u0442\u043e \u043b\u0435\u0442\u0438\u0442 \u0433\u0434\u0435-\u0442\u043e \u043d\u0430 \u0432\u044b\u0441\u043e\u0442\u0435, \u0441 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c\u044e, \u0438 \u0432 \u0441\u043e\u0442\u043d\u0435 \u043a\u0438\u043b\u043e\u043c\u0435\u0442\u0440\u043e\u0432 \u043e\u0442\u0441\u044e\u0434\u0430.<br \/>\u0415\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0432\u0440\u0435\u043c\u044f \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0442\u043e\u0436\u0435 \u043d\u0435\u0432\u0435\u0440\u043d\u043e\u0435.<\/p>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c \u043c\u0435\u0441\u0442\u043e\u043d\u0430\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f: \u0435\u0441\u043b\u0438 \u0432\u044b\u0441\u043e\u0442\u0430, \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0438 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0441\u0438\u043b\u044c\u043d\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f \u043e\u0442 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0445 &#8212; \u0437\u043d\u0430\u0447\u0438\u0442, GPS \u0432\u0440\u0451\u0442.<\/p>\n<p>\u041f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0432\u043e\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"cpp\">#include &lt;ESP8266WiFi.h&gt;#include &lt;time.h&gt;#include &lt;JbTime.h&gt;\/\/#define DEBUG#ifdef DEBUGvoid MqttPublish(const char * str);#endif\/* add to main.inovoid GPSSetup();bool GPSGetTime(JbTime * time);void GPSLoop();*\/#define REAL_ALT        XXX             \/\/ RMC 7#define REAL_LAT        XXXX           \/\/ RMC 5#define REAL_LON       XXXX           \/\/ RMC 3#define PIN_INT         13#define BUFLEN          200volatile bool ppsFlag = false;volatile uint32_t ppsMicros = 0;bool gpsOk = false;bool altOk = false;uint64_t sec = 0;#define X_GGA   0x00#define X_GLL   0x01#define X_GSA   0x02#define X_GSV   0x03#define X_RMC   0x04#define X_VTG   0x05void calcChecksum(uint8_t *data, uint8_t len, uint8_t &amp;ck_a, uint8_t &amp;ck_b) {  ck_a = 0;  ck_b = 0;  for (uint8_t i = 0; i &lt; len; i++) {    ck_a = ck_a + data[i];    ck_b = ck_b + ck_a;  }}void sendUBX(uint8_t *msg, uint8_t len) {  for (uint8_t i = 0; i &lt; len; i++) {    Serial.write(msg[i]);  }}void disableX(uint8_t x){  uint8_t buffer[] = {    0xB5, 0x62,       \/\/ Header    0x06, 0x01,       \/\/ CFG-MSG    0x03, 0x00,       \/\/ Length    0xF0, 0x03, 0x00, \/\/ Disable GSV (rate = 0)    0xFD, 0x15        \/\/ Checksum  };  buffer[7] = x;  calcChecksum(&amp;buffer[2], sizeof(buffer) - 4, buffer[9], buffer[10]);  sendUBX(buffer, sizeof(buffer));}\/\/-------------------------------------void ICACHE_RAM_ATTR onPPS() {    ppsMicros = micros();       \/\/ \u0444\u0438\u043a\u0441\u0438\u0440\u0443\u0435\u043c \u043c\u043e\u043c\u0435\u043d\u0442 \u0438\u043c\u043f\u0443\u043b\u044c\u0441\u0430    ppsFlag = true;             \/\/ \u043e\u0442\u043c\u0435\u0442\u043a\u0430 \u043e \u0441\u043e\u0431\u044b\u0442\u0438\u0438}\/\/-------------------------------------void GPSSetup(){  gpsOk = false;  altOk = false;  ppsFlag = false;  ppsMicros = micros();  disableX(X_GSV);  disableX(X_GSA);  disableX(X_VTG);  disableX(X_GLL);  pinMode(PIN_INT, INPUT);  attachInterrupt(digitalPinToInterrupt(PIN_INT), onPPS, RISING);}\/\/-------------------------------------bool GPSGetTime(JbTime * time){  if(gpsOk &amp;&amp; altOk){    uint32_t nowMicros = micros();    uint32_t usec = nowMicros - ppsMicros;    if(ppsFlag){      \/\/ RMC \u043d\u0435 \u0443\u0441\u043f\u0435\u043b \u043f\u0440\u0438\u0434\u0442\u0438      time-&gt;settime(sec + 1,usec);    }else{      time-&gt;settime(sec, usec);    }    return true;  }  return false;}\/\/ -----------------------------------------------void parse_rmc(char * str){  char *token;  char *rest = str;  char *fields[20];  int count = 0;  \/\/ \u0440\u0430\u0437\u0431\u043e\u0440 \u043d\u0430 \u0442\u043e\u043a\u0435\u043d\u044b  while ((token = strsep(&amp;rest, \",\")) != NULL) {    fields[count++] = token;  }  gpsOk = false;  \/\/ \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e - OK  if(strcmp(fields[2],\"A\")==0){    double lon = 0;    sscanf(fields[3], \"%lf\", &amp;lon );    double lat = 0;    sscanf(fields[5], \"%lf\", &amp;lat );    float speed;    sscanf(fields[7], \"%f\", &amp;speed );    if(speed &gt; 0.2) return;    if(abs(lon - REAL_LON) &gt; 0.03) return;    if(abs(lat - REAL_LAT) &gt; 0.03) return;    \/\/ ----------------------    int hh, mm, ss;    int day, mon, year;    \/\/ time    sscanf(fields[1], \"%2d%2d%2d\", &amp;hh, &amp;mm, &amp;ss);    \/\/ date    sscanf(fields[9], \"%2d%2d%2d\", &amp;day, &amp;mon, &amp;year);    if (year &lt; 80)      year += 2000;    else      year += 1900;    struct tm t = {0};    t.tm_year = year - 1900;    t.tm_mon  = mon - 1;    t.tm_mday = day;    t.tm_hour = hh;    t.tm_min  = mm;    t.tm_sec  = ss;    if(ppsFlag){      \/\/ PPS \u0431\u044b\u043b, \u043e\u0442\u043c\u0435\u0447\u0430\u0435\u043c \u0441\u0435\u043a\u0443\u043d\u0434\u0443      sec = mktime(&amp;t);      ppsFlag = false;    }    \/\/ ----------------------    gpsOk = true;  }}void parse_gga(char * str){  char *token;  char *rest = str;  char *fields[20];  int count = 0;  \/\/ \u0440\u0430\u0437\u0431\u043e\u0440 \u043d\u0430 \u0442\u043e\u043a\u0435\u043d\u044b  while ((token = strsep(&amp;rest, \",\")) != NULL) {    fields[count++] = token;  }  altOk = false;  float alt = 0;  sscanf(fields[9], \"%f\", &amp;alt );  if(abs(alt - REAL_ALT) &lt; 50) altOk = true;}\/\/ -----------------------------------------------void GPSLoop(){  static char buffer[BUFLEN];  static int p = 0;  while (Serial.available()) {    char c = Serial.read();    if (c == '\\n') {                                  \/\/ \u043a\u043e\u043d\u0435\u0446 \u0441\u0442\u0440\u043e\u043a\u0438      if(memcmp(buffer,\"$GPRMC\",6)==0){        parse_rmc(buffer);      }      else{        \/\/GGA - 9 \u0432\u044b\u0441\u043e\u0442\u0430        if(memcmp(buffer,\"$GPGGA\",6)==0){          parse_gga(buffer);        }      }      buffer[0] = 0;                                    \/\/ \u043e\u0447\u0438\u0449\u0430\u0435\u043c \u0431\u0443\u0444\u0435\u0440      p = 0;      return;                                           \/\/ \u0432\u044b\u0445\u043e\u0434\u0438\u043c \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u0441\u043b\u0435 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438    } else if (c != '\\r' &amp;&amp; p &lt; (BUFLEN - 1) ) {        \/\/ \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u0443\u0435\u043c CR      buffer[p] = c;      p++;      buffer[p] = 0;    }  }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h4>\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u043c \u0432\u0440\u0435\u043c\u044f<\/h4>\n<p>\u041d\u043e \u0432\u0441\u0451 \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u043f\u043e\u043a\u0430 \u043c\u043e\u0434\u0443\u043b\u044c \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442. \u0421\u0442\u043e\u0438\u0442 \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043f\u0438\u0442\u0430\u043d\u0438\u0435 &#8212; \u0438 \u0432\u0440\u0435\u043c\u044f \u043f\u0440\u043e\u043f\u0430\u0434\u0430\u0435\u0442, \u0430 \u0432\u043e\u0442 \u0441\u043c\u043e\u0436\u0435\u043c \u043b\u0438 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0435\u0433\u043e \u043f\u043e\u0441\u043b\u0435 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430 &#8212; \u0432 \u043d\u044b\u043d\u0435\u0448\u043d\u0438\u0445 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u0445 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0432\u043e\u043f\u0440\u043e\u0441. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c \u0445\u043e\u0434\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043f\u0440\u0438 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0438 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0442\u043e\u0436\u0435 \u043f\u043e\u0434 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u043c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0448\u0430\u0433 &#8212; \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c RTC, \u201c\u0447\u0430\u0441\u044b \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438\u201d. \u041f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u043a\u0430\u043a \u0432 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0430\u0445 &#8212; \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u0447\u0438\u043f \u0441 \u0431\u0430\u0442\u0430\u0440\u0435\u0439\u043a\u043e\u0439 \u201c\u0431\u0438\u043e\u0441\u0430\u201d \u043d\u0430 \u043f\u043b\u0430\u0442\u0435 (\u043d\u0438\u043a\u0430\u043a\u043e\u043c\u0443 \u201cBIOS\u201d \u0431\u0430\u0442\u0430\u0440\u0435\u0439\u043a\u0430 \u043d\u0435 \u043d\u0443\u0436\u043d\u0430, \u044d\u0442\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u0434\u043b\u044f  RTC).<\/p>\n<p>\u041f\u043e \u0441\u0443\u0442\u0438 \u044d\u0442\u043e \u0447\u0442\u043e-\u0442\u043e \u0432\u0440\u043e\u0434\u0435 \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u044b\u0445 \u0447\u0430\u0441\u043e\u0432, \u0442\u043e\u043b\u044c\u043a\u043e \u0431\u0435\u0437 \u0434\u0438\u0441\u043f\u043b\u0435\u044f: \u0432 \u043e\u0441\u043d\u043e\u0432\u0435 \u043a\u0432\u0430\u0440\u0446\u0435\u0432\u044b\u0439 \u0440\u0435\u0437\u043e\u043d\u0430\u0442\u043e\u0440 \u043d\u0430 \u0447\u0430\u0441\u0442\u043e\u0442\u0443 32768 \u0413\u0446, \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043d\u0435\u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0445 \u0434\u0435\u043b\u0438\u0442\u0435\u043b\u0435\u0439 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f 1\u0413\u0446, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0437\u0430\u0442\u0435\u043c \u0441\u0447\u0438\u0442\u0430\u044e\u0442\u0441\u044f, \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u044f\u0441\u044c \u0432 \u043c\u0438\u043d\u0443\u0442\u044b, \u0447\u0430\u0441\u044b \u0438 \u0434\u043d\u0438. \u041d\u0438\u043a\u0430\u043a\u0438\u0445 \u043c\u0438\u043a\u0440\u043e\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043e\u0432, \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u0431\u0438\u043d\u0430\u0440\u043d\u0430\u044f \u043b\u043e\u0433\u0438\u043a\u0430 &#8212; \u0432\u043e\u0442 \u0435\u0451-\u0442\u043e \u0438 \u043f\u0438\u0442\u0430\u0435\u0442 \u0431\u0430\u0442\u0430\u0440\u0435\u0439\u043a\u0430. \u0412 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0440\u0430\u0431\u043e\u0442\u044b \u043c\u043e\u0436\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0432 RTC, \u0438 \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u043f\u0438\u0442\u0430\u043d\u0438\u044f \u0447\u0430\u0441\u044b \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u044e\u0442 \u0438\u0434\u0442\u0438. \u041f\u0440\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0439 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0435 \u0438\u0437 RTC \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043a\u0430\u043a \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0435.<\/p>\n<p>\u041f\u043e \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0439 \u0441\u0445\u0435\u043c\u0435 \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u044b \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0432\u0441\u0435 \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u044b\u0435 \u0446\u0438\u0444\u0440\u043e\u0432\u044b\u0435 \u0447\u0430\u0441\u044b: \u0435\u0441\u043b\u0438 \u043d\u0430 \u043d\u0438\u0445 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u201cQuartz\u201d &#8212; \u044d\u0442\u043e \u043a\u0430\u043a \u0440\u0430\u0437 \u043f\u0440\u043e \u0442\u043e\u0442 \u043a\u0432\u0430\u0440\u0446\u0435\u0432\u044b\u0439 \u0440\u0435\u0437\u043e\u043d\u0430\u0442\u043e\u0440 \u043d\u0430 32768 \u0413\u0446. \u041a\u0442\u043e \u0441 \u043d\u0438\u043c\u0438 \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u043b\u0441\u044f &#8212; \u0437\u043d\u0430\u0435\u0442 \u0438 \u043a\u043b\u044e\u0447\u0435\u0432\u0443\u044e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443: \u0432\u0440\u0435\u043c\u044f \u201c\u043f\u043b\u044b\u0432\u0451\u0442\u201d, \u0447\u0430\u0441\u044b \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e \u043e\u0442\u0441\u0442\u0430\u044e\u0442 \u0438\u043b\u0438 \u0441\u043f\u0435\u0448\u0430\u0442, \u043a\u0430\u043a \u043f\u043e\u0432\u0435\u0437\u0435\u0442. \u041f\u0440\u0438\u0447\u0438\u043d\u0430 \u043d\u0435 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0441\u0430\u043c\u043e\u0439 \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u0438\u043a\u0438 \u0447\u0430\u0441\u043e\u0432, \u0430 \u0432 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438 \u0440\u0435\u0437\u043e\u043d\u0430\u043d\u0441\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u043e\u0442\u044b \u044d\u0442\u043e\u0433\u043e \u0440\u0435\u0437\u043e\u043d\u0430\u0442\u043e\u0440\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0435\u0433\u043e \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u0432, \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438 \u0438\u0437\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u0430 \u0437\u0430\u0432\u043e\u0434\u0435, \u0438 \u0434\u0430\u0436\u0435 \u043e\u0442 \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u044b &#8212; \u0432\u0435\u0434\u044c \u043f\u0440\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u044b \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0442\u0435\u043b\u0430 \u0441\u0436\u0438\u043c\u0430\u044e\u0442\u0441\u044f \u0438\u043b\u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u044e\u0442\u0441\u044f, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u043a\u0440\u0438\u0441\u0442\u0430\u043b\u043b\u044b \u043a\u0432\u0430\u0440\u0446\u0430.<\/p>\n<p>\u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u043b\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0442\u0435\u0440\u043c\u043e\u0441\u0442\u0430\u0431\u0438\u043b\u0438\u0437\u0430\u0446\u0438\u0438 (\u0438\u0437\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u043a\u043e\u0440\u043e\u0431\u043a\u0430 \u0441\u043e \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0439 \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u043e\u0439) \u0438 \u0442\u0435\u0440\u043c\u043e\u043a\u043e\u043c\u043f\u0435\u043d\u0441\u0430\u0446\u0438\u0438 (\u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0438\u043b\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u201c\u0442\u0438\u043a\u043e\u0432\u201d \u043f\u043e \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u043c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u044b).<\/p>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443, \u043f\u0440\u0438 \u0432\u044b\u0431\u043e\u0440\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430 RTC \u0432\u043c\u0435\u0441\u0442\u043e, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, DS1301 (\u043f\u0440\u043e\u0441\u0442\u044b\u0435 \u0447\u0430\u0441\u044b \u0441 \u043e\u0431\u044b\u0447\u043d\u044b\u043c \u201c\u0447\u0430\u0441\u043e\u0432\u044b\u043c\u201d \u0440\u0435\u0437\u043e\u043d\u0430\u0442\u043e\u0440\u043e\u043c) \u043b\u0443\u0447\u0448\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c DS3231, \u0433\u0434\u0435 \u043a\u0440\u0438\u0441\u0442\u0430\u043b\u043b \u0432\u0441\u0442\u0440\u043e\u0435\u043d \u0432 \u043c\u0438\u043a\u0440\u043e\u0441\u0445\u0435\u043c\u0443, \u0438 \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u0433\u043e\u0442\u043e\u0432\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0442\u0435\u0440\u043c\u043e\u043a\u043e\u043c\u043f\u0435\u043d\u0441\u0430\u0446\u0438\u0438. \u0423 \u0442\u0430\u043a\u043e\u0433\u043e \u043c\u043e\u0434\u0443\u043b\u044f \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0445\u043e\u0434\u0430 \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u0432\u044b\u0448\u0435, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u0438 \u0432\u0440\u0435\u043c\u044f \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0442\u043e\u0447\u043d\u0435\u0435, \u0434\u0430\u0436\u0435 \u0431\u0435\u0437 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/d63\/24b\/416\/d6324b4164e160b795bf333440a82288.png\" width=\"635\" height=\"420\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/d63\/24b\/416\/d6324b4164e160b795bf333440a82288.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/d63\/24b\/416\/d6324b4164e160b795bf333440a82288.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0418 \u0441\u043d\u043e\u0432\u0430 &#8212; \u0442\u0430 \u0436\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0447\u0442\u043e \u0441 GPS (\u0434\u0438\u0441\u043a\u0440\u0435\u0442\u043d\u043e\u0441\u0442\u044c &#8212; 1 \u0441\u0435\u043a\u0443\u043d\u0434\u0430), \u0438 \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0435 \u0436\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435: \u0435\u0441\u043b\u0438 \u0443 \u043c\u043e\u0434\u0443\u043b\u044f \u0435\u0441\u0442\u044c \u0432\u044b\u0445\u043e\u0434 SQ &#8212; \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043d\u0430 \u0432\u044b\u0434\u0430\u0447\u0443 \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u0432 1 \u0413\u0446, \u0438 \u043f\u043e \u0444\u0440\u043e\u043d\u0442\u0443 \u0438\u043c\u043f\u0443\u043b\u044c\u0441\u0430 \u043b\u043e\u0432\u0438\u0442\u044c \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u043a\u0443\u043d\u0434\u044b \u0447\u0435\u0440\u0435\u0437 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0435, \u0442\u0430\u043a \u043a\u0430\u043a \u0438\u043c\u043f\u0443\u043b\u044c\u0441 \u0436\u0435\u0441\u0442\u043a\u043e \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d \u043a \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u0443 \u0441\u0435\u043a\u0443\u043d\u0434. <br \/>\u041e\u0441\u0442\u0430\u043d\u0435\u0442\u0441\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0435\u0449\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0443 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432 RTC, \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0441\u0435\u043a\u0443\u043d\u0434\u044b \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u043b\u0438\u0441\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0431\u043b\u0438\u0437\u043a\u043e \u043a \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u043c, \u0441 \u0443\u0447\u0435\u0442\u043e\u043c \u0437\u0430\u0434\u0435\u0440\u0436\u0435\u043a \u043d\u0430 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432 \u0447\u0438\u043f.<\/p>\n<pre><code class=\"cpp\">#include &lt;RTClib.h&gt;#include &lt;JbTime.h&gt;\/* add to main.inovoid RTCSetup();bool RTCSetTime(JbTime * time);bool RTCGetTime(JbTime * time);float RTCGetTemperature();void RTCLoop(JbTime * time);*\/\/\/ information#define P_SDA         4#define P_SCL         5#define PIN_SQ        12#define RTC_MIN_YEAR  2026RTC_DS3231 rtc;volatile uint32_t sqMicros = 0;bool rtcOk = false;#define RTC_WRITE_DELAY_MAX   30000#define RTC_WRITE_DELAY_MIN   28000\/\/ -----------------------------------------------float RTCGetTemperature(){  if(!rtcOk) return -99;  return rtc.getTemperature();}\/\/ -----------------------------------------------bool RTCGetTime(JbTime * time){  if(!rtcOk) return false;  if( rtc.lostPower() ) return false;  DateTime now = rtc.now();  if(now.year() &lt; RTC_MIN_YEAR) return false;  unsigned long sec = now.unixtime();  uint32_t nowMicros = micros();  uint32_t usec = nowMicros - sqMicros;  time-&gt;settime(sec,usec);  return true;}\/\/ -----------------------------------------------void ICACHE_RAM_ATTR onSQ() {    sqMicros = micros();        \/\/ \u0444\u0438\u043a\u0441\u0438\u0440\u0443\u0435\u043c \u043c\u043e\u043c\u0435\u043d\u0442 \u0438\u043c\u043f\u0443\u043b\u044c\u0441\u0430}\/\/ -----------------------------------------------void RTCSetup() {  sqMicros = 0;  Wire.begin();  rtcOk = rtc.begin();  if(rtcOk){    rtc.writeSqwPinMode(DS3231_SquareWave1Hz);    pinMode(PIN_SQ, INPUT);    attachInterrupt(digitalPinToInterrupt(PIN_SQ), onSQ, FALLING);    delay(3000);  }}\/\/ -----------------------------------------------bool RTCSetTime(JbTime * time){  if(!rtcOk) return false;  uint64_t sec ;  uint32_t usec ;  time-&gt;gettime(&amp;sec, &amp;usec);  \/\/ left to next second  uint32_t x = 1000000 - usec;  if (x &lt; RTC_WRITE_DELAY_MIN) return false;  while(x &gt; RTC_WRITE_DELAY_MAX){    delay(1);    x -= 1000;  }  if(x &gt; RTC_WRITE_DELAY_MIN &amp;&amp; x &lt; RTC_WRITE_DELAY_MAX){    sec ++;    rtc.adjust(DateTime(sec));    return true;  }  return false;}\/\/ -----------------------------------------------void RTCLoop(JbTime * time){  if(!rtcOk) return ;  if(time-&gt;fresh){    if(RTCSetTime(time)){      time-&gt;fresh = false;    }  }  else if(time-&gt;old()){    if(RTCGetTime(time)){      \/\/ nothing    }  }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041d\u0443 \u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u044d\u0442\u043e \u0432\u0441\u0435 \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u043a\u043e\u0434\u0435:<\/p>\n<pre><code class=\"cpp\">#include &lt;JbTime.h&gt;void WifiSetup();void WifiLoop();String WifiIP();\/\/ ---------------------------void MqttSetup();void MqttLoop();void MqttPublish(const char * str);void MqttPublish(const char * topic, const char * str);void MqttPublishBin(const char * topic, byte * data, int len);\/\/ ---------------------------void RTCSetup();bool RTCSetTime(JbTime * time);bool RTCGetTime(JbTime * time);float RTCGetTemperature();void RTCLoop(JbTime * time);\/\/ ---------------------------void GPSSetup();bool GPSGetTime(JbTime * time);void GPSLoop();\/\/ ---------------------------#define IND     2JbTime systime;JbTime rtctime;JbTime gpstime;JbTime ntptime1;JbTime ntptime2;#include &lt;JbNTP.h&gt;JbNTPClient ntp(&amp;systime);#define NTP_PERIOD 3700000unsigned long ntp_timer;void NTPSetup(){  ntp.begin();  ntp_timer = 0;}void NTPLoop(){  ntp.serve();}void sync_time() {  \/\/ try to get GPS time  GPSGetTime(&amp;gpstime);  if(gpstime.ok &amp;&amp; !gpstime.old()){    systime.copy(&amp;gpstime);    systime.fresh = true;  }  \/\/ try to get NTP time  bool var1 = ntp.requestTime(\"xxxxxxxxx\",&amp;ntptime1);  bool var2 = ntp.requestTime(\"yyyyyyyyy\",&amp;ntptime2);  if((var1 || var2) &amp;&amp; !systime.fresh){    uint64_t ntp1_sec = 0;    uint32_t ntp1_usec = 0;    ntptime1.gettime(&amp;ntp1_sec, &amp;ntp1_usec);    uint64_t ntp2_sec = 0;    uint32_t ntp2_usec = 0;    ntptime2.gettime(&amp;ntp2_sec, &amp;ntp2_usec);    if(ntp1_sec == ntp2_sec){      uint32_t mid = (ntp1_usec + ntp2_usec ) &gt;&gt; 1;      systime.settime(ntp1_sec, mid);      systime.fresh = true;    }else{      if(var1 &amp;&amp; !var2){        systime.settime(ntp1_sec, ntp1_usec);        systime.fresh = true;      }      if(!var1 &amp;&amp; var2){        systime.settime(ntp2_sec, ntp2_usec);        systime.fresh = true;      }    }  }  if(systime.fresh){    if(RTCSetTime(&amp;systime)){      systime.fresh = false;    }  }}\/\/ =====================================#include &lt;ArduinoJson.h&gt;unsigned long publish_timer = 0;#define PUBLISH_PERIOD  60000#define PUBLISH_LENGTH 300void Publish(){  DynamicJsonDocument  doc(PUBLISH_LENGTH); char buf[30];  float t = RTCGetTemperature();  doc[\"t\"] = t;  uint64_t sec = 0;  uint32_t usec = 0;  \/\/ ---------------  if(RTCGetTime(&amp;rtctime)){    rtctime.gettime(&amp;sec, &amp;usec);    sprintf(buf,\"%llu.%06u\",sec,usec);    doc[\"rtc\"]  = buf;  }else{    doc[\"rtc\"]  = \"none\";  }  \/\/ ---------------  GPSGetTime(&amp;gpstime);  if(gpstime.ok &amp;&amp; !gpstime.old()){    gpstime.gettime(&amp;sec, &amp;usec);    sprintf(buf,\"%llu.%06u\",sec,usec);    doc[\"gps\"]  = buf;  }else{    doc[\"gps\"]  = \"none\";  }  \/\/ ---------------  if(ntptime1.ok){    ntptime1.gettime(&amp;sec, &amp;usec);    sprintf(buf,\"%llu.%06u\",sec,usec);    doc[\"ntp1\"]  = buf;  }else{    doc[\"ntp1\"]  = \"none\";  }  if(ntptime2.ok){    ntptime2.gettime(&amp;sec, &amp;usec);    sprintf(buf,\"%llu.%06u\",sec,usec);    doc[\"ntp2\"]  = buf;  }else{    doc[\"ntp2\"]  = \"none\";  }    \/\/ ---------------  if(systime.ok){    systime.gettime(&amp;sec, &amp;usec);    sprintf(buf,\"%llu.%06u\",sec,usec);    doc[\"sys\"]  = buf;  }else{    doc[\"sys\"] = \"none\";  }  \/\/ ---------------  doc[\"ip\"] = WifiIP();  \/\/ ---------------  String message;  serializeJson(doc, message);  MqttPublish(message.c_str());}void msg_callback(char* topic, byte* payload, unsigned int length) {  if(!strncmp((char *)payload, \"reset\", length)){    ESP.reset();  }  if(!strncmp((char *)payload, \"sync\", length)){    sync_time();  }}\/\/==========================================void setup() {  Serial.begin(9600);  pinMode(IND,OUTPUT);  WifiSetup();  MqttSetup();  RTCSetup();  NTPSetup();  GPSSetup();}void loop() {  WifiLoop();  MqttLoop();  NTPLoop();  GPSLoop();  RTCLoop(&amp;systime);  if( (millis() - publish_timer) &gt; PUBLISH_PERIOD ){    publish_timer = millis();    Publish();    digitalWrite(IND,LOW);    delay(50);    digitalWrite(IND,HIGH);  }  if( (millis() - ntp_timer) &gt; NTP_PERIOD || ntp_timer == 0 ){    ntp_timer = millis();    sync_time();  }  delay(100);}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u0438 \u0441\u0442\u0430\u0440\u0442\u0435 \u0434\u0435\u0432\u0430\u0439\u0441 \u0431\u0435\u0440\u0435\u0442 \u0432\u0440\u0435\u043c\u044f \u0438\u0437 RTC, \u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c NTP-\u0441\u0435\u0440\u0432\u0435\u0440\u0430\u043c, \u043f\u043e GPS, \u043f\u0440\u0438 \u0443\u0441\u043f\u0435\u0445\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442 RTC, \u0438 \u0441\u0430\u043c \u043f\u043e \u043d\u0435\u043c\u0443 \u0441\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u0432\u0440\u0435\u043c\u044f \u043e\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438. \u041d\u0443 \u0438 \u0441\u0430\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 NTP-\u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c.<\/p>\n<p>\u041c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u0435\u0449\u0435 \u043f\u0440\u0438\u0434\u0435\u043b\u0430\u0442\u044c \u043a \u043d\u0435\u043c\u0443 \u044d\u043a\u0440\u0430\u043d\u0447\u0438\u043a \u0438 \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f &#8212; \u043d\u043e \u043f\u043e \u0438\u0434\u0435\u0435 \u043e\u043d \u0434\u043e\u043b\u0436\u0435\u043d \u0432\u0438\u0441\u0435\u0442\u044c \u0433\u0434\u0435-\u0442\u043e \u043d\u0430 \u0441\u0442\u0435\u043d\u0435 \u0432 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u043e\u0439 \u043a\u043e\u0440\u043e\u0431\u043a\u0435 \u0438 \u043d\u0435 \u043c\u043e\u0437\u043e\u043b\u0438\u0442\u044c \u0433\u043b\u0430\u0437\u0430, \u0442\u0430\u043a \u0447\u0442\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u043a\u0430\u043a \u0447\u0430\u0441\u044b \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0435 \u0431\u0443\u0434\u0435\u043c. \u0412 \u043a\u043e\u043d\u0446\u0435 \u043a\u043e\u043d\u0446\u043e\u0432 \u043d\u0438\u0447\u0435\u0433\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u043d\u0435 \u043c\u0435\u0448\u0430\u0435\u0442 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u0447\u0430\u0441\u044b, \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u0443\u044e\u0449\u0438\u0435\u0441\u044f \u0443\u0436\u0435 \u0441 \u043d\u0438\u043c.<\/p>\n<\/p>\n<\/div>\n<p>\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/1023414\/\">https:\/\/habr.com\/ru\/articles\/1023414\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u041c\u044b \u0443\u0436\u0435 \u043f\u0440\u0438\u0432\u044b\u043a\u043b\u0438 \u0436\u0438\u0442\u044c \u0432 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u043c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u043c \u043c\u0438\u0440\u0435, \u0433\u0434\u0435, \u0441 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0432\u0430\u0436\u043d\u043e \u0437\u043d\u0430\u0442\u044c \u0442\u043e\u0447\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f, \u0430 \u0441 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b &#8212; \u043b\u0435\u0433\u043a\u043e \u0435\u0433\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c, \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043d\u0430 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0435 NTP, \u0434\u0430 \u0432\u043e\u0442 \u0445\u043e\u0442\u044f \u0431\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u0442\u0438\u043f\u0430 ntpdate pool.ntp.org.\u041d\u043e \u0435\u0441\u0442\u044c \u043d\u044e\u0430\u043d\u0441: \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u044d\u0442\u0438\u043c\u0438 \u0437\u0430\u043c\u0435\u0434\u043b\u0435\u043d\u0438\u044f\u043c\u0438, \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430\u043c\u0438 \u0438 &#171;\u0431\u0435\u043b\u044b\u043c\u0438 \u0441\u043f\u0438\u0441\u043a\u0430\u043c\u0438&#187; \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435\u0442 \u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0438, \u0447\u0442\u043e \u043a\u0430\u043a \u0440\u0430\u0437 \u0432 \u043d\u0443\u0436\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u043e\u043d\u0438 \u043d\u0435 \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0442 \u043d\u0430\u043c \u0438 NTP \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b, \u0432\u0435\u0434\u044c \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0435 \u043c\u0438\u0440\u043e\u0432\u044b\u0435 NTP-\u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0432\u0440\u044f\u0434 \u043b\u0438 \u0431\u0443\u0434\u0443\u0442 \u0432 \u0431\u0435\u043b\u044b\u0445 \u0441\u043f\u0438\u0441\u043a\u0430\u0445, \u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a\u0438\u0435-\u043d\u0438\u0431\u0443\u0434\u044c \u0434\u0440\u0443\u0433\u0438\u0435 &#8212; \u043d\u0443, \u0432\u0441\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0438\u0441\u0442\u043e\u0440\u0438\u044f \u043f\u0440\u043e\u043f\u0430\u0434\u0430\u043d\u0438\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0434\u043e\u043c\u0435\u043d\u043d\u044b\u0445 \u0438\u043c\u0435\u043d \u0438\u0437 \u041d\u0421\u0414\u0418, \u0438 \u0432\u0432\u043e\u0434 \u043f\u043b\u0430\u0442\u044b &#171;\u0437\u0430 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0447\u0430\u0441\u0430\u043c \u0442\u043e\u0447\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438&#187;, \u0447\u0442\u043e \u0431\u044b \u043f\u043e\u0434 \u044d\u0442\u0438\u043c \u043d\u0435 \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u043b\u043e\u0441\u044c.\u0412 \u043e\u0431\u0449\u0435\u043c, \u0441\u043f\u0430\u0441\u0435\u043d\u0438\u0435 \u0443\u0442\u043e\u043f\u0430\u044e\u0449\u0438\u0445&#8230; \u041a \u0442\u043e\u043c\u0443 \u0436\u0435, \u043a\u0430\u043a \u0433\u043e\u0432\u043e\u0440\u044f\u0442, &#171;\u043b\u044e\u0431\u043e\u0439, \u043a\u0442\u043e \u0443\u0432\u0438\u0434\u0435\u043b \u0410\u0440\u0434\u0443\u0438\u043d\u043e &#8212; \u0440\u0430\u043d\u043e \u0438\u043b\u0438 \u043f\u043e\u0437\u0434\u043d\u043e \u0434\u0435\u043b\u0430\u0435\u0442 \u0447\u0430\u0441\u044b \u0438\u043b\u0438 \u043c\u0435\u0442\u0435\u043e\u0441\u0442\u0430\u043d\u0446\u0438\u044e&#187;. \u041f\u0440\u043e\u0441\u0442\u044b\u0435 \u0447\u0430\u0441\u044b \u043c\u044b \u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435 \u0431\u0443\u0434\u0435\u043c, \u0430 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0432\u043f\u043e\u043b\u043d\u0435 IT-\u0448\u043d\u044b\u0439 NTP-\u0441\u0435\u0440\u0432\u0435\u0440.\u0417\u0430 \u043e\u0441\u043d\u043e\u0432\u0443 \u0431\u0435\u0440\u0435\u043c \u0447\u0438\u043f ESP8266, \u0442\u043e\u0447\u043d\u0435\u0435 \u0435\u0433\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442 ESP12-F. \u0421\u0435\u0439\u0447\u0430\u0441 \u043e\u043d\u0438 \u0441\u0447\u0438\u0442\u0430\u044e\u0442\u0441\u044f \u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0438\u043c\u0438, \u0432\u0441\u0435 \u0434\u0430\u0432\u043d\u043e \u0441\u0431\u0435\u0436\u0430\u043b\u0438 \u043d\u0430 ESP32, \u043d\u043e \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0447\u0438\u043f \u0445\u043e\u0440\u043e\u0448\u0438\u0439, \u0430 \u0435\u0433\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0442\u0443\u0442 \u0431\u043e\u043b\u0435\u0435 \u0447\u0435\u043c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e. \u0415\u0441\u043b\u0438 \u043a\u0442\u043e \u0434\u043e \u0441\u0438\u0445 \u043f\u043e\u0440 \u043d\u0435 \u0437\u043d\u0430\u043b &#8212; \u043e\u043d \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u043c\u0438 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430\u043c\u0438 Arduino, \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0430 \u043f\u0438\u0448\u0435\u0442\u0441\u044f \u043d\u0430 \u0432\u043f\u043e\u043b\u043d\u0435 \u043e\u0431\u044b\u0447\u043d\u043e\u043c C++ (\u043a\u0430\u043a\u0438\u043c \u043e\u043d \u0431\u044b\u043b \u0433\u043e\u0434\u0443 \u0432 99, \u0431\u0435\u0437 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043d\u0430\u0432\u043e\u0440\u043e\u0442\u043e\u0432).\u041e\u0431\u0449\u0430\u044f \u0438\u0434\u0435\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f: \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a WiFi \u0441\u0435\u0442\u0438, \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0432\u043d\u0443\u0442\u0440\u0438 NTP-\u0441\u0435\u0440\u0432\u0435\u0440 \u0438 \u0440\u0430\u0437\u0434\u0430\u0435\u043c \u0442\u043e\u0447\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043f\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u043c \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432 \u0438\u0437 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0435\u0442\u0438. \u0418 \u0441\u0440\u0430\u0437\u0443 \u0436\u0435 \u0432\u043e\u043f\u0440\u043e\u0441 &#8212; \u0433\u0434\u0435 \u0435\u0433\u043e \u0431\u0440\u0430\u0442\u044c, \u044d\u0442\u043e \u0442\u043e\u0447\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f? \u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0438\u0441\u0445\u043e\u0434\u0438\u043c \u0438\u0437 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0434\u043e\u0441\u0442\u0443\u043f \u043a\u0443\u0434\u0430-\u0442\u043e \u0431\u0443\u0434\u0435\u0442 &#8212; \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435\u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u044b\u0439, \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u043a\u0430\u043a \u0432 \u0434\u043e\u0441\u0442\u043e\u0441\u043b\u0430\u0432\u043d\u044b\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0430 \u0434\u0438\u0430\u043b\u0430\u043f\u0430 &#8212; \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u043a \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0443, \u043f\u043e\u0442\u043e\u043c \u043f\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c, \u043f\u043e\u0442\u043e\u043c \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f. \u0410 \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0432\u0441\u0451 \u0442\u043e\u0442 \u0436\u0435 NTP, \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u0440\u0435\u043c\u044f, \u043f\u043e\u0442\u043e\u043c \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0438 \u043a\u0430\u043a\u043e\u0433\u043e-\u0442\u043e \u043f\u0435\u0440\u0438\u043e\u0434\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f, \u043f\u043e\u0442\u043e\u043c \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438 \u0430\u043a\u0442\u0443\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u043f\u0440\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438.\u0412 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0445 \u043f\u0430\u043a\u0435\u0442\u0430\u0445 \u0434\u043b\u044f ESP \u0443\u0436\u0435 \u0435\u0441\u0442\u044c &#171;\u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f&#187; &#8212; \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c, \u0437\u0430\u0442\u0435\u043c \u043e\u043d\u043e &#171;\u0438\u0434\u0451\u0442&#187; \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u0442\u0438\u043a\u0430\u043c\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430. \u0422\u043e\u0442 \u0436\u0435 \u0441\u0430\u043c\u044b\u0439 \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u0447\u0442\u043e \u0438 \u0432 \u043b\u044e\u0431\u043e\u0439 \u041e\u0421. \u0418 \u0442\u043e\u0436\u0435 \u043a\u0430\u043a \u0432 \u043b\u044e\u0431\u043e\u0439 \u041e\u0421 &#8212; \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c \u0445\u043e\u0434\u0430 \u044d\u0442\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0442\u043e\u0433\u043e, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e &#171;\u041e\u0421&#187; \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u043e\u0446\u0435\u043d\u0438\u0432\u0430\u0435\u0442 \u0447\u0430\u0441\u0442\u043e\u0442\u0443 \u0442\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u0430 \u044d\u0442\u0430 \u0447\u0430\u0441\u0442\u043e\u0442\u0430, \u0438 \u0442.\u0434. \u0412 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435, \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u043d\u043e\u0433\u0434\u0430 \u043f\u043e\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0435\u0433\u043e &#8212; \u044d\u0442\u043e\u0433\u043e \u0443\u0436\u0435 \u0432\u043f\u043e\u043b\u043d\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e.\u0412 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u0445 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u0445 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0438 \u043a \u0432\u043d\u0435\u0448\u043d\u0438\u043c NTP-\u0441\u0435\u0440\u0432\u0435\u0440\u0430\u043c:#include &lt;time.h&gt;configTime(0, 0, &#171;pool.ntp.org&#187;);\u0420\u0430\u0437 \u0432 3600 \u0441\u0435\u043a\u0443\u043d\u0434 &#171;\u041e\u0421&#187; \u0431\u0443\u0434\u0435\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0434\u0435\u043b\u0430\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441 \u0438 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c \u0432\u0440\u0435\u043c\u044f. \u041a\u043e\u0433\u0434\u0430 \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0442\u0435\u0443\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f &#8212; \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u043c \u0435\u0433\u043e:time_t now = time(nullptr);\u041f\u043e \u0444\u0430\u043a\u0442\u0443 &#8212; \u044d\u0442\u043e \u043e\u0431\u044b\u0447\u043d\u044b\u0439 unixtime, \u0432\u0440\u0435\u043c\u044f \u0441 \u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445 \u0441 01.01.1970.\u0422\u043e \u0435\u0441\u0442\u044c, \u0432\u0440\u0435\u043c\u044f \u0442\u0443\u0442 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0430\u0435\u0442\u0441\u044f \u0441 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c\u044e \u0434\u043e \u0441\u0435\u043a\u0443\u043d\u0434. \u041e\u0431\u044b\u0447\u043d\u043e \u044d\u0442\u043e\u0433\u043e \u0432\u043f\u043e\u043b\u043d\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e. \u043d\u043e \u0432\u0435\u0434\u044c \u043c\u044b \u0445\u043e\u0442\u0435\u043b\u0438 \u0441\u0435\u0440\u0432\u0435\u0440 \u0422\u041e\u0427\u041d\u041e\u0413\u041e \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u0447\u0442\u043e\u0431\u044b \u0440\u0430\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u043f\u043e NTP, \u0430 \u0442\u0430\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0441\u043e\u0442\u044b\u0435 \u0438 \u0442\u044b\u0441\u044f\u0447\u043d\u044b\u0435 \u0434\u043e\u043b\u0438 \u0441\u0435\u043a\u0443\u043d\u0434\u044b.\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0435\u0436\u0434\u0435 \u0432\u0441\u0435\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u0441\u0447\u0435\u0442\u0447\u0438\u043a \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u0441 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u043a\u0443\u043d\u0434\u0430\u043c\u0438. \u041f\u0440\u0438\u043d\u0446\u0438\u043f \u043f\u0440\u043e\u0441\u0442\u043e\u0439: \u043f\u0440\u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0435 \u0442\u043e\u0447\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0438 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0441\u0447\u0435\u0442\u0447\u0438\u043a \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u043a\u0443\u043d\u0434 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430, \u043f\u0440\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0435 \u043a \u043d\u0435\u043c\u0443 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u043a\u0443\u043d\u0434, \u043f\u0440\u043e\u0448\u0435\u0434\u0448\u0438\u0445 \u043c\u0435\u0436\u0434\u0443 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u043e\u0439 \u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u043c, \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u043e\u0432\u043e\u0435 \u0432\u0440\u0435\u043c\u044f. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u0432\u0440\u0435\u043c\u044f &#171;\u0448\u043b\u043e&#187; &#8212; \u0435\u0433\u043e \u043d\u0430\u0434\u043e \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0442\u044c, \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c &#8212; \u0434\u043e \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u043a\u0443\u043d\u0434, \u0430 \u043f\u043e\u0433\u0440\u0435\u0448\u043d\u043e\u0441\u0442\u044c &#8212; \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0437\u0430\u043f\u0440\u043e\u0441\u0430, \u043e\u043a\u043e\u043b\u043e 20-30 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u043a\u0443\u043d\u0434. \u041d\u0435\u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e, \u043d\u043e \u0441\u043e\u0439\u0434\u0435\u0442.#ifndef jb_time#define jb_time#include &lt;stdint.h&gt;#define JB_TIME_MAX_AGE  600class JbTime {private:  uint64_t _last ;    \/\/ last change time  uint64_t _sec ;     \/\/ seconds  uint32_t _usec ;    \/\/ microseconds  uint32_t _mark ;    \/\/ mark uS for time updatepublic:  bool ok;  bool fresh;  JbTime(){    _sec = 0;    _usec = 0;    _mark = 0;    _last = 0;    ok = false;    fresh = false;  }  inline bool old() {    if(_sec == 0) return true;    if((_sec &#8212; _last) &gt; JB_TIME_MAX_AGE) return true;    return false;  }  inline void copy(JbTime * src) {    uint64_t sec;    uint32_t usec;    src-&gt;gettime(&amp;sec, &amp;usec);    _mark = micros();    _sec = sec;    _usec = usec;    ok = src-&gt;ok;    _last = sec;  }    inline void settime(uint64_t sec, uint32_t usec, uint32_t mark = micros() ){    _mark = mark;    _sec = sec;    _sec += usec \/ 1000000;    _usec = usec % 1000000;    _usec = usec;    ok = true;    _last = sec;  }  inline void gettime(uint64_t *o_sec, uint32_t *o_usec){    if(ok){      uint32_t now = micros();      uint32_t delta = now &#8212; _mark;      _mark = now;      uint64_t total = (uint64_t)_usec + delta;      _sec += total \/ 1000000;      _usec = total % 1000000;      *o_sec = _sec;      *o_usec = _usec;    }else{      *o_sec = 0;      *o_usec = 0;    }  }  inline uint64_t synced(){    return _last;  }};#endif\u0418 \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u044d\u0442\u043e \u043a\u043b\u0430\u0441\u0441 &#8212; \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437\u043d\u044b\u0445 \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u043e\u0432 \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u043f\u043e\u0434 \u0440\u0430\u0437\u043d\u044b\u0435 \u0446\u0435\u043b\u0438.\u0422\u0430\u043a \u043a\u0430\u043a \u0448\u0442\u0430\u0442\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e \u0441 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c\u044e \u0434\u043e \u0441\u0435\u043a\u0443\u043d\u0434 &#8212; \u0442\u043e \u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043a NTP \u0441\u0435\u0440\u0432\u0435\u0440\u0430\u043c \u0438\u0437 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0432\u044b\u0434\u0430\u0432\u0430\u043b\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0441 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c\u044e \u0434\u043e \u0441\u0435\u043a\u0443\u043d\u0434, \u0430 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0442\u043e\u0447\u043d\u0435\u0435.\u041f\u0440\u043e\u0442\u043e\u043a\u043e\u043b NTP \u043e\u043f\u0438\u0441\u0430\u043d \u0432 RFC 5905: \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b, \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 \u043e\u0431\u043c\u0435\u043d\u0435 \u043f\u0430\u043a\u0435\u0442\u0430\u043c\u0438 \u043c\u0435\u0436\u0434\u0443 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u043c \u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c, \u0433\u0434\u0435 \u0441\u0435\u0440\u0432\u0435\u0440 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442 \u0441\u0432\u043e\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u043e \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438.\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f UDP, 123 \u043f\u043e\u0440\u0442, \u0432\u0440\u0435\u043c\u044f \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445 \u0441 1900 \u0433\u043e\u0434\u0430.\u041a\u043b\u044e\u0447\u0435\u0432\u043e\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432 \u0444\u043e\u0440\u043c\u0443\u043b\u0435 \u0440\u0430\u0441\u0447\u0435\u0442\u0430 \u0441\u0435\u0442\u0435\u0432\u043e\u0439 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0438, \u0442\u0430\u043a \u043a\u0430\u043a \u0441\u0435\u0440\u0432\u0435\u0440 \u043d\u0435 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u043d\u0430 \u0437\u0430\u043f\u0440\u043e\u0441 \u043c\u0433\u043d\u043e\u0432\u0435\u043d\u043d\u043e, \u0438 \u0432\u0440\u0435\u043c\u044f \u043d\u0435\u043b\u044c\u0437\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u0442\u0430\u043a \u0432\u0437\u044f\u0442\u044c \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c.\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u0432\u043e\u0439 NTP-\u0441\u0435\u0440\u0432\u0435\u0440 \u0442\u043e\u0436\u0435 \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0441\u043b\u043e\u0436\u043d\u043e, \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043d\u0430 \u0437\u0430\u043f\u0440\u043e\u0441 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c UDP-\u043f\u0430\u043a\u0435\u0442 \u0441 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438. \u0412\u0440\u0435\u043c\u044f \u0431\u0435\u0440\u0435\u043c \u0441\u0432\u043e\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0435.\u041d\u0430\u043f\u0438\u0448\u0435\u043c \u0441\u0432\u043e\u0439 \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 NTP, \u0434\u043b\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0438 \u043e\u0442\u0432\u0435\u0442\u043e\u0432 \u0441\u0440\u0430\u0437\u0443: #ifndef jb_ntp#define jb_ntp#include &lt;ESP8266WiFi.h&gt;#include &lt;WiFiUdp.h&gt;#include &lt;time.h&gt;#include &lt;JbTime.h&gt;#define ntpPort   123#define NTP_UNIX_EPOCH_DIFF 2208988800UL#define MINIMAL_UNIXTIME    1767225600UL\/\/ \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 NTP \u043f\u0430\u043a\u0435\u0442\u0430 (48 \u0431\u0430\u0439\u0442)struct NTPPacket {  uint8_t li_vn_mode;      \/\/ leap indicator, version, mode  uint8_t stratum;          \/\/ \u0441\u0442\u0440\u0430\u0442\u0443\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0430  uint8_t poll;             \/\/ \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u043e\u043f\u0440\u043e\u0441\u0430  uint8_t precision;        \/\/ \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c \u0447\u0430\u0441\u043e\u0432  uint32_t rootDelay;       \/\/ \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430  uint32_t rootDispersion;  \/\/ \u0434\u0438\u0441\u043f\u0435\u0440\u0441\u0438\u044f  uint32_t refId;           \/\/ id \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430  uint32_t refTm_s;         \/\/ \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 (\u0441\u0435\u043a\u0443\u043d\u0434\u044b)  uint32_t refTm_f;         \/\/ \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 (\u0434\u0440\u043e\u0431\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c)  uint32_t origTm_s;        \/\/ \u0432\u0440\u0435\u043c\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u043c (T1) &#8212; \u0441\u0435\u043a\u0443\u043d\u0434\u044b  uint32_t origTm_f;        \/\/ \u0432\u0440\u0435\u043c\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u043c (T1) &#8212; \u0434\u0440\u043e\u0431\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c  uint32_t rxTm_s;          \/\/ \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c (T2) &#8212; \u0441\u0435\u043a\u0443\u043d\u0434\u044b  uint32_t rxTm_f;          \/\/ \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c (T2) &#8212; \u0434\u0440\u043e\u0431\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c  uint32_t txTm_s;          \/\/ \u0432\u0440\u0435\u043c\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u043e\u0442\u0432\u0435\u0442\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c (T3) &#8212; \u0441\u0435\u043a\u0443\u043d\u0434\u044b  uint32_t txTm_f;          \/\/ \u0432\u0440\u0435\u043c\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u043e\u0442\u0432\u0435\u0442\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c (T3) &#8212; \u0434\u0440\u043e\u0431\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c} __attribute__((packed));#define JB_NTPCLIENT_NOINIT     1#define JB_NTPCLIENT_NODNS      2#define JB_NTPCLIENT_NOSEND     3#define JB_NTPCLIENT_NOREPLY    4#define JB_NTPCLIENT_BADPACKET  5#define JB_NTPCLIENT_ZEROTIME   6class JbNTPClient {private:  WiFiUDP udp;  int _error;  bool _success;  double _networkDelay;  JbTime * systime;  \/\/ \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 32-\u0431\u0438\u0442\u043d\u043e\u0433\u043e NTP \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432 double (\u0441\u0435\u043a\u0443\u043d\u0434\u044b + \u0434\u0440\u043e\u0431\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c)  inline double ntpToDouble(uint32_t sec, uint32_t frac) {    return sec + frac \/ 4294967296.0; \/\/ 2^32  }  inline double ntpToDouble(uint64_t sec, uint32_t frac) {    uint32_t x_sec = (uint32_t)(sec &amp; 0xFFFFFFFF);    return x_sec + frac \/ 4294967296.0; \/\/ 2^32  }  \/\/ \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 NTP-\u0437\u0430\u043f\u0440\u043e\u0441\u0430  void createRequest(NTPPacket &amp;packet, uint64_t sec, uint32_t frac) {    memset(&amp;packet, 0, sizeof(NTPPacket));    packet.li_vn_mode = 0x23; \/\/ LI=0, VN=4, Mode=3 (client)    uint32_t x_sec = (uint32_t)(sec &amp; 0xFFFFFFFF);    packet.txTm_s = htonl(x_sec);    packet.txTm_f = htonl(frac);  }public:  JbNTPClient(JbTime * src) {    _success = false;    _error  = JB_NTPCLIENT_NOINIT;    _networkDelay = 0;    systime = src;  }  bool begin() {    return udp.begin(ntpPort);  }  WiFiUDP port() { return udp; }  bool success() { return _success; }  bool error() { return _error; }  double netDelay() { return _networkDelay; }  \/\/ \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043a NTP-\u0441\u0435\u0440\u0432\u0435\u0440\u0443  \/\/ \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u0442 mytime  bool requestTime(const char* server, JbTime * mytime) {    _success = false;    _error  = JB_NTPCLIENT_NOINIT;    _networkDelay = 0;    mytime-&gt;ok = false;    IPAddress timeServerIP;    if (!WiFi.hostByName(server, timeServerIP)) {      _error  = JB_NTPCLIENT_NODNS;      return false;    }    NTPPacket packet;    \/\/ T1: \u0432\u0440\u0435\u043c\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u043f\u0430\u043a\u0435\u0442\u0430    uint64_t t1_sec = 0;    uint32_t t1_usec = 0;    systime-&gt;gettime(&amp;t1_sec, &amp;t1_usec);    t1_sec += NTP_UNIX_EPOCH_DIFF;    uint32_t t1_frac = (uint32_t)((t1_usec * (uint64_t)0x100000000ULL) \/ 1000000ULL);    createRequest(packet, t1_sec, t1_frac);    \/\/ \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u043f\u0440\u043e\u0441    udp.beginPacket(timeServerIP, ntpPort);    udp.write((uint8_t*)&amp;packet, sizeof(NTPPacket));    udp.endPacket();    \/\/ \u043e\u0436\u0438\u0434\u0430\u0435\u043c \u043e\u0442\u0432\u0435\u0442 \u0441 \u0442\u0430\u0439\u043c\u0430\u0443\u0442\u043e\u043c    unsigned long timeout = millis() + 2000; \/\/ 2 \u0441\u0435\u043a\u0443\u043d\u0434\u044b \u0442\u0430\u0439\u043c\u0430\u0443\u0442    while (udp.parsePacket() == 0) {      if (millis() &gt; timeout) {        _error  = JB_NTPCLIENT_NOREPLY;        return false;      }      delay(10);    }    \/\/ T4: \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043e\u0442\u0432\u0435\u0442\u0430     uint64_t t4_sec;    uint32_t t4_usec;    systime-&gt;gettime(&amp;t4_sec, &amp;t4_usec);    t4_sec += NTP_UNIX_EPOCH_DIFF;    uint32_t t4_frac = (uint32_t)((t4_usec * (uint64_t)0x100000000ULL) \/ 1000000ULL);    uint32_t t4_mark = micros();    \/\/ \u0447\u0438\u0442\u0430\u0435\u043c \u043e\u0442\u0432\u0435\u0442    int len = udp.read((uint8_t*)&amp;packet, sizeof(NTPPacket));    if (len &lt; sizeof(NTPPacket)) {      _error  = JB_NTPCLIENT_BADPACKET;      return false;    }    uint8_t mode = packet.li_vn_mode &amp; 0x07;    if (mode != 4) {      _error  = JB_NTPCLIENT_BADPACKET;      return false;    }    \/\/ \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u043c \u043c\u0435\u0442\u043a\u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0438\u0437 \u043f\u0430\u043a\u0435\u0442\u0430    uint32_t t2_sec = ntohl(packet.rxTm_s);    uint32_t t2_frac = ntohl(packet.rxTm_f);    uint32_t t3_sec = ntohl(packet.txTm_s);&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-475915","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/475915","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=475915"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/475915\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=475915"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=475915"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=475915"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}