Ini merupakan kelanjutan dari pembahasan Jam TV part1 dan merupakan bagian yang paling penting untuk mendapatkan waktu yg akurat. Umumnya para desainer elektronika yg membutuhkan pewaktu akan menggunakan RTC baik yg jadul paralel DS12887 atau yg sangat murah RTC serial/i2c DS1807. Penulis sangat benci menggunakan RTC karena ketidak akuratannya yg akan melenceng seiring waktu. Bahkan tidak pernah menggunakan RTC dalam proyek apapun karena selalu menggunakan timer internal dari AVR seperti yg pernah saya bahas secara gamblang disini. Karena sekarang saya menggunakan timer secara khusus untuk timing raster tv maka akan mengganggu library tvout nya. Untuk itu saya menggunakan NTP atau network time protocol yang kekauratatnnya teruji untuk penggunaan komputer. Menurut wikipedia....
Network Time Protocol (NTP) adalah sebuah protokol yang digunakan untuk pengsinkronan waktu di dalam sebuah jaringan bisa pada jaringan LAN (Local Area Network) maupun pada jaringan internet dan untuk sinkronisasi jam-jam sistem komputer di atas paket-switching, variabel-latency jaringan data. Proses sinkronisasi ini dilakukan didalam jalur komunikasi data yang biasanya menggunakan protokol komunikasi TCP/IP. Sehingga proses ini sendiri dapat dilihat sebagai proses komunikasi data yang hanya melakukan pertukaran paket-paket data saja.
NTP menggunakan port komunikasi UDP nomor 123. Salah satu contoh NTP server yg bisa dicoba adalah ntp.bmkg.go.id dan banyak lagi NTP server lainnya. Data yg diberikan oleh server NTP berupa elapsed second sejak tahun 1900. Komputer pada umumnya menggunakan unix / epoch time yg dihitung mulai 1 januari 1970, jadi butuh perhitungan mengurangi data yg diterima sebanyak 2208988800 . Wow lumayan besar angkanya jadi kita akan terbiasa dengan format angka Unsigned Long. Untuk mempelajari prinsip epoch, unix time, dan NTP bisa baca di epochconverter.com .
- ESP8266 / ESP-01
Modul murah meriah ESP8266 merupakan penggerak utama dari perkembangan IOT di dunia sejak 10 tahun lalu. Bagaimana tidak hampir semua alat ber-wifi menggunakan platform yg sama dan membuat saya heran karena harganya super murah. Gak habis pikir deh berapa nilai keuntungan yg diambil oleh espressif ? Sebagai jebolan pabik komponen jadi ingat kalau pabrik di china bisa sampai menekan harga dan mengambil untung hanya 1 sen untuk tiap produknya, dengan catatan order ke mereka main kuantitas besar. Ahh jangan dibahas lah kalau lawan industri china, kita di Indonesia hanya bisa lihat dan impor saja, bermimpi kembali ke jaman 80-90an dimana ada pabrik komponen yg pabriknya lokal jawa timuran.
Gambar Yang saya tampilkan diatas merupakan interfacing / hubungan antara ESP yg berlevel tegangan 3.3 volt dengan Arduino dengan level 5 volt. Pembagi tegangan menggunakan resistor bisa ditambahkan untuk keamanan, tapi menurut saya sudah bertahun-tahun level uart TTL bisa langsung dipake ke uart 3.3 volt asal jangan sampai tegangan supplynya / vcc aja sampe salah.
Baudrate UART dari ESP pada umumnya di set 115200 dan menggunakan perintah AT command seperti halnya pada modul GSM SIM800. Anda bisa mencobanya dengan USB UART dan terminal yang memiliki fasiitas penambahan "CR" pada akhir command. Jadi jangan gunakan putty secara polos ya, gunakan monitor uart pada arduino atau Real Term daripada bingung karena Putty tanpa respond hanya keluar tulisan " Ready".
-Library ESPWiFi mode AT COMMAND
Kita lanjut pembahasan bagaimana interfacingnya modul ESP01 ini ke arduino dan penulis sangat terkejut bahwa library dari ESP yg dengan firmware AT "WiFiEsp" sudah memiliki fasilitas NTP-UDP siap pakai. Wahh tinggal copy paste ini sepertinya dan benar saja dari kumpulan script example bisa kita langsung dapatkan hasil yang memuaskan.
Untuk mengubah data waktu EPOCH dengan hasil yg lebih spesifik (hari tanggal bulan tahun) maka kita perlu menambahkan libary pengolah kalender "TimeLib.h". Ini karena pada library WiFiEsp tidak ada fasilitas pengolahan data EPOCH nya. Modifikasi saja pada script sesuai contoh berikut:
if (Udp.parsePacket()) {
Serial.println("packet received");
// We've received a packet, read the data from it into the buffer
Udp.read(packetBuffer, NTP_PACKET_SIZE);
// the timestamp starts at byte 40 of the received packet and is four bytes,
// or two words, long. First, esxtract the two words:
unsigned long highWord = word(packetBuffer[40], packetBuffer[41]);
unsigned long lowWord = word(packetBuffer[42], packetBuffer[43]);
// combine the four bytes (two words) into a long integer
// this is NTP time (seconds since Jan 1 1900):
unsigned long secsSince1900 = highWord << 16 | lowWord;
Serial.print("Seconds since Jan 1 1900 = ");
Serial.println(secsSince1900);
// now convert NTP time into everyday time:
Serial.print("Unix time = ");
// Unix time starts on Jan 1 1970. In seconds, that's 2208988800:
const unsigned long seventyYears = 2208988800UL;
// subtract seventy years:
unsigned long epoch = secsSince1900 - seventyYears + 25200; //offset +7
// print Unix time: Indonesia + 7 WIB
Serial.println(epoch);
// print the hour, minute and second , ini mode libraru standar
Serial.print("Waktu WIB (+7) = "); // WIB +7
Serial.print(( epoch % 86400L) / 3600); // print the hour
Serial.print(':');
if (((epoch % 3600) / 60) < 10) {
// In the first 10 minutes of each hour, we'll want a leading '0'
Serial.print('0');
}
Serial.print((epoch % 3600) / 60); // print the minute
Serial.print(':');
if ((epoch % 60) < 10) {
// In the first 10 seconds of each minute, we'll want a leading '0'
Serial.print('0');
}
Serial.println(epoch % 60); // print the second
// dibawah ini penggunaan TimeLib.h yang lebih singkat
char buffer[100] ;
sprintf(buffer, " Tanggal : %4d-%02d-%02d", year(epoch), month(epoch),day(epoch));
Serial.println(buffer);
}
- Mengubah ESP01 menjadi Berbasis Arduino
Kelanjutan pembahasan saya kali ini alur ceritanya maju kedepan saat kegagalan mencoba Wifi + NTP + TVOUT gara-gara critical timingnya. Jadi saya perlu mendapatkan parameter waktu tanpa mengganggu timer 16 bit nya atmega328 dan ini sangat mustahil. Awalnya saya berpikir menggunakan Software Serial untuk mengambil data vi AT command, akan tetapi layar TV langsung blank. Jadi Mau tidak mau harus menggunakan jalur komunikasi lainnya yg memungkinkan, dan benar saja GPIO dari ESP8266/01 ini ada 2 buah yg GPIO 0 dan 2, jadi cukup lah untuk menjadikannya port I2C ( SDA dan SCL). Namun saya perlu merangkai flashernya agar bisa diprogram melalui sketch arduino.
Cara flashingnya dengan urutan : Menekan 2 Tombol Flash + Reset , kemudian lepas tombol Reset dan tombol Flash tetap ditekan , ditandai dengan led esp warna biru kedip sekali. Nah selanjutnya anda bisa menekan Upload pada sketch seperti biasanya. Pembahasan I2C untuk mengirim data kalender akan dibahas pada tulisan berikutnya. Anda bisa mencoba menggunakan ESP01 untuk menerima data NTP dan menampilkan pada serial port / debug port seperti script dibawah.
#include <NTPClient.h>
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
const char *ssid = "Nama Wifi";
const char *password = "Passwordnya";
const long utcOffsetInSeconds = 25200; //offset +7 WIB
char daysOfTheWeek[7][12] = {"Minggu", "Senin", "Selasa", "Rabu", "Kamis", "Jumat", "Sabtu"};
// NTP lokal aja yg dipake, ubah kalau mau
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "ntp.bmkg.go.id", utcOffsetInSeconds);
void setup(){
Serial.begin(9600);
WiFi.begin(ssid, password);
while ( WiFi.status() != WL_CONNECTED ) {
delay ( 500 );
Serial.print ( "." );
}
timeClient.begin();
}
void loop() {
timeClient.update();
Serial.print(daysOfTheWeek[timeClient.getDay()]);
Serial.print(", ");
Serial.print(timeClient.getHours());
Serial.print(":");
Serial.print(timeClient.getMinutes());
Serial.print(":");
Serial.println(timeClient.getSeconds());
delay(1000);
}
Lalu bagaimana menggabungkan Jam TV menggunakan Arduino dengan ESP8266-01 sebagai pengirim NTP ? Bisa dibaca disini.
Selamat Mencoba
0 komentar:
Posting Komentar