Showing posts with label Elektronika. Show all posts
Showing posts with label Elektronika. Show all posts

Thursday, March 21, 2013

[Review] Mengaktifkan Motor dengan Keypad

         21 - 05 - 2013
         09 : 53 PM





         Halo, sudah lama sekali saya tidak menulis postingan baru di blog ini. Mungkin salah satu penyebabnya adalah karena personal computer atau yang biasa disebut PC saya sedang rusak (hiks2). Jadi tidak bisa main game online lagi, karena laptop yang saya punya tidak begitu bagus spesifikasinya untuk bermain game online. Hmm mungkin ini salah satu kebaikan juga untuk saya. Karena saya jadi bisa fokus untuk skripsi semester ini dan tidak bermain-main game online dahulu.
         Baiklah kalau begitu, kali ini saya ingin memposting sebuah postingan tentang elektronika lagi. Kali ini saya akan memposting seperti sebelumnya, yaitu sebuah analisa yang sedikit dari rangkaian Penulisan Ilmiah (PI) dari teman saya yang bernama Fadli yang saya sempat membantunya dalam pembuatan program alatnya. Baiklah, langsung saja saya share gambar rangkaiannya :



          Alat ini kalau tidak salah berjudul 'Mengaktifkan Motor dengan Keypad'. Jadi alat ini sebagai sebuah simulasi dari kendaraan bermotor yang mana untuk mengaktifkannya tidak hanya harus menyalakan kontaknya, tetapi juga harus memasukkan kode keypad yang sesuai dengan yang sudah di setting. Kurang lebih alat ini untuk menambah keamanan pada kendaraan. Alat ini memiliki Input yang berupa : Penekanan pada Keypad, Proses : Mikrokontroller ATMEGA8535, Output : Perputaran Motor DC dan Nyala Lampu LED. Lalu password yang sudah di set di rangkaian ini adalah '2313'. LED pada Port A ini berfungsi sebagai penanda bahwa tombol keypad yang ditekan sudah disimpan atau belum. Jadi ketika tombol 0-9 ditekan, maka LED pada Port A akan menyala sekitar 1 detik, kemudian LED akan mati lagi yang menandakan bahwa tombol yang ditekan pada keypad sudah disimpan, sehingga kita dapat memasukkan angka berikutnya pada keypad.
          Setelah itu LED pada Port C adalah sebagai indikator salah atau benarnya password. Apabila ketika di tekan tombol enter pada keypad dan ternyata password yang dimasukkan adalah benar, maka LED pada PortC.1 akan menyala sebentar lalu mati lagi. Tetapi ketika password yang dimasukkan salah, maka LED pada PortC.0 akan menyala terus. Di rangkaian ini LED pada PortC.0 kalau tidak salah di analogikan dengan alarm. Jadi jika password salah maka alarm akan terus berbunyi, sampai rangkaian ditekan tombol reset. Yah kurang lebih cara kerjanya seperti itu. Baiklah saya akan men-share programnya di akhir postingan. Terima kasih, semoga bermanfaat.

#include <mega8535.h>
#include <delay.h>
unsigned char dt,array[];
int i=0,nilai=0,password=2313;
void detek_key(void);
void simpan_pass(void);
void main (void)
{
PORTA=0x00;
DDRA=0xff;
PORTB=0xff;
DDRB=0xff;
PORTC=0x00;
DDRC=0xff;
PORTD=0xff;
DDRD=0xf0;
while(1)
{
detek_key();
delay_ms(50);
};
}
void simpan_pass(void){
if (i==1){nilai=array[i];}
if (i>=2 && i<=8)
{
nilai=(nilai*10)+array[i];
}}

void detek_key(void){
PORTD.4=0;
delay_ms(50);
dt=(~PIND & 0x0f);
switch (dt){
case 1 : i++;array[i]=1;simpan_pass();PORTA=0xff;delay_ms(100);PORTA=0x00;delay_ms(50);break;
case 2 : i++;array[i]=0;simpan_pass();PORTA=0xff;delay_ms(100);PORTA=0x00;delay_ms(50);break;
case 4 : i++;array[i]=0;simpan_pass();PORTA=0xff;delay_ms(100);PORTA=0x00;delay_ms(50);break;
case 8 : if (nilai==password){PORTB=0xfe;PORTC=0xfe;delay_ms(200);PORTC=0x00;}else {PORTC=0xfd;}delay_ms(100);PORTA=0x00;delay_ms(50);break;
};
PORTD.4=1;PORTD.5=0;
delay_ms(50);
dt=(~PIND & 0x0f);
switch (dt){
case 1 : i++;array[i]=2;simpan_pass();PORTA=0xff;delay_ms(100);PORTA=0x00;delay_ms(50);break;
case 2 : i++;array[i]=0;simpan_pass();PORTA=0xff;delay_ms(100);PORTA=0x00;delay_ms(50);break;
case 4 : i++;array[i]=0;simpan_pass();PORTA=0xff;delay_ms(100);PORTA=0x00;delay_ms(50);break;
case 8 : i++;array[i]=0;simpan_pass();PORTA=0xff;delay_ms(100);PORTA=0x00;delay_ms(50);break;
};
PORTD.5=1;PORTD.6=0;
delay_ms(50);
dt=(~PIND & 0x0f);
switch (dt){
case 1 : i++;array[i]=3;simpan_pass();PORTA=0xff;delay_ms(100);PORTA=0x00;delay_ms(50);break;
case 2 : i++;array[i]=0;simpan_pass();PORTA=0xff;delay_ms(100);PORTA=0x00;delay_ms(50);break;
case 4 : i++;array[i]=0;simpan_pass();PORTA=0xff;delay_ms(100);PORTA=0x00;delay_ms(50);break;
case 8 : i++;array[i]=0;simpan_pass();PORTA=0xff;delay_ms(100);PORTA=0x00;delay_ms(50);break;
};
PORTD.6=1;PORTD.7=0;
delay_ms(50);
dt=(~PIND & 0x0f);
switch (dt){
case 1 : i++;array[i]=0;simpan_pass();PORTA=0xff;delay_ms(100);PORTA=0x00;delay_ms(50);break;
case 2 : i++;array[i]=0;simpan_pass();PORTA=0xff;delay_ms(100);PORTA=0x00;delay_ms(50);break;
case 4 : i++;array[i]=0;simpan_pass();PORTA=0xff;delay_ms(100);PORTA=0x00;delay_ms(50);break;
case 8 : i++;array[i]=0;simpan_pass();PORTA=0xff;delay_ms(100);PORTA=0x00;delay_ms(50);break;
};
PORTD.7=1;
delay_ms(50);
}

