
Интернет-магазин «Неглупый Дом»
В других проектах на сайте время в DS1307 записывается один раз вручную — через время компиляции скетча (`rtc.adjust(DateTime(F(__DATE__), F(__TIME__)))`). Здесь ESP8266 сама получает точное время с сервера точного времени (NTP) через интернет и каждый раз при включении автоматически выставляет его в DS1307, без участия человека.
NTP (Network Time Protocol) — это протокол, по которому устройства по всему миру синхронизируют время с эталонными серверами точного времени. ESP8266 отправляет такому серверу короткий запрос по WiFi и получает в ответ точное время с точностью до секунд — это гораздо точнее и удобнее, чем вручную выставлять время компиляции скетча, которое неизбежно немного "отстаёт" от момента реальной заливки на плату.
Получив время по NTP, ESP8266 передаёт его в DS1307 той же командой `rtc.adjust()`, что и при ручной установке — просто вместо константы времени компиляции используется актуальное время, полученное через интернет. После этого DS1307 продолжает отсчёт самостоятельно от батарейки, как и раньше — NTP-синхронизация нужна только в момент установки, а не постоянно.
Так как реализации данного модуля бывают разные, если у вас на плате нет тех контактов, которые указаны ниже — сориентируйтесь по названиям контактов на своей плате.
// ВНИМАНИЕ: рекомендую отладить код через монитор порта, так как я языковая
// модель, а не специализированный кодер, и могу что-то упустить. Основу
// и идею я накидал, но проверьте под свою схему.
#include <ESP8266WiFi.h>
#include <Wire.h>
#include <RTClib.h>
#include <time.h>
const char* WIFI_SSID = "ваша_сеть";
const char* WIFI_PASSWORD = "ваш_пароль";
RTC_DS1307 rtc;
void setup() {
Serial.begin(9600);
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
}
Serial.println("WiFi подключен");
configTime(3 * 3600, 0, "pool.ntp.org", "time.nist.gov"); // смещение в секундах под свой часовой пояс
Serial.println("Ждём синхронизации по NTP...");
time_t now = time(nullptr);
while (now < 100000) { // пока время не похоже на реальное (а не 1970 год)
delay(500);
now = time(nullptr);
}
if (!rtc.begin()) {
Serial.println("DS1307 не найден!");
while (1) delay(1000);
}
struct tm timeinfo;
gmtime_r(&now, &timeinfo);
rtc.adjust(DateTime(timeinfo.tm_year + 1900, timeinfo.tm_mon + 1, timeinfo.tm_mday,
timeinfo.tm_hour, timeinfo.tm_min, timeinfo.tm_sec));
Serial.println("DS1307 синхронизирован по NTP!");
}
void loop() {
DateTime now = rtc.now();
Serial.print(now.hour());
Serial.print(":");
Serial.println(now.minute());
delay(5000);
}
Библиотека RTClib (Adafruit) ставится через Менеджер библиотек Arduino IDE, библиотеки ESP8266WiFi и time.h входят в стандартный пакет поддержки ESP8266. Смещение `3 * 3600` в `configTime()` задано для часового пояса UTC+3 — поменяйте под свой часовой пояс.
Ещё модули для Arduino: Электронные модули.
🎁 Купить весь комплект со скидкой 10%
Все 2 товара сразу в корзину: 305 ₽ 275 ₽ (экономия 30 ₽)
Скидка применяется автоматически при оформлении заказа, если в корзине именно этот комплект.
Остались вопросы? Проконсультируйтесь с ИИ-инженером — он уже в курсе темы статьи и сразу ответит, ничего вводить не нужно.