Menampilkan Tanggal dan Waktu pada LCD dengan NTP Server

Indobot Update

Menampilkan Tanggal dan Waktu dengan NTP Server
Cara Menampilkan Tanggal dan Waktu pada LCD dengan NTP Server

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.

  1. Software Arduino ID
  2. Koneksi Internet (Hotspot)
  3. NodeMCU ESP8266
  4. LCD 16×2
  5. LCM 1602 IIC (Driver LCD)
  6. Projectboard
  7. 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!

Ingin Tahu Program Kami Lebih Lanjut?

Silahkan isi Formulir Dibawah Ini untuk Diskusi dengan Tim Indobot Academy.

Baca Juga

Bagikan:

Tags

Tinggalkan komentar

whatsapp