Saturday, February 9, 2013

[Review] Alat Pengingat Shalat 5 Waktu

         29 - 01 - 2013
         11 : 34 PM




         Baiklah, pasti kalian bertanya-tanya, dari post-post review rangkaian sebelumnya kok hanya memposting rangkaian Penulisan Ilmiah milik teman terus. Rangkaian Penulisan milik mu sendiri mana? Ok ok, kali ini saya akan memposting rangkaian Penulisan Ilmiah saya. Tapi mungkin agak sedikit rumit ya, bukan maksud untuk merumit-rumitkan atau membesar-besarkan rangkaian Penulisan Ilmiah saya sendiri. Tapi memang kalau anda tidak mengerti perhitungannya matematisnya akan rumit, karena saya tidak akan membahas secara perhitungan secara matematisnya. Baiklah langsung saja kalau begitu, alat ini berjudul "Alat Pengingat Shalat 5 Waktu Berbasis ATMEGA32".
         Baiklah, karena ini adalah rangkaian saya sendiri. Jadi saya akan langsung memberikan gambar blok diagramnya saja ya.


         Baiklah, input, proses, maupun output sudah jelas di blok diagram. Lalu bagaimana cara kerja alat ini? Alat ini bekerja layaknya sebuah jam weker. Hanya bedanya jam ini akan berbunyi ketika sudah masuk waktu shalat 5 waktu. Bagaimana, terdengar simple ya? Baiklah lanjut kalau begitu, karena shalat waktu setiap harinya atau mungkin setiap minggunya berubah-ubah. Jadi saya menggunakan rumus perhitungan matematis yang biasa di gunakan oleh situs-situs perhitungan shalat 5 waktu seperti situs ini : http://www.islamicfinder.org/world.php . Perhitungan waktu shalat 5 waktunya saya gunakan seperti yang ada di situs ini, silahkan anda baca sendiri jika tertarik ingin tahu bagaimana perhitungannya : http://jokoradityo.wordpress.com/2010/06/16/cara-menghitung-waktu-shalat/ .

         Baiklah, lalu sekarang gambar rangkaiannya adalah seperti ini : 



         Hmm blok diagram sudah, lalu gambar rangkaian juga sudah. Baiklah kalau begitu sekarang cara kerja alat. Jadi alat ini terdiri dari rangkaian pengontroll / mikrokontroller, dan rangkaian music player. Karena outputnya disini adalah tampilan LCD dan suara adzan dari suatu file mp3, sehingga perlu rangkaian penguat lagi. Karena output dari mikrokontroller hanya 5v, jadi perlu rangkaian penguat lagi yang bisa menghidupkan rangkaian mp3 yang membutuhkan tegangan sekitar 12v. Saya tidak tampilkan gambar rangkaiannya disini, karena saya langsung menggunakan music player dan rangkaian penguat yang langsung jadi dari toko elektronik sekitar 20 ribu-50 ribu kalau tidak salah, lupa juga. Karena waktu itu mepet waktunya dengan jadwal sidang saya, jdi mau tidak mau saya harus cepat bergerak, jadi membeli rangkaian langsung. Ok jadi langsung saja ya, karena yang saya gunakan pada gambar rangkaian di atas adalah nyala lampu LED yang mana mengisyaratkan kondisi High, yang mana kondisi High itu nanti akan di proses oleh rangkaian penguat lalu akan menuju ke rangkaian Music Player untuk menyalakan suara adzan. Ok langsung saja saya share program dan videonya yang sempat saya rekam waktu itu untuk dokumentasi jaga-jaga kalau alatnya bermasalah pas saat sidang nanti. Pada video demo ini saya menggunakan input tegangan yang berasal dari adaptor. Karena lebih hemat dibandingkan harus membeli batu baterai 12v. Dan juga maketnya (pemaketan alatnya) sangat fail sekali pakai sterofoam wakakakak, bener-bener hemat alias ga modal wakakakk. Tapi ya sudahlah, memang saya kurang begitu ahli dalam hal pemaketan alat. Dan juga pada video demonstrasi alat ini saya sudah sempat mengecek sebelumnya dari alat itu bahwa waktu shalat dzuhur pada tanggal tersebut adalah jam 11 : 59 AM. Jadi alat ini juga bisa mengecek waktu shalat pada tanggal yang tertera pada alat, tapi saya tidak demonstrasikan pengecekan waktu shalatnya. Ok langsung saja saya share di bawah ini program dan videonya. Semoga bermanfaat.



----

#include <mega32.h>
#include <delay.h>
#include <stdio.h>
#include <math.h>
#asm
   .equ __i2c_port=0x18
   .equ __sda_bit=0
   .equ __scl_bit=1
   .equ __lcd_port=0x15
