Lewati ke konten utama
seratusribu.com
Semua artikel
ESP32 & IoT

Jam Digital ESP32 Sinkron NTP: Tidak Perlu Modul RTC Lagi

Oleh Anang H. Darmawan

4 menit baca
Laporkan
Jam Digital ESP32 Sinkron NTP: Tidak Perlu Modul RTC Lagi

Foto: Andrei Anufrienko / Unsplash

Proyek jam digital klasik biasanya dimulai dari Arduino Uno plus modul RTC. Masalahnya muncul beberapa minggu kemudian: jamnya maju dua menit, atau reset ke tahun 2000 karena baterai koin di modul RTC habis. Kalau papan yang kamu pakai adalah ESP32, ada jalan yang lebih praktis, yaitu mengambil waktu langsung dari internet lewat NTP.

Saya sering menyarankan pendekatan ini ke yang baru belajar IoT, karena hasilnya langsung terasa. Begitu ESP32 tersambung ke WiFi, jam di layar sudah benar sampai ke detiknya, tanpa perlu menyetel tombol satu per satu.

Cara kerja NTP di ESP32

NTP (Network Time Protocol) adalah protokol untuk menanyakan waktu ke server yang jamnya dijaga sangat akurat. ESP32 mengirim permintaan kecil ke server, misalnya pool.ntp.org atau id.pool.ntp.org untuk server yang dekat dengan Indonesia, lalu menerima jawaban berupa waktu UTC. Setelah itu ESP32 menyimpan waktu tersebut di jam internalnya dan menghitung detik sendiri.

Di Arduino core untuk ESP32, semua itu cukup dengan satu pemanggilan `configTime()` setelah WiFi tersambung, lalu `getLocalTime()` setiap kali kamu mau membaca jam. Library SNTP bawaan juga menyinkronkan ulang secara berkala di latar belakang, jadi kamu tidak perlu menulis logika sinkron sendiri. Detail parameter dan interval sinkronnya ada di dokumentasi resmi ESP-IDF dan arduino-esp32, cek di sana sesuai versi core yang terpasang.

Menyetel zona waktu WIB dengan benar

Server NTP selalu memberi waktu UTC. Kesalahan paling umum adalah lupa menambahkan offset, sehingga jam tampil tujuh jam lebih lambat. Untuk WIB (UTC+7), offset-nya 7 x 3600 = 25200 detik. WITA berarti 28800 detik dan WIT 32400 detik. Indonesia tidak memakai daylight saving time, jadi parameter kedua di `configTime()` diisi 0.

Ada cara lain yang lebih rapi, yaitu memakai string zona waktu POSIX lewat `configTzTime()`. Hati-hati dengan tandanya: format POSIX membalik arah, sehingga WIB ditulis "WIB-7", bukan "WIB+7". Banyak yang terjebak di sini dan malah mendapat jam yang mundur 14 jam dari seharusnya.

Coba cek hasilnya dengan mencetak waktu ke Serial Monitor sebelum menyambungkan layar. Kalau di Serial sudah benar, masalah di OLED nanti pasti urusan tampilan, bukan urusan waktu.

Apa yang terjadi saat WiFi putus

Pertanyaan ini hampir selalu muncul. Jawabannya: jam tetap jalan. Setelah sekali sinkron, ESP32 menghitung waktu dari timer internalnya, jadi kehilangan WiFi sebentar tidak membuat jam berhenti atau kembali ke nol. Yang terjadi hanya penyimpangan kecil yang terkumpul pelan-pelan sampai sinkron berikutnya berhasil.

Beda cerita kalau listriknya yang putus. Begitu ESP32 kehilangan daya dan menyala ulang, waktu internal hilang, dan jam baru benar lagi setelah WiFi tersambung dan NTP menjawab. Untuk jam meja di rumah dengan WiFi stabil, jeda beberapa detik saat boot ini biasanya tidak masalah. Tampilkan saja teks "menyinkronkan jam" di layar selama menunggu supaya pengguna tahu jamnya belum siap.

Satu kebiasaan baik: simpan status sinkron terakhir dan tampilkan ikon kecil di pojok layar kalau sudah terlalu lama tidak sinkron. Dengan begitu kamu tahu kapan angka di layar mulai tidak bisa dipercaya penuh.

Kapan modul RTC DS3231 tetap perlu

NTP bukan jawaban untuk semua kasus. Modul RTC seperti DS3231 punya baterai cadangan dan osilator dengan kompensasi suhu, sehingga tetap menghitung waktu walau perangkat mati total. Datasheet-nya menyebut akurasi sekitar ±2 ppm pada rentang suhu ruang, cukup untuk kebutuhan pencatatan yang serius.

KondisiNTP sajaTambah RTC DS3231
WiFi selalu ada, listrik stabilCukupTidak wajib
Sering mati listrik, WiFi lambat pulihJam salah sampai sinkronJam langsung benar saat boot
Lokasi tanpa internet sama sekaliTidak bisaWajib
Pencatatan log dengan jam akurat (absensi, data logger)Berisiko ada celah waktuLebih aman

Pola yang paling tahan banting adalah menggabungkan keduanya: RTC sebagai sumber waktu saat boot, NTP untuk mengoreksi RTC setiap kali internet tersedia. Tapi untuk jam meja dan alarm harian, NTP saja sudah lebih dari cukup.

Mulai dari proyek yang sudah jalan

Kalau kamu ingin langsung punya jam yang berfungsi, Jam digital NTP + alarm memakai ESP32 dan layar OLED dengan dukungan multi-alarm, lengkap dengan kode .ino, skema wiring, dan daftar komponen. Setelah paham pola NTP dan OLED, langkah berikutnya yang enak adalah menambah sensor, misalnya Weather station mini OLED yang membaca suhu dan tekanan udara dari BMP280 di layar yang sama.

Sebelum merakit, cocokkan dulu pin I2C untuk OLED di referensi pinout ESP32 supaya kamu tidak salah menancapkan kabel SDA dan SCL. Setelah itu, upload sketsa, buka Serial Monitor, dan pastikan jam WIB tampil benar sebelum menyentuh kode tampilan.