Semua Tentang Belajar Teknologi Digital Dalam Kehidupan Sehari - Hari

  • IC Timer 555 yang Multifungsi

    IC timer 555 adalah sirkuit terpadu (chip) yang digunakan dalam berbagai pembangkit timer, pulsa dan aplikasi osilator. Komponen ini digunakan secara luas, berkat kemudahan dalam penggunaan, harga rendah dan stabilitas yang baik

  • Ayo Migrasi TV Digital

    Kami bantu anda untuk memahami lebih jelas mengenai migrasi tv digital, apa sebabnya dan bagaimana efek terhadap kehidupan. Jasa teknisi juga tersedia dan siap membantu instalasi - setting perangkat - pengaturan antena dan distribusi televisi digital ke kamar kos / hotel

  • Bermain DOT Matrix - LOVEHURT

    Project Sederhana dengan Dot Matrix dan Attiny2313. Bisa menjadi hadiah buat teman atau pacarmu yang ulang tahun dengan tulisan dan animasi yang dapat dibuat sendiri.

  • JAM DIGITAL 6 DIGIT TANPA MICRO FULL CMOS

    Jika anda pencinta IC TTL datau CMOS maka project jam digital ini akan menunjukkan bahwa tidak ada salahnya balik kembali ke dasar elektronika digital , sebab semuanya BISA dibuat dengan teknologi jadul

  • Node Red - Kontrol Industri 4.0

    Teknologi kontrol sudah melampaui ekspektasi semua orang dan dengan kemajuan dunia elektronika, kini semakin leluasa berkreasi melalui Node Red

Tampilkan postingan dengan label microcontroller. Tampilkan semua postingan
Tampilkan postingan dengan label microcontroller. Tampilkan semua postingan

Jumat, 21 Juni 2013

Tutorial: Text berjalan 3 Led Matrix




REVISI


Setelah beberapa pembaca mengeluh karena ga bisa jalan itu script...dan saya juga bingung dibuatnya, akhirnya terdeteksi bahwa saya menggunakan script dengan ARRAY yang melebihi RAM seperti gambar berikut ini :



JADI MOHON DIMAAFKAN !!



Atas permintaan seorang pembaca blog dengan id kaskus sn0bi, kali ini kita akan bahas perancangan 3 LED MATRIX yang menggunakan ATMega 8535. Sebenernya ini adalah perpanjangan dari project LOVE HURT yang hanya menggunakan 1 buat Led Matrix. Untuk mengurangi jumlah komponen yang dipakai, maka ukuran led matrix jangan melebihi dari 2" (inch) . Untuk dapat dirancang diatas breadboard / projectboard dipilihlah led matrix berukuran 1 inch.

Bahan-bahan dan skematiknya seperti berikut ini :

klik untuk memperjelas
*) catatan : perhatikan port ISP yg digunakan 6 pin..sesuaikan dengan yg kamu gunakan



Dari skematik diatas dapat dijelaskan bahwa ATMEGA8535 menggunakan clock internal / default 1MHz dan dot/led matrix diparalel dibagian baris. Untuk scanning kolom digunakan portD 0-7 dan portC 0-6. Sebenarnya kalo dilihat dari gambar diatas, kaki-kaki ATMega masih cukup untuk 1 buah led matrix (tinggal penyesuaian di script nya saja). Scanning cukup dilakukan dengan menggeser bit (active low) dari kiri ke kanan. Secara lengkap scriptnya seperti berikut :

#define F_CPU 1000000UL //ubah sesuai clock micro
#include <avr/io.h>
#include <util/delay.h>
#include <avr/eeprom.h>
#include <inttypes.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h> 
#include <string.h>

#define cepat 8  //ubah ini untuk mengatur kecepatan scroll

//UPDATED JUNE 9 2014 ...www.aisi555.com ....

const char textset[] PROGMEM  = 
{0x30, 0x4a, 0x4a, 0x4a, 0x7c,//a
0x7f, 0x28, 0x44, 0x44, 0x38,//b
0x80, 0x38, 0x44, 0x44, 0x44,//c
0x38, 0x44, 0x44, 0x28, 0x7f,//d
0x38, 0x54, 0x54, 0x54, 0x18,//e
0x08, 0x7e, 0x09, 0x09, 0x02,//f
0x08, 0x54, 0x54, 0x54, 0x3c,//g
0x7f, 0x08, 0x04, 0x04, 0x78,//h
0x80, 0x44, 0x7d, 0x40, 0x80,//i
0x20, 0x40, 0x44, 0x3d, 0x80,//j 
0x80, 0x7f, 0x18, 0x24, 0x42,//k
0x80, 0x41, 0x7f, 0x40, 0x80,//l
0x7c, 0x04, 0x78, 0x04, 0x78,//m
0x7c, 0x08, 0x04, 0x04, 0x78,//n
0x38, 0x44, 0x44, 0x44, 0x38,//o
0x7c, 0x14, 0x14, 0x14, 0x08,//p
0x08, 0x14, 0x14, 0x14, 0x7c,//q
0x7c, 0x08, 0x04, 0x04, 0x08,//r
0x48, 0x54, 0x54, 0x54, 0x24,//s
0x80, 0x04, 0x3f, 0x44, 0x44,//t
0x3c, 0x40, 0x40, 0x20, 0x7c,//u
0x1c, 0x20, 0x40, 0x20, 0x1c,//v
0x3c, 0x40, 0x30, 0x40, 0x3c,//w
0x44, 0x28, 0x10, 0x28, 0x44,//x
0x0c, 0x50, 0x50, 0x50, 0x3c,//y
0x44, 0x64, 0x54, 0x4c, 0x44,//z
0x3e, 0x51, 0x49, 0x45, 0x3e, //0
0x80, 0x42, 0x7f, 0x40, 0x80, //1
0x42, 0x61, 0x51, 0x49, 0x46, //2
0x41, 0x41, 0x45, 0x4b, 0x31, //3
0x18, 0x14, 0x12, 0x7f, 0x10, //4
0x27, 0x45, 0x45, 0x45, 0x39, //5
0x3c, 0x4a, 0x49, 0x49, 0x31, //6
0x01, 0x71, 0x09, 0x05, 0x03, //7
0x36, 0x49, 0x49, 0x49, 0x36, //8
0x06, 0x49, 0x49, 0x29, 0x1e, //9
0x7e, 0x11, 0x11, 0x11, 0x7e, //A
0x7f, 0x49, 0x49, 0x49, 0x36, //B
0x3e, 0x41, 0x41, 0x41, 0x22, //C
0x7f, 0x41, 0x41, 0x22, 0x1c, //D
0x7f, 0x49, 0x49, 0x49, 0x41, //E
0x7f, 0x09, 0x09, 0x09, 0x01, //F
0x3e, 0x41, 0x49, 0x49, 0x7a, //G
0x7f, 0x08, 0x08, 0x08, 0x7f, //H
0x80, 0x41, 0x7f, 0x41, 0x80,//I
0x20, 0x40, 0x41, 0x3f, 0x01, //J
0x7f, 0x08, 0x14, 0x22, 0x41, //K
0x7f, 0x40, 0x40, 0x40, 0x40, //L
0x7f, 0x02, 0x04, 0x02, 0x7f, //M
0x7f, 0x04, 0x08, 0x10, 0x7f, //N
0x3e, 0x41, 0x41, 0x41, 0x3e, //O
0x7f, 0x11, 0x11, 0x11, 0x0e, //P
0x3e, 0x41, 0x51, 0x21, 0x5e, //Q
0x7f, 0x09, 0x19, 0x29, 0x46, //R
0x46, 0x49, 0x49, 0x49, 0x31, //S
0x01, 0x01, 0x7f, 0x01, 0x01, //T
0x3f, 0x40, 0x40, 0x40, 0x3f, //U
0x1f, 0x20, 0x40, 0x20, 0x1f, //V
0x3f, 0x40, 0x38, 0x40, 0x3f, //W
0x63, 0x14, 0x08, 0x14, 0x63, //X
0x07, 0x08, 0x70, 0x08, 0x07, //Y
0x61, 0x51, 0x49, 0x45, 0x43, //Z
0x80, 0x80, 0x80};//""


const char textreal[] PROGMEM= { 'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',' ' } ;


char blk = 0x80;
char fulltext[17] ; 
char scrolltext[500];//panjang kalimat 300 dibagi 6 (5 kolom + 1pembatas)
//UBAH besar ARRAY scroltext[XXX] sesuaikan besar RAM IC yg dipakai..
char textnya[] = "3 Led Matrix ATMega8535 AHOCOOL SurabayA 2013";


void cleartext(void)  // MEMBERSIHKAN datanya menjadi kosong
{  uint8_t i;

      
   for(i=0 ; i <20 ; i++)
     { fulltext[i] = 0 ; }  

}


void convert_text(char *texte)
{

uint8_t a,b,max_text;
int c,d;

char dummy[1];

max_text=strlen(texte);

for(a=0 ; a<max_text; a++)

  {    
      for(b=0;b<65;b++)  // maximum jumlah definisi text di database array
     
   {
            strncpy_P(dummy,&textreal[b],1);
         
   if ( texte[a] == dummy[0]) break; 

   }
      
        d=b*5;          
      
      if(dummy[0] != ' ') for(c=d; c<d+5; c++) strncat_P(scrolltext,&textset[c],1); //spasi
      else  for(c=d; c<d+3; c++) strncat_P(scrolltext,&textset[c],1);
      
   strncat(scrolltext,&blk,1);
  }

}


void tulis_text(void)
{
uint8_t a;
int b,speed;

a=0;
speed=5;//UBAH NILAI speed sesuai keinginan dan kedip led


 
 while(a<16)

  {
 
 
for(b=0;b<speed;b++ ) 
{
    
 if(a<8 ) 
 
 {
    
 
 PORTD = ~(1<<a) ;
 PORTC =0b11111111;

 }
  
  else
 {
    
    PORTC = ~(1<<(a-8)) ;
 PORTD =0b11111111;
 
 }

 PORTA=fulltext[a];
 _delay_us(60);   

    PORTA=0x80;  //biar tidak berbayang


  }



 a++;
  } 


   
  }


void scrol(char *scrtxt)
{  uint8_t q,r,step =0;
   int maxstep;

    maxstep = (strlen(scrtxt) * 6) ;
   
    convert_text(scrtxt);
     

  while(step < ( maxstep + 30)   )
   {
  if(step < 15)
       {
        
     for(q=0; q <(16-step) ; q++ )       
               
  {   fulltext[q]= 0x80;      }
  
     for(q=(15-step); q <16 ; q++ )       
  {   fulltext[q]=scrolltext[q - 15 + step];    }
            
 for(r=0;r<cepat;r++) tulis_text(); 


  }  
       

  else if( step > (maxstep + 15 ) )
     {


     for(q=0; q <(maxstep + 30 - step) ; q++ )       
  {   fulltext[q]=scrolltext[step -15 + q];    }

  for(q=(maxstep + 30 - step); q <16 ; q++ )       
               
  {   fulltext[q]= 0x80;      }
          
        for(r=0;r<cepat;r++) tulis_text();   
        }


    else
 {

     for(q=0; q <16 ; q++ )       
  {   
  
  fulltext[q]=scrolltext[q + step -15];   
  
   }
            
  for(r=0;r<cepat;r++) tulis_text();  


  }  
      

 
 
  
      
   step++;
 
 
   }




}


int main(void)
{
 //bagian ini sesuaikan dengan port micro yg kamu gunakan
  DDRA = 0b11111111; // portA = data text dot matrix
  DDRC = 0b11111111; //scanning kolom
  DDRD = 0b11111111; //scanning kolom
  
  

 while(1)
  {
     scrol(textnya);  
     cleartext();


  }



 
 

 
return 0;
}

proses geser-geser yang terpenting adalah bagian berikut :

Scanning kolom  :