#endasm
#include <i2c.h>
#include <ds1307.h>
#include <lcd.h>
unsigned char buff[16];
unsigned char h,m,s,day,month,year,set1,set2,set3,set4,set5,set6;
int jamdhuz,mendhuz,detdhuz,asd,asd5,wl=7,tinggi=50,sudsub=18,sudisy=17,month2,year2,aa,bb,aa2,jamash,menash,detash,jammagh,menmagh,detmagh,asd7,jamisy,menisy,detisy,asd9,jamsub,mensub,detsub,asd11,var1;
float jddhuz,sudtandhuz,uudhuz,l0dhuz,deltadhuz,equdhuz,wktdhuz,asd2,asd6,pi=3.14159265359,korlin=-1*6.1744,korbuj=106.8294,jdg,jdl,sudtan,delta,uu,l0,equ,perdhuz,lintang,asd3,asd4,absol,percosash,perhaash,jdash,sudtanash,uuash,l0ash,deltaash,equash,absol2,altnam,koralt,altsej,cosash,haash,wktash,percosmagh,perhamagh,jdmagh,sudtanmagh,uumagh,l0magh,deltamagh,equmagh,cosmagh,hamagh,wktmagh,asd8,sudisya,percosisy,perhaisy,jdisy,sudtanisy,uuisy,l0isy,deltaisy,equisy,coshaisy,haisy,wktisy,asd10,sudsubuh,percossub,perhasub,jdsub,sudtansub,uusub,l0sub,deltasub,equsub,coshasub,hasub,wktsub,asd12;
void main(void)
{
PORTA=0x00;DDRA=0xff;
PORTB=0x00;DDRB=0xff;
PORTC=0x00;DDRC=0xff;
PORTD=0xff;DDRD=0x00;

ACSR=0x80;
SFIOR=0x00;
i2c_init();
rtc_init(0,0,0);
lcd_init(16);
lcd_clear();              
while (1)
      {lcd_clear(); 
      rtc_get_time(&h,&m,&s);
      rtc_get_date(&day,&month,&year);
      lcd_gotoxy(0,0);
      sprintf(buff,"Time %d:%d:%d",h,m,s);
      lcd_puts(buff);
      lcd_gotoxy(0,1);
      sprintf(buff,"Date %d:%d:20%d", day,month,year);
      lcd_puts(buff);
      delay_ms(50);

lintang=korlin*pi/180;
month2=month,year2=2000+year;
if (month<=2)
{month2=month2+12;year2=year2-1;}
aa= (year2)/100;
aa2=aa/4;
bb = 2 + aa2 - aa;
asd3= 365.25*(year2);
asd4=30.6001*(month2 + 1);
jdg = 1720994.5 + asd3 + asd4 + bb + day +(12/24);

jdl = jdg-(wl/24);
sudtan=2*pi*(jdl - 2451545)/365.25;
delta=(0.37877 + 23.264*sin((57.297*sudtan - 79.547)*pi/180) + 0.3812*sin((2*57.297*sudtan - 82.682)*pi/180) + 0.17132*sin((3*57.297*sudtan - 59.722)*pi/180))*pi/180;
uu = (jdl - 2451545)/36525;
l0 = (280.46607 + 36000.7698*uu)*pi/180;
equ= (-1*(1789 + 237*uu)*sin(l0) - (7146 - 62*uu)*cos(l0) + (9934 - 14*uu)*sin(2*l0) - (29 + 5*uu)*cos(2*l0) + (74 + 10*uu)*sin(3*l0) + (320 - 4*uu)*cos(3*l0) - 212*sin(4*l0))/1000;
perdhuz=12+wl-(korbuj/15)-(equ/60);
jddhuz=jdl+(perdhuz/24)-(12/24);
sudtandhuz=2*pi*(jddhuz - 2451545)/365.25;
uudhuz = (jdl - 2451545)/36525;
l0dhuz=(280.46607 + 36000.7698*uudhuz)*pi/180;
deltadhuz=(0.37877 + 23.264*sin((57.297*sudtandhuz - 79.547)*pi/180) + 0.3812*sin((2*57.297*sudtandhuz - 82.682)*pi/180) + 0.17132*sin((3*57.297*sudtandhuz - 59.722)*pi/180))*pi/180;
equdhuz= (-1*(1789 + 237*uudhuz)*sin(l0dhuz) - (7146 - 62*uudhuz)*cos(l0dhuz) + (9934 - 14*uudhuz)*sin(2*l0dhuz) - (29 + 5*uudhuz)*cos(2*l0dhuz) + (74 + 10*uudhuz)*sin(3*l0dhuz) + (320 - 4*uudhuz)*cos(3*l0dhuz) - 212*sin(4*l0dhuz))/1000;
wktdhuz=12+wl-(korbuj/15)-(equdhuz/60);
asd=wktdhuz;
asd2= ((wktdhuz)-(asd));
jamdhuz=asd;
mendhuz=asd2*60;
detdhuz=((asd2*60)-mendhuz)*60;

absol=lintang-delta;
if (absol<0)
{absol=-1*absol;}
percosash=(sin(atan(1/(1+tan(absol))))-sin(delta)*sin(lintang))/(cos(delta)*cos(lintang));
perhaash=acos(percosash)*180/pi;
jdash=jdl+(perhaash/360);
sudtanash=2*pi*(jdash-2451545)/365.25;
uuash=(jdash-2451545)/36525;
l0ash=(280.46607 + 36000.7698*uuash)*pi/180;
deltaash=(0.37877+23.264*sin((57.297*sudtanash-79.547)*pi/180)+0.3812*sin((2*57.297*sudtanash-82.682)*pi/180)+0.17132*sin((3*57.297*sudtanash-59.722)*pi/180))*pi/180;
equash=(-1*(1789 + 237*uuash)*sin(l0ash) - (7146 - 62*uuash)*cos(l0ash) + (9934 - 14*uuash)*sin(2*l0ash) - (29 + 5*uuash)*cos(2*l0ash) + (74 + 10*uuash)*sin(3*l0ash) + (320 - 4*uuash)*cos(3*l0ash) - 212*sin(4*l0ash))/1000;
absol2=lintang-deltaash;
if (absol2<0)
{absol2=-1*absol2;}
altnam=atan(1/(1+tan(absol2)))*180/pi;
koralt=1/(60*tan((altnam+7.31/(altnam+4.4))*pi/180));
altsej=(altnam-koralt)*pi/180;
cosash=(sin(altsej)-sin(deltaash)*sin(lintang))/(cos(deltaash)*cos(lintang));
haash=acos(cosash)*180/pi;
wktash=12+wl-korbuj/15-equash/60+haash/15;
asd5=wktash;
asd6= ((wktash)-(asd5));
jamash=asd5;
menash=asd6*60;
detash=((asd6*60)-menash)*60;

percosmagh=(sin((-0.8333-0.0347*pow(tinggi,0.5))*pi/180)-sin(delta)*sin(lintang))/(cos(delta)*cos(lintang));
perhamagh=acos((sin((-0.8333-0.0347*pow(tinggi,0.5))*pi/180)-sin(delta)*sin(lintang))/(cos(delta)*cos(lintang)))*180/pi;
jdmagh=jdl+perhamagh/360;
sudtanmagh=2*pi*(jdmagh-2451545)/365.25;
uumagh=(jdmagh-2451545)/36525;
l0magh=(280.46607 + 36000.7698*uumagh)*pi/180;
deltamagh= (0.37877+23.264*sin((57.297*sudtanmagh-79.547)*pi/180)+0.3812*sin((2*57.297*sudtanmagh-82.682)*pi/180)+0.17132*sin((3*57.297*sudtanmagh-59.722)*pi/180))*pi/180;
equmagh=(-1*(1789 + 237*uumagh)*sin(l0magh) - (7146 - 62*uumagh)*cos(l0magh) + (9934 - 14*uumagh)*sin(2*l0magh) - (29 + 5*uumagh)*cos(2*l0magh) + (74 + 10*uumagh)*sin(3*l0magh) + (320 - 4*uumagh)*cos(3*l0magh) - 212*sin(4*l0magh))/1000;
cosmagh=(sin((-0.8333-0.0347*pow(tinggi,0.5))*pi/180)-sin(deltamagh)*sin(lintang))/(cos(deltamagh)*cos(lintang));
hamagh=acos(cosmagh)*180/pi;
wktmagh=12+wl-(korbuj/15)-(equmagh/60)+(hamagh/15);
asd7=wktmagh;
asd8= ((wktmagh)-(asd7));
jammagh=asd7;
menmagh=asd8*60;
detmagh=((asd8*60)-menmagh)*60;

sudisya=sudisy*pi/180;
percosisy=(sin(-1*sudisya)-sin(delta)*sin(lintang))/(cos(delta)*cos(lintang));
perhaisy=acos(percosisy)*180/pi;
jdisy=jdl+perhaisy/360;
sudtanisy=2*pi*(jdisy-2451545)/365.25;
uuisy=(jdisy-2451545)/36525;
l0isy=(280.46607 + 36000.7698*uuisy)*pi/180;
deltaisy=(0.37877+23.264*sin((57.297*sudtanisy-79.547)*pi/180)+0.3812*sin((2*57.297*sudtanisy-82.682)*pi/180)+0.17132*sin((3*57.297*sudtanisy-59.722)*pi/180))*pi/180;
equisy=(-1*(1789 + 237*uuisy)*sin(l0isy) - (7146 - 62*uuisy)*cos(l0isy) + (9934 - 14*uuisy)*sin(2*l0isy) - (29 + 5*uuisy)*cos(2*l0isy) + (74 + 10*uuisy)*sin(3*l0isy) + (320 - 4*uuisy)*cos(3*l0isy) - 212*sin(4*l0isy))/1000;
coshaisy=(sin(-1*sudisya)-sin(deltaisy)*sin(lintang))/(cos(deltaisy)*cos(lintang));
haisy=acos(coshaisy)*180/pi;
wktisy=12+wl-korbuj/15-equisy/60+haisy/15;
asd9=wktisy;
asd10= ((wktisy)-(asd9));
jamisy=asd9;
menisy=asd10*60;
detisy=((asd10*60)-menisy)*60;

sudsubuh=sudsub*pi/180;
percossub=(sin(-1*sudsubuh)-sin(delta)*sin(lintang))/(cos(delta)*cos(lintang));
perhasub=acos(percossub)*180/pi;
jdsub=jdl-perhasub/360;
sudtansub=2*pi*(jdsub-2451545)/365.25;
uusub=(jdsub-2451545)/36525;
l0sub=(280.46607 + 36000.7698*uusub)*pi/180;
deltasub=(0.37877+23.264*sin((57.297*sudtansub-79.547)*pi/180)+0.3812*sin((2*57.297*sudtansub-82.682)*pi/180)+0.17132*sin((3*57.297*sudtansub-59.722)*pi/180))*pi/180;
equsub=(-1*(1789 + 237*uusub)*sin(l0sub) - (7146 - 62*uusub)*cos(l0sub) + (9934 - 14*uusub)*sin(2*l0sub) - (29 + 5*uusub)*cos(2*l0sub) + (74 + 10*uusub)*sin(3*l0sub) + (320 - 4*uusub)*cos(3*l0sub) - 212*sin(4*l0sub))/1000;
coshasub=(sin(-1*sudsubuh)-sin(deltasub)*sin(lintang))/(cos(deltasub)*cos(lintang));
hasub=acos(coshasub)*180/pi;
wktsub=12+wl-korbuj/15-equsub/60-hasub/15;
asd11=wktsub;
asd12= ((wktsub)-(asd11));
jamsub=asd11;
mensub=asd12*60;
detsub=((asd12*60)-mensub)*60;
      switch (PIND)
      {case 0xFE :
      {lcd_clear();
      set3=0,set1=h;set2=m;
      while (1)
      {
      lcd_gotoxy(0,0);
      lcd_putsf("Set Jam :");                
      lcd_gotoxy(0,1);
      sprintf(buff,"Jam %d:%d",set1,set2);
      lcd_puts(buff);
      if (PIND.1==0)
      {set1++;
      rtc_set_time(set1,set2,set3);
      delay_ms(150);
      if (set1==24 | set1>=100)
      {lcd_clear();set1=0;
      rtc_set_time(set1,set2,set3);
      delay_ms(20);}}
      if (PIND.2==0)
      {set2++;
      rtc_set_time(set1,set2,set3);
      delay_ms(150);
      if (set2==60 | set2>=100)
      {lcd_clear();set2=0;
      rtc_set_time(set1,set2,set3);
      delay_ms(20);}}
      if (PIND.4==0)
      {break;}
      };break;}
     
      case 0xFD :
      {lcd_clear();
      set4=day,set5=month,set6=year;
      while (1)
      {
      lcd_gotoxy(0,0);
      lcd_putsf("Set Tanggal :");                
      lcd_gotoxy(0,1);
      sprintf(buff,"%d-%d-20%d",set4,set5,set6);
      lcd_puts(buff);
      if (PIND.1==0)
      {set4++;
      rtc_set_date(set4,set5,set6);
      delay_ms(150);
      var1=29;
      if (set6%4==0)
      {var1=30;}
      if (set4==var1 | set4>=100 )
      {lcd_clear();set4=0;
      rtc_set_date(set4,set5,set6);
      delay_ms(20);}}
      if (PIND.2==0)
      {set5++;
      rtc_set_date(set4,set5,set6);
      delay_ms(150);
      if (set5==13 | set5>=100)
      {lcd_clear();set5=1;
      rtc_set_date(set4,set5,set6);
      delay_ms(20);}}
      if (PIND.3==0)
      {set6++;
      rtc_set_date(set4,set5,set6);
      delay_ms(150);
      if (set6==100 | set6>=100)
      {lcd_clear();set6=0;
      rtc_set_date(set4,set5,set6);
      delay_ms(20);}}
      if (PIND.4==0)
      {break;}
      };break;}
      case 0xFB :
      {lcd_clear();
      while (1){
      lcd_gotoxy(0,0);
      sprintf(buff,"shubuh %d:%d",jamsub,mensub);
      lcd_puts(buff);
      delay_ms(200);
      lcd_clear();
      if (PIND.4==0)
      {break;}
      sprintf(buff,"dzuhur %d:%d",jamdhuz,mendhuz);
      lcd_puts(buff);
      delay_ms(200);
      lcd_clear();
      if (PIND.4==0)
      {break;}
      sprintf(buff,"ashar %d:%d",jamash,menash);
      lcd_puts(buff);
      delay_ms(200);
      lcd_clear();
      if (PIND.4==0)
      {break;}
      sprintf(buff,"maghrib %d:%d",jammagh,menmagh);
      lcd_puts(buff);
      delay_ms(200);
      lcd_clear();
      if (PIND.4==0)
      {break;}
      sprintf(buff,"isya %d:%d",jamisy,menisy);
      lcd_puts(buff);
      delay_ms(200);
      lcd_clear();
      if (PIND.4==0)
      {break;}};break;}
      
      default : break;}
      if (jamsub==h&mensub==m| jamisy==h&menisy==m| jammagh==h&menmagh==m| jamash==h&menash==m| jamdhuz==h&mendhuz==m)
      {
      PORTA=0xff;}
      else
      {PORTA=0x00;}     
     };
}    

