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.
- laptop/PC yang terinstall Arduino IDE
- NodeMCU ESP8266 1
- Buzzer 1
- Button 1
- Breadboard 1
- 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!