void tulis_text(void)
{
uint8_t a;
int b,speed;

a=0;
speed=20;//UBAH NILAI speed sesuai keinginan

while(a<16)
  {
  
for(b=0;b<speed;b++ ) 
{
if(a<8 ) 
{
PORTD = ~(1<<a) ;
PORTC =0b11111111;

}
  else
{  
 PORTC = ~(1<<(a-8)) ;
PORTD =0b11111111;
}
PORTA=fulltext[a];
_delay_us(300);   

    PORTA=0x80;  //biar tidak berbayang
  }

a++;

}


Dari script scanning  diatas dapat dilihat script   PORTD = ~(1<<a) ; yang berfungsi untuk menegasi pergeseran bit 1 menjadi active low. Jika menggunakan 4 buah matrix maka dialkukan penyesuaian kondisi if ketika port nya loncat ke seri port yg berbeda.


Geser Kiri :

void scrol(char *scrtxt)
{  int q,step =0;
   int maxstep;

  maxstep = (strlen(scrtxt) * 6) ;
convert_text(scrtxt); 

  while(step < ( maxstep + 30)   )  //30 = 15 awal + 15 akhir 
   {
if(step < 15)   //start awal
       {
    
   for(q=0; q <(16-step) ; q++ )   
               
{   fulltext[q]= 0x80;      }
   for(q=(15-step); q <16 ; q++ )   
{   fulltext[q]=scrolltext[q - 15 + step];  }
tulis_text(); 
}  
else if( step > (maxstep + 15 ) )    //akhir kalimat
   {
   for(q=0; q <(maxstep + 30 - step) ; q++ )   
{   fulltext[q]=scrolltext[step -15 + q];  }

for(q=(maxstep + 30 - step); q <16 ; q++ )   
               
{   fulltext[q]= 0x80;      }       
      tulis_text();
        }
    else
{

   for(q=0; q <16 ; q++ )   
{   
fulltext[q]=scrolltext[q + step -15]; // ditengah-tengah 
}         
tulis_text(); 
}  
 step++;

   }
}


Bagian terpenting adalah ketika memberikan efek kosong pada awal dan akhir dari urutan kalimat. Variable "maxstep" merupakanjumlah step scanning kolom maksimum dari kalimat, sedangkan variable "step" adalah langkah pergeseran. Untuk 3 buah matrix maka terdapat 15 step scanning kolom pada setiap kali penampilan huruf di matrix. Jadi jika menggunakan 4 matrix cukup merubah unsur penghitungan kolom yang ditampilkan saja (step = 20). Untuk geser atas atau animasi lainnya dapat dikreasikan dari project love hurt.

Hasil dari project ini yang dilakukan rekan sn0bi dari makasar seperti pada video berikut :




seperti biasa, jika ingin membeli bahan-bahannya bisa lewat aku, atau paket belajarnya di "custom" dengan 3 led matrix ? bisa...harga nego via contact aku ya...

SELAMAT MENCOBA
Share:

Rabu, 19 Juni 2013

Tutorial: RFID ID-12 Trainer Modul dan Aplikasi Pintu Berbasis RFID




Penulis mendapat modul starter kit RFID innovative dari pembaca blog yg kebingungan setelah membeli nya. Modul ini dapat diperoleh dengan harga sekitar 350 ribu dengan packing yang sudah terdapat komunikasi serial UART atau Rs232 serta beberapa rangkaian tambahan sehingga dapat dikatakan siap pakai. Modul Utama RFID adalah ID-12 yang bekerja pada frekuensi 125Khz dan hanya berfungsi sebagai reader. Terdapat antenna internal sehingga tinggal menempatkan kartu RFID di atasnya. Unutk model yang bisa write/menulis ke kartu RFID maka dibutuhkan jenis yang lebih advance yaitu ID-20


jaycon_systems_white_rfid_card_125khz.jpg (800×600)

Ternyata tidaklah sesusah yg dikira..bisa langsung dihubungkan menuju serial port atau usb to serial converter dan melalui software hyperterminal / putty  (9600 bps) ketika kartu RFID dideketkan ke modul akan muncul kode ascii seperti contoh ini :




4D00D584B1AD

Dari datasheet didapatkan penjelasan byte yg dikirim ketika kartu didekatkan berupa :




1. STX (0x02) , start transmission
2. 10 DATA ASCII
3. 2 byte checksum (ascii) 
4. <cr><lf> ETX , kalo hexanya 0x0D , 0x0A, 0x03


Ke 16 byte ini bisa dibaca langsung melalui serial port (tentunya ketika kartu yg sesuai ditempelkan dekan ID-12) akan tetapi checksumnya mubazir jika hanya kecepatan membaca kartu tidak tinggi, sehingga lebih baik hanya di compare semua byte ascii (10 + 2) jika ingin melakukan suatu proses pengecekan kartu.



Untuk rangkaian dari datasheet produk RFID Innovations, seperti berikut:








Perbedaan antara ID-0/ID-2 dan ID-12 hanya di antenna , dimana ID0/2 tidak memiliki antena internal seperti ID12. Tapi ID12 dapat juga dipasangkan antena external yg dapat digunakan bersamaan. Antenna dapat dibuat dengan lilitan kawat enamel diameter 0.5 mm yang dililit melingkar sekitar 100 putaran  dengan diameter lingkaran 10cm (kira2 menghasilkan 640uh, gunakan google untuk mencari kalkulator lilitan), dan kemudian jangan lupa memasangkan tunning capacitor yang bernilai sekitar 1,5nF. Untuk koneksinya dapat dilihat pada gambar diatas.


Jika modul trainner dihubungkan dengan Microcontroller maka cukup gunakan  mode UART TTL , dan hanya digunakan pin RX saja , karena tujuannya hanya membaca data serial yg diberikan oleh modul ketika membaca kartu.

jadi....kodenya kira2 begini , output ke LCD 16x2 (baca tutorial mengenai penulisan lcd disini):



#define F_CPU 4000000UL //sesuaikan dengan clock micro
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include "lcd.h"  //silahkan baca pembahasan menulis LCD

#define USART_BAUDRATE 9600 //baudrate 
#define BAUD_PRESCALE (((F_CPU / (USART_BAUDRATE * 16UL))) - 1) 



void init_usart(void)
{



   UCSRB |= (1 << RXEN) | (1 << TXEN);   
   UCSRC |= (1 << UCSZ0) | (1 << UCSZ1); 
   UBRRL = BAUD_PRESCALE; 
   UBRRH = (BAUD_PRESCALE >> 8);
   UCSRB |= (1 << RXCIE);  //interupt serial usart

    sei(); //enable interupt
  }




ISR(USART_RX_vect) //interupt ketika ada data yg diterima
{ 
 char databyte;
 
  
  databyte = UDR;  // isi data 



    if(databyte == 2) {  //deteksi STX (0x02h)
     
      lcd_gotoxy(0,1);
   }                     
    //tampilkan data kecuali data status  ke LCD
    else if((databyte != 0x0D)&&(databyte != 0x0A)&&(databyte != 0x03)) 
 {lcd_putc(databyte); 
    }



}


int main(void)
{


//inisialisasi port I/O

DDRC=0b1111111; //port LCD


ADCSRA &= ~_BV(ADEN); //matiin ADC biar irit

//inisialisasi LCD

lcd_init(LCD_DISP_ON);
lcd_clrscr();


lcd_puts("   BACA RF ID");

init_usart();

while(1) 
{




}



return 0;

}

Script diatas hanya berfungsi untuk mendapatkan pembacaan dari kartu RFID yang didekatkan ke modul. Untuk lebih ke aplikasi selanjutnya kita dapat memanfaatkan nomer kartu yang unique yang kemudian akan dipakai sebagai pembuka suatu slot kunci dari selenoid. Slot kuncinya seperti ini nih :



Jadi ntar salah satu pin dari microcontroller akan meng ON dan OFF selenoid sebagai proses Kunci dan Buka dari pintu. Ketika tombol kunci ditekan maka selenoid akan OFF sehingga ujung slot akan mengunci pintu. Ketika kartu yang kodenya sesuai dengan yang diijinkan membuka (atau memakai daftar database pun bisa) maka Micro akan meng ON kan selenoid sehingga slot akan tertarik oleh magnet selenoid dan pintu akan terbuka. Selenoid ini harus di drive oleh relay atau transistor agar tidak merusak microcontroller dan rata-rata tegangan selenoid tidak bisa di drive langsung oleh microcontroller. contohnya seperti gambar berikut:




Script komparasi dari kartu RFID seperti berikut ini :


/*=============================
RF ID trainner modul IE version
connected to IE MINSYS 8535  
For DOOR LOCK via SELENOID
by: ahocool@gmail.com    www.aisi555.com
=============================*/
#define F_CPU 4000000UL //sesuaikan clock xtal yg dipakai
#include <string.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include "lcd.h"  //untuk LCD

#define USART_BAUDRATE 9600  //baudrate komunikasi serial
#define BAUD_PRESCALE (((F_CPU / (USART_BAUDRATE * 16UL))) - 1) 

uint8_t dataindex,detik;

char data[12];
char pass[12]="4D00D584B1AD" ;  
//sesuaikan dengan pembacaan kartu via PC & hyperterminal/putty , kartu yg digunakan yg dapat membuka pintu



void init_usart(void)  //inisialisasi usart
{



   UCSRB |= (1 << RXEN) | (1 << TXEN);   
   UCSRC |= (1 << UCSZ0) | (1 << UCSZ1); 
   UBRRL = BAUD_PRESCALE; 
   UBRRH = (BAUD_PRESCALE >> 8);
   UCSRB |= (1 << RXCIE);  //interupt serial usart
sei();
  }


void init_jam(void) //timer 8 detik tanpa aktivitas, LCD mati
{
   TCCR1B |= (1 << WGM12); // Configure timer 1 for CTC mode
   TIMSK |= (1 << OCIE1A); // Enable CTC interrupt 
   OCR1A  = 62499; //compare the CTC A 
   TCCR1B |= (1 << CS11)|(1 << CS10); // Start timer at Fcpu/64
   TCNT1 = 0;
   
   PORTC |= (1<<PC7); //hidupkan LCD
   detik=0;

}


ISR(TIMER1_COMPA_vect) //interrupt detik

{ 


detik ++;

if(detik == 2)
{
   lcd_gotoxy(0,1);  
   lcd_puts("Tempelkan Kartu!");

}

if(detik >=8) { //8 detik layar lcd mati

PORTC &= ~(1<<PC7); // lcd mati
TCCR1B=0;
}



}



ISR(USART_RX_vect) //interupt data serial dari RFID
{ 
 char databyte;
 uint8_t a;
 
  
  databyte = UDR;   



    if(databyte == 2) {  //Start transmission
     
      dataindex=0;
   }                     
     //byte status di skip aja  
    else if((databyte != 0x0D)&&(databyte != 0x0A)&&(databyte != 0x03)) 
 { 
   data[dataindex - 1]=databyte; //simpan ke memory hasil pembacaan
 }

 
    if(dataindex > 14 ) //jika sudah baca semua data
     {

       for(a=0 ;a<12 ; a++) { 

       if(data[a] != pass[a]) break; //komparasi nilai pembacaan RFID

    }


    if( a == 12) { //jika kartu benar

       lcd_gotoxy(0,1);  
          lcd_puts("                ");
          lcd_gotoxy(0,1);  
          lcd_puts("  PINTU DIBUKA  ");
    PORTA |=(1<<PA0);
          init_jam();

          }
        else{
    lcd_gotoxy(0,1); //jika kartu salah  
          lcd_puts("                ");
          lcd_gotoxy(0,1);  
          lcd_puts("  Kartu Salah ! ");

          init_jam();
    
    }  
  }
   
   
    dataindex++;



}

void tombol(void) //routine pembacaan tombol
{


if(bit_is_clear(PINA, PINA1)) 
   { 
    
   lcd_gotoxy(0,1);  
   lcd_puts("                ");
   lcd_gotoxy(0,1);  
   lcd_puts("  PINTU DIKUNCI ");
     
   PORTA &= ~(1<<PA0);

   init_jam();
   

   
   }

}



int main(void)
{


//inisialisasi port I/O, sesuaikan dengan IC AVR yg dipakai

DDRC=0b11111111; //port LCD dan PC7 terhubung ke VCC dari LCD (kalau tidak kuat di drive transistor) untuk mematikan layar jika melebihi waktu (biar hemat listrik)

DDRA |= (1<<PA0); //output ke relay/transistor driver selenoid kunci & led status pintu 
DDRA &= ~(1<<PA1); //tombol kunci pintu ,tombol lepas= pull up 10k ke vcc, tombol ditekan = nyambung ke GND


ADCSRA &= ~_BV(ADEN); //matiin ADC biar irit

//inisialisasi LCD

init_jam();

lcd_init(LCD_DISP_ON);
lcd_clrscr();


lcd_puts(" RFID DOOR LOCK\n");
lcd_puts("Tempelkan Kartu!");
init_usart();

while(1) 
{

tombol();


}



return 0;

}




Hasilnya seperti ini nih...




Selamat Mencoba
Share:

Jumat, 07 Juni 2013

Tutorial: POV TEXT Sederhana



Yang mau belajar tentang POV... nih ane share, tapi yang model paling sederhana dulu ya...
Jadi startnya masih ngaco karena ga ada semacam sensor penanda posisi motor
tapi lumayan lah buat start pemula....

Sebelumnya kita perlu tau prinsip POV,sebenernya sama dengan prinsip scanning led matrix, dimana tiap byte dari baris dikeluarkan satu persatu berdasarkan periode waktu. Karena led ini bergerak (dalam hal ini berputar) maka kelembaman mata akan menyebabkan efek terlihatnya teks. Seperti pada video berikut ini :






Video diatas merupakan dasar POV yang cukup sederhana yang tidak memiliki sensor penanda awal posisi motor dan deretan led, sehingga efek yang muncul adalah tulisan yang tidak diam alias ikut muter. Sensor yang mungkin dipakai adalah Opto sensor atau magnetic-hall efect sensor. Sensor ini nantinya akan mentrigger interupt yang akan menandai titik referensi awal dari motor.


0307feat2fig1.gif (410×433)



Hall_sensor_tach.gif (274×204)
Sensor Opto dan Magnetic (Hall Effect)





skematiknya ini ya ...



scriptnya ga jauh beda dengan praktek LOVEHURT kok ...


#define F_CPU 1000000UL

#include <avr/io.h>

#include <util/delay.h>

#include <avr/eeprom.h>

#include <inttypes.h>

#include <avr/interrupt.h>

#include <avr/pgmspace.h> 

#include <string.h>



//database Huruf

const char h_A[5] PROGMEM = {0x7e, 0x11, 0x11, 0x11, 0x7e}; //A

const char h_B[5] PROGMEM = {0x7f, 0x49, 0x49, 0x49, 0x36}; //B

const char h_C[5] PROGMEM = {0x3e, 0x41, 0x41, 0x41, 0x22}; //C

const char h_D[5] PROGMEM = {0x7f, 0x41, 0x41, 0x22, 0x1c}; //D

const char h_E[5] PROGMEM = {0x7f, 0x49, 0x49, 0x49, 0x41}; //E

const char h_F[5] PROGMEM = {0x7f, 0x09, 0x09, 0x09, 0x01}; //F

const char h_G[5] PROGMEM = {0x3e, 0x41, 0x49, 0x49, 0x7a}; //G

const char h_H[5] PROGMEM = {0x7f, 0x08, 0x08, 0x08, 0x7f}; //H

const char h_I[5] PROGMEM = {0x80, 0x41, 0x7f, 0x41, 0x80};//I

const char h_J[5] PROGMEM = {0x20, 0x40, 0x41, 0x3f, 0x01}; //J

const char h_K[5] PROGMEM = {0x7f, 0x08, 0x14, 0x22, 0x41}; //K

const char h_L[5] PROGMEM = {0x7f, 0x40, 0x40, 0x40, 0x40}; //L

const char h_M[5] PROGMEM = {0x7f, 0x02, 0x04, 0x02, 0x7f}; //M

const char h_N[5] PROGMEM = {0x7f, 0x04, 0x08, 0x10, 0x7f}; //N

const char h_O[5] PROGMEM = {0x3e, 0x41, 0x41, 0x41, 0x3e}; //O

const char h_P[5] PROGMEM = {0x7f, 0x11, 0x11, 0x11, 0x0e}; //P

const char h_Q[5] PROGMEM = {0x3e, 0x41, 0x51, 0x21, 0x5e}; //Q

const char h_R[5] PROGMEM = {0x7f, 0x09, 0x19, 0x29, 0x46}; //R

const char h_S[5] PROGMEM = {0x46, 0x49, 0x49, 0x49, 0x31}; //S

const char h_T[5] PROGMEM = {0x01, 0x01, 0x7f, 0x01, 0x01}; //T

const char h_U[5] PROGMEM = {0x3f, 0x40, 0x40, 0x40, 0x3f}; //U

const char h_V[5] PROGMEM = {0x1f, 0x20, 0x40, 0x20, 0x1f}; //V

const char h_W[5] PROGMEM = {0x3f, 0x40, 0x38, 0x40, 0x3f}; //W

const char h_X[5] PROGMEM = {0x63, 0x14, 0x08, 0x14, 0x63}; //X

const char h_Y[5] PROGMEM = {0x07, 0x08, 0x70, 0x08, 0x07}; //Y

const char h_Z[5] PROGMEM = {0x61, 0x51, 0x49, 0x45, 0x43}; //Z

const char h_27[5] PROGMEM = {0x32, 0x49, 0x79, 0x41, 0x3f}; //@

const char h_28[5] PROGMEM = {0x02, 0x01, 0x51, 0x09, 0x06}; //?

const char h_29[5] PROGMEM = {0x80, 0x80, 0x5f, 0x80, 0x80}; //!

const char h_30[5] PROGMEM = {0x3e, 0x51, 0x49, 0x45, 0x3e}; //0

const char h_31[5] PROGMEM = {0x80, 0x42, 0x7f, 0x40, 0x80}; //1

const char h_32[5] PROGMEM = {0x42, 0x61, 0x51, 0x49, 0x46}; //2

const char h_33[5] PROGMEM = {0x41, 0x41, 0x45, 0x4b, 0x31}; //3

const char h_34[5] PROGMEM = {0x18, 0x14, 0x12, 0x7f, 0x10}; //4

const char h_35[5] PROGMEM = {0x27, 0x45, 0x45, 0x45, 0x39}; //5

const char h_36[5] PROGMEM = {0x3c, 0x4a, 0x49, 0x49, 0x31}; //6

const char h_37[5] PROGMEM = {0x01, 0x71, 0x09, 0x05, 0x03}; //7

const char h_38[5] PROGMEM = {0x36, 0x49, 0x49, 0x49, 0x36}; //8

const char h_39[5] PROGMEM = {0x06, 0x49, 0x49, 0x29, 0x1e}; //9

const char h_40[5] PROGMEM = {0x80, 0x60, 0x60, 0x80, 0x80}; //dot

const char h_41[5] PROGMEM = {0x20, 0x10, 0x08, 0x04, 0x02}; //slash

const char h_42[5] PROGMEM = {0x08, 0x08, 0x08, 0x08, 0x08}; //-

const char h_43[5] PROGMEM = {0x80, 0x80, 0x80, 0x80, 0x80}; //blank

const char h_44[5] PROGMEM = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; //end



char charnya[5];



void tulis(void)



{



int a;



for(a=0 ; a<5 ;a++)

 { 

   PORTD = charnya[a] ;

   _delay_ms(2);



 }





PORTD = 0x80 ;

_delay_ms(2);

}







int main(void)

{
    DDRD = 0b1111111; // PD0-PD6 output

 while(1)

 {

//ubah susunan huruf sesuai keinginan (asal ga penuh aja memorynya)



     strncpy_P(charnya,h_A,5);

  tulis();



  strncpy_P(charnya,h_H,5);

  tulis();



  strncpy_P(charnya,h_O,5);

  tulis();



         strncpy_P(charnya,h_C,5);

  tulis();



  strncpy_P(charnya,h_O,5);

  tulis();



  strncpy_P(charnya,h_O,5);

  tulis();



  strncpy_P(charnya,h_L,5);

  tulis();



     _delay_ms(500);  //ubah2 sesuai keinginan dan kecepatan motor

 }

 

return 0;

}









lumayan kan ? skematik dalam bentuk eagle dapat didownload disini
Share:

Kamis, 06 Juni 2013

Tutorial: Text Scroll 12 Led Matrix



Ayo kita bikin scroll text dengan led matrix yang panjang. Pada paket belajar microcontroller yang dijual disini terdapat project terakhir yaitu 1 led  matrix yang bisa ditulisi text yang dinamakan project LOVEHURT (pembahasan script disini). Bagaimana dengan led matrix yang lebih panjang ? Wah kaki microcontroller pasti habis tuh ? Tenang saja, kita pernah bahas membuat LED BERJALAN yang panjang dengan cara cascading 4017. Jadi clock dan reset dari 4017 dikendalikan oleh microcontroller, sedangkan outputnya akan melakukan scanning kolom dari led matrix [5 x N(jumlah led matrix)]. Sedangkan untuk 7 bit baris akan diparalel dan data text dikirim sesuai timing scaning kolom.

Skematiknya agak ribet, bisa dilihat disini ya .. (klik untuk memperjelas)




*) Pin CLK dari  semua 4017 dihubungkan ke PE1
*) pin 4017 terakhir (scan ke 61) dapat juga dihubungkan ke Reset 4017 pertama menggunakan diode 1n4148
untuk IC AVR lain silahkan menyesuaikan