----



http://www.youtube.com/watch?v=fGCUDa2VsWY&feature=youtu.be







Monday, January 28, 2013

[Review] Rangkaian Payung Otomatis Berbasis AT89S51

         28 - 01 - 2013
         10 : 24 PM




         Ok, kali ini saya akan kembali mereview sebuah rangkaian yang pernah saya buat. Alat ini adalah alat yang digunakan sebagai Penulisan Ilmiah (PI) dari teman saya bernama eko. Judul alat ini adalah 'Payung Otomatis'. Alat ini terdiri dari input berupa : Cahaya, Air, dan beberapa switch sebagai pengontrol. Lalu prosesnya berupa : Mikrokontroller AT89S51, Driver Motor DC L293D, dan IC komparator LM339. Dan terakhir output berupa : Tampilan LCD 16x2, dan Perputaran Motor DC.
         Baik, mari saya jelaskan sedikit kinerja alat ini. Karena saya sedang tidak begitu mood mereview listing program secara perbaris seperti sebelumnya. Toh tidak ada yang minat juga sepertinya untuk mengerti alurnya program dari rangkaian. Kalian hanya tinggal menyamakan jalur / rangkaian seperti yang di gambar, lalu mengcopy-paste program yang akan saya berikan di bawah postan ini. Dan selesai, alat bekerja. Benar kan, itu yang kalian inginkan? Baiklah baik.
         Alat ini bekerja dengan memproses input dari LDR maupun dari sensor air. Jadi kondisinya, ketika ada cahaya yang banyak (kondisi panas terik). Maka payung akan terbuka, payung terbuka disini di ibaratkan berputar searah jarum jam (Clock Wise). Lalu apabila sensor air terkena air (kondisi hujan), maka payung akan terbuka juga. Kondisi lainnya, maka payung akan menutup atau berputar berlawanan arah jarum jam (Counter Clock Wise). Lalu bagaimana payung akan berhenti berputar? Nah, karena itulah kita pergunakan switch. Switch disini berfungsi sebagai pemberhenti perputaran motor. Jadi ketika payung sudah terbuka maximal ataupun menutup maximal, maka kita buat switch menjadi tertekan. Contoh dengan meletakkan switch pada kedua ujung saat payung terbuka maximal maupun menutup maximal. Lalu LCD disini akan menampilkan tulisan "Terbuka" apabila payung sedang dalam keadaan terbuka. Dan "Tertutup" apabila payung sedang dalam keadaan tertutup.
         Yah kurang lebih seperti itulah cara kerjanya. Sedikit simple yah kedengarannya. Baiklah saya langsung saja bagikan gambar dan listing programnya. Selamat menikmati, hope you enjoy !!!





