RTC atau Real Time Clock adalah modul yang paling biasa digunakan dalam Elektronik dan peranti tertanam untuk mengesan masa. Tetapi masalah dengan RTC adalah bahawa mikrocip dalam komputer tidak begitu tepat dan hanya dapat menyediakan waktu peranti tempatan. Sebaliknya, menggunakan internet untuk mengambil masa dari pelayan NTP adalah penyelesaian yang lebih baik untuk mendapatkan masa kerana lebih tepat dan dapat memberikan masa di mana-mana kawasan geografi di dunia. Kami hanya memerlukan modul Wi-Fi dan akses ke internet untuk mendapatkan waktu dari mana-mana lokasi di dunia dengan menggunakan pelayan NTP. Dalam tutorial ini, kita akan menggunakan ESP8266 NodeMCU untuk mendapatkan masa dan tarikh terkini dari pelayan NTP dan memaparkannya pada paparan OLED.
Protokol Masa Rangkaian (NTP)
NTP adalah salah satu Internet Protocol (IP) rangkaian tertua untuk menyegerakkan jam antara rangkaian komputer. Ia dirancang oleh David L. Mills dari University of Delaware pada tahun 1981. Protokol ini dapat digunakan untuk menyegerakkan banyak rangkaian ke Waktu Sejagat Terpadu (UTC) dalam beberapa milisaat. UTC adalah standard waktu utama di mana dunia mengatur jam dan waktu. UTC tidak berubah dan berbeza untuk lokasi geografi yang berbeza. NTP menggunakan UTC sebagai rujukan waktu dan memberikan masa yang tepat dan diselaraskan di seluruh Internet.
NTP berfungsi pada model pelayan pelanggan yang hierarki. Model teratas mempunyai jam rujukan yang dikenal sebagai "stratum0" seperti jam atom, gelombang radio, GPS, GSM yang menerima masa dari satelit. Pelayan yang menerima masa dari stratum0 disebut sebagai "stratum1" dan pelayan yang menerima masa dari stratum1 disebut "stratum2" dan sebagainya. Ini berterusan dan ketepatan masa terus menurun selepas setiap peringkat. NTP secara automatik memilih yang terbaik dari beberapa sumber masa yang ada untuk disegerakkan yang menjadikannya protokol yang boleh bertolak ansur.
Jadi di sini dalam projek ini, kami mendapat masa dari pelayan NTP menggunakan ESP8266 NodeMCU dan menunjukkannya pada paparan OLED. Jam Internet yang serupa ini dibina dengan menggunakan ESP32 dalam tutorial sebelumnya.
ESP8266 dapat mengakses pelayan NTP menggunakan internet untuk mendapatkan masa yang tepat. Di sini NTP berfungsi dalam mod pelayan pelanggan, ESP8266 berfungsi sebagai peranti pelanggan dan bersambung dengan pelayan NTP menggunakan UDP (User Datagram Protocol). Pelanggan menghantar paket permintaan ke pelayan NTP dan sebagai balasannya NTP menghantar paket cap waktu yang terdiri daripada maklumat seperti ketepatan, zon waktu, cap waktu UNIX dll. Kemudian pelanggan memisahkan butiran tarikh dan masa yang dapat digunakan lebih lanjut dalam aplikasi mengikut keperluan.
Komponen Diperlukan
- Paparan OLED 7-pin SSD1306 0,96 ā€¯monokrom
- ESP8266 NodeMCU
- Kabel USB mikro
- Papan roti
- Wayar Jumper Lelaki hingga Lelaki
Diagram dan Sambungan Litar
Paparan OLED 7-pin ini berkomunikasi dengan modul ESP8266 menggunakan protokol SPI, di bawah ini adalah rajah litar dan jadual sambungan untuk menghubungkan pin OLED SPI dengan NodeMCU untuk memaparkan waktu Internet.
Tidak. |
Paparan OLED |
NodeMCU |
1 |
GND |
GND |
2 |
VDD |
3.3V |
3 |
SCK |
D5 |
4 |
MOSI (SPI) atau SDA (I2C) |
D7 |
5 |
LETAKKAN |
D3 |
6 |
DC |
D2 |
7 |
CS |
D8 |
Untuk mengetahui lebih lanjut paparan OLED 7-pin Monochrome ini dan antaranya dengan ESP8266 NodeMCU, ikuti pautan tersebut.
Penjelasan Kod
Mula-mula kita harus memuat turun dan memasang perpustakaan NTP ke dalam ESP8266. Terdapat banyak perpustakaan yang tersedia untuk Pelanggan NTP. Anda boleh memasang salah satu dari Arduino IDE. Dalam tutorial ini saya telah memasang perpustakaan NTPClient oleh Taranais kerana senang digunakan dan mempunyai fungsi untuk mendapatkan tarikh dan waktu dari pelayan NTP. ESP8266 NodeMCU dapat diprogram dengan mudah menggunakan Arduino IDE.
Untuk memasang perpustakaan NTP, muat turun perpustakaan terlebih dahulu menggunakan pautan di atas dan kemudian pasangkannya menggunakan Arduino IDE. Untuk memasangnya pergi ke Sketch> Include Library> Add.ZIP Library , kemudian buka folder Zip dengan pergi ke lokasi di mana anda telah memuat turun folder zip dan mulakan semula Arduino IDE.
Perpustakaan klien NTP dilengkapi dengan contoh. Buka Arduino IDE dan Contoh Goto> NTPClient> Lanjutan . Kod yang diberikan dalam lakaran ini memaparkan waktu dari pelayan NTP pada monitor bersiri. Kami akan menggunakan lakaran ini untuk memaparkan waktu dan tarikh semasa pada paparan OLED.
Kod lengkap terdapat di akhir tutorial ini, di sini saya telah menerangkan beberapa bahagian penting kod tersebut.
Perpustakaan ESP8266 Wi-Fi menyediakan rutin Wi-Fi khusus ESP8266 untuk menyambung ke rangkaian. WiFiUDP.h menangani penghantaran dan penerimaan pakej UDP. Oleh kerana kami menggunakan protokol SPI untuk menghubungkan OLED dengan NodeMCU oleh itu kami akan mengimport perpustakaan "SPI.h". Dan "Adafruit_GFX.h" dan "Adafruit_SSD1306.h" digunakan untuk Paparan OLED.
#sertakan
Saiz OLED kami adalah 128x64 jadi kami menetapkan lebar dan tinggi layar masing-masing sebagai 128 dan 64. Oleh itu, tentukan pemboleh ubah untuk pin OLED yang disambungkan ke NodeMCU untuk komunikasi SPI.
#define SCREEN_WIDTH 128 // Lebar paparan OLED, dalam piksel #define SCREEN_HEIGHT 64 // Tinggi paparan OLED, dalam piksel // Perisytiharan untuk paparan SSD1306 disambungkan menggunakan SPI perisian (kes lalai): #tentukan OLED_MOSI D7 #tentukan OLED_CLK D5 #tentukan OLED_DC D2 #tentukan OLED_CS D8 #tentukan OLED_RESET D3
Paparan Adafruit_SSD1306 (SCREEN_WIDTH, SCREEN_HEIGHT, OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
Ganti "your_ssid" dan "your_password" dengan SSID Wi-Fi dan kata laluan anda pada baris kod di bawah ini.
const char * ssid = "your_ssid"; const char * kata laluan = "kata laluan_anda";
Siapkan sambungan WI-Fi dengan memberikan SSID dan kata laluan ke fungsi WiFi . Mulailah . Sambungan ESP8266 memerlukan sedikit masa untuk menyambung ke NodeMCU jadi kami harus menunggu sehingga ia tersambung.
WiFi.begin (ssid, kata laluan); sementara (WiFi.status ()! = WL_CONNECTED) { kelewatan (500); Cetakan bersiri ("."); }
Untuk meminta tarikh dan waktu, mulakan waktu klien dengan alamat pelayan NTP. Untuk ketepatan yang lebih baik, pilih alamat pelayan NTP yang berdekatan dengan kawasan geografi anda. Di sini kita menggunakan " pool.ntp.org " yang memberikan pelayan dari seluruh dunia. Sekiranya anda ingin memilih pelayan dari Asia, anda boleh menggunakan " asia.pool.ntp.org ". timeClient juga mengambil pengimbangan masa UTC dalam milisaat zon waktu anda. Contohnya, pengimbangan UTC untuk India ialah +5: 30 jadi kami menukar pengimbangan ini dalam milisaat yang sama dengan 5 * 60 * 60 + 30 * 60 = 19800.
Kawasan |
Pengimbangan masa UTC (jam dan minit) |
Pengimbangan masa UTC (saat) |
INDIA |
+5: 30 |
19800 |
LONDON |
0:00 |
0 |
YORK BARU |
-5: 00 |
-18000 |
WiFiUDP ntpUDP; NTPClient timeClient (ntpUDP, "pool.ntp.org", 19800,60000);
SSD1306_SWITCHCAPVCC diberikan untuk menghasilkan 3.3V secara dalaman untuk memulakan paparan. Semasa OLED dimulakan, ia akan memaparkan " SELAMAT DATANG KE CIRCUIT DIGEST " dengan saiz teks 2 dan warna BIRU selama 3 saat.
jika (! display.begin (SSD1306_SWITCHCAPVCC)) { Serial.println (F ("peruntukan SSD1306 gagal")); untuk (;;); // Jangan teruskan, gelung selamanya } display.clearDisplay (); display.setTextSize (2); // Lukiskan paparan teks berskala 2X.setTextColor (BLUE); display.setCursor (5, 2); display.println ("SELAMAT DATANG"); display.println ("CIRCUIT"); display.println ("DIGEST"); paparan.display (); kelewatan (3000);
Pelanggan NTP diinisialisasi menggunakan fungsi begin () untuk menetapkan tarikh dan waktu dari pelayan NTP.
timeClient.begin ();
Fungsi kemas kini () digunakan untuk menerima tarikh dan waktu setiap kali kita meminta ke pelayan NTP.
timeClient.update ();
Baud rate 115200 ditetapkan untuk mencetak waktu pada monitor bersiri.
Serial.begin (115200); Serial.println (timeClient.getFormattedTime ());
getHours (), getMinutes (), getSeconds (), getDay adalah fungsi perpustakaan dan memberikan jam, minit, saat dan hari semasa dari pelayan NTP. Kod di bawah digunakan untuk membezakan masa antara AM dan PM. Sekiranya jam kita menggunakan getHours () lebih besar dari 12 maka kita menetapkan waktu itu sebagai PM yang lain.
int hh = timeClient.getHours (); int mm = timeClient.getMinutes (); int ss = timeClient.getSeconds (); int hari = timeClient.getDay (); jika (hh> 12) { hh = hh-12; display.print (hh); display.print (":"); paparan.cetakan (mm); display.print (":"); display.print (ss); display.println ("PM"); } lain { display.print (hh); display.print (":"); paparan.cetakan (mm); display.print (":"); display.print (ss); display.println ("AM"); } int hari = timeClient.getDay (); display.println ("'" + arr_days + "'");
getFormattedDate () digunakan tarikh get dalam format "yyyy-mm-dd" dari pelayan NTP. Fungsi ini memberikan tarikh dan masa dalam format "yyyy-mm-dd T hh: mm: ss . Tetapi kita hanya memerlukan tarikh sehingga kita harus memisahkan rentetan ini yang disimpan dalam format date_time hingga "T" yang dilakukan dengan fungsi substring () dan kemudian menyimpan tarikh dalam pemboleh ubah "tarikh" .
date_time = timeClient.getFormattedDate (); int index_date = date_time.indexOf ("T"); Tali rentetan = date_time.substring (0, index_date); Serial.println (tarikh); display.println (tarikh); paparan.display ();
Beginilah rupa Jam Internet OLED akhirnya: