Selasa, 02 Agustus 2016

Jam dinding Arduino 2

Link Menuju Halaman Utama

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