Membuat Alarm Bangun Tidur menggunakan NTP

Indobot Update

Halo sahabat Indobot?

Sebelumnya kita sudah belajar membuat NTP Server untuk jam digital. Bagi yang belum mempelajari, silakan kunjungi di sini yaa.

Nah kali ini ada project apa lagi nih kakak?

Kali ini, kita akan belajar untuk membuat alarm dengan menggunakan NTP Server sebagai penentu waktunya. Pengaturan jam untuk alarm ini juga harus dilakukan secara manual. Tujuannya adalah agar kita tidak perlu terus-terusan mengirimkannya lewat aplikasi arduino IDE.

Seperti apa cara membuatnya? simak ya.

 

Belajar Elektronika, Arduino, dan IoT step by step dengan bantuan tangga belajar? Daftar sekarang dan dapatkan PROMO

 

Alat dan Bahan

Alat dan bahan untuk project ini adalah sebagai berikut.

  1. Software Arduino ID
  2. NodeMCU ESP8266 1
  3. Buzzer 1
  4. Push Button 3
  5. Resistor 3
  6. Projectboard 2
  7. Kabel jumper Secukupnya

baca juga: Menampilkan Tanggal dan Waktu pada LCD dengan NTP Server

Rangkaian

Susun device di atas menjadi rangkaian seperti berikut. Pastikan semua terhubung dengan baik.

Program

Tahap selanjutnya adalah penulisan program pada Arduino IDE. Buatlah program seperti berikut. Perhatikan keterangan (comment) untuk memahami program dengan baik.

 

 
//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[] = "hotspotbelajar";  //  hotspot anda
const char pass[] = "wemosmini";       // password hotspot anda

// NTP Servers:
static const char ntpServerName[] = "us.pool.ntp.org";

//time zone untuk wilayah Indonesia adalah 7.
const int timeZone = 7;     // Central European Time
#define buttonTambah D6
#define buttonPindah D7
#define buttonSetting D8
#define buzzer D5
int tambahMenit_p = 0;
int tambahMenit_s = 0;
int tambahjam_p = 0;
int tambahjam_s = 0;
int nilai = 0;
int bTambah = 0;
int bPindah = 0;
int bSetting = 0;
int nilaiPindah = 0;
int jam = 0;
int menit = 0;
bool atur = 0;

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.init();
  lcd.backlight();
  while (!Serial) ; 
  delay(250);
  Serial.println("TimeNTP Example");
  Serial.print("Connecting to ");
  
  Serial.println(ssid);
  WiFi.begin(ssid, pass);
  lcd.print("Tunggu Koneksi");
  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);
  lcd.clear();
  pinMode(buttonTambah, INPUT);
  pinMode(buttonPindah, INPUT);
  pinMode(buttonSetting, INPUT);
  pinMode(buzzer, OUTPUT);
  lcd.backlight();
}

time_t prevDisplay = 0; // ketika jam digital mulai diaktifkan

void loop()
{
  bTambah = digitalRead(buttonTambah);
  bPindah = digitalRead(buttonPindah);
  bSetting = digitalRead(buttonSetting);
  settingManual();
  if (hour() == jam && minute() == menit) {               
    digitalWrite(buzzer, HIGH);
  delay(5000);   
  }
}

void digitalClockDisplay()
{
  // jam digital yang ditampilkan di serial monitor
  Serial.print(hour());
  Serial.print(minute());
  Serial.print(second());
   // jam digital yang ditampilkan di LCD
  lcd.setCursor(0,0);
  lcd.print("Pukul:");
  lcd.setCursor(0,1);
  lcd.print(hour());
  lcd.print(":");
  printDigits(minute());
  lcd.print(":");
  printDigits(second());
}

void printDigits(int digits)
{
  if (digits < 10)
    lcd.print('0');
  lcd.print(digits);
}


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;
  Udp.beginPacket(address, 123);
  Udp.write(packetBuffer, NTP_PACKET_SIZE);
  Udp.endPacket();
}

void settingManual(){
  if (bSetting ==HIGH){
    atur = !atur;
    delay(500);
  }
  if (atur == 1) {
    pengaturanWaktu();
  }
  else if (atur == 0){
   hasilpengaturan();
  }
}
void hasilpengaturan(){
  jam = tambahjam_p*10 + tambahjam_s;
  menit = tambahMenit_p*10 + tambahMenit_s;
   if (timeStatus() != timeNotSet) {
    if (now() != prevDisplay) { 
      prevDisplay = now();
      digitalClockDisplay();
    }
  }
}


void pengaturanWaktu(){
  //lcd.setCursor(0,1)
  lcd.setCursor(0,0);
  lcd.print("Pengaturan Waktu");
  if(bPindah == HIGH){
    nilaiPindah++;
    if (nilaiPindah == 4) {
      nilaiPindah = 0;
    }
    nilai = 0;
  }
  
  if(nilaiPindah == 0){
    setNilai(0,2);
    tambahjam_p = nilai;
  }
  else if (nilaiPindah == 1){
    if(tambahjam_p > 1) setNilai(1,3);
    else setNilai(1,9);
    tambahjam_s = nilai;
  }
  else if (nilaiPindah == 2){
    setNilai(3,5);
    tambahMenit_p = nilai;
  }
  else if (nilaiPindah == 3){
    setNilai(4,9);
    tambahMenit_s = nilai;
  }
  jam = tambahjam_p*10 + tambahjam_s;
  menit = tambahMenit_p*10 + tambahMenit_s;
}


void setNilai(int kolom, int maks){
  if (bTambah == HIGH){
    nilai++;
    if (nilai > maks) {
      nilai = 0;
    }
    lcd.setCursor(kolom,1);
    lcd.print (nilai);
   // Serial.println (nilai);
    delay(500);
  }
  else {
    lcd.setCursor(kolom,1);
    lcd.print (" ");
    delay(100);
    lcd.setCursor(kolom,1);
    lcd.print (nilai);
    delay(500);
  }
}

Jika sudah dituliskan di Arduino IDE, silakan bisa langsung diupload ke nodeMCU dan lihat hasilnya.

baca juga: Membuat Jam Digital tanpa RTC Skala Internasional dengan NTP Server

Nah pada percobaan berikutnya, kita akan coba mengatur jamnya dengan HP tanpa harus dihubungkan ke nodeMCU. Bagaimana caranya? simak terus di blog kami ya.


Bikin project tanpa ribet beli komponen sana-sini? Starter Kit Arduino/IoT bisa jadi solusi mu!

Ingin Tahu Program Kami Lebih Lanjut?

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

Baca Juga

Bagikan:

Tinggalkan komentar

whatsapp whatsapp