org 00h
DB0 EQU P3.0
DB1 EQU P3.1
DB2 EQU P3.2
DB3 EQU P3.3
DB4 EQU P3.4
DB5 EQU P3.5
DB6 EQU P3.6
DB7 EQU P3.7
EN EQU P2.7
RS EQU P2.5
RW EQU P2.6
DATA_LCD EQU P3

mov p0,#0feh
mov p1,#0ffh
mov p2,#0ffh
mov p3,#0ffh
lcall lcd_tertutup
start:
mov p1,#0ffh
jnb p0.1,buka
jb p0.0,buka2
sjmp start

buka:
mov p1,#0efh
lcall lcd_terbuka
kondisi1:
jnb p0.2,berhenti
sjmp kondisi1

buka2:
mov p1,#0efh
lcall lcd_terbuka
kondisi5:
jnb p0.2,berhenti2
sjmp kondisi5

tutup:
mov p1,#0dfh
lcall lcd_tertutup
kondisi2:
jnb p0.3,start
sjmp kondisi2

berhenti2:
mov p1,#0ffh
kondisi3:
jnb p0.0,tutup
sjmp kondisi3

berhenti:
mov p1,#0ffh
kondisi4:
jb p0.1,tutup
sjmp kondisi4

lcd_terbuka:
LCALL INIT_LCD
LCALL CLEAR_LCD
MOV A,#'T'
LCALL WRITE_TEXT
MOV A,#'E'
LCALL WRITE_TEXT
MOV A,#'R'
LCALL WRITE_TEXT
MOV A,#'B'
LCALL WRITE_TEXT
MOV A,#'U'
LCALL WRITE_TEXT
MOV A,#'K'
LCALL WRITE_TEXT
MOV A,#'A'
LCALL WRITE_TEXT
ret
lcd_tertutup:
LCALL INIT_LCD
LCALL CLEAR_LCD
MOV A,#'T'
LCALL WRITE_TEXT
MOV A,#'E'
LCALL WRITE_TEXT
MOV A,#'R'
LCALL WRITE_TEXT
MOV A,#'T'
LCALL WRITE_TEXT
MOV A,#'U'
LCALL WRITE_TEXT
MOV A,#'T'
LCALL WRITE_TEXT
MOV A,#'U'
LCALL WRITE_TEXT
MOV A,#'P'
LCALL WRITE_TEXT
ret

