Halo sahabat indobot.
Sudah tau NTP Server?
NTP Server merupakan singkatan dari Network Time Protocol. NTP server berfungsi untuk singkronisasi waktu dalam sebuah jaringan internet. aplikasi NTP sudah berjalan dalam internet tanpa berhenti sedikitpun. perangkat NTP ini terus berkembang sebagai layanan pengaturan waktu. prinsip kerja dari NTP menggunakan algoritma Marzullo dengan menggunakan referensi skala waktu UTC. pengaturan waktu dari NTP dapat mencapai 1 mili second. Hal ini berfungsi untuk mencapai akurasi yang lebih tinggi.
Nah pertanyaannya adalah, bagaimana cara kita mengakses NTP server ini untuk kebutuhan tanggal dan waktu?
NTP Server hanya dapat diakses dengan internet. sehingga kita tidak bisa menggunakan device mikrokontroler tanpa adanya wifi untuk terkoneksi dengan internet. Pengembangan mikrokontroler untuk hal ini seperti NodeMCU ESP8266, Wemos atau menggunakan device yang menggunakan device tambahan seperti ESP8266 sebagai wifi.
Pada percobaan kali ini, kita akan menggunakan NodeMCU ESP8266 yang akan dihubungkan dengan LCD 16×2. LCD ini berfungsi sebagai penampil dari tanggal dan waktu yang sudah terbaca.
Menampilkan Tanggal dan Waktu pada LCD dengan NTP Server
langsung saja kita coba praktikkan project kali ini.
Alat dan Bahan
Alat dan bahan untuk project ini adalah sebagai berikut.
- Software Arduino ID
- Koneksi Internet (Hotspot)
- NodeMCU ESP8266
- LCD 16×2
- LCM 1602 IIC (Driver LCD)
- Projectboard
- Kabel jumper
baca juga: Timer Penghitung Waktu Mundur Arduino Uno
Rangkaian
Susun device di atas menjadi rangkaian seperti berikut. Pastikan semua terhubung dengan baik.
Belajar Elektronika, Arduino, dan IoT step by step dengan bantuan tangga belajar? Daftar sekarang dan dapatkan PROMO
Program
Tahap selanjutnya adalah penulisan program pada Arduino IDE. Buatlah program seperti berikut.
//program NTP dengan LCD oleh indobot #include <TimeLib.h> #include <ESP8266WiFi.h> #include <WiFiUdp.h> #include <Wire.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27, 16, 2); const char ssid[] = "*************"; // hotspot anda const char pass[] = "********"; // password hotspot anda // NTP Servers: static const char ntpServerName[] = "us.pool.ntp.org"; //static const char ntpServerName[] = "time.nist.gov"; //static const char ntpServerName[] = "time-a.timefreq.bldrdoc.gov"; //static const char ntpServerName[] = "time-b.timefreq.bldrdoc.gov"; //static const char ntpServerName[] = "time-c.timefreq.bldrdoc.gov"; //time zone untuk wilayah Indonesia adalah 7. const int timeZone = 7; // Central European Time //const int timeZone = -5; // Eastern Standard Time (USA) //const int timeZone = -4; // Eastern Daylight Time (USA) //const int timeZone = -8; // Pacific Standard Time (USA) //const int timeZone = -7; // Pacific Daylight Time (USA) WiFiUDP Udp; unsigned int localPort = 8888; // port lokal untuk UDP packets time_t getNtpTime(); void digitalClockDisplay(); void printDigits(int digits); void sendNTPpacket(IPAddress &address); void setup() { Serial.begin(9600); lcd.begin(); lcd.backlight(); while (!Serial) ; delay(250); Serial.println("TimeNTP Example"); Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, pass); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.print("IP number assigned by DHCP is "); Serial.println(WiFi.localIP()); Serial.println("Starting UDP"); Udp.begin(localPort); Serial.print("Local port: "); Serial.println(Udp.localPort()); Serial.println("waiting for sync"); setSyncProvider(getNtpTime); setSyncInterval(300); } time_t prevDisplay = 0; // ketika jam digital mulai diaktifkan void loop() { if (timeStatus() != timeNotSet) { if (now() != prevDisplay) { //mengupdate display ketika jam berubah prevDisplay = now(); digitalClockDisplay(); } } } void digitalClockDisplay() { // jam digital yang ditampilkan diserial monitor dan LCD Serial.print(hour()); printDigits(minute()); printDigits(second()); Serial.print(" "); Serial.print(day()); Serial.print("."); Serial.print(month()); Serial.print("."); Serial.print(year()); Serial.println(); lcd.setCursor(0,0); lcd.print(hour()); printDigits(minute()); printDigits(second()); lcd.setCursor(0,1); lcd.print(day()); lcd.print("."); lcd.print(month()); lcd.print("."); lcd.print(year()); } void printDigits(int digits) { // utility for digital clock display: prints preceding colon and leading 0 //membuat jam digital menampilkan angka 0 ketika ada nilai 0-9 lcd.print(":"); if (digits < 10) lcd.print('0'); lcd.print(digits); } /*-------- NTP code ----------*/ const int NTP_PACKET_SIZE = 48; // Waktu NTP ada dalam 48 byte pertama pesan byte packetBuffer[NTP_PACKET_SIZE]; //buffer untuk menampung paket masuk & keluar time_t getNtpTime() { IPAddress ntpServerIP; // alamat server NTP while (Udp.parsePacket() > 0) ; // membuang semua data sebelumnya Serial.println("Transmit NTP Request"); // get a random server from the pool WiFi.hostByName(ntpServerName, ntpServerIP); Serial.print(ntpServerName); Serial.print(": "); Serial.println(ntpServerIP); sendNTPpacket(ntpServerIP); uint32_t beginWait = millis(); while (millis() - beginWait < 1500) { int size = Udp.parsePacket(); if (size >= NTP_PACKET_SIZE) { Serial.println("Receive NTP Response"); Udp.read(packetBuffer, NTP_PACKET_SIZE); // membaca paket ke dalam buffer unsigned long secsSince1900; // konversi empat byte mulai dari lokasi 40 menjadi bilangan long integer secsSince1900 = (unsigned long)packetBuffer[40] << 24; secsSince1900 |= (unsigned long)packetBuffer[41] << 16; secsSince1900 |= (unsigned long)packetBuffer[42] << 8; secsSince1900 |= (unsigned long)packetBuffer[43]; return secsSince1900 - 2208988800UL + timeZone * SECS_PER_HOUR; } } Serial.println("No NTP Response :-("); return 0; // return 0 if unable to get the time } // send an NTP request to the time server at the given address void sendNTPpacket(IPAddress &address) { // set all bytes in the buffer to 0 memset(packetBuffer, 0, NTP_PACKET_SIZE); // Initialize values needed to form NTP request // (see URL above for details on the packets) packetBuffer[0] = 0b11100011; // LI, Version, Mode packetBuffer[1] = 0; // Stratum, or type of clock packetBuffer[2] = 6; // Polling Interval packetBuffer[3] = 0xEC; // Peer Clock Precision // 8 bytes of zero for Root Delay & Root Dispersion packetBuffer[12] = 49; packetBuffer[13] = 0x4E; packetBuffer[14] = 49; packetBuffer[15] = 52; // all NTP fields have been given values, now // you can send a packet requesting a timestamp: Udp.beginPacket(address, 123); //NTP requests are to port 123 Udp.write(packetBuffer, NTP_PACKET_SIZE); Udp.endPacket(); } |
baca juga: Tutorial Arduino UNO R3 Membuat Jam Digital dengan Modul RTC DS 1302
Upload program di atas, kemudian lihat hasilnya pada LCD yang digunakan. jika sudah benar, maka LCD akan menampilkan waktu di baris pertama dan tanggal di baris berikutnya.
silakan mencoba.
Mau belajar elektronika dasar? Arduino? atau Internet of Things? Ikuti kursus online Indobot Academy!