Untuk mendrive setiap kolom maka diperlukan IC ULN 2003 sebagai inverter logika "1" dari output scanning 4017 ke Ground dan ada keuntungan lainnya yaitu dengan komponen transistor darlington pada ULN akan menyeragamkan nyala tiap dot dari LED MATRIX walaupun yang menyala hanya 1 buah atau 7 buah dalam tiap scanning. Skematik dibawah merupakan kreasi penulis untuk memudahkan penyusunan ULN2003 ke LED MATRIX agar lebih simple dan tidak memerlukan kabel yang banyak.




Jika rangkaian sudah disusun kemudian downloadkan script program yang sudah saya upload disini. Untuk contoh program dari script yang dulu saya buat untuk rekan dari aceh yang kita gunakan adalah internal memori dan eeprom untuk text dan animasi. Terdapat juga script untuk kalender dimana tombol untuk setting kalender dihubungkan ke pin INT (yang ada resistor pull up) sehingga switch diharuskan menghubungkan  pin ke GND. Contoh ini menggunakan xtal 8MHZ atau internal default 1MHZ juga bisa asal dilakukan penyesuaian pada script.

Pada contoh script yang menggunakan xtal 7.3728 MHz ditujukan untuk kontrol via PC/ komputer melalui program SecureCrt (silahkan cari di google) dan dihubungkan menggunakan serial port atau USB to serial converter jika serial port tidak tersedia. SecureCrt sangatlah memudahkan programing karena ada fasilitas scripting Visual Basic sehingga perintah serial dapat dikirimkan secara otomatis.

