RTC или часовникът в реално време е най-често използваният модул в електрониката и вградените устройства за следене на времето. Но проблемът с RTC е, че микрочиповете в компютрите не са толкова точни и те могат да осигурят само времето на локалното устройство. От друга страна, използването на интернет за извличане на времето от NTP сървърите е по-доброто решение за получаване на време, тъй като е по-точно и може да предостави времето на която и да е географска област в света. Нуждаем се само от Wi-Fi модул и достъп до интернет, за да получим време на всяко място в света с помощта на NTP сървъри. В този урок ще използваме ESP8266 NodeMCU, за да получим текущото време и дата от NTP сървърите и да ги покажем на OLED дисплей.
Протокол за мрежово време (NTP)
NTP е един от най-старите мрежови интернет протоколи (IP) за синхронизиране на часовници между компютърни мрежи. Проектиран е от Дейвид Л. Милс от Университета в Делауеър през 1981 г. Този протокол може да се използва за синхронизиране на много мрежи с координирано универсално време (UTC) в рамките на няколко милисекунди. UTC е основният стандарт за времето, по който светът регулира часовника и времето. UTC не се променя и варира за различните географски местоположения. NTP използва UTC като ориентир за време и осигурява точно и синхронизирано време в Интернет.
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
- Микро USB кабел
- Макет
- Кабели от мъжки към мъжки джъмпер
Електрическа схема и връзки
Този 7-пинов OLED дисплей комуникира с модул ESP8266, използвайки протокол SPI, по-долу са схемата и таблицата на връзките за свързване на OLED SPI щифтове с NodeMCU за показване на интернет време.
Не. |
OLED дисплей |
NodeMCU |
1 |
GND |
GND |
2 |
VDD |
3.3V |
3 |
SCK |
D5 |
4 |
MOSI (SPI) или SDA (I2C) |
D7 |
5 |
НУЛИРАНЕ |
D3 |
6 |
DC |
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> Разширени . Кодът, даден в тази скица, показва времето от NTP сървъра на серийния монитор. Ще използваме тази скица, за да покажем текущия час и дата на OLED дисплея.
Пълният код е наличен в края на този урок, тук съм обяснил няколко важни части от кода.
ESP8266WiFi библиотеката осигурява специфични за ESP8266 Wi-Fi процедури за свързване към мрежата. WiFiUDP.h обработва изпращането и получаването на UDP пакети. Тъй като използваме протокол SPI за интерфейс OLED с NodeMCU, следователно ще импортираме библиотека “SPI.h”. И “Adafruit_GFX.h” и “Adafruit_SSD1306.h” се използват за OLED дисплей.
#include
Нашият 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 #define OLED_CS D8 #define OLED_RESET D3
Дисплей Adafruit_SSD1306 (SCREEN_WIDTH, SCREEN_HEIGHT, OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
Заменете “your_ssid” и “your_password” с вашия Wi-Fi SSID и парола в долните редове на кода.
const char * ssid = "your_ssid"; const char * password = "your_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.3V, за да инициализира дисплея. Когато OLED стартира, на дисплея се появява „ ДОБРЕ ДОШЛИ В ЦИФРОВА ЦИФРОВА “ с размер на текста 2 и цвят СИН за 3 секунди.
ако (! display.begin (SSD1306_SWITCHCAPVCC)) { Serial.println (F ("SSD1306 разпределението не бе успешно")); за(;;); // Не продължавайте, цикли завинаги } display.clearDisplay (); display.setTextSize (2); // Начертайте 2X мащабен текстов дисплей.setTextColor (СИН); display.setCursor (5, 2); display.println ("ДОБРЕ ДОШЛИ В"); display.println ("CIRCUIT"); display.println ("DIGEST"); 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 hh = timeClient.getHours (); int mm = timeClient.getMinutes (); int ss = timeClient.getSeconds (); int day = timeClient.getDay (); ако (hh> 12) { hh = hh-12; display.print (hh); display.print (":"); display.print (mm); display.print (":"); display.print (ss); display.println ("PM"); } else { display.print (hh); display.print (":"); display.print (mm); display.print (":"); display.print (ss); display.println ("AM"); } int day = timeClient.getDay (); display.println ("'" + arr_days + "'");
getFormattedDate () се използва дата на получаване във формат „гггг-мм-дд“ от NTP сървър. Тази функция дава дата и час във формат „гггг-мм-дд Т чч: мм: сс формат. Но ние се нуждаем само от дата, така че трябва да разделим този низ, който се съхранява във формат date_time до “T”, което се извършва от функцията substring () и след това да съхраним датата в променлива “date”
date_time = timeClient.getFormattedDate (); int index_date = date_time.indexOf ("T"); String date = date_time.substring (0, index_date); Serial.println (дата); display.println (дата); display.display ();
Ето как най- накрая ще изглежда OLED интернет часовникът: