Halaman ini adalah lanjutan dari halaman Praktek membuat Jam dinding dengan Arduino
Latihan pada sesi sebelumnya sudah dapat kita gunakan sebagai jam. buatlah wadah yang bagus dan dapat diletakan di dinding atau meja kerja. Tetapi yang disayangkan adalah jamnya tidak bisa di rubah datanya, jika saja jamnya mengalami kekacauan alias ngaco maka kita tidak bisa merubah nilainya agar sesuai. maka otomatis jamnya sudah tidak berguna lagi. nah marilah kita modifikasi programnya agar jamnya bisa di atur agar nilainya sesuai.
Di bawah ini disertakan contoh program untuk merubah data waktu di modul RTC . Coba kita perhatikan dengan teliti
-------------------------------------------------------------------------------------
#include "Wire.h"
#define DS1307_ADDRESS 0x68
byte zero = 0x00; //workaround for issue #527
void setup(){
Wire.begin();
Serial.begin(9600);
setDateTime(); //MUST CONFIGURE IN FUNCTION
}
void loop(){
printDate();
delay(1000);
}
void setDateTime(){
byte second = 45; //0-59 Di isi dengan detik
byte minute = 31; //0-59 Di isi dengan Menit
byte hour = 9; //0-23 Di isi dengan Jam
byte weekDay = 5; //1-7 Di isi dengan hari ke
byte monthDay = 9; //1-31 Diisi dengan Tanggal
byte month = 11; //1-12 Di isi dengan Bulan
byte year = 13; //0-99 Di isi dengan Tahun
Wire.beginTransmission(DS1307_ADDRESS);
Wire.write(zero); //stop Oscillator
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(zero); //start
Wire.endTransmission();
}
byte decToBcd(byte val){
// Convert normal decimal numbers to binary coded decimal
return ( (val/10*16) + (val%10) );
}
byte bcdToDec(byte val) {
// Convert binary coded decimal to normal decimal numbers
return ( (val/16*10) + (val%16) );
}
void printDate(){
// Reset the register pointer
Wire.beginTransmission(DS1307_ADDRESS);
Wire.write(zero);
Wire.endTransmission();
Wire.requestFrom(DS1307_ADDRESS, 7);
int second = bcdToDec(Wire.read());
int minute = bcdToDec(Wire.read());
int hour = bcdToDec(Wire.read() & 0b111111); //24 hour time
int weekDay = bcdToDec(Wire.read()); //0-6 -> sunday - Saturday
int monthDay = bcdToDec(Wire.read());
int month = bcdToDec(Wire.read());
int year = bcdToDec(Wire.read());
//print the date EG 3/1/11 23:59:59
Serial.print(month);
Serial.print("/");
Serial.print(monthDay);
Serial.print("/");
Serial.print(year);
Serial.print(" ");
Serial.print(hour);
Serial.print(":");
Serial.print(minute);
Serial.print(":");
Serial.println(second);
}
------------------------------------------------------------------------------------------------
Sketsa program di atas adalah dasar program untuk merubah nilai waktu yang ada di rtc. bila waktu tidak sesuai upload program di atas dan jika sudah kita upload kembali program jam sebelumnya. beres deh.. tapi sayang yaaa .. tidak praktis. Nah marilah kita
Yang kita perlukan dalam Percobaan kali ini adalah :
Arduino Uno
Tactile Switch 3 buah
Resistor 1 Kilo Ohm 3 buah
Kabel secukupnya
LCD 20x4 Karakter
Modul RTC
BreadBoard atau di solder ya terserah agan ajaa.. yaaaa...
Pertama tama Resistor 1 kilo Ohm dirangkai dengan Tactile Switch menjadi rangkaian saklar. kita memerlukan tiga tombol saklar dalam percobaan latihan kali ini.
Sebelum memulai percobaan yang utama ada baiknya melakukan pengetesan tiap bagian modul. bagi yang baru pertama kali belajar Mikrokontroller Arduino coba ikuti link di bawah ini
Latihan Arduino dengan Modul RTC
Latihan Arduino dengan Modul LCD
Latihan Arduino dengan Rangkaian Saklar
Listing Pemrogramannya adalah seperti di bawah ini :
---------------------------------------------------------------------------------
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // RS,E,D4,D5,D6,D7
#include "Wire.h"
#define DS1307_ADDRESS 0x68
byte zero = 0x00; //workaround for issue #527
int ct1=1;
int ta=9 ; int tb=8; int tc=7;
int t1,t2,t3,j,mn,d,tg,bl,th,hk;
String hari;
String b1,b2,baris1,baris2;
int k=1; int tm=1;
int j1,j2,m1,m2,d1,d2;
int ct2,ct3;
boolean lt1= false;
void setup() {
Wire.begin();
lcd.begin(16,2);
pinMode(ta,INPUT); pinMode(tb,INPUT);pinMode(tc,INPUT);
}
void loop() {
delay(100);
t1= digitalRead(ta);
t2= digitalRead(tb);
t3= digitalRead(tc);
if (k==1) {
Wire.beginTransmission(DS1307_ADDRESS);
byte zero = 0x00;
Wire.write(zero);
Wire.endTransmission();
Wire.requestFrom(DS1307_ADDRESS, 7);
d = bcdToDec(Wire.read());
mn = bcdToDec(Wire.read());
j = bcdToDec(Wire.read() & 0b111111); //24 hour time
hk = bcdToDec(Wire.read()); //0-6 -> sunday - Saturday
tg = bcdToDec(Wire.read());
bl = bcdToDec(Wire.read());
th = bcdToDec(Wire.read());
j1= j/10; j2=j%10; m1=mn/10; m2=mn%10; d1=d/10; d2=d%10;
baris1=hari+ " "+ String (tg) +"-"+ String (bl)+"-"+ String (th) ;
baris2= "Jam : "+String (j1)+String (j2) +":"+ String (m1)+String (m2)+":"+String (d1)+String (d2) ;
if (t1 ==1 && lt1 == false) {
ct1+=1; if (ct1>19) {k=2;tm=1;ct1=1; lt1= true ;} }
else ct1=1;
}
if (k==2) {
if (tm==1){
baris1 ="Memasuki Menu ";
baris2 = "Pengaturan Alat ";
ct1 +=1;
if (ct1 > 10) {ct1=0; tm=2; }
}
if (tm==2){
baris1 ="2. Rubah Waktu ";
baris2 = "3. Keluar ";
if (t2==1 ) {tm=3; }
if (t3==1 ) {tm=1; k=1; }
if (t1==0) lt1= false;
}
if (tm==3){
baris1 ="Memasuki Menu ";
baris2 = "Merubah Data Jam ";
ct1 +=1;
if (ct1 > 10) {ct1=0; tm=4; }
}
if (tm==4){
baris1 ="Jam : "+String(j) ;
baris2 ="1.Next 2&3 Atur";
if (t2==1 ) {j+=1; if(j>23) j=0;}
if (t3==1 ) {j-=1; if(j<0) j=23;}
if (t1==1 && lt1== false) { tm=5; lt1=true; }
if (t1==0) lt1= false;
}
if (tm==5){
baris1 ="Menit : "+String(mn) ;
baris2 ="1.Next 2&3 Atur";
if (t2==1 ) {mn+=1; if(mn>59) mn=0;}
if (t3==1 ) {mn-=1; if(mn<0) mn=59;}
if (t1==1 && lt1 == false) { tm=6; lt1=true; }
if (t1==0) lt1= false;
}
if (tm==6){
baris1 ="Memasuki Menu ";
baris2 = "Merubah Tanggal";
ct1 +=1;
if (ct1 > 10) {ct1=0; tm=7; }
}
if (tm==7){
baris1 ="Tanggal : "+ String(tg) ;
baris2 ="1.Next 2&3 Atur";
if (t2==1 ) {tg+=1; if(tg>31) tg=1;}
if (t3==1 ) {tg-=1; if(tg<1) tg=31;}
if (t1==1 && lt1 == false) { tm=8; lt1=true; }
if (t1==0) lt1= false;
}
if (tm==8){
baris1 = "Bulan : "+ String(bl) ;
baris2 = "1.Next 2&3 Atur";
if (t2==1 ) {bl+=1; if(bl>12) bl=1;}
if (t3==1 ) {bl-=1; if(bl<1) bl=12;}
if (t1==1 && lt1 == false) { tm=9; lt1=true; }
if (t1==0) lt1= false;
}
if (tm==9){
baris1 = "Tahun : "+ String(th) ;
baris2 = "1.Next 2&3 Atur";
if (t2==1 ) {th+=1; if(th>99) th=1;}
if (t3==1 ) {th-=1; if(th<1) th=99;}
if (t1==1 && lt1 == false) { tm=10; lt1=true; }
if (t1==0) lt1= false;
}
if (tm==10){
baris1 = "Hari : "+ String(hari) ;
baris2 = "1.Next 2&3 Atur";
if (t2==1 ) {hk +=1; if(hk>7 ) hk=1;}
if (t3==1 ) {hk -=1; if(hk<1) hk=7;}
if (t1==1 && lt1 == false) { tm=11; lt1=true; }
if (t1==0) lt1= false;
}
if (tm== 11){
baris1 ="Data dirubah...?";
baris2= "2. Ya 3. Tidak ";
if (t1==0) lt1= false;
if (t3==1 ){ tm=1;k=1;}
if (t2==1 ) {tm=1;k=1;
Wire.beginTransmission(DS1307_ADDRESS);
Wire.write(zero); //stop Oscillator
Wire.write(decToBcd(1));
Wire.write(decToBcd(mn));
Wire.write(decToBcd(j));
Wire.write(decToBcd(hk));
Wire.write(decToBcd(tg));
Wire.write(decToBcd(bl));
Wire.write(decToBcd(th));
Wire.write(zero); //start
Wire.endTransmission();
delay (100);
}}
delay (155);
} // END OF K2
if(b1!= baris1 || b2!=baris2 ) {
b1= baris1 ; b2=baris2 ;
lcd.clear() ;
lcd.setCursor(0,0);
lcd.print(b1);
lcd.setCursor(0,1);
lcd.print(b2);
}
if (hk==1) hari="Minggu" ;
if (hk==2) hari="Senin" ;
if (hk==3) hari="Selasa" ;
if (hk==4) hari="Rabu" ;
if (hk==5) hari="Kamis" ;
if (hk==6) hari="Jum'at" ;
if (hk==7) hari="Sabtu" ;
// end loop
}
byte bcdToDec(byte val) {
// Convert binary coded decimal to normal decimal numbers
return ( (val/16*10) + (val%16) );
}
byte decToBcd(byte val){
// Convert normal decimal numbers to binary coded decimal
return ( (val/10*16) + (val%10) );
}
---------------------------------------------------------------------------------
Dari praktek di atas kita dapat merubah data jam dan menitnya saja. belum tersedia untuk merubah tanggalnya. untuk dapat merubah tanggal marilah kita kembangkan program di atas agar lebih komplit. coba perhatikan programnya panjang yaaaa.. tentu, karena programnya terdiri dari program menampilkan waktu dari Modul RTC dan program untuk merubah tanggal yang ada di RTC. Untuk program selanjutnya tentu akan lebih rumit lagi.. Ayo semangat....
Tidak ada komentar:
Posting Komentar