Posted by : Unknown Kamis, 21 November 2013

Kali ini kita akan belajar bagaimana mensetting RTC (real time clock) kita secara otomatis menggunakan serial monitor.
Sebelum itu kita mengenal dulu apa itu RTC (real time clock). RTC adalah sebuah jam elektronik berupa chip yang dapat menghitung waktu maupun tanggal dan tahun dengan akurat. Chip RTC juga dapat kita jumpai pada komputer jenis desktop maupun jinjing (laptop) maka dari itu komputer kita dapat tepat dalam penghitungan waktu karena mempunyai osilator crystal walau komputer kita dalam keadaan mati (off) sekalipun.
Salah satu chip yang terkenal dan mulai dikenal dengan shield RTC arduino merupakan jenis chip DS1307 dengan memakai osilator crystal 32,768 KHz.
Dibawah ini merupakan kaki IC DS1307:
Click Image To Large
Dan ini adalah gambar skema rangkaian sederhana IC DS1307:
Click Image To Large
Sekarang kita mulai belajar bagaimana cara untuk mensetting RTC tersebut agar sesuai dengan jam saat ini. Sebelum itu kita siapkan bahan sebagai berikut:
  1. RTC
  2. Arduino Uno, Leonardo, Mega, dll
  3. Kabel jumper
Kemudian kita hubungkan SCL dan SDA seperti gambar berikut ini:
Click Image To Large
Setelah itu kita download library DS1307 kita disini. Jika sudah terinstall pada software arduino sekarang kita jalankan software arduino tersebut lalu kita buat sketch seperti dibawah ini:

#include <Wire.h>
const int DS1307 = 0x68; // Alamat pin RTC pada arduino
const char* days[] =
{"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
const char* months[] =
{"January", "February", "March", "April", "May", "June", "July", "August","September", "October", "November", "December"};

// Inisialisasi semua nilai:
byte second = 0;
byte minute = 0;
byte hour = 0;
byte weekday = 0;
byte monthday = 0;
byte month = 0;
byte year = 0;

void setup() {
  Wire.begin();
  Serial.begin(9600);
  delay(2000); // Timer untuk MCU membaca tanggal dan waktu

  Serial.print("The current date and time is: ");
  printTime();
  Serial.println("Please change to newline ending the settings on the lower right of the Serial Monitor");
  Serial.println("Would you like to set the date and time now? Y/N");

  while (!Serial.available()) delay(10);
  if (Serial.read() == 'y' || Serial.read() == 'Y')

  // This set of functions allows the user to change the date and time
  {
    Serial.read();
    setTime();
    Serial.print("The current date and time is now: ");
    printTime();
  }


  Serial.println("Thank you.");
}

// Continuous function for converting bytes to decimals and vice versa
void loop() {
}
byte decToBcd(byte val) {
  return ((val/10*16) + (val%10));
}
byte bcdToDec(byte val) {
  return ((val/16*10) + (val%16));
}


// Setting kode untuk input data waktu dan tanggal
void setTime() {
  Serial.print("Please enter the current year, 00-99. - ");
  year = readByte();
  Serial.println(year);
  Serial.print("Please enter the current month, 1-12. - ");
  month = readByte();
  Serial.println(months[month-1]);
  Serial.print("Please enter the current day of the month, 1-31. - ");
  monthday = readByte();
  Serial.println(monthday);
  Serial.println("Please enter the current day of the week, 1-7.");
  Serial.print("1 Sun | 2 Mon | 3 Tues | 4 Weds | 5 Thu | 6 Fri | 7 Sat - ");
  weekday = readByte();
  Serial.println(days[weekday-1]);
  Serial.print("Please enter the current hour in 24hr format, 0-23. - ");
  hour = readByte();
  Serial.println(hour);
  Serial.print("Please enter the current minute, 0-59. - ");
  minute = readByte();
  Serial.println(minute);
  second = 0;
  Serial.println("The data has been entered.");
 

// Kode untuk mentransmisikan atau mengirimkan data ke RTC
  Wire.beginTransmission(DS1307);
  Wire.write(byte(0));
  Wire.write(decToBcd(second));
  Wire.write(decToBcd(minute));
  Wire.write(decToBcd(hour));
  Wire.write(decToBcd(weekday));
  Wire.write(decToBcd(monthday));
  Wire.write(decToBcd(month));
  Wire.write(decToBcd(year));
  Wire.write(byte(0));
  Wire.endTransmission();
  // Ends transmission of data
}


byte readByte() {
  while (!Serial.available()) delay(10);
  byte reading = 0;
  byte incomingByte = Serial.read();
  while (incomingByte != '\n') {
    if (incomingByte >= '0' && incomingByte <= '9')
      reading = reading * 10 + (incomingByte - '0');
    else;
    incomingByte = Serial.read();
  }
  Serial.flush();
  return reading;
}


void printTime() {
  char buffer[3];
  const char* AMPM = 0;
  readTime();
  Serial.print(days[weekday-1]);
  Serial.print(" ");
  Serial.print(months[month-1]);
  Serial.print(" ");
  Serial.print(monthday);
  Serial.print(", 20");
  Serial.print(year);
  Serial.print(" ");
  if (hour > 12) {
    hour -= 12;
    AMPM = " PM";
  }
  else AMPM = " AM";
  Serial.print(hour);
  Serial.print(":");
  sprintf(buffer, "%02d", minute);
  Serial.print(buffer);
  Serial.println(AMPM);
}


void readTime() {
  Wire.beginTransmission(DS1307);
  Wire.write(byte(0));
  Wire.endTransmission();
  Wire.requestFrom(DS1307, 7);
  second = bcdToDec(Wire.read());
  minute = bcdToDec(Wire.read());
  hour = bcdToDec(Wire.read());
  weekday = bcdToDec(Wire.read());
  monthday = bcdToDec(Wire.read());
  month = bcdToDec(Wire.read());
  year = bcdToDec(Wire.read());
}


Setelah semua kode diatas telah ditulis dengan benar lalu kita upload sketch tersebut ke arduino kita. Lalu kita buka serial monitor (Ctrl + Shift + M). Setelah itu ubah Tab dibawah yang bertuliskan No Line Ending dengan Newline. Lalu kita masukkan input sesuai dalam petunjuk dalam serial monitor tersebut. Berikut screenshot saat menset RTC tersebut:
Click Image To Large
Click Image To Large
Click Image To Large
Click Image To Large
Click Image To Large
Click Image To Large
Click Image To Large
Click Image To Large
Jika telah terdapat teks bertuliskan thank you seperti diatas dan telah tertera waktu dan tanggal seperti yang kita kehendaki maka setting RTC kita telah berhasil. Sekian dari saya, dan terima kasih telah berkunjung diblog sederhana saya. . . :)

{ 20 komentar... read them below or Comment }

  1. kenapa ketika program diatas di compile terjadi error: 'class TwoWire' has no member named 'read'? gimana cara ngatasin errornya ini mas? terima kasih sebelumnya.

    BalasHapus
    Balasan
    1. Maaf mas.. Lama balas karena ada ksbukan.. hehe
      Mungkin library nya ada yang kurang mas... Bisa di screenshot hasilnya?

      Hapus
  2. kalo udah slsai, misal code di arduinonya diganti apa gnti setingan rtc?

    BalasHapus
    Balasan
    1. tinggal masukan aja ke program penampil mas, misal mau di aplikasikan dengan lcd atau 7 segmen begitu,,
      karena tutor di atas hanya untuk setting jam pertama kali beli,,, thx

      Hapus
  3. ko g nongol ya mas di lcd 1602nya?apa wiring nya ada yg salah?padahal dah ngikutin semua tutorial diatas,,,tq

    BalasHapus
    Balasan
    1. klo g salah itu krn tidak ada perintah utk menampilkan pada lcd 1602 (#include ), code diatas utk ditampilkan pada serial monitor coba tekan Ctrl+Shift+M setelah upload code.

      Hapus
    2. iya benar apa yang dibilang mas ndaru,,
      program di atas hanya untuk setting jam lewat serial monitor mas, bukan untuk penampil dengan lcd.. thx

      Hapus
  4. knapa ya mas kalau saya matikan sampai 4 jam terus saya hidupkan lagi jam nya tidak menyimpan di RTC nya mas balik lagi kesetingan awal tidak sesuai dengan jam yang saat ini. mohon infonya mas...

    BalasHapus
    Balasan
    1. maaf lama balas mas,, apakah program sudah berhasil di upload?
      dan apakah baterai rtc 3v sudah dipasang?

      Hapus
  5. waktu pas masukin angka kok bengong ga ada respon yah

    BalasHapus
    Balasan
    1. apakah sudah mengikuti tutor seperti di screenshot mas?

      Hapus
  6. Terima kasih mas tutorialnya sangat membantu sekali....

    BalasHapus
  7. gan kenapa pas di setingan awal dari arduino saya coba error di error: 'tmElements_t' has not been declared

    BalasHapus
  8. diserial monitor nya cuman berhenti di tulisan
    "the current date and time is :" itu knp ya gan ?
    thanks

    BalasHapus
  9. Mas kalo nyetting jam misal lampu hidup jam 15.00 trus mati jam 17.00 cara coding di arduinonya gimana ya?

    BalasHapus
  10. Mas kalo nyetting jam misal lampu hidup jam 15.00 trus mati jam 17.00 cara coding di arduinonya gimana ya?

    BalasHapus
  11. kok sy hasilnya ga kya gitu ya? hasil jam dan tgl nya ngaco semua mas

    BalasHapus
  12. lanjutan dari ini mana bro?

    BalasHapus
  13. gan punyaku rtcnya kok gak tanggal sekarang gan

    BalasHapus

Popular Post

Blogger templates

Diberdayakan oleh Blogger.

- Copyright © Technology - Powered by Blogger -