Уроки / Урок 11

Часы из интернета

Получаем точное время по NTP и учитываем часовой пояс.

У ESP32 нет часов с батарейкой, но через Wi-Fi плата узнаёт точное время у серверов времени (протокол NTP) за доли секунды. Дальше время идёт внутри чипа само.

#include <WiFi.h>
#include <time.h>

const char *SSID = "ИмяСети";
const char *PASS = "пароль";
const int LED = 2;

void setup() {
  Serial.begin(115200);
  pinMode(LED, OUTPUT);
  WiFi.begin(SSID, PASS);
  while (WiFi.status() != WL_CONNECTED) delay(300);

  // часовой пояс Москвы (UTC+3) и два сервера времени
  configTzTime("MSK-3", "pool.ntp.org", "time.google.com");
}

void loop() {
  struct tm t;
  if (!getLocalTime(&t)) {
    Serial.println("Жду время...");
    return;
  }
  char buf[40];
  strftime(buf, sizeof(buf), "%d.%m.%Y %H:%M:%S", &t);
  Serial.println(buf);

  digitalWrite(LED, t.tm_sec % 2);  // светодиод мигает раз в секунду
  delay(1000);
}

Часовой пояс

Строка "MSK-3" записана в формате POSIX: имя пояса и смещение с обратным знаком. Москва — UTC+3, поэтому -3. Другие примеры: Самара "SAMT-4", Екатеринбург "YEKT-5", Новосибирск "NOVT-7", Владивосток "VLAT-10", Калининград "EET-2".

Полезные поля

  • t.tm_hour, t.tm_min, t.tm_sec — часы, минуты, секунды.
  • t.tm_mday — число, t.tm_mon — месяц от 0 (январь = 0), t.tm_year — год минус 1900.
  • t.tm_wday — день недели, 0 = воскресенье.

Попробуйте сделать будильник: в нужное время включайте светодиод или сыграйте звук «Дуино» из урока 8.