Контроллер NodeMCU подключается к WiFi-сети, а значит может получать данные с различных серверов. На этом занятии мы будем подключаться к NTP-северу (Network Time Protocol). Этот сервер позволяет получить точное время и дату. Эти данные можно выводить в монитор порта, а можно выводить на OLED-дисплей, который установлен на нашем домике.
Соберите следующую схему
Информация о времени и дате выводится на OLED-дисплей на русском языке. Для использования русских символов требуется библиотека <iarduino_OLED_txt.h>
.
В следующем скетче очень важно использовать правильную библиотеку <NTPClient.h>
. Если пользоваться неправильной библиотекой с таким же именем, может возникать ошибка при компиляции скетча. Сообщается об отсутствии метода getFormattedDate(). Взять нужную библиотеку <NTPClient.h> можно по ссылке: https://github.com/taranais/NTPClient
// Внимание! Использовать библиотеку NTPClient.h отсюда
// https://github.com/taranais/NTPClient
#define SDA_pin D2
#define SCL_pin D1
#include <ESP8266WiFi.h>
#include <iarduino_OLED_txt.h> // Подключаем библиотеку iarduino_OLED_txt.
iarduino_OLED_txt myOLED(0x78); // Объявляем объект myOLED, указывая адрес дисплея на шине I2C
extern uint8_t SmallFontRus[]; // Подключаем шрифт SmallFontRus.
#include <NTPClient.h>
#include <WiFiUdp.h>
uint32_t refreshTime = 10000; // время перерисовки времени и даты
uint32_t curTime = 0; // текущее время
// Смещение в секундах для часового пояса Москвы
const long utcOffsetInSeconds = 10800;
char Week_days[7][24] = {"Воскресенье", "Понедельник", "Вторник", "Среда", "Четверг", "Пятница", "Суббота"};
// Определение NTP-клиента для получения времени
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "pool.ntp.org", utcOffsetInSeconds);
// Укажите данные вашей сети WiFi
const char* ssid = "****************";
const char* password = "****************";
void setup(){
Serial.begin(9600);
WiFi.begin(ssid, password);
while ( WiFi.status() != WL_CONNECTED )
{
delay ( 1000 );
Serial.print ( "." );
}
Serial.print ( "Соединение установлено! IP: ");
Serial.println(WiFi.localIP());
myOLED.begin(); // Инициируем работу с дисплеем.
myOLED.setFont(SmallFontRus);// Указываем шрифт который требуется использовать для вывода цифр и текста.
timeClient.begin();
delay(5000); // Задержка перед первым считыванием точного времени
curTime = millis();
}
void loop() {
String curDate = "01-01-1900";
if (millis() - curTime > refreshTime) { // пора перерисовать время
timeClient.update();
curTime = millis();
myOLED.clrScr(); // Чистим экран.
curDate = timeClient.getFormattedDate();
myOLED.print(curDate.substring(11,16), 0, 0);
// myOLED.print(":");
// myOLED.print(curDate.substring(8,10), 17, 9);
myOLED.print(Week_days[timeClient.getDay()], 0, 2);
myOLED.print(curDate.substring(8,10), 0, 4);
myOLED.print("-");
myOLED.print(curDate.substring(5,7));
myOLED.print("-");
myOLED.print(curDate.substring(0,4));
//Serial.print(Week_days[timeClient.getDay()]);
//Serial.print(", ");
//Serial.print(timeClient.getHours());
//Serial.print(":");
//Serial.print(timeClient.getMinutes());
//Serial.print(":");
//Serial.print(timeClient.getSeconds());
//Serial.print("; ");
Serial.println(curDate);
}
}
После загрузки скетча время и дата будут выведены на OLED-дисплей после 15 секунд задержки. Наберитесь терпения и подождите. Это время требуется для того, чтобы получить правильное время с NTP-сервера.
Обновление времени происходит каждые 10 секунд. Это время установлено в переменной uint32_t refreshTime = 10000;
Такое время требуется для отладки скетча. Получать точное время с NTP-сервера можно значительно реже, например, каждые минут 15. В промежутках между обращением к серверу достаточно пользоваться часами, встроенными в микроконтроллер. Такое изменение программы вы можете сделать самостоятельно.
Другая важная величина – константа const long utcOffsetInSeconds = 10800;
Эта константа – величина смещения в секундах времени, полученного от NTP-сервера для часового пояса Москвы. Если вам требуется точное время для другого часового пояса, нужно изменить эту константу.
Результат работы скетча приведён на рисунке.