- Сетевой протокол времени (NTP)
- Необходимые компоненты
- Принципиальная схема и подключения
- Код Пояснение
RTC или часы реального времени - это наиболее часто используемый модуль в электронике и встроенных устройствах для отслеживания времени. Но проблема с RTC в том, что микрочипы в компьютерах не очень точны и могут отображать только время локального устройства. С другой стороны, использование Интернета для получения времени с серверов NTP - лучшее решение для получения времени, поскольку оно более точное и может предоставить время для любой географической области в мире. Нам просто нужен модуль Wi-Fi и доступ к Интернету, чтобы узнать время в любой точке мира с помощью серверов NTP. В этом руководстве мы будем использовать ESP8266 NodeMCU, чтобы получать текущее время и дату с серверов NTP и отображать их на OLED-дисплее.
Сетевой протокол времени (NTP)
NTP - один из старейших сетевых интернет-протоколов (IP) для синхронизации часов между компьютерными сетями. Он был разработан Дэвидом Л. Миллсом из Университета Делавэра в 1981 году. Этот протокол можно использовать для синхронизации многих сетей с всемирным координированным временем (UTC) за несколько миллисекунд. UTC - это основной стандарт времени, по которому мир регулирует часы и время. UTC не меняется и различается для разных географических регионов. NTP использует всемирное координированное время в качестве ориентира времени и обеспечивает точное и синхронизированное время в Интернете.
NTP работает по иерархической модели клиент-сервер. Топовая модель имеет эталонные часы, известные как «stratum0», такие как атомные часы, радиоволны, GPS, GSM, которые получают время со спутника. Серверы, которые получают время от stratum0, называются «stratum1», а серверы, которые получают время от stratum1, называются «stratum2» и так далее. Это продолжается, и точность измерения времени уменьшается после каждого этапа. NTP автоматически выбирает лучший из нескольких доступных источников времени для синхронизации, что делает его отказоустойчивым протоколом.
Итак, в этом проекте мы получаем время от сервера NTP, используя ESP8266 NodeMCU и показываем его на OLED-дисплее. Такие же интернет-часы созданы с использованием ESP32 из предыдущего руководства.
ESP8266 может получить доступ к серверам NTP через Интернет, чтобы узнать точное время. Здесь NTP работает в режиме клиент-сервер, ESP8266 работает как клиентское устройство и соединяется с серверами NTP с использованием UDP (User Datagram Protocol). Клиент передает пакет запроса на серверы NTP, а в ответ NTP отправляет пакет с отметкой времени, который содержит такую информацию, как точность, часовой пояс, временная метка UNIX и т. Д. Затем клиент разделяет данные о дате и времени, которые могут в дальнейшем использоваться в приложениях в соответствии с требованиями.
Необходимые компоненты
- Монохромный 7-контактный SSD1306 0,96-дюймовый OLED-дисплей
- ESP8266 NodeMCU
- Кабель Micro USB
- Макетная плата
- Перемычки между мужчинами и женщинами
Принципиальная схема и подключения
Этот 7-контактный OLED-дисплей обменивается данными с модулем ESP8266 по протоколу SPI. Ниже приведены принципиальная схема и таблица соединений для подключения контактов OLED SPI к NodeMCU для отображения времени в Интернете.
Нет. |
OLED-дисплей |
NodeMCU |
1 |
GND |
GND |
2 |
VDD |
3,3 В |
3 |
SCK |
D5 |
4 |
MOSI (SPI) или SDA (I2C) |
D7 |
5 |
СБРОС |
D3 |
6 |
ОКРУГ КОЛУМБИЯ |
D2 |
7 |
CS |
D8 |
Чтобы узнать больше об этом монохромном 7-контактном OLED-дисплее и его взаимодействии с ESP8266 NodeMCU, перейдите по ссылке.
Код Пояснение
Сначала мы должны загрузить и установить библиотеку NTP в ESP8266. Для NTP-клиента доступно множество библиотек. Вы можете установить любой из них из Arduino IDE. В этом руководстве я установил библиотеку NTPClient от Taranais, потому что она проста в использовании и имеет функции для получения даты и времени с серверов NTP. ESP8266 NodeMCU можно легко запрограммировать с помощью Arduino IDE.
Чтобы установить библиотеку NTP, сначала загрузите библиотеку, используя ссылку выше, а затем установите ее с помощью Arduino IDE. Чтобы установить его, перейдите в Sketch> Include Library> Add.ZIP Library , затем откройте папку Zip, перейдя в место, где вы загрузили zip-папку, и перезапустите Arduino IDE.
Библиотека NTPClient поставляется с примерами. Откройте Arduino IDE и перейдите к примерам> NTPClient> Advanced . Код, приведенный в этом эскизе, отображает время с сервера NTP на последовательном мониторе. Мы будем использовать этот эскиз для отображения текущего времени и даты на OLED-дисплее.
Полный код доступен в конце этого руководства, здесь я объяснил несколько важных частей кода.
Библиотека ESP8266WiFi предоставляет специальные подпрограммы Wi-Fi ESP8266 для подключения к сети. WiFiUDP.h обрабатывает отправку и получение пакетов UDP. Поскольку мы используем протокол SPI для взаимодействия OLED с NodeMCU, мы импортируем библиотеку «SPI.h». И «Adafruit_GFX.h» и «Adafruit_SSD1306.h» используются для OLED-дисплея.
#включают
Наш размер OLED - 128x64, поэтому мы устанавливаем ширину и высоту экрана 128 и 64 соответственно. Итак, определите переменные для выводов OLED, подключенных к NodeMCU для связи SPI.
#define SCREEN_WIDTH 128 // Ширина OLED-дисплея в пикселях #define SCREEN_HEIGHT 64 // Высота OLED-дисплея в пикселях // Объявление для дисплея SSD1306, подключенного с помощью программного SPI (случай по умолчанию): #define OLED_MOSI D7 #define OLED_CLK D5 #define OLED_DC D2 # определить OLED_CS D8 # определить OLED_RESET D3
Отображение Adafruit_SSD1306 (SCREEN_WIDTH, SCREEN_HEIGHT, OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
Замените your_ssid и your_password своим SSID и паролем Wi-Fi в следующих строках кода.
const char * ssid = "your_ssid"; const char * password = "ваш_пароль";
Настройте соединение WI-Fi, указав SSID и пароль для функции WiFi.begin . Для подключения ESP8266 к NodeMCU требуется некоторое время, поэтому нам нужно подождать, пока он подключится.
WiFi.begin (ssid, пароль); в то время как (WiFi.status ()! = WL_CONNECTED) { задержка (500); Serial.print ("."); }
Чтобы запросить дату и время, инициализируйте клиент времени с адресом серверов NTP. Для большей точности выберите адрес серверов NTP, которые находятся недалеко от вашего географического региона. Здесь мы используем « pool.ntp.org », который предоставляет серверы со всего мира. Если вы хотите выбрать серверы из Азии, вы можете использовать « asia.pool.ntp.org ». timeClient также принимает смещение времени UTC в миллисекундах вашего часового пояса. Например, смещение UTC для Индии составляет +5: 30, поэтому мы конвертируем это смещение в миллисекунды, что равно 5 * 60 * 60 + 30 * 60 = 19800.
Площадь |
Смещение времени UTC (часы и минуты) |
Смещение времени UTC (секунды) |
ИНДИЯ |
+5: 30 |
19800 |
ЛОНДОН |
0:00 |
0 |
НЬЮ-ЙОРК |
-5:00 |
-18000 |
WiFiUDP ntpUDP; NTPClient timeClient (ntpUDP, «pool.ntp.org», 19800,60000);
SSD1306_SWITCHCAPVCC предназначен для внутренней генерации 3,3 В для инициализации дисплея. Когда OLED запускается, он отображает « ДОБРО ПОЖАЛОВАТЬ В ДАЙДЖЕСТ ЦЕПИ » с размером текста 2 и СИНИМ цветом в течение 3 секунд.
if (! display.begin (SSD1306_SWITCHCAPVCC)) { Serial.println (F («Ошибка выделения SSD1306»)); за(;;); // Не продолжать, цикл бесконечно } display.clearDisplay (); display.setTextSize (2); // Рисуем текст в масштабе 2X display.setTextColor (BLUE); display.setCursor (5, 2); display.println («ДОБРО ПОЖАЛОВАТЬ»); display.println («ЦЕПЬ»); display.println («ДАЙДЖЕСТ»); display.display (); задержка (3000);
Клиент NTP инициализируется с помощью функции begin () для установки даты и времени с серверов NTP.
timeClient.begin ();
Функция Update () используется для получения даты и времени всякий раз, когда мы запрашиваем NTP-серверы.
timeClient.update ();
Скорость передачи 115200 установлена для печати времени на последовательном мониторе.
Serial.begin (115200); Serial.println (timeClient.getFormattedTime ());
getHours (), getMinutes (), getSeconds (), getDay - это библиотечные функции , которые выдают текущий час, минуты, секунды и день с сервера NTP. Код ниже используется для различения времени между AM и PM. Если час, который мы получаем с помощью getHours () , больше 12, мы устанавливаем это время как PM, иначе его AM.
int чч = timeClient.getHours (); int мм = timeClient.getMinutes (); int ss = timeClient.getSeconds (); int day = timeClient.getDay (); если (чч> 12) { чч = чч-12; display.print (чч); display.print (":"); display.print (мм); display.print (":"); display.print (ss); display.println ("PM"); } еще { display.print (чч); display.print (":"); display.print (мм); display.print (":"); display.print (ss); display.println («AM»); } int day = timeClient.getDay (); display.println ("'" + arr_days + "'");
getFormattedDate () используется для получения даты в формате «гггг-мм-дд» с сервера NTP. Эта функция отображает дату и время в формате «гггг-мм-дд T чч: мм: сс» . Но нам нужна только дата, поэтому мы должны разделить эту строку, которая хранится в формате date_time , до «T», что выполняется функцией substring (), а затем сохранить дату в переменной «date» .
date_time = timeClient.getFormattedDate (); int index_date = date_time.indexOf ("Т"); Строка date = date_time.substring (0, index_date); Serial.println (дата); display.println (дата); display.display ();
Вот так, наконец, будут выглядеть OLED Internet Time Clock: