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.
- Software Arduino ID
- NodeMCU ESP8266 1
- Buzzer 1
- Push Button 3
- Resistor 3
- Projectboard 2
- 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!