Cara Me-Run script pada SecureCrt
Contoh-contoh script VB - SecureCrt ada pada file yg sama yang didownload sebelumnya (script).


Hasilnya yang bisa bikin ngiler kayak gini nih .....





Kepingin ? Bahan-Bahannya dapat dibeli dari saya kok, tapi asal sudah ada dasar microcontrollernya,kalo ndak ya kudu belajar dulu via paket belajar disini ..... Silahkan hubungi kontak saya ya...
Share:

Selasa, 04 Juni 2013

Tutorial: ADC lanjutan - Termometer dengan LM35 dan ATmega8

Kita akan melanjutkan pembahasan dasar ADC sebelumnya, dengan merubah inputan trimpot sebagai voltage divider menjadi inputan dari sensor temperatur yg sangat umum yaitu LM35.




LM35 sangatlah gampang dipakai , hanya dengan memberikan tegangan VCC (kali ini pake 5V) dan ground, maka di pin output akan terjadi perubahan tegangan sebesar 10mV tiap perubahan 1 derajat Celcius.

Skematik dari termometer tidak jauh berbeda dengan project sebelumnya, hanya mengganti trimpot dengan LM35



klik untuk memperbesar



Karena LM35 menggunakan step per derajat sebesar 10mili volt dan mega 8 memiliki resolusi 10 bit dan step per bit adalah 4,9 mili volt, maka secara mudah pembacaan ADC dari LM 35 dapat langsung dirumuskan sebagai 


