Hallo semuanya.
Kalian sudah menggunakan NodeMCU ESP8266 sebagai project kalian?
Sudah? Belum? Sayang sekali kalau belum.
Soalnya pada project kali ini, kita akan menggunakan NodeMCU ESP8266 sebagai device controllernya. Buat kalian yang masih menggunakan arduino UNO dan sejenisnya, bisa juga mengikuti project ini. Tapi harus ditambahkan dengan device wifi seperti ESP8266.
Teman-teman pasti sudah tau ya perbedaan paling mendasar antara arduino dengan NodeMCU ESP8266. Perbedaannya terletak pada fitur tambahan yang disediakan. Pada NodeMCU ESP8266, kita mendapatkan fitur tambahan seperti bluetooth dan wifi. Fitur ini sangat berguna bagi teman-teman yang sedang dalam project IoT (Internet of Things). Fitur ini tidak ada pada arduino, sehingga jika kita menggunakan arduino dan ingin membuat program yang membutuhkan bluetooth dan wifi, teman-teman harus menambahkan device lainnya. Lalu apakah saya lebih suka NodeMCU ESP8266 dari pada arduino UNO? Tidak juga. Jika mau membandingkan, untuk program-program yang tidak membutuhkan fitur tersebut, saya lebih suka pakai UNO karena lama peng-upload-annya yang tidak selama NodeMCU ESP8266. Yang sudah pernah pakai keduanya pasti paham. Hehe.
baca juga: NodeMCU ESP8266 Temperature, Humidity data upload on Thingspeak with Arduino IDE
Oke. Kembali lagi ke project kita kali ini yaitu membuat jam digital tanpa RTC tapi internasional. Waooo internasional. Tapi ini ngga bohong. Beneran internasional. Hehe.
Jadi bagaimana caranya?
Caranya adalah dengan menggunakan NTP Server. NTP server ini dapat berjalan dengan melalui jaringan internet. Sehingga tampilan jam akan sama dengan jam lainnya berdasarkan jam internet dengan sinkronisasi. Seperti penjelasannya bahwa NTP membutuhkan interner, artinya pengoperasiaannya dibutuhkan jaringan internet yang bisa didapatkan oleh modul wifi yang digunakan.
NTP adalah singkatan dari Network Time Protocol. NTP inilah yang menjadi standar internet protokol yang digunakan pada komputer dan smartphone. Jika teman-teman perhatikan, penunjukkan jam dan tanggal yang muncul pada hp atau laptop kita, akan dapat menyesuaikan diri dengan lokasi teman-teman. Hal inilah yang dinamakan dengan NTP.
Nahhh pada project ini, kita akan menggunakan NTP sebagai dasar waktu untuk pembuatan jam digital. Selain itu, NTP juga dapat mengakses tanggal saat ini. Jadi dalam project ini, kita juga akan menampilkannya secara keseluruhan. Tanggal dan jam akan ditampilkan pada LCD 16×2.
Langsung saja kita praktikkan.
Membuat Jam Digital tanpa RTC Skala Internasional dengan NTP Server
Alat dan Bahan
Alat dan bahan untuk project ini adalah sebagai berikut.
- Software Arduino IDE
- Koneksi Internet (Hotspot)
- NodeMCU ESP8266
- LCD 16×2
- LCM 1602 IIC (Driver LCD)
- Projectboard
- Kabel jumper
Belajar Elektronika, Arduino, dan juga 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.
Program
Tahap selanjutnya adalah penulisan program pada Arduino IDE. Buatlah program seperti berikut.
//program waktu dengan NTP Server oleh indobot.co.id #include <TimeLib.h> #include <ESP8266WiFi.h> #include <WiFiUdp.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27,16,2); const char ssid[] = "hotspot portabel"; // nama hostpot yang anda gunakan const char pass[] = "hotspotpermanen"; // password hotspot yang anda gunakan // NTP Servers: static const char ntpServerName[] = "us.pool.ntp.org"; const int timeZone = 7; // time zone menggunakan GMT +7 (untuk WIB) //bagi kalian yang bukan WIB, silakan cari GMT d tempat masing-masing WiFiUDP Udp; unsigned int localPort = 8888; time_t getNtpTime(); void digitalClockDisplay(); void printDigits(int digits); void sendNTPpacket(IPAddress &address); void setup() { Serial.begin(9600); delay(250); Serial.println("NTP Indobot Project"); Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, pass); 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.init (); //Mulai LCD lcd.setBacklight(HIGH); } time_t prevDisplay = 0; void loop() { if (timeStatus() != timeNotSet) { if (now() != prevDisplay) { prevDisplay = now(); digitalClockDisplay(); } } } void digitalClockDisplay() { lcd.setCursor(0,0); //tampilan hari bulan tahun lcd.print(day()); lcd.print("."); lcd.print(month()); lcd.print("."); lcd.print(year()); lcd.setCursor(0,1); // tampilan jam, menit, detik lcd.print("pkl : "); lcd.print(hour()); printDigits(minute()); printDigits(second()); } void printDigits(int digits) { lcd.print(":"); if (digits < 10) lcd.print('0'); lcd.print(digits); } /*-------- NTP code ----------*/ const int NTP_PACKET_SIZE = 48; byte packetBuffer[NTP_PACKET_SIZE]; time_t getNtpTime() { IPAddress ntpServerIP; while (Udp.parsePacket() > 0) ; 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); unsigned long secsSince1900; 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; } void sendNTPpacket(IPAddress &address) { memset(packetBuffer, 0, NTP_PACKET_SIZE); packetBuffer[0] = 0b11100011; packetBuffer[1] = 0; packetBuffer[2] = 6; packetBuffer[3] = 0xEC; packetBuffer[12] = 49; packetBuffer[13] = 0x4E; packetBuffer[14] = 49; packetBuffer[15] = 52; Udp.beginPacket(address, 123); Udp.write(packetBuffer, NTP_PACKET_SIZE); Udp.endPacket(); } |
Program di atas, akan menghubungkan NodeMCU ESP8266 ke sambungan hotpot yang dituliskan. Jika sudah terhubung dengan baik, maka NodeMCU ESP8266 akan mendapatkan data NTP sesuai dengan timezone yang dipilih (Indonesia menggunakan 7). Data ini kemudian ditampilkan ke LCD 16×2 yang sudah terhubung. Maka muncullah tulisan tanggal dan jam yang sudah sesuai dengan jam di smartphone maupun di laptop anda.
Mau belajar elektronika dasar? Arduino? atau bahkan Internet of Things? Ikuti kursus online Indobot Academy!