WAIT_LCD:
CLR EN ;Start LCD command
CLR RS ;It's a command
SETB RW ;It's a read command
MOV DATA_LCD,#0FFh ;Set all pins to FF initially
SETB EN ;Clock out command to LCD
MOV A,DATA_LCD ;Read the return value
JB p3.7,WAIT_LCD ;If bit 7 high, LCD still busy
CLR EN ;Finish the command
CLR RW ;Turn off RW for future commands
RET

INIT_LCD:
CLR RS
MOV DATA_LCD,#38h
SETB EN
CLR EN
LCALL WAIT_LCD
CLR RS
MOV DATA_LCD,#0Eh
SETB EN
CLR EN
LCALL WAIT_LCD
CLR RS
MOV DATA_LCD,#06h
SETB EN
CLR EN
LCALL WAIT_LCD
RET

CLEAR_LCD:
CLR RS
MOV DATA_LCD,#01h
SETB EN
CLR EN
LCALL WAIT_LCD
RET

WRITE_TEXT:
SETB RS
MOV DATA_LCD,A
SETB EN
CLR EN
LCALL WAIT_LCD
RET

delay: mov r0,#00fh
waktu :
       djnz r2,waktu
       djnz r1,waktu
       djnz r0,waktu
       ret
end

Friday, January 18, 2013

Program LCD Dengan Mikrokontroller ATMEL

         18 - 01 - 2013
         11 : 09 PM



         

         Pada kesempatan kali ini saya akan coba membahas bagaimana cara membuat program tampilan LCD dengan menggunakan bahasa assembler / mikrokontroller keluar ATMEL ( AT89S51 / AT89S52 dsb ). Baiklah pertama yang menjadi referensi saya dalam belajar pemrograman tampilan LCD adalah dari website berikut : http://www.8052.com/tutlcd.phtml . Sekarang saya coba terangkan dalam bahasa Indonesia apa yang saya dapat dari sana.
         Pertama, kita harus tahu dahulu 3 pin kontrol pada LCD. Ketiga pin kontrol tersebut adalah : EN, RS, RW.
                  - EN atau singkatan dari Enable. Pin kontrol ini berfungsi untuk memberitahu LCD bahwa kamu akan mengirim data. Untuk mengirim data ke LCD, kamu harus membuat program di Pin ini berlogika Low (0). Setelah itu set kedua Pin kontrol lainnya untuk mengirim data ke data bus. Saat kedua Pin kontrol tersebut telah selesai mengirimkan datanya. Berikan logika high (1) pada kaki EN. Lalu tunggu sampai waktu yang di perlukan oleh LCD untuk menjalankan perintah selanjutnya, rentang waktu ini bergantung pada LCD nya, setiap LCD memiliki rentang waktu untuk menjalankan instruksi selanjutnya berbeda-beda. Kamu dapat melihat pada datasheet LCD tersebut. Setelah waktu rentang untuk menjalankan instruksi selanjutnya telah siap, berikan logika low (0) lagi pada kaki EN.

                  - RS atau singkatan dari Register Select. Saat RS berlogika Low (0), data siap untuk di perlakukan sebagai perintah atau instruksi special ( Seperti Clear Screen, Screen Position, dsb. ). Saat RS berlogika High (1), data akan siap untuk mengirim text data untuk di tampilkan di LCD. Sebagai contoh, untuk menampilkan huruf 'K' pada layar LCD maka kamu harus memberikan RS logika High (1).

                  - RW atau singkatan dari Read / Write. Saat RW berlogika Low (0), informasi pada data bus akan di tulis ke LCD. Saat RW berlogika High (1), program akan efektif untuk membaca LCD. Hanya terdapat satu instruksi untuk membaca kondisi LCD, yaitu 'Get LCD Status'. Sisanya adalah perintah untuk menulis. Sehingga RW hampir selalu di beri logika Low (0).

         Lalu yang terakhir, data bus terdiri dari 4 atau 8 pin, bergantung pada mode operasi yang di pilih oleh pengguna. Pada kasus penggunaan data bus 8 pin, itu berarti DB0-DB7.

         Sekarang saya beri contoh hardware konfigurasi, atau pemasangan pin-pin LCD ke mikrokontroller. Seperti ini :



         Seperti yang terlihat di atas, kita sudah menyambungkan Pin kontrol dan data buss ke mikrokontroller. Sekarang kita ketikkan programnya dengan perintah equ untuk penamaan variable. Seperti ini :


    DB0 EQU P1.0
    DB1 EQU P1.1
    DB2 EQU P1.2
    DB3 EQU P1.3
    DB4 EQU P1.4
    DB5 EQU P1.5
    DB6 EQU P1.6
    DB7 EQU P1.7
    EN EQU P3.7
    RS EQU P3.6
    RW EQU P3.5
    DATA EQU P1


         Sekarang kita telah memberikan nama pada pin-pin LCD yang terhubung pada mikrokontroller dengan nama pin LCD itu sendiri. Lalu untuk memberikan logika High kepada pin kontrol, dapat di gunakan perintah SETB. Dan untuk memberikan logika Low kepada pin kontrol, dapat di gunakan perintah CLR. Seperti ini :

SETB RW
CLR EN

         Lalu bagaimana untuk mengecek status sibuk LCD? Atau bagaimana kita tahu bahwa LCD sudah siap untuk menjalankan instruksi selanjutnya atau tidak? Ya, benar. Jawabannya kita dapat melihat datasheet delay waktu LCD yang kita gunakan seperti yang di jelaskan di atas tadi. Tetapi ada cara lebih mudah, kita tidak perlu repot-repot melihat datasheet LCD tersebut. Kita hanya perlu membuat program kondisi pada pin DB07. Apabila pin DB07 masih berlogika High (1), itu berarti bahwa LCD masih sibuk dan belum siap untuk menjalankan perintah selanjutnya. Jadi ketika pin DB07 sudah berlogika Low (0), kita baru dapat memberikan instruksi selanjutnya pada LCD. Seperti ini programnya :