SUHU = PEMBACAAN ADC / 2

Skrip dibawah ini merupakan cuplikan dari main program, untuk inisialisasi dan lainnya dapat dibaca pada pembahasan dasar adc sebelumnya.

int main(void)
{

uint16_t baca,decimal,pecahan;

char derajat = 0xDF; // karakter derajat
char dum;


lcd_init(LCD_DISP_ON);
lcd_clrscr();
lcd_gotoxy(0,0);
lcd_puts("TEST ADC ATMEGA8");


initADC();
  

   while(1)
   {

      baca=ReadADC(0); //baca ADC

      lcd_gotoxy(0,1);
      lcd_puts("Suhu=");

   itoa(baca/2,&dum); // konversi ke suhu
   lcd_puts(&dum);
    
   lcd_putc(',');
      
   itoa((baca%2)*5,&dum); // kasi resolusi 0.5
   lcd_puts(&dum);
    
      lcd_putc(' ');
      lcd_putc(derajat);
   lcd_putc('C');
  

      _delay_ms(100);

   }







return 0;

}


hasilnya seperti berikut :






MEMBUAT PEMBACAAN ADC LEBIH STABIL






Dari video diatas, kita lihat hasil pengukuran terlalu loncat2 ....wahh parah, walaupun mengikuti saran menambah filter LC ke AVCC seperti di datasheet dan C ke Aref



wahhh ...pusing juga belom sukses...akhirnya kita baca lagi datasheet dibagian "ADC NOISE CANCELER"

yang aku lakukan dengan menambah LC filter dinamakan analog noise canceler. Yang belum aku lakukan adalah menambahkan "ADC NOISE REDUCTION" yaitu memberikan posisi "SLEEP" saat sebelum konversi dilakukan ...

dan satu lagi, ketika sleep mode dan konversi, penggunaan output di minimalkan seperti dengan mematikan output ke 7 segment


void initADC()

{

ADMUX=(1<<REFS0);// Aref=AVcc;

ADCSRA|=(1<<ADEN)|(1<<ADIE)|(7<<ADPS0); //interupt aktif

sei();

}



uint16_t ReadADC(uint8_t ch)

{

  

  posisi(0);  //MATIKAN OUTPUT KE 7 SEGMENT



  MCUCR |= _BV(SE);  // Sleep Enable, jadi abis ini processor diturunkan loadnya



 MCUCR |=_BV(SM0);  // mode ADC NOISE REDUTION

  

   //Select ADC Channel ch must be 0-7

   ch=ch&0b00000111;

   ADMUX|=ch;



   //Start Single conversion



   ADCSRA|=(1<<ADSC);



   //Wait for conversion to complete

   while(!(ADCSRA & (1<<ADIF)));



   //Clear ADIF by writing one to it

   ADCSRA|=(1<<ADIF);



   return(ADC);



   MCUCR &= ~_BV(SE) ;  //BANGUN DARI SLEEP

}










