
Jam Digital Cerdas Berbasis NTP (Network Time Protocol) adalah sistem jam digital yang menggunakan modul ESP8266 untuk menyinkronkan waktu secara otomatis melalui jaringan Wi-Fi dengan server NTP (Network Time Protocol). Proyek ini menampilkan informasi waktu pada layar OLED serta memiliki fitur tambahan seperti pengaturan alarm menggunakan tombol push button dan peringatan suara melalui buzzer. Perangkat ini dikendalikan menggunakan Arduino IDE dengan beberapa library pendukung seperti NTPClient dan Adafruit_SSD1306, yang harus diinstal sebelum pemrograman.
Daftar Isi
Komponen
- Modul Trainer IOT
- Board NodeMCU ESP8266
- Oled Display
- Buzzer
- Push Button
- Kabel Jumper (Female – Female)
- Kabel USB
- Arduino IDE
Diagram Wiring

Keterangan :
LCD I2C 16×2 | Node MCU | BUZZER & BUTTON |
SCL | D1(GPIO5) | – |
SDA | D2(GPIO4) | – |
– | D4(GPIO2) | BUZZER |
– | D5(GPIO14) | BUTTON 1 ( jam ) |
– | D6(GPIO12) | BUTTON 2 (menit) |
Note : Pastikan semua koneksi dilakukan sesuai dengan tabel di atas. Hubungkan SCL pada Oled Display ke D1 (GPIO5) dan SDA ke D2 (GPIO4) pada NodeMCU. Untuk Buzzer, sambungkan ke D4 (GPIO), sedangkan Button 1 (pengaturan jam) dihubungkan ke D5 (GPIO) dan Button 2 (pengaturan menit) ke D6 (GPIO).
Implementasi
- Install Board ESP8266
- Buka File > Preferences di Arduino IDE.
- Tambahkan URL: http://arduino.esp8266.com/stable/package_esp8266com_index.json di Additional Boards Manager URLs.
- Pilih Tools > Board > Board Manager.
- Masukkan “esp8266” pada kolom pencarian, akan muncul pilihan board esp8266 by ESP8266 Community, untuk versi Board pilih 2.5.2, kemudian klik Install.
- Jika Instalasi benar, akan muncul board Esp8266.
- Pada menu pemilihan board Pilih board NodeMCU 1.0 (ESP-12E Module).
- Install Library
- Silahkan download terlebih dahulu Library yang diperlukan (Disini).
- Setelah di download, file .zip library tidak perlu di ekstrak ya. Tinggal ikuti langkah berikut :
- Pada Arduino IDE, klik Menu Sketch -> Include Library -> Add .ZIP Library…
- Cari file Library yang sudah di Download sebelumnya, lalu pilih dan klik Open.
Kode Program
#include <ESP8266WiFi.h>
#include <NTPClient.h>
#include <WiFiUdp.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
// Koneksi LCD -> SCL ke D1 dan SDA ke D2
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "pool.ntp.org");
char ssid[] = "xxxxxxxxxx"; // Nama WiFi
char password[] = "xxxxxxxxxx"; // Password WiFi
#define buzzer 2
#define tombolJam 14
#define tombolMenit 12
int timezone = 7 * 3600; // Zona waktu Indonesia (UTC+7)
int dst = 0;
int setJam = 0;
int setMenit = 0;
struct tm* p_tm;
void setup() {
Serial.begin(9600);
timeClient.begin();
timeClient.setTimeOffset(timezone); // Set timezone offset sesuai dengan zona waktu Indonesia (UTC+7)
// Memulai komunikasi dengan layar OLED
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for (;;);
}
display.clearDisplay();
display.display();
pinMode(tombolJam, INPUT_PULLUP);
pinMode(tombolMenit, INPUT_PULLUP);
pinMode(buzzer, OUTPUT);
digitalWrite(buzzer, LOW);
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0, 0);
display.println("Wifi connecting to ");
display.println(ssid);
WiFi.begin(ssid, password);
display.println("\nConnecting");
display.display();
while (WiFi.status() != WL_CONNECTED) {
delay(500);
display.print(".");
display.display();
}
// Setelah terhubung ke WiFi
display.clearDisplay();
display.display();
display.setCursor(0, 0);
display.println("Wifi Connected!");
display.print("IP:");
display.println(WiFi.localIP());
display.display();
display.println("\nTime response....OK");
display.display();
delay(1000);
display.clearDisplay();
display.display();
}
void loop() {
// Update waktu dan tampilkan di layar
clock_display();
// Update alarm jika tombol ditekan
set_alarm();
// Jika waktunya cocok dengan alarm, aktifkan buzzer
alarm();
}
void clock_display() {
timeClient.update();
String time = timeClient.getFormattedTime();
time_t epochTime = timeClient.getEpochTime();
struct tm *ptm = gmtime((time_t *)&epochTime);
// Debugging, untuk memastikan waktu yang diterima benar
Serial.print(ptm->tm_mday);
Serial.print("/");
Serial.print(ptm->tm_mon + 1);
Serial.print("/");
Serial.print(ptm->tm_year + 1900);
Serial.print(" ");
Serial.print(ptm->tm_hour);
Serial.print(":");
Serial.print(ptm->tm_min);
Serial.print(":");
Serial.println(ptm->tm_sec);
// Menampilkan waktu di OLED
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(10, 10);
display.print(time);
display.setTextSize(1);
display.setCursor(30, 0);
display.print(ptm->tm_mday);
display.print("/");
display.print(ptm->tm_mon + 1);
display.print("/");
display.print(ptm->tm_year + 1900);
display.setTextSize(1);
display.setCursor(30, 30);
display.print("SET ALARM");
display.setTextSize(2);
display.setCursor(35, 40);
display.print(String(setJam) + ":" + String(setMenit));
display.display();
delay(1000); // Update setiap 1 detik
}
void set_alarm() {
// Mengecek apakah tombol jam ditekan
if (!digitalRead(tombolJam)) {
Serial.println("Tambah jam");
setJam++;
if (setJam > 24) {
setJam = 0;
}
}
// Mengecek apakah tombol menit ditekan
if (!digitalRead(tombolMenit)) {
Serial.println("Tambah menit");
setMenit++;
if (setMenit > 59) {
setMenit = 0;
}
}
}
void alarm() {
int jamSekarang = timeClient.getHours();
int menitSekarang = timeClient.getMinutes();
if (jamSekarang == setJam && menitSekarang == setMenit) {
buzzer_beep();
}
}
void buzzer_beep() {
digitalWrite(buzzer, HIGH);
delay(100);
digitalWrite(buzzer, LOW);
delay(100);
digitalWrite(buzzer, HIGH);
delay(100);
digitalWrite(buzzer, LOW);
delay(100);
digitalWrite(buzzer, HIGH);
delay(100);
digitalWrite(buzzer, LOW);
delay(100);
digitalWrite(buzzer, HIGH);
delay(100);
digitalWrite(buzzer, LOW);
delay(100);
digitalWrite(buzzer, HIGH);
delay(100);
digitalWrite(buzzer, LOW);
delay(1000);
}
Langkah-langkah di Arduino IDE
- Memverifikasi Kode
- Klik tombol Verify untuk memeriksa kesalahan pada kode.
- Upload Program
- Hubungkan ESP8266 ke komputer.
- Pilih board ESP8266, pastikan board yang dipilih NodeMCU 1.0 ESP-12E, uploud speed adalah 921600, dan Port telah sesuai.
- Klik tombol Upload untuk mengunggah program.
Hasil Akhir