WAIT_LCD:
CLR EN ;Start LCD command
CLR RS ;Memberi perintah
SETB RW ;Membaca perintah
MOV DATA,#0FFh ;Set semua pin awal ke FF
SETB EN ;Mengirim perintah clock ke LCD
MOV A,DATA ;Memberikan DATA ke register A
JB DB7,WAIT_LCD ;Apabila bit 7 high, LCD masih sibuk
CLR EN ;Menyelesaikan perintah
CLR RW ;Menyiapkan RW untuk ke perintah selanjutnya
RET ;Kembali ke baris pemanggil subroutine.

         Baiklah, kita sudah mempunyai subroutine delay LCD. Sekarang kita memerlukan subroutine Inisialisasi LCD. Saya tidak menjelaskan kenapa inisialisasinya seperti ini, mungkin untuk LCD yang 4 bit kontrol maupun LCD yang ukuran lain akan berbeda inisialisasinya. Tapi saya mencoba dengan LCD 16x2 dan 8 bit kontrol dengan inisialisasi seperti ini :


INIT_LCD:
CLR RS
MOV DATA,#38h
SETB EN
CLR EN
LCALL WAIT_LCD
CLR RS
MOV DATA,#0Eh
SETB EN
CLR EN
LCALL WAIT_LCD
CLR RS
MOV DATA,#06h
SETB EN
CLR EN
LCALL WAIT_LCD
RET

         Lalu apa lagi yang kita butuhkan, kita memerlukan subroutine untuk membersihkan LCD / LCD CLEAR. Ada baiknya kita membersihkan LCD dahulu sebelum memulai menulis di LCD. Subroutinenya adalah seperti ini :

CLEAR_LCD:
CLR RS
MOV DATA,#01h
SETB EN
CLR EN
LCALL WAIT_LCD
RET

         Lalu yang terakhir yang kita perlukan adalah subroutine untuk menulis data ke LCD. Seperti ini :

WRITE_TEXT:
SETB RS
MOV DATA,A
SETB EN
CLR EN
LCALL WAIT_LCD
RET

         Ok, semua sudah komplit. Lalu bagaimana cara membuat tulisan sederhana 'HELLO WORLD' ? Perintahnya adalah seperti ini :

LCALL INIT_LCD
LCALL CLEAR_LCD
MOV A,#'H'
LCALL WRITE_TEXT
MOV A,#'E'
LCALL WRITE_TEXT
MOV A,#'L'
LCALL WRITE_TEXT
MOV A,#'L'
LCALL WRITE_TEXT
MOV A,#'O'
LCALL WRITE_TEXT
MOV A,#' '
LCALL WRITE_TEXT
MOV A,#'W'
LCALL WRITE_TEXT
MOV A,#'O'
LCALL WRITE_TEXT
MOV A,#'R'
LCALL WRITE_TEXT
MOV A,#'L'
LCALL WRITE_TEXT
MOV A,#'D'
LCALL WRITE_TEXT

         Lalu bagaimana mengatur posisi teks atau kursor untuk memulai memasukkan data. Lihat gambar berikut :


         Dapat di lihat bahwa line 1 di mulai dari 00h, dan line 2 di mulai dari 40h. Jadi ketika kita memasukkan data melebihi 16 karakter pada LCD 16x2. Data selanjutnya tidak akan otomatis langsung pindah ke line 2. Data tersebut akan masuk ke 10h dst yang mana berarti tidak akan tampil pada LCD 16x2. Sehingga kita harus menset kordinat baru di 40h.

         Ok kita langsung ke contoh, misal kita ingin membuat tampilan 'WORLD' nya berada pada karakter ke 10 line ke 2. Yang mana posisinya adalah 4Ah. Karena posisi awal untuk meletakkan kursor adalah 80h. Maka untuk meletakkannya menjadi seperti ini : 80h + 4Ah = CAh


         Sehingga subroutinenya menjadi seperti ini :

CLR RS
MOV DATA,#0CAh
SETB EN
CLR EN
LCALL WAIT_LCD

         Jadi untuk membuat tulisan 'HELLO WORLD' yang mana kata 'WORLD' nya berada di line ke 2 dan karakter ke 10, programnya seperti ini :

LCALL INIT_LCD
LCALL CLEAR_LCD
MOV A,#'H'
LCALL WRITE_TEXT
MOV A,#'E'
LCALL WRITE_TEXT
MOV A,#'L'
LCALL WRITE_TEXT
MOV A,#'L'
LCALL WRITE_TEXT
MOV A,#'O'
LCALL WRITE_TEXT
CLR RS
MOV DATA,#0CAh
SETB EN
CLR EN
LCALL WAIT_LCD
MOV A,#'W'
LCALL WRITE_TEXT
MOV A,#'O'
LCALL WRITE_TEXT
MOV A,#'R'
LCALL WRITE_TEXT
MOV A,#'L'
LCALL WRITE_TEXT
MOV A,#'D'
LCALL WRITE_TEXT


         Kesimpulannya :
         
         Tutorial ini menampilkan konsep pokok dari programming LCD. Tapi ini bukan berarti sudah semuanya kita pelajari, LCD 44780 kontroller memiliki lebih banyak fungsi lainnya untuk mengakses LCD tersebut, yang mana tidak di bahas disini.



----        
        Semoga review saya ini dapat membantu anda dalam memahami rangkaian dan lalu membuat programnya berdasarkan gambar dan kondisi rangkaian. Kurang lebihnya saya minta maaf. By the way, saya membuka jasa pembuatan program, rangkaian, maupun konsultasi ataupun diskusi tentang rangkaian-rangkaian mikrokontroller seperti ini. Jika tertarik, kalian dapat langsung berkomentar saja pada tulisan ini. Nanti kita akan lanjutkan berkomunikasinya di luar komentar ini, entah dengan email, ym, fb, sms, dan sebagainya. Yang pasti kita tidak akan berdiskusi di kolom komentar. Baiklah, terima kasih banyak karena sudah meluangkan waktu untuk membaca tulisan saya.
----

Monday, January 14, 2013

[Review] Tirai dan Lampu Otomatis Berbasis Mikrokontroler AT89S51

         15 - 01 - 2013
         07 : 32 AM



----
         Baiklah, karena sepertinya masih agak banyak yang kesulitan dalam membaca rangkaian dan membuat program pada sebuah rangkaian mikrokontroller. Maka saya memutuskan untuk me-review rangkaian dan program yang pernah saya buat. Terima kasih kepada semuanya yang telah mau berbagi gambar rangkaian dan programnya kepada saya.
