ESP32 Sebagai NTP Client

Kali ini akan membuat program pada ESP32 sebagai NTP Client menggunakan PlatformIO.

Langkah 1 : Setting platformio.ini

Karena outputnya akan ditampilkan pada serial monitor, jadi kita harus tambahkan parameter baud rate untuk serial monitor nya pada file platformio

monitor_speed = 115200

Langkah 2 : Menulis Program

/*
 Program ESP32 sebagai NTP Client
 Link yang bermanfaat :
 
 https://github.com/espressif/arduino-esp32
 https://docs.espressif.com/projects/arduino-esp32/en/latest/libraries.html

*/
#include <WiFi.h>
#include "time.h"

const char *ssid     = "disi_nama_wifi";
const char *password = "diisi_password_wifi";

const char* ntpServer = "pool.ntp.org";
const long  gmtOffset_sec = 3600*7;
const int   daylightOffset_sec = 0;

void printLocalTime(){
  struct tm timeinfo;
  if(!getLocalTime(&timeinfo)){
    Serial.println("Failed to obtain time");
    return;
  }
  Serial.println(&timeinfo, "%A, %B %d %Y %H:%M:%S");
  
  Serial.print("Hari: ");
  Serial.println(&timeinfo, "%A");
  
  Serial.print("Tanggal: ");
  Serial.println(&timeinfo, "%d");
  Serial.print("Bulan: ");
  Serial.println(&timeinfo, "%B");
  Serial.print("Tahun: ");
  Serial.println(&timeinfo, "%Y");
  
  Serial.print("Jam: ");
  Serial.println(&timeinfo, "%H");
  Serial.print("Jam (12 hour format): ");
  Serial.println(&timeinfo, "%I");
  Serial.print("Menit: ");
  Serial.println(&timeinfo, "%M");
  Serial.print("Detik: ");
  Serial.println(&timeinfo, "%S");
  Serial.println("=====================");
}

void setup(){
  Serial.begin(115200);

  // Connect ke Wi-Fi
  Serial.print("Connecting to ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected.");
  
  // Inisialiasi dan ambil waktu dari NTP Server
  configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
  printLocalTime();

  //disconnect WiFi karena sudah tidak dibutuhkan
  WiFi.disconnect(true);
  WiFi.mode(WIFI_OFF);
}

void loop(){
  delay(1000);
  printLocalTime();
}

Tampilan di Serial Monitor nya adalah sebagai berikut :

Tampilan Serial Monitor

Beberapa hal penting adalah sebagai berikut

  • Karena posisi Indonesia di GMT+7 maka untuk gmtOffset nya adalah 3600*7
  • Untuk ambil waktu dari NTP Server, kita bisa gunakan library ESP32 configTime(). Jika ingin lihat detailnya ada disini
  • Kemudian untuk mendapatkan waktu dari Board, kita bisa gunakan perintah getLocalTime()

Berikut Format Date specifier

specifierReplaced byExample
%aAbbreviated weekday name *Thu
%AFull weekday name *Thursday
%bAbbreviated month name *Aug
%BFull month name *August
%cDate and time representation *Thu Aug 23 14:55:02 2001
%CYear divided by 100 and truncated to integer (00-99)20
%dDay of the month, zero-padded (01-31)23
%DShort MM/DD/YY date, equivalent to %m/%d/%y08/23/01
%eDay of the month, space-padded ( 1-31)23
%FShort YYYY-MM-DD date, equivalent to %Y-%m-%d2001-08-23
%gWeek-based year, last two digits (00-99)01
%GWeek-based year2001
%hAbbreviated month name * (same as %b)Aug
%HHour in 24h format (00-23)14
%IHour in 12h format (01-12)02
%jDay of the year (001-366)235
%mMonth as a decimal number (01-12)08
%MMinute (00-59)55
%nNew-line character ('\n')
%pAM or PM designationPM
%r12-hour clock time *02:55:02 pm
%R24-hour HH:MM time, equivalent to %H:%M14:55
%SSecond (00-61)02
%tHorizontal-tab character ('\t')
%TISO 8601 time format (HH:MM:SS), equivalent to %H:%M:%S14:55:02
%uISO 8601 weekday as number with Monday as 1 (1-7)4
%UWeek number with the first Sunday as the first day of week one (00-53)33
%VISO 8601 week number (01-53)34
%wWeekday as a decimal number with Sunday as 0 (0-6)4
%WWeek number with the first Monday as the first day of week one (00-53)34
%xDate representation *08/23/01
%XTime representation *14:55:02
%yYear, last two digits (00-99)01
%YYear2001

Modifikasi Program:

Nama Hari dan Bulan menggunakan Bahasa Indonesia

/*
 Program ESP32 sebagai NTP Client
 Link yang bermanfaat :
 
 https://github.com/espressif/arduino-esp32
 https://docs.espressif.com/projects/arduino-esp32/en/latest/libraries.html

*/
#include <WiFi.h>
#include "time.h"

const char *ssid     = "disi_nama_wifi";
const char *password = "diisi_password_wifi";

const char* ntpServer = "pool.ntp.org";
const long  gmtOffset_sec = 3600*7;
const int   daylightOffset_sec = 0;

String Hari[7] = {"Minggu", "Senin ", "Selasa", "Rabu", "Kamis", "Jumat", "Sabtu"};
String Bulan[12] = {"Januari", "Februari ", "Maret", "April", "Mei", "Juni", "Juli", "Agustus", "September", "Oktober", "November", "Desember"};
char Tanggal[50] = "";
char Jam[20] = "";

void printLocalTime(){
  struct tm timeinfo;
  if(!getLocalTime(&timeinfo)){
    Serial.println("Failed to obtain time");
    return;
  }

    // Year dalam timestruct dihitung sejak 1900
  sprintf(Tanggal, "%s,%d %s %d ",Hari[timeinfo.tm_wday],timeinfo.tm_mday,Bulan[timeinfo.tm_mon],timeinfo.tm_year+1900);
  sprintf(Jam, "%02d:%02d:%02d ",timeinfo.tm_hour,timeinfo.tm_min,timeinfo.tm_sec);

  Serial.print("Tanggal Format Indonesia : ");
  Serial.println(Tanggal);
  Serial.print("Jam Format Indonesia : ");
  Serial.println(Jam);
  Serial.println("=====================");

}

void setup(){
  Serial.begin(115200);

  // Connect ke Wi-Fi
  Serial.print("Connecting to ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected.");
  
  // Inisialiasi dan ambil waktu dari NTP Server
  configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
  printLocalTime();

  //disconnect WiFi karena sudah tidak dibutuhkan
  WiFi.disconnect(true);
  WiFi.mode(WIFI_OFF);
}

void loop(){
  delay(5000);
  printLocalTime();
}

Jika ingin mencoba di wokwi.com , cukup dengan mengganti WiFi nya seperti berikut. [Baca Tutorial Menggunakan Wokwi.com]

WiFi.begin("Wokwi-GUEST", "", 6);

Leave a Comment

Your email address will not be published. Required fields are marked *