Video Tutorial
FAQ
Apa itu NTP (Network Time Protocol)?
NTP adalah protokol yang digunakan untuk menyinkronkan waktu di perangkat menggunakan server waktu internet. Ini memastikan jam pada ESP8266 selalu akurat
Mengapa menggunakan ESP8266 untuk proyek ini?
ESP8266 adalah mikrokontroler yang dilengkapi dengan modul WiFi, sehingga bisa terhubung ke internet dan mendapatkan waktu dari server NTP secara langsung tanpa memerlukan sumber waktu lokal.
Apa fungsi dari OLED Display dalam jam digital ini?
Fungsi OLED Display dalam jam digital ini adalah untuk menampilkan informasi waktu secara real-time, termasuk jam, menit, detik, tanggal, bulan, dan tahun yang diperoleh dari NTP (Network Time Protocol). Selain itu, OLED juga digunakan untuk menampilkan pengaturan alarm, seperti jam dan menit yang telah disesuaikan oleh pengguna.
Apakah saya perlu mengatur ulang waktu secara manual?
Tidak, karena proyek ini menggunakan NTP untuk secara otomatis mendapatkan waktu dari server waktu internet, sehingga waktu selalu sinkron dan akurat.
Bagaimana cara kerja buzzer dalam sistem alarm proyek ini?
Buzzer dalam sistem alarm ini bekerja dengan cara menerima perintah dari ESP8266. Ketika alarm disetel, waktu yang telah diatur akan disimpan dalam ESP8266. Saat waktu mencapai alarm yang telah ditentukan, ESP8266 akan mengaktifkan buzzer, sehingga buzzer berbunyi sebagai tanda pengingat.
Kesimpulan
Dari pembelajaran mengenai Jam Digital Cerdas Berbasis NTP, dapat disimpulkan bahwa sistem ini memanfaatkan ESP8266 yang berguna sebagai mikrokontroler utama untuk mengambil data waktu secara real-time dari server NTP (Network Time Protocol) melalui koneksi Wi-Fi. Serta dengan adanya OLED Display, dapat memudahkan kita untuk melihat jam, menit, detik, tanggal, bulan, dan tahun, serta melakukan pengaturan alarm sesuai kebutuhan. Selain itu, sistem ini juga dilengkapi dengan buzzer yang akan berbunyi saat waktu alarm tercapai. Implementasi alat tersebut menunjukkan bagaimana pemrograman mikrokontroler dapat digunakan untuk membuat perangkat pintar yang efisien dan akurat dalam menampilkan waktu.