Halaman 2

Sambungan dari halaman 1 
Gambar rangkaian ada di halaman awal
Latihan LCD 16x2 karakter
Program latihan membuat tasbeh digital


Pernah memakai Counter atau tasbeh digital seperti di atas. yaaa.. itu adalah tasbeh digital atau alat penghitung . satu tombol jika di tekan maka nilai hitungan akan bertambah dan satu tombol yang satunya untuk mereset hitungan agar kembali ke nilai nol. Kali ini marilah kita berlatih membuat tasbeh digital. 
Kita memerlukan 2 saklar tactile switch, LCD dan mikrokontroller.Saklar 1 (alamat 13) digunakan untuk menambah hitungan
Saklar 2 (alamat 15 ) digunakan untuk mereset hitungan

Program  tasbeh digital

-------------------------------------------
int a=3;
int b=5;
int x=0;
#include <LiquidCrystal.h>
const int rs = 32, en = 34, d4 = 38, d5 = 40, d6 = 42, d7 = 36;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
void setup()   {
pinMode(a,INPUT);
pinMode(b,INPUT);
 lcd.begin(16, 2);
}
void loop() {
lcd.clear();
  lcd.setCursor(0, 1); lcd.print(x);
  lcd.setCursor(0, 0); lcd.print("Tasbeh Digital");
if (digitalRead(a)==1) x=x+1;
if (digitalRead(b)==1) x=0;
delay(222);
}

----------------------------------------
Program di atas mempunyai satu kelemahan yaitu bila kita tekan terus maka hitungan akan terus bertambah. nah cobalah program di bawah ini dan bandingkan hasilnya.

Program tasbeh digital 2
-----------------------------------------------------


int a= 3;  // Tombol 1
int b= 5;  // Tombol 2
int x=0;
boolean stA = false ;
boolean stB = false ;
#include <LiquidCrystal.h>
const int rs = 32, en = 34, d4 = 38, d5 = 40, d6 = 42, d7 = 36;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
void setup()   {
pinMode(a,INPUT);
pinMode(b,INPUT);
 lcd.begin(16, 2);
}
void loop() {
lcd.clear();
  lcd.setCursor(0, 0); lcd.print("Tasbeh Digital 2");
  lcd.setCursor(0, 1); lcd.print(x);
if (digitalRead(a)== 1 && stA == false)
{  x=x+1; stA =  true ; }
if (digitalRead(a)== 0  )  stA =  false ;
if (digitalRead(b)==1 && stB == false)
{  x=0; stB =  true ; }
if (digitalRead(b)== 0  )  stB =  false ;
delay (100);}

--------------------------------------


Latihan dasar RTC DS1307
Latihan menampilkan jam pada layar LCD

Pada prinsipnya cara kerja dari program yang dirancang kali ini adalah kita mengambil data waktu dari Modul RTC dan data waktu tersebut kita tampilkan di layar LCD. Data yang ditampilkan adalah jam dan tanggal.
Tampilan Jam yang akan ditampilkan di layar Lcd adalah seperti di bawah ini.


List Program di bawah adalah Program jam yang kita praktekan sekarang.
---------------------------------------------------------------------------------

#include <LiquidCrystal.h>
const int rs = 32, en = 34, d4 = 38, d5 = 40, d6 = 42, d7 = 36;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
#include "Wire.h"
#define DS1307_ADDRESS 0x68
byte zero = 0x00; //workaround for issue #527
String hari, lcd1,lcd2;
int d,mn,j,hk,tg,bl,th ;
void setup() {
    Wire.begin();
    lcd.begin(16,2);
}
void loop() {
  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());
  if (hk==0) hari="Minggu" ;   if (hk==1) hari="Senin" ;
  if (hk==2) hari="Selasa" ;  if (hk==3) hari="Rabu" ;
  if (hk==4) hari="Kamis" ;  if (hk==5) hari="Jum'at" ;
  if (hk==6) hari="Sabtu" ;
  lcd1 = "Jam : " + String (j)+":" +String (mn/10)+ String (mn%10)+ ":" +String (d/10)+ String (d%10);
  lcd2 = hari +" " + String (tg) + "-"+ String (bl)+ "-20" + String (th);
  lcd.clear() ;
  lcd.setCursor(0,0);  lcd.print(lcd1);
  lcd.setCursor(0,1);  lcd.print(lcd2);
delay (500); 
}
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) );
}
---------------------------------------------------------------------------------
 Marilah coba kita teliti programnya
Dari  Wire.beginTransmission(DS1307_ADDRESS);   sampai Wire.requestFrom(DS1307_ADDRESS, 7);
adalah untuk bagian RTC.. Intinya adalah mengaktipkan RTC untuk kemudian dibaca datanya.
   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());

Baris program di atas adalah membaca data detik menyimpannya di variabel d, data menit dimasukan ke variabel mn. dan seterusnya ( j = jam, hk = hari, tg = tanggal, bl = bulan, th = tahun )

Data yang tersimpan di variabel hk adalah data hari dimulai dari nilai nol sampai enam, nol berarti minggu, satu artinya senin dan seterusnya sampai enam artinya Sabtu. Nah data inilah kita transfer menjadi nama hari melalui seleksi if. coba perhatikan list program di bawah.
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" ; 

