Tutorial Membuat Setting Waktu Alarm Waktu NTP

Indobot Update

Halo Fanbot!

Pada project kita kali ini, kita akan membuat Alarm bangun tidur dengan patokan waktu NTP.

NTP Server merupakan singkatan dari Network Time Protocol. NTP server digunakan untuk singkronisasi waktu dalam sebuah jaringan internet. aplikasi NTP sudah berjalan dalam internet tanpa berhenti sedikitpun. perangkat NTP ini terus dikembangkan 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 digunakan untuk mencapai akurasi yang lebih tinggi.

Selain itu, kita juga dapat melakukan pengaturan ulang dengan menggunakan sistem Telegram Bot. Penasaran bagaimana cara membuatnya? Yuk kita simak.

 

 Alat dan Bahan

Alat dan bahan yang digunakan untuk project kita kali ini adalah sebagai berikut. Jangan sampai ada yang kelewat ya.

  1. laptop/PC yang terinstall Arduino IDE
  2. NodeMCU ESP8266   1
  3. Buzzer 1
  4. Button 1
  5. Breadboard 1
  6. Kabel jumper secukupnya

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

Rangkaian

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

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

Program

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

Jangan lupa untuk memasukkan terlebih dahulu library Time, CTBot dan Arduino Json.

 

 

/*
  Program NTP dengan Setting alarm menggunakan Telegram
 */

#include <TimeLib.h>
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
#include "CTBot.h" //Pendeklarasian Library
CTBot myBot;
#define alarm D1
#define button D2



int jamAlarm;
int menitAlarm;

TBMessage msg;
const char ssid[] = "**********";  //  your network SSID (name)
const char pass[] = "*********";       // your network password
String token = "XXXX";    //token bot baru kalian
const int id = 11111111111;      //id telegram kalian


// NTP Servers:
static const char ntpServerName[] = "us.pool.ntp.org";
const int timeZone = 7;     // Central European Time
WiFiUDP Udp;
unsigned int localPort = 8888;  // local port to listen for UDP packets

time_t getNtpTime();
void digitalClockDisplay();
void printDigits(int digits);
void sendNTPpacket(IPAddress &address);

void setup()
{
  Serial.begin(9600);
  pinMode(alarm, OUTPUT);
  pinMode(button,INPUT_PULLUP);
  while (!Serial) ; // Needed for Leonardo only
  delay(250);
  Serial.println("TimeNTP Example");
  Serial.print("Connecting to ");
  Serial.println(ssid);
  WiFi.begin(ssid, pass);
  myBot.setTelegramToken(token);
  
  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);
 
  myBot.sendMessage(msg.sender.id, (String)"Setting Waktu Alarm \n" +
        "kirimkan pesan >>> alarm=(jam):(menit \n"+
        "Contoh >> alarm=03:30 \n"
        );
}

time_t prevDisplay = 0; // when the digital clock was displayed

void loop()
{
  if (timeStatus() != timeNotSet) {
    if (now() != prevDisplay) { //update the display only if time has changed
      prevDisplay = now();
      digitalClockDisplay();
    }
  }
  if (hour() == jamAlarm && minute() == menitAlarm)  digitalWrite(alarm, HIGH);
  if (digitalRead(button) == HIGH) digitalWrite(alarm, LOW);
  telegram();
}

void telegram() {
  if (myBot.getNewMessage(msg)) {
    String a = msg.text;
    int b = a.indexOf("alarm=");
    int c = a.indexOf(":");
    if ( b > -1) {
    jamAlarm = a.substring(b+1,c).toInt();
    menitAlarm = a.substring(c).toInt();
    myBot.sendMessage(msg.sender.id, (String)"Alarm Pukul ="+jamAlarm+":"+menitAlarm);
    }

    else {                                         
        myBot.sendMessage(msg.sender.id, (String)"Memutar Musik dengan Mengirim Berikut \n" +
        "kirimkan pesan >>> putar(nomor yang ingin di play) \n"+
        "Maksimal 10 \n\n"+
        "Matikan Musik >>> stop"
        );
    }
}
}

void digitalClockDisplay()
{
  // digital clock display of the time
  Serial.print(hour());
  printDigits(minute());
  printDigits(second());
  Serial.print(" ");
  Serial.print(day());
  Serial.print(".");
  Serial.print(month());
  Serial.print(".");
  Serial.print(year());
  Serial.println();
}

void printDigits(int digits)
{
  // utility for digital clock display: prints preceding colon and leading 0
  Serial.print(":");
  if (digits < 10)
    Serial.print('0');
  Serial.print(digits);
}

/*-------- NTP code ----------*/

const int NTP_PACKET_SIZE = 48; // NTP time is in the first 48 bytes of message
byte packetBuffer[NTP_PACKET_SIZE]; //buffer to hold incoming & outgoing packets

time_t getNtpTime()
{
  IPAddress ntpServerIP; // NTP server's ip address

  while (Udp.parsePacket() > 0) ; // discard any previously received packets
  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);  // read packet into the buffer
      unsigned long secsSince1900;
      // convert four bytes starting at location 40 to a 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();
}

Pastikan ssid, pass, token, dan id sudah dimasukkan dengan benar. 

Upload program di atas ke NodeMCU yang anda gunakan.

 

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

 

Hasil dari project ini adalah kita dapat membuat alarm bangun tidur dengan menggunakan jam NTP. Selain itu, kita juga dapat mengatur ulang jam tersebut dengan mengirimkan setting jam dan menit yang kita inginkan melalui telegram bot ke NodeMCU ESP8266.

Baca juga :Pentingnya Pendidikan Keterampilan untuk Sukses di Dunia Kerja

Bagaimana? Tertarik untuk membuatnya? Yuk kita coba dan modifikasi ya.

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:

Tinggalkan komentar

whatsapp whatsapp