dan voilaaa .....pembacaan ADC dari LM 35 menjadi lebih stabil


SELAMAT MENCOBA
Share:

Senin, 03 Juni 2013

Tutorial: Penggunaan ADC dari AVR - Praktek voltmeter ATmega8

Tutorial ini pernah dibahas di forum kaskus yang juga saya asuh dan tidak ada salahnya untuk saya tulis lagi disini (untuk alasan kemudahan search). ADC yang embedded pada microcontroller seri AVR merupakan suatu nilai tambah sehingga banyak yang beralih ke jenis microcontroller ini.

Seri AVR yg memiliki ADC yg ada dipasaran adalah : ATtiny26, Mega8/8535/16/32 etc . Umumnya seri yg umum dipasaran memiliki lebih dari satu port ADC dengan resolusi 10bit

sebelumnya kita bahas dulu ADC....ADC dulunya terpisah dari micro, biasanya jaman tahun 2000 kebawah kita harus menggunakan ADC terpisah (contoh ADC 0808) yg selanjutnya akan diolah oleh kontroller. contoh rangkaiannya seperti ini, TS inget dulu pernah praktikum bikin voltmeter trus dibaca melalui paralel port PC

 

ADC 0808 ini memiliki resolusi 8 bit, jadi hasil pengukuran secara digital 0-254
jika AVR memiliki resolusi 10 bit, jadi biner pengukuran 0-1023.
Jadi resolusi menentukan kepekaan dari pembacaan ADC, semisal jika 8 bit dan range pengukuran 0-5V maka perubahan 1bit = 5/253 = 19,6 mV. Jika ADC 10 bit maka perubahan 1bit = 5/1023 = 4,9 mV

ADC akan meminta untuk diberikan tegangan Vref, yg merupakan tegangan cuplik referensi dari analog input. Seinget saya ADC 0808 membutuhkan tegangan referensi Vmax/2 , jadi jika range tegangan 0-5v maka perlu dikasi Vref 2.5 V.

Untuk AVR dapat dipilih tegangan Vref internal (2.56v), VCC sebagai Vref atau Vref external. Kali ini kita menggunakan mode yg paling sederhana yaitu Vref=Vcc , mode pembacaan sekali dan IC yg dipilih adalah ATMEGA 8. Vref merupakan suatu tegangan yang menunjukkan nilai maximum  dari pembacaan ADC sehingga mewakili resolusinya. Jadi ADC akan mengeluarkan data binner yang mewakili nilai 0 - Vref  dan diperlukan nilai tegangan yang stabil, maka apabila menggunakan baterai atau supply yg dapat naik turun maka diperlukan nilai vref yang stabil dengan regulator tegangan.

Pin ADC pada microcontroller seri AVR memiliki keterbatasan input tegangan yang hanya maximum 6volt, sehingga jika memerlukan pengukuran tegangan (DC) yang lebih tinggi dapat dilakukan pembagian tegangan sederhana menggunakan resistor sehingga tegangan max yg masuk ke ADC tidak melebihi spesifikasi datasheet. Rangkaian buffer atau voltage follower menggunakan op-amp mungkin akan menstabilkan tegangan input sebelum masuk ke pin ADC.




figure792

displaymath1978


Untuk rangkaian pertama, kita akan mencoba mebuat pembacaan tegangan pada TRIMPOT 10K, dimana berfungsi sebagai voltage divider dan dibaca oleh ADC port 0. Tampilannya akan dikirim menuju LCD 2x16 baris

INGAT karena memakai LCD, maka sebaiknya baca terlebih dulu pembahasan menulis di LCD

Siapkan rangkaian berikut (klik buat gambar lebih jelas)





selanjutnya kita bahas satu persatu codingnya :

I. Insialisai 

Code:
#define F_CPU 1000000UL //clock mega8 internal default
#include <string.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <avr/eeprom.h>
#include "lcd.h" //library lcd milik pfleury


void initADC()  //inisialisasi mode ADC dari mega8
{
ADMUX=(1<<REFS0);// Aref=AVcc;
ADCSRA=(1<<ADEN)|(7<<ADPS0);
}

II. Pembacaan data ADC

Code:
uint16_t ReadADC(uint8_t ch)
{
   //pemilihan Ch ADC 0-7
   ch=ch&0b00000111;
   ADMUX|=ch;

   //mulai konversi

   ADCSRA|=(1<<ADSC);

   //tunggu sampai konversi selesai
   while(!(ADCSRA & (1<<ADIF)));

   //bersihkan ADIF untuk pembacaan selanjutnya
   ADCSRA|=(1<<ADIF);

  //kembalikan nilai pembacaan ADC
   return(ADC); 
}
III. Script Merubah Binner ke ascii

karena pembacaan ADC berupa binner, maka perlu dirubah menjadi ASCII dan dapat langsung ditampilkan ke LCD. Sebenernya WinAVR string.h memiliki fungsi "itoa" / integer to ascii, tetapi memakan memory yg lebih dan mubazir karena konversinya hanya 1 digit saja

Code:
void reverse(char s[]) 
{ 
   int c, i, j; 
    
   for (i = 0, j = strlen(s)-1; i < j; i++, j--){ 
      c = s[i]; 
      s[i] = s[j]; 
      s[j] = c; 
   } 
} 
void itoa(int n, char s[]) 
{ 
   int i, sign; 
    
   if ((sign = n) < 0) // record sign 
      n = -n;         // make n positive 
   i = 0; 
   do {   // generate digits in reverse order 
      s[i++] = n % 10 + '0'; // get next digit 
   } while ((n /= 10) > 0); // delete it 
   if (sign < 0) 
      s[i++] = '-'; 
   s[i] = '\0'; // add null terminator for string 
   reverse(s); 
}
IV. Program Utama
Code:
int main(void)
{

uint16_t baca,decimal,pecahan;
char dum;

//Inisialisasi LCD (dibahas di tutorial laen)

lcd_init(LCD_DISP_ON);
lcd_clrscr();
lcd_gotoxy(0,0);
lcd_puts("TEST ADC ATMEGA8");


initADC(); //panggil inisialisai ADC


   while(1)
   {

      baca=ReadADC(0); // baca ADC di port 0 , putar-putar trimpot

       // mencari nilai decimal dan pecahan 
       // range 0-5V dengan resolusi 10 bit = 1023 step
      // jadi tiap step = 4,9 mili volt 
      //kalibrasikan dengan nilai VCC  yg sebenarnya

   decimal= (baca * 4.9)/1000 ;
   pecahan= ( ((baca * 4.9) - (decimal * 1000) ) /10);
    
      //tampilkan di LCD

      lcd_gotoxy(0,1);
      lcd_puts("Nilai=");

      itoa(decimal,&dum);
   lcd_puts(&dum);
   lcd_putc(',');
      
       if(pecahan <10) lcd_putc('0');

      itoa(pecahan,&dum);
   lcd_puts(&dum);

   lcd_puts(" V    ");
  

      _delay_ms(100); //kasi delay sebentar

   }

return 0;

}