Data jam bernilai dari 0 (Jam 12 Malam) sampai jam 23, data menit  dan detik dari 0 sampai 59 . Coba perhatikan jika jam menunjukan pukul 12 malam lewat 1 menit dan 2 detik maka akan di tampilkan   Jam: 0:1:2 . Nah akan terasa tidak nyaman bukan, seharusnya yang ditampilkan adalah Jam: 0:01:02
Nah oleh karena itulah perlu di modifikasi seperti di bawah ini :

  lcd1 = "Jam : " + String (j)+":" +String (mn/10)+ String (mn%10)+ ":" +String (d/10)+ String (d%10);

Untuk menapilkan di layar Lcd list nya  adalah

Latihan pengaturan waktu RTC
Latihan jam RTC yang dapatbdi atur
Program di atas hanya membuat jam RTC saja. Dan jika waktu yang di tunjukan tidak sesuai maka perlu dibprogram ulang. Alangkah baiknya jika sebuah jam dapat disesuaikan waktunya tanpa perlu program ulang dengan konputer.
Latih jam beker
Nah sekarang kita akan kembangkan lagi program dari larihan di atas dengan menambahkan alarm buzzer yang dapat berbunyi.
Pada prinsipnya adalah
Mikrokontroller akan mengambil data waktu di IC RTC dan ditampilkan di kayar LCD
Data waktu berupa jam dan menit yang berjalan akan dibandingkan dengan waktu stelan alarm.

---------------------------------------------------------------------------------------------
#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 =      41; // Detik diisi dengan nilai 0-59
  byte minute =      30; //  Menit diisi dengan nilai0-59
  byte hour =        8; //  Jam diisi dengan nilai 0-23
  byte weekDay =     2; // Hari diisi dengan nilai 1-7 (1=Minggu, 2 Senin Dst)
  byte monthDay =    2; // Tanggal diisi dengan nilai 1-31
  byte month =       3; //  Bulan diisi dengan nilai 1-12
  byte year  =       15; // Tahun diisi dengan nilai  0-99
  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);
}
---------------------------------------------------------------------------------------------

Untuk merubah jam Rtc perhatikan nilai jam yang ada di bagian Setup. isilah second dengan nilai detik yang akan di input. nilai minute dengan nilai menit , hour dengan nilai jam. dan nilai seterusnya. ketika program di Uploud ke Mikrokontroller maka mikrokontroller akan menuliskannya ke RTC. 
Sebagai Catatatn bahwa setelah program di Uploud maka data akan berubah dan jam  sudah sesuai dengan waktu yang berlaku, maka kita harus mengaploud program untuk menampilkan jam saja. contohnya Uploud saja program pada percobaan sebelunya. Kenapa demikian .........?   . Jawabannya adalah akan terjadi masalah ketika Mikrokontroller di matikan. sebagai contoh kita akan membetulkan nilai jam yang ada di Modul RTC yang tidak sesuai. Pada saat itu menunjukan Jam 5 sore pas dan tanggal pada saat itu adalah tanggal 1 Januari 2015. Tentunya kita memasukan nilai tersebut di bagian setup kemudian alat kita biarkan menyala sampai jam 6 sore dan kita matikan. pada saat Jam 7 malam kita nyalakan kembali mikrokontrollernya dan jam yang akan tampil adalah jam 5 sore dan bukan jam 7 malam. Hal ini dikarenakan pada saat mikrokontroller dihidupkan Modul Rtc kembali di rubah data waktunya seperti nilai yang tertulis di bagian setup. Nah oleh karena itu maka setelah program ini di uploud harus segera di ganti dengan program tampilan jam saja.



---------------------------------------------------------------------------------------------
#include <LiquidCrystal.h>
const int rs = 32, en = 34, d4 = 38, d5 = 40, d6 = 42, d7 = 36;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

#include "Wire.h"
#define DS1307_ADDRESS 0x68
byte zero = 0x00; //workaround for issue #527
int ct1=1;
int ta=3 ; int tb=5; int tc=7;
int t1,t2,t3,j,mn,d,tg,bl,th,hk,tg2;
String hari;
String b1,b2,baris1,baris2;
int k=1; int tm=1;
int j1,j2,m1,m2,d1,d2;
int ct2,ct3,ht;
boolean lt1= false;
boolean lt3= 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;
 if (t1 ==1 && lt1 == false) { 
   ct1+=1; if (ct1>9) {k=2;tm=1;ct1=1; lt1= true ;} }
  else ct1=1;
  if (t3==1 && lt3== false ){k=3;tm=1; lt3= true; }
  baris1= "Jam : "+String (j1)+String (j2) +":"+ String (m1)+String (m2)+":"+String (d1)+String (d2) ;
  baris2= hari+ " "+ String (tg) +"-"+ String (bl)+"-20"+ String (th) ;
 }

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>6) hk=0;}
 if (t3==1 ) {hk -=1; if(hk<0) hk=6;}
 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);
 } 
  
  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==0) hari="Minggu" ;
  if (hk==1) hari="Senin" ;
  if (hk==2) hari="Selasa" ;
  if (hk==3) hari="Rabu" ;
  if (hk==4) hari="Kamis" ;
  if (hk==5) hari="Jum'at" ;
  if (hk==6) hari="Sabtu" ;
}
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) );
}

---------------------------------------------------------------------------------------------

Bersambung ke Halaman 3
Kembali ke  halaman awal

Komentar

Postingan populer dari blog ini

Halaman 5

Halaman1