----


         Karena ini review pertama saya tentang rangkaian dan program, semoga tidak begitu buruk ya hahaa.
         



         Rangkaian ini adalah Project yang di ajukan oleh teman saya untuk PI (Penulisan Ilmiah) nya. Rangkaian ini berjudul 'Tirai dan Lampu Otomatis Berbasis Mikrokontroler AT89S51'. Kamu dapat mengunjungi blognya jika ingin membaca tulisan-tulisannya di alamat http://raqheelcaze.wordpress.com/

         Baiklah langsung saja ya, dapat kita lihat bahwa alat ini memiliki input berupa 3 switch dan sensor. Switch pada p1.0 dan p1.2 terhubung dengan ground yang berarti akan aktif jika terdapat logika low (aktif low / 0). Maka kedua port ini ketika di inisialisasikan di awal harus di berikan logika high (1). Seperti ini :

mov p1, #0ffh

        Lalu input pada p3.0 yang mana di dapat dari sensor LDR (Light Dependent Resistor), input dari LDR ini akan di dapat dari output pada rangkaian comparator. Yang berarti bahwa apabila LDR terkena cahaya, maka akan menghasilkan output high (1) pada output comparator. Itu berarti bahwa p3.0 ini harus di inisialisasikan awalnya dengan logika low (0). Begitu juga dengan switch pada p3.2 yang terhubung ke vcc, yang berarti aktif high. Maka harus di inisialisasikan di awal dengan logika low (0). Seperti ini :

mov p3, #000h

        Lalu sekarang kita lihat outputnya. Outputnya berupa nyala lampu LED pada port p2.4 yang mana terhubung dengan kaki anoda LED. Ini berarti LED akan aktif jika mendapat logika high (1). Karena LED ini di andaikan adalah sebuah lampu, maka pada inisialisasi awal harus di berikan logika high (1) untuk menyalakan LED, karena kondisi awal LDR nya tadi adalah tidak aktif, yang berarti itu di andaikan kondisi awal adalah malam hari maka lampu harus menyala dan tirai dalam keadaan tertutup. Lalu output lainnya pada kaki p2.0 dan p2.2 yang terhubung ke driver motor DC, yang pada keadaan awal ini motor tidak aktif, maka dapat kita berikan inisialisasi awal berupa logika high (1) maupun logika low (0), tetapi disini kita akan menggunakan logika high agar semua pin pada port p2 berlogika sama, yaitu logika high (1), karena pada pin p2.6 terhubung ke kaki enable juga yang harus di inisialisasikan dengan logika high (1). Seperti ini :

mov p2, #0ffh

        Baiklah, semua port input maupun output telah kita inisialisasikan. Saatnya kita membuat logika pengkondisian programnya. Logikanya adalah seperti ini. Alat Tirai ini aktif dengan dua cara, manual dengan switch pada pin p3.2, lalu auto dengan kondisi LDR. Itu berarti apabila switch di tekan, maka tirai akan tertutup. Lalu apabila switch tidak di tekan, itu berarti akan bergantung pada kondisi LDR, jika LDR nya terkena cahaya (output comparator logika 1) maka tirai akan terbuka, lalu jika LDR tidak terkena cahaya (output comparator logika 0) maka tirai akan tertutup. Pengkondisiannya dapat di lakukan dengan sintaks seperti ini :

jb p3.2, tutup
jnb p3.2, pilih


        Jb p3.2,tutup berarti bahwa jika pin p3.2 mendapat logika high (1), maka akan melompat ke sub-routine tutup. Lalu jnb p3.2,pilih berarti bahwa jika pin p3.2 mendapat logika low (0), maka akan melompat ke sub-routine pilih.
        Baiklah, sekarang saatnya kita membuat outputnya. Apabila tirai terbuka, maka motor akan berputar CW (Clock Wise / Searah Jarum Jam). Lalu apabila tirai tertutup, maka motor akan berputar CCW (Counter Clock Wise / Berlawanan Jarum Jam). Itu berarti kita harus membuat perbedaan pada output pin p2.0 dan p2.2. Seperti ini :

buka :
mov p2, #0eeh
tutup :
mov p2, #0fbh

        Lalu bagaimana perputaran motor ini akan berhenti? Perputaran motor ini akan berhenti di picu oleh penekanan pada switch di p1.0 atau p1.2. Saat tirai di buka, maka motor akan berhenti apabila switch p1.0 di tekan. Lalu apabila tirai tertutup, maka motor akan berhenti apabila switch p1.2 di tekan. Seperti ini :

jnb p1.0, mati1
jnb p1.2, mati2

----        
        Baiklah, sepertinya tugas saya dalam me-review rangkaian dan program hanya sampai disini saja. Sekarang saatnya tugas kalian untuk menyatukan semua puzzle yang terpisah-pisah ini menjadi satu. Saya akan memberikan program lengkapnya di bawah. Semoga review saya ini dapat membantu anda dalam memahami rangkaian dan lalu membuat programnya berdasarkan gambar dan kondisi rangkaian. Kurang lebihnya saya minta maaf. By the way, saya membuka jasa pembuatan program, rangkaian, maupun konsultasi ataupun diskusi tentang rangkaian-rangkaian mikrokontroller seperti ini. Jika tertarik, kalian dapat langsung berkomentar saja pada tulisan ini. Nanti kita akan lanjutkan berkomunikasinya di luar komentar ini, entah dengan email, ym, fb, sms, dan sebagainya. Yang pasti kita tidak akan berdiskusi di kolom komentar. Baiklah, terima kasih banyak karena sudah meluangkan waktu untuk membaca tulisan saya.

----


Compiler : MIDE-51
Language : Assembler
MikroKontroller : AT89S51

$mod51
org 00h
mov p1, #0ffh
mov p2, #0ffh
mov p3, #000h
pil :
mov a,p3
jb p3.2, tutup
jnb p3.2, pilih
pilih :
jnb p3.0, tutup
jb p3.0, buka
buka :
mov p2, #0eeh
jnb p1.0, mati1
cjne a, p3, pil
sjmp buka
tutup :
mov p2, #0fbh
jnb p1.2, mati2
cjne a, p3, pil
sjmp tutup
mati1 :
mov p2, #0eah
cjne a, p3, pil
sjmp mati1
mati2 :
mov p2, #0fah
cjne a, p3, pil
sjmp mati2
end


 
Free Website TemplatesFreethemes4all.comFree CSS TemplatesFree Joomla TemplatesFree Blogger TemplatesFree Wordpress ThemesFree Wordpress Themes TemplatesFree CSS Templates dreamweaverSEO Design