hasil dari skematik & coding diatas dapat dilihat pada gambar berikut :



Share:

Kamis, 30 Mei 2013

SMS KONTROL: Kirim SMS dengan AVR ATTiny 2313



  


Pada praktek kali ini kita akan memanfaatkan ATtiny 2313 sebagai controller untuk mengirim sms ketika tombol ditekan


Baud rate untuk komunikasi RS232 adalah 9600, sehingga sebelum menggunakan modem (modem yg dipake modem wavecom dengan port rs232) perlu diset baud rate nya 9600 dengan AT command melalui PC dengan software terminal seperti hyperterminal atau putty. Ingat secara default modem wavecom memiliki baudrate 115200 sehingga koneksi awal menggunakan baudrate 115200. Setting juga mode control dari komunikasi serial yang hanya menggunakan 3 kabel (tx rx gnd) sehingga dipilih control mode = none.


AT+IPR=9600<enter>
OK
AT+IFC=0,0<enter>
OK
AT&W<enter>



Rangkaian elektronik nya sebagai berikut : (klik untuk memperjelas)


*) koneksi dari PORT Serial ke Serial DB9 secara cross , 1 vs 3(DB9-Rx) , 2 vs 2(DB9-Tx) , GND=5(DB9)
**) xtal yg digunakan nilainya khusus (7372800), jika menggunakan yg umum (4/8 mhz) atau default 1Mhz maka akan terjadi error 0,2%, tetapi tidak terlalu signifikan jika hanya kirim sms
***) ketika tombol ditekan maka micro akan mengirimkan perintah ke wavecom untuk mengirim sms


secara bertahap kita akan bahas programming dalam GCC-WINAVR-AVRSTUDIO




Inisialisasi Awal

Yang utama dari bagian inisialisasi adalah penulisan clock CPU yang digunakan, sebaiknya membaca datasheet dibagian BAUD RATE dan hubungannya dengan persentase error akibat pembagian clock yang tidak bulat.

#define F_CPU 7372800UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h> 

//definisi baudrate RS232

#define USART_BAUDRATE 9600
#define BAUD_PRESCALE (((F_CPU / (USART_BAUDRATE * 16UL))) - 1)


Inisialisasi command2 AT COMMAND sebagai variabel constant



//ganti nomer HP 
const char sms[] PROGMEM=  "AT+CMGS=0812345678\r test dari micro";

const char smsend[] PROGMEM= {0x1A}; // ascii dari CTRL+Z

Routine untuk inisialisasi USART


void init_usart(void)
{


   UCSRB |= (1 << RXEN) | (1 << TXEN);   
   UCSRC |= (1 << UCSZ0) | (1 << UCSZ1); 
   UBRRL = BAUD_PRESCALE; 
   UBRRH = (BAUD_PRESCALE >> 8);
   UCSRB |= (1 << RXCIE);  //interupt serial usart

  }


Routine untuk kirim karakter melalui RS232



void USART_Tx(unsigned char data)
{   
    
   while (!(UCSRA & (1<<UDRE)));{} // wait till transmit Data register is empty
    UDR = data; // Send data to the computer
}

void kirim_text(const char *data)
{
   while (pgm_read_byte(data) != 0x00)
     USART_Tx(pgm_read_byte(data++));
}

Routine interupt untuk membaca tombol dan kirim sms



SIGNAL (SIG_INT0)
{

kirim_text(sms);
kirim_text(smsend); 
}
Routine main program


int main(void)
{
   GIMSK |= (1<<INT0) ; // tombol interupt  0
   MCUCR |= (1<<ISC01)| (1<<ISC00); //rising edge interupt

   init_usart(); // inisialisai komunikasi usart
 
   sei(); //hidupkan interupt


while(1)

   {
   }


}

Jika menggunakan clock external / xtal , jangan lupa untuk mengaktifkan clock external dari Attiny di fusebit/CKSEL, pilihlah frek yg high. 




Aplikasi pada contoh praktek kali ini dapat digunakan juga dalam berbagai keperluan, diantaranya:


- Alarm (contoh pintu terbuka langsung kirim sms, sensor menggunakan limit switch)
- Deteksi level tegangan AC jika drop langsung kirim sms (sensor menggunakan komparator)
- Deteksi level air, misal untuk pendeteksi banjir maka otomatis mengirim sms (sensor level air sederhana menggunakan transistor FET)

- dsb

SELAMAT MENCOBA
Share:

Kontak Penulis



12179018.png (60×60)
+628155737755

Mail : ahocool@gmail.com

Site View

Categories

555 (8) 7 segmen (3) adc (4) amplifier (2) analog (19) android (12) antares (8) arduino (26) artikel (11) attiny (3) attiny2313 (19) audio (5) baterai (5) blog (1) bluetooth (1) chatgpt (2) cmos (2) crypto (2) dasar (46) digital (11) dimmer (5) display (3) esp8266 (25) euro2020 (13) gcc (1) iklan (1) infrared (2) Input Output (3) iot (58) jam (7) jualan (12) kereta api (1) keyboard (1) keypad (3) kios pulsa (2) kit (6) komponen (17) komputer (3) komunikasi (1) kontrol (8) lain-lain (8) lcd (2) led (14) led matrix (6) line tracer (1) lm35 (1) lora (7) MATV (1) memory (1) metal detector (4) microcontroller (70) micropython (6) mikrokontroler (1) mikrokontroller (14) mikrotik (5) modbus (9) mqtt (3) ninmedia (5) ntp (1) paket belajar (19) palang pintu otomatis (1) parabola (88) pcb (2) power (1) praktek (2) project (33) proyek (1) python (7) radio (26) raspberry pi (4) remote (1) revisi (1) rfid (1) robot (1) rpm (2) rs232 (1) script break down (3) sdcard (3) sensor (2) sharing (3) signage (1) sinyal (1) sms (6) software (18) solar (1) solusi (1) tachometer (2) technology (1) teknologi (2) telegram (2) telepon (9) televisi (167) television (28) transistor (2) troubleshoot (3) tulisan (93) tutorial (108) tv digital (6) tvri (2) vu meter (2) vumeter (2) wav player (3) wayang (1) wifi (3)

Arsip Blog

Diskusi


kaskus
Forum Hobby Elektronika