RTC atau Real Time Clock adalah modul yang paling umum digunakan di Elektronik dan perangkat tertanam untuk melacak waktu. Tetapi masalah dengan RTC adalah bahwa microchip di komputer tidak terlalu akurat dan mereka hanya dapat menyediakan waktu perangkat lokal. Di sisi lain, menggunakan internet untuk mengambil waktu dari server NTP adalah solusi yang lebih baik untuk mendapatkan waktu karena lebih akurat dan dapat menyediakan waktu dari setiap wilayah geografis di dunia. Kami hanya membutuhkan modul Wi-Fi dan akses ke internet untuk mendapatkan waktu dari lokasi mana pun di dunia dengan menggunakan server NTP. Dalam tutorial ini, kami akan menggunakan ESP8266 NodeMCU untuk mendapatkan waktu dan tanggal saat ini dari server NTP dan menampilkannya di layar OLED.
Protokol Waktu Jaringan (NTP)
NTP adalah salah satu Internet Protocol (IP) jaringan tertua untuk sinkronisasi jam antar jaringan komputer. Ini dirancang oleh David L. Mills dari University of Delaware pada tahun 1981. Protokol ini dapat digunakan untuk menyinkronkan banyak jaringan ke Waktu Universal Terkoordinasi (UTC) dalam beberapa milidetik. UTC adalah standar waktu utama yang digunakan dunia untuk mengatur jam dan waktu. UTC tidak berubah dan berbeda untuk lokasi geografis yang berbeda. NTP menggunakan UTC sebagai referensi waktu dan menyediakan waktu yang akurat dan tersinkronisasi di Internet.
NTP bekerja pada model klien-server hierarkis. Model teratas memiliki jam referensi yang dikenal sebagai "stratum0" seperti jam atom, gelombang radio, GPS, GSM yang menerima waktu dari satelit. Server yang menerima waktu dari stratum0 disebut sebagai "stratum1" dan server yang menerima waktu dari stratum1 disebut "stratum2" dan seterusnya. Ini terus berlanjut dan keakuratan waktu terus menurun setelah setiap tahap. NTP secara otomatis memilih yang terbaik dari beberapa sumber waktu yang tersedia untuk disinkronkan yang menjadikannya protokol yang dapat toleran terhadap kesalahan.
Jadi di sini, di proyek ini, kami mendapatkan waktu dari server NTP menggunakan ESP8266 NodeMCU dan menampilkannya di layar OLED. Jenis jam Internet yang sama ini dibuat dengan menggunakan ESP32 di tutorial sebelumnya.
ESP8266 dapat mengakses server NTP menggunakan internet untuk mendapatkan waktu yang akurat. Di sini NTP bekerja dalam mode client-server, ESP8266 berfungsi sebagai perangkat klien dan terhubung dengan server NTP menggunakan UDP (User Datagram Protocol). Klien mengirimkan paket permintaan ke server NTP dan sebagai gantinya NTP mengirimkan paket timestamp yang terdiri dari informasi seperti akurasi, zona waktu, stempel waktu UNIX, dll. Kemudian klien memisahkan detail tanggal dan waktu yang selanjutnya dapat digunakan dalam aplikasi sesuai dengan kebutuhan.
Komponen Diperlukan
- Layar OLED Monokrom 7-pin SSD1306 0,96 inci
- ESP8266 NodeMCU
- Kabel USB mikro
- Papan tempat memotong roti
- Kabel Jumper Pria ke Pria
Diagram Sirkuit dan Koneksi
Layar OLED 7-pin ini berkomunikasi dengan modul ESP8266 menggunakan protokol SPI, di bawah ini adalah diagram rangkaian dan tabel koneksi untuk menghubungkan pin-pin OLED SPI dengan NodeMCU untuk menampilkan waktu Internet.
Tidak. |
Layar OLED |
NodeMCU |
1 |
GND |
GND |
2 |
VDD |
3.3V |
3 |
SCK |
D5 |
4 |
MOSI (SPI) atau SDA (I2C) |
D7 |
5 |
SETEL ULANG |
D3 |
6 |
DC |
D2 |
7 |
CS |
D8 |
Untuk mempelajari lebih lanjut tampilan OLED 7-pin Monokrom ini dan interfacingnya dengan ESP8266 NodeMCU, ikuti tautannya.
Penjelasan Kode
Pertama kita harus mendownload dan menginstal library NTP ke ESP8266. Ada banyak perpustakaan yang tersedia untuk Klien NTP. Anda dapat menginstal salah satunya dari Arduino IDE. Dalam tutorial ini saya telah menginstal perpustakaan NTPClient oleh Taranais karena mudah digunakan dan memiliki fungsi untuk mendapatkan tanggal dan waktu dari server NTP. ESP8266 NodeMCU dapat dengan mudah diprogram menggunakan Arduino IDE.
Untuk menginstal perpustakaan NTP, pertama-tama unduh perpustakaan menggunakan tautan di atas dan kemudian instal menggunakan Arduino IDE. Untuk menginstalnya pergi ke Sketch> Include Library> Add.ZIP Library , kemudian buka folder Zip dengan pergi ke lokasi tempat Anda mendownload folder zip dan restart Arduino IDE.
Perpustakaan NTPClient dilengkapi dengan contoh. Buka Arduino IDE dan Goto Example> NTPClient> Advanced . Kode yang diberikan dalam sketsa ini menampilkan waktu dari server NTP pada monitor serial. Kami akan menggunakan sketsa ini untuk menampilkan waktu dan tanggal saat ini pada layar OLED.
Kode lengkap tersedia di akhir tutorial ini, di sini saya telah menjelaskan beberapa bagian penting dari kode tersebut.
Perpustakaan ESP8266WiFi menyediakan rutinitas Wi-Fi khusus ESP8266 untuk terhubung ke jaringan. WiFiUDP.h menangani pengiriman dan penerimaan paket UDP. Karena kami menggunakan protokol SPI untuk menghubungkan OLED dengan NodeMCU, maka kami akan mengimpor pustaka "SPI.h". Dan "Adafruit_GFX.h" dan "Adafruit_SSD1306.h" digunakan untuk Layar OLED.
#include
Ukuran OLED kami adalah 128x64 jadi kami menyetel lebar dan tinggi layar masing-masing 128 dan 64. Jadi tentukan variabel untuk pin OLED yang terhubung ke NodeMCU untuk komunikasi SPI.
#define SCREEN_WIDTH 128 // OLED display width, dalam piksel #define SCREEN_HEIGHT 64 // OLED display height, dalam piksel // Deklarasi untuk tampilan SSD1306 yang terhubung menggunakan software SPI (case default): #define OLED_MOSI D7 #define OLED_CLK D5 #define OLED_DC D2 # Tentukan OLED_CS D8 # Tentukan OLED_RESET D3
Layar 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 sandi Anda di baris kode di bawah ini.
const char * ssid = "your_ssid"; const char * password = "your_password";
Atur koneksi WI-Fi dengan memberikan SSID dan kata sandi ke fungsi WiFi.begin . Koneksi ESP8266 membutuhkan beberapa waktu untuk terhubung ke NodeMCU jadi kami harus menunggu sampai terhubung.
WiFi.begin (ssid, kata sandi); while (WiFi.status ()! = WL_CONNECTED) { delay (500); Serial.print ("."); }
Untuk meminta tanggal dan waktu, inisialisasi klien waktu dengan alamat server NTP. Untuk akurasi yang lebih baik, pilih alamat server NTP yang dekat dengan wilayah geografis Anda. Di sini kami menggunakan " pool.ntp.org " yang menyediakan server dari seluruh dunia. Jika Anda ingin memilih server dari Asia, Anda dapat menggunakan " asia.pool.ntp.org ". timeClient juga menggunakan offset waktu UTC dalam milidetik dari zona waktu Anda. Misalnya, offset UTC untuk India adalah +5: 30 jadi kami mengonversi offset ini dalam milidetik yang sama dengan 5 * 60 * 60 + 30 * 60 = 19800.
Daerah |
Pengimbangan waktu UTC (jam dan menit) |
Pengimbangan waktu UTC (detik) |
INDIA |
+5: 30 |
19800 |
LONDON |
0:00 |
0 |
NEW YORK |
-5: 00 |
-18000 |
WiFiUDP ntpUDP; NTPClient timeClient (ntpUDP, "pool.ntp.org", 19800,60000);
SSD1306_SWITCHCAPVCC diberikan untuk menghasilkan 3.3V secara internal untuk menginisialisasi tampilan. Saat OLED mulai, OLED akan menampilkan “ WELCOME TO CIRCUIT DIGEST ” dengan ukuran teks 2 dan warna BIRU selama 3 detik.
if (! display.begin (SSD1306_SWITCHCAPVCC)) { Serial.println (F ("alokasi SSD1306 gagal")); untuk(;;); // Jangan lanjutkan, loop selamanya } display.clearDisplay (); display.setTextSize (2); // Gambarlah tampilan teks skala 2X.setTextColor (BLUE); display.setCursor (5, 2); display.println ("SELAMAT DATANG"); display.println ("CIRCUIT"); display.println ("DIGEST"); display.display (); penundaan (3000);
Klien NTP diinisialisasi menggunakan fungsi begin () untuk mengatur tanggal dan waktu dari server NTP.
timeClient.begin ();
Fungsi Update () digunakan untuk menerima tanggal dan waktu setiap kali kami meminta ke server NTP.
timeClient.update ();
Baud rate 115200 diatur untuk mencetak waktu pada monitor serial.
Serial.begin (115200); Serial.println (timeClient.getFormattedTime ());
getHours (), getMinutes (), getSeconds (), getDay adalah fungsi pustaka dan memberikan jam, menit, detik dan hari saat ini dari server NTP. Kode di bawah ini digunakan untuk membedakan waktu antara AM dan PM. Jika jam yang kita peroleh menggunakan getHours () lebih besar dari 12 maka kita atur waktu itu sebagai PM yang lain AM.
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 (":"); display.print (mm); display.print (":"); display.print (ss); display.println ("PM"); } lain { display.print (hh); display.print (":"); display.print (mm); display.print (":"); display.print (ss); display.println ("AM"); } int hari = timeClient.getDay (); display.println ("'" + arr_days + "'");
getFormattedDate () digunakan untuk mendapatkan tanggal dalam format “yyyy-mm-dd” dari server NTP. Fungsi ini memberikan tanggal dan waktu dalam format “tttt-bb-hh T jj: mm: dd . Tetapi kita hanya membutuhkan tanggal sehingga kita harus membagi string ini yang disimpan dalam format date_time menjadi “T” yang dilakukan dengan fungsi substring () dan kemudian menyimpan tanggal dalam variabel “date” .
date_time = timeClient.getFormattedDate (); int index_date = date_time.indexOf ("T"); String date = date_time.substring (0, index_date); Serial.println (tanggal); display.println (tanggal); display.display ();
Beginilah tampilan Jam Waktu Internet OLED: