Arduino RTC DS1307

From Indonesian Research And Development Center
Jump to: navigation, search

Pendahuluan

Pada tutorial kali ini, kita akan belajar cara membuat rangkaian real time clock menggunakan IC DS1307 dan menghubungkannya dengan arduino (pada tutorial ini digunakan arduino leonardo).


Implementasi

Pada bagian ini akan dibahas implementasi dasar untuk RTC DS1307 serta cara memanfaatkan RTC DS1307 sebagai One Time Password (OTP).


DS1307 Sebagai RTC

  • Untuk rangkaian real time clock, digunakan komponen berikut ini:
    • IC DS1307.
    • Baterai kancing CR2032 (3 volt) beserta soketnya.
    • 2 buah resistor dengan ukuran 10K (atau dibawahnya juga tidak apa-apa).
    • Crystal dengan ukuran 32.768kHz.
    • Breadboard dan kabel jumper.
  • Sedikit catatan mengenai rangkaian yang akan kita buat adalah IC DS1307 ini menggunakan protokol I2C untuk berkomunikasi dengan mikrokontroller dan menggunakan input 5v. Dan pull up resistor yang digunakan pada tutorial ini adalah 2.2K. Penggunaan resistor dengan nilai rendah, tujuannya untuk komunikasi I2C yang lebih cepat, namun kemungkinan akan mengurangi masa pakai baterai. Anda dapat mengganti nilai resistor ini dengan 4.7K atau 10K.
  • Berikut ini adalah pinout untuk IC DS1307:
         _____
    X1 -|  U  |- Vcc
    X2 -|     |- SQW
 VBatt -|     |- SCL
   GND -|_____|- SDA
  • Keterangan untuk tiap pin pada IC DS1307 di atas adalah sebagai berikut:
    • Pin X1 dan X2 adalah pin yang akan dihubungkan dengan crystal.
    • Pin VBatt dihubungkan dengan kutub positif pada baterai.
    • Pin GND dihubungkan dengan kutub negatif baterai dan pin GND pada arduino.
    • Pin SDA dihubungkan dengan pin SDA pada arduino.
    • Pin SCL dihubungkan dengan pin SCL pada arduino.
    • Pin Vcc dihubungkan dengan pin 5v pada arduino.
    • Pin Vcc dan SDA dihubungkan dengan pull up resistor (pada tutorial ini digunakan resistor dengan nilai 2.2K).
    • Pin Vcc dan SCL dihubungkan dengan pull up resistor (pada tutorial ini digunakan resistor dengan nilai 2.2K).
    • Sebagai langkah opsional, Anda dapat juga menambahkan pull up resistor yang menghubungkan antara pin Vcc dan pin SQW yang nilainya sama dengan pull up resistor pada ke-2 pin lainnya.
  • Setelah semua koneksi terhubung, selanjutnya kita akan melakukan cloning library rtc dari repository adafruit:
cd /usr/share/arduino/libraries
git clone https://github.com/adafruit/RTClib.git
  • Selanjutnya uji apakah rtc dengan menggunakan sketch berikut ini:
#include <Wire.h>
#include <RTClib.h>

RTC_DS1307 RTC;

void setup() {
    Serial.begin(9600);                             // gunakan koneksi serial dengan baudrate 9600
    while (!Serial) ;                               // baris ini khusus untuk leonardo
    Wire.begin();                                   // inisialisasi library I2C
    RTC.begin();                                    // inisialisasi library RTC

    if (!RTC.isrunning()) {                         // periksa apakah RTC berjalan
        RTC.adjust(DateTime(__DATE__, __TIME__));   // jika belum, sesuaikan dengan waktu kompilasi
    }
}

void loop() {
    DateTime now = RTC.now();                       // variabel untuk menampung waktu

    Serial.print(now.day(), DEC);                   // tampilkan tanggal
    Serial.print('/');                              // karakter '/' sebagai pemisah
    Serial.print(now.month(), DEC);                 // tampilkan bulan
    Serial.print('/');                              // karakter '/' sebagai pemisah
    Serial.print(now.year(), DEC);                  // tampilkan tahun
    Serial.print(' ');                              // karakter spasi sebagai pemisah
    Serial.print(now.hour(), DEC);                  // tampilkan jam
    Serial.print(':');                              // karakter ':' sebagai pemisah
    Serial.print(now.minute(), DEC);                // tampilkan menit
    Serial.print(':');                              // karakter ':' sebagai pemisah
    Serial.print(now.second(), DEC);                // tampilkan detik
    Serial.println();                               // baris baru

    delay(1000);                                    // tunggu selama 1 detik
}
  • Setelah melakukan proses kompilasi dan upload ke arduino, maka Anda dapat membuka koneksi serial menggunakan baudrate 9600 untuk melihat tampilan waktu dari rtc.


DS1307 Untuk OTP

One Time Password, atau biasa disingkat dengan OTP merupakan salah satu metode untuk menambah tingkat keamanan dengan mengimplementasikan password yang senantiasa berubah setiap kali Anda melakukan login. Adapun spesifikasi algoritma yang digunakan oleh OTP dapat dibaca pada RFC 4226 untuk HMAC-based One Time Password (HOTP) dan RFC 6238 untuk Time-based One Time Password (TOTP). OTP yang akan dibahas pada tutorial ini sifatnya sama dengan implementasi yang digunakan oleh google authenticator, sehingga Anda dapat menggunakannya untuk authentikasi pada layanan yang disediakan oleh google atau memanfaatkannya untuk sistem yang Anda buat. Untuk TOTP, password akan senantiasa berubah setiap jangka waktu 30 detik dan perlu diingat bahwa untuk menggunakan TOTP, realtime clock yang Anda gunakan harus akurat dan jika Anda menginginkan kompatibilitas dengan google authenticator, maka realtime clock harus Anda atur sesuai dengan waktu GMT. Berikut ini adalah langkah-langkahnya:

  • Lakukan instalasi library Cryptosuite dan TOTP arduino (sesuaikan dengan direktori dimana library arduino berada pada sistem yang Anda gunakan):
# cd /usr/share/arduino/libraries/
# git clone https://github.com/maniacbug/Cryptosuite
# git clone https://github.com/lucadentella/ArduinoLib_TOTP TOTP
  • Pindahkan library SHA1 dan hapus direktori Cryptosuite:
# mv Cryptosuite/Sha .
# rm -rf Cryptosuite/
  • Selanjutnya, Anda memerlukan kode authenticator yang dapat Anda buat pada link ini. Anda cukup mengisi bagian secret dengan 10 karakter sesuai keinginan Anda, lalu menekan tombol Go. Misalnya, Anda memasukkan kupukupuku sebagai secret maka berikut ini adalah hasil dari aplikasi tersebut:
Arduino HEX array: {0x6b, 0x75, 0x70, 0x75, 0x6b, 0x75, 0x70, 0x75, 0x6b, 0x75}
Google Authenticator code: NN2XA5LLOVYHK23V
  • Lanjutkan dengan membuat sketch untuk arduino. Sebagai catatan, tutorial ini menggunakan IC DS1307 sebagai sumber realtime clock. Berikut ini adalah sketchnya yang merupakan modifikasi dari contoh yang disertakan pada library TOTP:
#include <Wire.h>       // library untuk komunikasi I2C
#include "sha1.h"       // library crypto SHA1
#include "TOTP.h"       // library one-time password
#include "RTClib.h"     // library realtime clock DS1307

// HMAC key yang dihasilkan dari langkah sebelumnya
uint8_t hmacKey[] = {0x6b, 0x75, 0x70, 0x75, 0x6b, 0x75, 0x70, 0x75, 0x6b, 0x75};

RTC_DS1307 rtc;                                             // inisialisasi RTC
TOTP totp = TOTP(hmacKey, 10);                              // inisialisasi one-time password menggunakan HMAC key
char code[7] = {0};                                         // variabel untuk menampung kode autentikasi

void setup()
{
    Serial.begin(9600);                                     // inisialisasi komunikasi serial arduino
    while (!Serial) ;                                       // khusus untuk arduino leonardo

    Wire.begin();                                           // inisialisasi protokol komunikasi I2C
    rtc.begin();                                            // aktifkan RTC
    if (!RTC.isrunning()) {                                 // jika RTC tidak aktif
        rtc.adjust(DateTime(__DATE__, __TIME__));           // sesuaikan RTC dengan waktu kompilasi
    }
}

void loop()
{
    DateTime now = rtc.now();                               // ambil waktu saat ini
    char *new_code = totp.getCode(now.unixtime() - 25200);  // ubah menjadi waktu GMT (untuk wilayah Jakarta dikurangi 7 jam (7 * 60 * 60))
                                                            // lalu buat kode autentikasi berdasarkan waktu tersebut
    if (strncmp(code, new_code, 6) != 0) {                  // periksa apakah kode autentikasinya sama dengan kode yang lama
        strncpy(code, new_code, 6);                         // jika berbeda, maka simpan kode yang baru ke variabel 'code'
        Serial.print("Auth Code: ");                        // tampilkan pesan
        Serial.println(code);                               // berisi kode autentikasi yang baru
    }

    delay(1000);                                            // delay selama 1 detik
}

  • Pengujian dapat dilakukan secara sederhana dengan menggunakan script python yang telah dilengkapi dengan library pyotp. Jika instalasi python pada sistem operasi Anda belum memiliki library pyotp, maka terlebih dahulu lakukan instalasi library pyotp:
# pip install pyotp
  • Berikut ini adalah contoh implementasi TOTP menggunakan python yang disertakan pada library pyotp:
import pyotp
totp = pyotp.TOTP("NN2XA5LLOVYHK23V")
print "Auth Code: %s" % totp.now()
  • Output dari script di atas akan sama dengan output pada serial arduino.


Penutup

Dari sini, Anda dapat mengembangkan lebih lanjut misalnya dengan menambahkan layar LCD untuk menampilkan kode autentikasi atau mengendalikan perangkat lain jika input kode autentikasi cocok. Sekian tutorial kali ini, semoga bermanfaat. Terima kasih kepada Tuhan Yang Maha Esa, Maxindo, N3, RNDC dan Anda yang telah membaca tutorial ini.


Referensi