RTC nebo hodiny v reálném čase jsou nejčastěji používaným modulem v elektronice a vestavěných zařízeních pro sledování času. Problém s RTC však spočívá v tom, že mikročipy v počítačích nejsou tak přesné a mohou poskytnout pouze čas místního zařízení. Na druhou stranu je použití internetu k načtení času ze serverů NTP lepším řešením pro získání času, protože je přesnější a může poskytnout čas jakékoli zeměpisné oblasti na světě. Potřebujeme pouze modul Wi-Fi a přístup k internetu, abychom získali čas kdekoli na světě pomocí serverů NTP. V tomto tutoriálu použijeme ESP8266 NodeMCU k získání aktuálního času a data ze serverů NTP a zobrazení na OLED displeji.
Network Time Protocol (NTP)
NTP je jedním z nejstarších síťových internetových protokolů (IP) pro synchronizaci hodin mezi počítačovými sítěmi. Byl navržen Davidem L. Millsem z University of Delaware v roce 1981. Tento protokol lze použít k synchronizaci mnoha sítí do koordinovaného světového času (UTC) během několika milisekund. UTC je primární časový standard, kterým svět reguluje hodiny a čas. UTC se nemění a liší se pro různá geografická umístění. NTP používá jako referenční čas UTC a poskytuje přesný a synchronizovaný čas přes internet.
NTP funguje na hierarchickém modelu klient-server. Špičkový model má referenční hodiny známé jako „stratum0“ jako atomové hodiny, rádiové vlny, GPS, GSM, které přijímají čas ze satelitu. Servery, které přijímají čas ze stratum0, se nazývají „stratum1“ a servery, které přijímají čas ze stratum1, se nazývají „stratum2“ atd. To pokračuje a přesnost času klesá po každé fázi. NTP automaticky vybere to nejlepší z několika dostupných časových zdrojů, které se mají synchronizovat, což z něj činí protokol odolný vůči chybám.
Tady v tomto projektu získáváme čas ze serveru NTP pomocí ESP8266 NodeMCU a zobrazujeme jej na OLED displeji. Stejný druh internetových hodin je vytvořen pomocí ESP32 v předchozím tutoriálu.
ESP8266 může přistupovat k serverům NTP pomocí internetu a získat tak přesný čas. Zde NTP pracuje v režimu klient-server, ESP8266 funguje jako klientské zařízení a připojuje se k serverům NTP pomocí UDP (User Datagram Protocol). Klient odešle paket požadavku na servery NTP a na oplátku NTP odešle paket časového razítka, který obsahuje informace, jako je přesnost, časové pásmo, časové razítko UNIX atd. Poté klient oddělí podrobnosti data a času, které lze dále použít v aplikacích podle požadavku.
Požadované komponenty
- Monochromatický 7pinový SSD1306 0,96 ”OLED displej
- ESP8266 NodeMCU
- Kabel micro USB
- Nepájivá deska
- Propojovací vodiče mezi mužem a mužem
Schéma zapojení a zapojení
Tento 7pinový OLED displej komunikuje s modulem ESP8266 pomocí protokolu SPI, níže je schéma zapojení a tabulka připojení pro připojení pinů OLED SPI k NodeMCU pro zobrazení internetového času.
Ne. |
OLED displej |
NodeMCU |
1 |
GND |
GND |
2 |
VDD |
3,3 V |
3 |
SCK |
D5 |
4 |
MOSI (SPI) nebo SDA (I2C) |
D7 |
5 |
RESETOVAT |
D3 |
6 |
DC |
D2 |
7 |
CS |
D8 |
Chcete-li se dozvědět více o tomto monochromatickém 7kolíkovém OLED displeji a jeho propojení s ESP8266 NodeMCU, klikněte na odkaz.
Vysvětlení kódu
Nejprve musíme stáhnout a nainstalovat knihovnu NTP do ESP8266. Pro klienta NTP je k dispozici mnoho knihoven. Můžete je nainstalovat z Arduino IDE. V tomto tutoriálu jsem nainstaloval knihovnu NTPClient od Taranais, protože je snadno použitelný a má funkce pro získání data a času ze serverů NTP. ESP8266 NodeMCU lze snadno naprogramovat pomocí Arduino IDE.
Chcete-li nainstalovat knihovnu NTP, nejprve si stáhněte knihovnu pomocí výše uvedeného odkazu a poté ji nainstalujte pomocí Arduino IDE. Chcete-li jej nainstalovat, přejděte na Skica> Zahrnout knihovnu> Přidat knihovnu.ZIP , poté otevřete složku Zip tak, že přejdete na místo, kde jste si stáhli složku zip, a restartujte IDE Arduino.
Knihovna NTPClient přichází s příklady. Otevřete Arduino IDE a přejděte na příklady> NTPClient> Upřesnit . Kód uvedený v tomto náčrtu zobrazuje čas ze serveru NTP na sériovém monitoru. Tento náčrt použijeme k zobrazení aktuálního času a data na OLED displeji.
Kompletní kód je k dispozici na konci tohoto tutoriálu, zde jsem vysvětlil několik důležitých částí kódu.
Knihovna ESP8266WiFi poskytuje pro připojení k síti specifické rutiny Wi-Fi specifické pro ESP8266. WiFiUDP.h zpracovává odesílání a přijímání balíčků UDP. Protože používáme protokol SPI k propojení OLED s NodeMCU, importujeme knihovnu „SPI.h“. A „Adafruit_GFX.h“ a „Adafruit_SSD1306.h“ se používají pro OLED displej.
#zahrnout
Naše velikost OLED je 128 x 64, takže nastavujeme šířku a výšku obrazovky na 128, respektive 64. Definujte tedy proměnné pro piny OLED připojené k NodeMCU pro komunikaci SPI.
#define SCREEN_WIDTH 128 // šířka displeje OLED, v pixelech #define SCREEN_HEIGHT 64 // výška displeje OLED, v pixelech // deklarace pro displej SSD1306 připojený pomocí softwaru SPI (výchozí případ): #define OLED_MOSI D7 #define OLED_CLK D5 #define OLED_DC D2 #define OLED_CS D8 #define OLED_RESET D3
Adafruit_SSD1306 display (SCREEN_WIDTH, SCREEN_HEIGHT, OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
V níže uvedených řádcích kódu nahraďte „your_ssid“ a „your_password“ svým Wi-Fi SSID a heslem.
const char * ssid = "your_ssid"; const char * heslo = "vaše_heslo";
Nastavte připojení WI-Fi přidělením SSID a hesla funkci WiFi.begin . Připojení ESP8266 nějakou dobu trvá, než se připojíme k NodeMCU, takže musíme počkat, až se připojí.
WiFi.begin (ssid, heslo); while (WiFi.status ()! = WL_CONNECTED) { zpoždění (500); Serial.print ("."); }
Chcete-li požádat o datum a čas, inicializujte časového klienta s adresou serverů NTP. Pro lepší přesnost vyberte adresu serverů NTP, které jsou blízko vaší geografické oblasti. Zde používáme „ pool.ntp.org “, který poskytuje servery z celého světa. Pokud si chcete vybrat servery z Asie, můžete použít „ asia.pool.ntp.org “. timeClient také bere časový posun UTC v milisekundách vašeho časového pásma . Například posun UTC pro Indii je +5: 30, takže tento posun převedeme v milisekundách, což se rovná 5 * 60 * 60 + 30 * 60 = 19800.
Plocha |
Časový posun UTC (hodiny a minuty) |
Časový posun UTC (sekundy) |
INDIE |
+5: 30 |
19800 |
LONDÝN |
0:00 |
0 |
NEW YORK |
-5: 00 |
-18000 |
WiFiUDP ntpUDP; NTPClient timeClient (ntpUDP, "pool.ntp.org", 19800 60000);
SSD1306_SWITCHCAPVCC je dán k internímu generování 3,3 V pro inicializaci displeje. Po spuštění OLED se na 3 sekundy zobrazí „ VÍTEJTE V OKRUHU DIGEST “ s velikostí textu 2 a barvou MODRÉ.
if (! display.begin (SSD1306_SWITCHCAPVCC)) { Serial.println (F ("alokace SSD1306 selhala")); pro(;;); // Nepokračujte, opakujte navždy } display.clearDisplay (); display.setTextSize (2); // Nakreslete text v 2X měřítku. SetTextColor (MODRÝ); display.setCursor (5, 2); display.println ("VÍTEJTE V"); display.println ("OKRUH"); display.println ("DIGEST"); display.display (); zpoždění (3000);
NTP klient je inicializován pomocí funkce begin () pro nastavení data a času ze serverů NTP.
timeClient.begin ();
Funkce Update () se používá k přijetí data a času, kdykoli požádáme o servery NTP.
timeClient.update ();
Přenosová rychlost 115200 je nastavena pro tisk času na sériovém monitoru.
Serial.begin (115200); Serial.println (timeClient.getFormattedTime ());
getHours (), getMinutes (), getSeconds (), getDay jsou funkce knihovny a udávají aktuální hodinu, minuty, sekundy a den ze serveru NTP. Níže uvedený kód slouží k rozlišení času mezi AM a PM. Pokud je hodina, kterou používáme pomocí getHours (), větší než 12, nastavíme tento čas jako PM, jinak jako AM.
int hh = timeClient.getHours (); int mm = timeClient.getMinutes (); int ss = timeClient.getSeconds (); int den = timeClient.getDay (); if (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 den = timeClient.getDay (); display.println ("" "+ arr_days +" "");
getFormattedDate () se používá k získání data ve formátu „rrrr-mm-dd“ ze serveru NTP. Tato funkce poskytuje datum a čas ve formátu „rrrr-mm-dd T hh: mm: ss “. Potřebujeme však pouze datum, takže musíme tento řetězec, který je uložen ve formátu date_time, rozdělit na „T“, což se provede funkcí substring () a poté uložit datum do proměnné „date“ .
date_time = timeClient.getFormattedDate (); int index_date = date_time.indexOf ("T"); Řetězec date = date_time.substring (0, index_date); Serial.println (datum); display.println (datum); display.display ();
Takto budou OLED Internet Time Clock konečně vypadat: