- Back to Home »
- Setting Clock RTC Arduino dengan Serial Monitor
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:
- RTC
- Arduino Uno, Leonardo, Mega, dll
- Kabel jumper
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:
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. . . :)
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 |
kenapa ketika program diatas di compile terjadi error: 'class TwoWire' has no member named 'read'? gimana cara ngatasin errornya ini mas? terima kasih sebelumnya.
BalasHapusMaaf mas.. Lama balas karena ada ksbukan.. hehe
HapusMungkin library nya ada yang kurang mas... Bisa di screenshot hasilnya?
kalo udah slsai, misal code di arduinonya diganti apa gnti setingan rtc?
BalasHapustinggal masukan aja ke program penampil mas, misal mau di aplikasikan dengan lcd atau 7 segmen begitu,,
Hapuskarena tutor di atas hanya untuk setting jam pertama kali beli,,, thx
ko g nongol ya mas di lcd 1602nya?apa wiring nya ada yg salah?padahal dah ngikutin semua tutorial diatas,,,tq
BalasHapusklo 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.
Hapusiya benar apa yang dibilang mas ndaru,,
Hapusprogram di atas hanya untuk setting jam lewat serial monitor mas, bukan untuk penampil dengan lcd.. thx
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...
BalasHapusmaaf lama balas mas,, apakah program sudah berhasil di upload?
Hapusdan apakah baterai rtc 3v sudah dipasang?
waktu pas masukin angka kok bengong ga ada respon yah
BalasHapusapakah sudah mengikuti tutor seperti di screenshot mas?
HapusTerima kasih mas tutorialnya sangat membantu sekali....
BalasHapusgan kenapa pas di setingan awal dari arduino saya coba error di error: 'tmElements_t' has not been declared
BalasHapusdiserial monitor nya cuman berhenti di tulisan
BalasHapus"the current date and time is :" itu knp ya gan ?
thanks
Mas kalo nyetting jam misal lampu hidup jam 15.00 trus mati jam 17.00 cara coding di arduinonya gimana ya?
BalasHapusMas kalo nyetting jam misal lampu hidup jam 15.00 trus mati jam 17.00 cara coding di arduinonya gimana ya?
BalasHapuskok sy hasilnya ga kya gitu ya? hasil jam dan tgl nya ngaco semua mas
BalasHapuslanjutan dari ini mana bro?
BalasHapusgan punyaku rtcnya kok gak tanggal sekarang gan
BalasHapusboleh minta no. wa nya gan..
BalasHapus