Subscribe via email

Enter your email address:

Delivered by FeedBurner

Detektor beban 220 Volt AC (2)

Ini lanjutan dari artikel Detektor Beban 220Volt AC beberapa waktu lalu. Di artikel itu iika ada perubahan keadaan Lampu, maka nilai R dari LDR juga berubah. Ternyata banyak yang bingung gimana cara interface perubahan  R dari LDR  ke microcontroller?bingung (termasuk gua sendiri :-p)

hmm ….  LOGIC yang diminta adalah:

 

  • saat Lampu mati, logic sensor HIGH
  • jika Lampu  nyala, logic sensor LOW
    Ide pertama yg terpikir: LDR di Pull Up pake R 2k2. Saat Lampu masih mati kondisi logic yg diperoleh HIGH(5 volt) , ini dah sesuai ama yg diinginkan. Tapi saat Lampu dah nyala ternyata tegangan sensornya 2,3Volt. Klo tegangan segini masih ke detect HIGH oleh microcontrollermumet

Mumet Mode: ON.

 

Akhirnya bongkar pasang rangkaian, nyoba pake PC817 blum bisa. Pake transistor masih lum bisa juga.. aihhh…….{kepaksa buka buku lagi dech… ElkaDasar  :-p LOL  }

Di buku di jelasin klo mau pake transistor untuk switching, kaki Basis logicnya gak boleh ngambang jadi musti di pull up atau pull down. Karena make Transistor NPN maka kaki Basis nya ak pull down.

Gambar Rangkaian seperti berikut:

image Pada gambar diatas tampak Transistor C9014, sohib2 gak harus make Transistor ini. Bisa diganti ama BD139, C9013 ato pake jenis NPN yang laen.

R 1k pada kaki basis di pake untuk Pull Down, agar Transistor baru terbias saat nilai resistansi LDR udah kecil.

R 2k2 pada kaki collector di gunakan untuk Pull Up, supaya tegangan ke kaki micro  bisa mencapai +5 volt saat Lampu off.

 

INGAT!!! LED (D5) dan LDR harus ditutup( di dalam Heatshrink Tube atau di isolasi) agar tidak terpengaruh cahaya dari luar.

 

Component List:

D1,D2,D3,D4 = dioda IN4002

D5= LED 5mm

LDR1=LDR

Transistor C9014

Led

R 2K2

R 1K

R 380

Oh iya… biar gak kebalik waktu pasang Transistor C9014, berikut ane sertain gambar kaki-kaki transistor C9014 dilihat dari bawah

image 

 

Let’s share…  ide /saran/kritik kirim aja ke zigan@ymail.com

Copyright  ©  AVRku.blogspot.com

Selengkapnya...

Detektor Beban 220Volt AC

Pada aplikasi controlling system secara wireless entah itu pake’  GSM, RF atau Bluetooth pendeteksian kondisi beban adalah hal yang penting. Contohnya pada controlling home appliance pake HP, saat operator ingin menyalakan lampu depan rumah dia mengirim perintah melalui SMS. Saat SMS dah dikirim tentu si Operator bakal mikir  apa Lampunya udah ON ato masih OFF?/bingung

Nah… disini pentingnya sensor untuk mendeteksi kondisi beban.

Ada beberapa ide saat saya ketemu persoalan ini.. setelah tanya “ngalor-ngidul” ke temen2 n gak ketinggalan juga minta wangsit ama mbah google akhirnya ketemu solusi yg bener2 TOPbangetz.z…  super duper ultra low cost…

image Gambar nich ketemunya di pojokan internet tepatnya di http://sound.westhost.com/project40.htm

Component List:

D1,D2,D3,D4 = dioda IN4002

D5= LED 5mm

LDR1=LDR

prinsipnya saat sensor ini memanfaatkan nyala LED untuk merubah nilai resistansi LDR. agar nilai resistansi LDR tidak dipengaruhi cahaya dari luar maka LED dan LDR dibungkus pake’ heatshrink tube. Saat dirangkai ama beban rangkaiannya berubah bentuk jadi kek gini:

image  Pasti ada pertanyaan ngapain ada rangkaian seri D1,D2,D3??? hi

Usut punya usut 3 diode ini diperluin buat beda potensial antara 2 titik LED sehingga LEDnya bisa nyala. Tegangan jatuh diode kan sekita 0,7 Volt klo 3 berarti 2,1 Volt. Ane dah nyoba D1 aja gak nyala LEDnya, coba D1+D2 tetep gak nyala,,,

Gua juga ada ide ngapain kok gak pake OptoCoupler macam 4n25 ato PC817??? kan ndak praktiss…  hehehee ana coba dan hasilnya…… PC817nya meleduk.. langsung shortcapek… mungkin ini karena nilai R nya perlu digedein tapi berhubung dah gak ada waktu buat coba-coba ,, kita pake LED aja dech..  Klo sohib2 ntar ada yg berhasil pake PC817 ato 4n25  tlong share ya….  ^_^

 

Alur Kerja Sensor: 

Saat switch terbuka, lampu off gak ada arus listrik yg nyalain LED sehingga resistansi LDR  gedhe banget (tak terhingga).

Begitu switch ditutup, lampu “ON” dan arus listrik yg mengalir, menghidupkan LED membuat nilai resistansi LDR jadi kecil.

 

Perubahan nilai resistansi LDR ini yang bisa dijadikan acuan sistem apakah beban (dalam kasus ini lampu) dah ON apa blum…

 

Let’s share…  ide /saran/kritik kirim aja ke zigan@ymail.com

 

Copyright  ©  AVRku.blogspot.com

Selengkapnya...

Deteksi Level Air via RFM12B

clip_image002[6]Kita akan membahas sebuah project untuk mendeteksi level air bendungan/sungai. Fungsi pendeteksian ini untuk memberi peringatan dini jika level air pada bendungan melebihi batas dan dikhawatirkan terjadi banjir. Sensor level air terpasang di bendungan sedang ruang operator berjarak  ratusan meter dari letak sensor. Agar operator bisa mengetahui kondisi level air  maka diperlukan pengiriman data sensor ke display ruang operator. Jika  menggunakan kabel sebagai media pengiriman data , ini akan berdampak pada biaya dan rumitnya instalasi.

Solusi yg efisien dalam transmisi data adalah menggunakan sistem wireless (tanpa kabel), salah satu yg sistem wireless yg umum digunakan yaitu gelombang RF (Radio Frequency). Dlm project ini kita memakai RFM12B sebagai RF transceiver

image RFM12B dibuat oleh HOPE RF, modul ini mudah digunakan dan harganya yang relatif lebih murah jika dibandingkan dengan XBee Pro. RFM12B Bisa digunakan sebagai Pengirim (Transmitter) maupun penerima (Receiver) Tapi saya kesulitan saat bikin PCBnya, karena pake RFM12B dengan package SMD, buat temen2 saya saranin cari package yang sudah dilengkapi connector biar tinggal colok aja  ke microcontroller.

 

Berikut Gambar rangkaian yang saya gunakan:

Transmitter

TX(.JPG)

Receiver

RX(JPG)

Alur Kerja:

Saat sensor aktif (terhubung ke +9V), maka Transmitter akan mengirim karakter-karakter khusus yang mewakili setiap sensor.

  1. Jika sensor Level Air Rendah aktif karakter yang dikirimkan adalah R
  2. Jika sensor Level Air Normal aktif karakter yang dikirimkan adalah N
  3. Jika sensor Level Air Tinggi aktif karakter yang dikirimkan adalah T

Jika ada 2 atau 3 sensor yang aktif bersamaan maka karakter yang dikirim adalah sensor Level yang lebih tinggi.

Jika tidak ada sensor yang aktif, maka karakter yang dikirim adalah karakter O

Receiver akan menunggu karakter-karakter diatas (R,N,T atau O), jika tidak ada karakter yang diterima maka LCD akan menampilkan: MENUNGGU DATA…

Saat karakter T diterima (tanda bahwa Sensor Level Air Tinggi aktif), maka relay akan ON. Dengan aktifnya relay otomatis Alarm akan aktif.

 

Prinsip kerja sensor:

clip_image002[8]

Saat tidak ada air, tegangan tidak masuk ke kaki 1 ic 4n25, ini menyebabkan kaki 5 (colector) tidak terhubung ke emitor (kaki 4) / ground. Maka input microcontroller akan tetap berlogika HIGH (5 V).

 

 

clip_image002[10]

Saat ada air, maka tegangan dari +9V masuk ke kaki 1. Tegangan yang masuk ini berkisar 7 volt karena besarnya resistansi air.Dengan adanya tegangan, maka led didalam IC 4n25 akan menyala sehingga mengkaktifkan sisi output. Sisi output IC 4n25 dikatakan aktif jika collector dan emitornya terhubung.

Saat kaki Colector terhubung ke Emitor ini berarti colector terhubung ke ground. Aliran arus listrik akan menuju ground. Sehingga input microcontroller berlogika LOW.

Dengan system inilah microcontroller mengetahui perubahan level air.

Seperti yang diterangkan di awal microcontroller pada sisi transmitter akan mengirim karakter sesuai kondisi inputan sensor nya.

 

Code program sisi Transmitter:

 

/*****************************************************

Chip type           : ATmega8535
Program type        : Application
Clock frequency     : 4.000000 MHz
Memory model        : Small
External SRAM size  : 0
Data Stack size     : 128
*****************************************************/

#include <mega8535.h>
#include <delay.h>
#include <stdio.h>

#define SCK 2   // SPI clock
#define SDO 0   // SPI Data output (RFM12B side) //MOSI
#define SDI 1   // SPI Data input (RFM12B side)  //MISO
#define CS  3   // SPI SS (chip select)
#define NIRQ 4  // (PORTD)

#define HI(x) PORTA |= (1<<(x))
#define LO(x) PORTA &= ~(1<<(x))
#define WAIT_NIRQ_LOW() while(PINA&(1<<NIRQ))

#define LED 6
#define LED_OFF() PORTD &= ~(1<<LED)
#define LED_ON() PORTD |= (1<<LED)

#define level_rendah PIND.0
#define level_normal PIND.1
#define level_tinggi PIND.2

void portInit()
{
  HI(CS);
  HI(SDI);
  LO(SCK);
  PORTA.4=1;
  DDRA = (1<<CS) | (1<<SDI) | (1<<SCK);
  //DDRD = (1<<LED);
  DDRD=0xf0;
  PORTD=0x0f;
}

unsigned int writeCmd(unsigned int cmd)
{
  unsigned char i;
  unsigned int recv;
  recv = 0;
  LO(SCK);
  LO(CS);
  for(i=0; i<16; i++) {
    if(cmd&0x8000) HI(SDI); else LO(SDI);
    HI(SCK);
    recv<<=1;
    if( PINA&(1<<SDO) ) {
      recv|=0x0001;
    }
    LO(SCK);
    cmd<<=1;
  }
  HI(CS);
  return recv;
}

void rfInit() {
  writeCmd(0x80E7); //EL,EF,868band,12.0pF
  writeCmd(0x8239); //!er,!ebb,ET,ES,EX,!eb,!ew,DC
  writeCmd(0xA640); //frequency select
  writeCmd(0xC647); //4.8kbps
  writeCmd(0x94A0); //VDI,FAST,134kHz,0dBm,-103dBm
  writeCmd(0xC2AC); //AL,!ml,DIG,DQD4
  writeCmd(0xCA81); //FIFO8,SYNC,!ff,DR
  writeCmd(0xCED4); //SYNC=2DD4G
  writeCmd(0xC483); //@PWR,NO RSTRIC,!st,!fi,OE,EN
  writeCmd(0x9850); //!mp,90kHz,MAX OUT
  writeCmd(0xCC17); //OB1COB0, LPX,IddyCDDITCBW0
  writeCmd(0xE000); //NOT USE
  writeCmd(0xC800); //NOT USE
  writeCmd(0xC040); //1.66MHz,2.2V
}

void rfSend(unsigned char data)
{
  WAIT_NIRQ_LOW();
  writeCmd(0xB800 + data);
}

void main(void)
{
unsigned char data_rf;

#asm("cli");
//for(i=0;i<1000;i++)for(j=0;j<123;j++);
portInit();
rfInit();

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

while (1)
      {
      // Place your code here
          if(level_tinggi==0)data_rf='T';    
          else if(level_normal==0)data_rf='N';
          else if(level_rendah==0)data_rf='R';
          else data_rf='O';
          LED_ON();
          delay_ms(1000);
          writeCmd(0x0000);
          rfSend(0xAA); // PREAMBLE
          rfSend(0xAA);
          rfSend(0xAA);
          rfSend(0x2D); // SYNC
          rfSend(0xD4);
          //Data yang akan dikirim
           rfSend(data_rf);
          ///////////////
          rfSend(0xAA); // DUMMY BYTES
          rfSend(0xAA);
          rfSend(0xAA);
          LED_OFF();
          delay_ms(100);
      };
}

 

Code Program Receiver:

/*****************************************************

Chip type           : ATmega8535
Program type        : Application
Clock frequency     : 4.000000 MHz
Memory model        : Small
External SRAM size  : 0
Data Stack size     : 128
*****************************************************/

#include <mega8535.h>
#include <delay.h>
#include <stdio.h>
#include <lcd.h>

#define SCK 2   // SPI clock
#define SDO 0   // SPI Data output (RFM12B side) //MOSI
#define SDI 1   // SPI Data input (RFM12B side)  //MISO
#define CS  3   // SPI SS (chip select)
#define NIRQ 4 

#define HI(x) PORTA |= (1<<(x))
#define LO(x) PORTA &= ~(1<<(x))
#define WAIT_NIRQ_LOW() while(PINA&(1<<NIRQ))

#define ALARM PORTD.6
//#define LED 6
//#define LED_OFF() PORTD &= ~(1<<LED)
//#define LED_ON() PORTD |= (1<<LED)

// Alphanumeric LCD Module functions
#asm
   .equ __lcd_port=0x15 ;PORTC
#endasm

// Declare your global variables here
char buff[16];

void portInit()
{
  HI(CS);
  HI(SDI);
  LO(SCK);
  PORTA.0=1;
  PORTA.4=1;
  DDRA = (1<<CS) | (1<<SDI) | (1<<SCK);
  DDRD = 0xff;
  PORTD=0x00;
}

unsigned int writeCmd(unsigned int cmd)
{
  unsigned char i;
  unsigned int recv;
  recv = 0;
  LO(SCK);
  LO(CS);
  for(i=0; i<16; i++) {
    if(cmd&0x8000) HI(SDI); else LO(SDI);
    HI(SCK);
    recv<<=1;
    if( PINA&(1<<SDO) ) {
      recv|=0x0001;
    }
    LO(SCK);
    cmd<<=1;
  }
  HI(CS);
  return recv;
}

void rfInit() {
  writeCmd(0x80E7); //EL,EF,868band,12.0pF
  writeCmd(0x8299); //er,!ebb,ET,ES,EX,!eb,!ew,DC
  writeCmd(0xA640); //frequency select
  writeCmd(0xC647); //4.8kbps
  writeCmd(0x94A0); //VDI,FAST,134kHz,0dBm,-103dBm
  writeCmd(0xC2AC); //AL,!ml,DIG,DQD4
  writeCmd(0xCA81); //FIFO8,SYNC,!ff,DR
  writeCmd(0xCED4); //SYNC=2DD4G
  writeCmd(0xC483); //@PWR,NO RSTRIC,!st,!fi,OE,EN
  writeCmd(0x9850); //!mp,90kHz,MAX OUT
  writeCmd(0xCC17); //OB1COB0, LPX,IddyCDDITCBW0
  writeCmd(0xE000); //NOT USE
  writeCmd(0xC800); //NOT USE
  writeCmd(0xC040); //1.66MHz,2.2V
}
/*
void rfSend(unsigned char data)
{
  WAIT_NIRQ_LOW();
  writeCmd(0xB800 + data);
}
*/
void FIFOReset()
{
  writeCmd(0xCA81);
  writeCmd(0xCA83);
}

/*unsigned char rfRecv()
{
  unsigned int data;
  writeCmd(0x0000);
  data = writeCmd(0xB000);
  return (data&0x00FF);
}*/

unsigned char rfRecv()
{
  unsigned int data;
  while(1)
  {
    data = writeCmd(0x0000);
    if ( (data&0x8000) )
    {
      data = writeCmd(0xB000);
      return (data&0x00FF);
    }
  } 
}

void main(void)
{
unsigned char data_rf;

#asm("cli");
//for(i=0;i<1000;i++)for(j=0;j<123;j++);
portInit();
rfInit();
FIFOReset();

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// LCD module initialization
lcd_init(16);
lcd_putsf("ALAT PENDETEKSI ");
lcd_gotoxy(0,1);      
lcd_putsf("    BANJIR     ");
delay_ms(2000);

lcd_clear();
lcd_putsf("  MENGGUNAKAN  ");
lcd_gotoxy(0,1);      
lcd_putsf("KOMUNIKASI RADIO");
delay_ms(2000);

lcd_clear();
lcd_putsf("Menunggu Data..");
while (1)
      {
      // Place your code here
          data_rf = rfRecv();
          FIFOReset();
          lcd_clear();
          if(data_rf=='O')
          {
               lcd_putsf("Koneksi OK..");
          }
          else if(data_rf=='R')
          {
               lcd_putsf("Level Air Rendah");
               ALARM=0;
          }
          else if(data_rf=='N')
          {
               lcd_putsf("Level Air Normal");
               ALARM=0;
          }
          else if(data_rf=='T')
          {
               lcd_putsf("Level Air Tinggi");
               ALARM=1;
          }
          else
          {
               lcd_putsf("Koneksi Gagal");
               buff[0]=data_rf;
               lcd_gotoxy(0,1);
               lcd_puts(buff);
          }
          delay_ms(1000);
          lcd_clear();
          lcd_putsf("Menunggu Data..");
          //if(data_rf=='T')ALARM=1;
          //else ALARM=0;
      };
}

 

 

DOWNLOAD source code program, gambar rangkaian klik disini

 

 

 

Yuppss…. sekarang jangan duduk aja… cepet buat project mu…

Transmisi data memakai RFM12B ini bisa dikembangin jadi wireless data acquisition misal: membaca nilai suhu dan temperatur ato aplikasi remote control…

 

Let’s share…  ide /saran/kritik kirim aja ke zigan@ymail.com

 

Copyright  ©  AVRku.blogspot.com

Selengkapnya...

CodeVision AVR Program Untuk Hitachi H48C

H48C adalah sensor yang biasa digunakan untuk mendeteksi kemiringan robot. Sensor ini mampu mendeteksi gaya gravitasi dalam tiga sumbu(X,Y,Z). Karena H48C membutuhkan tegangan 3,3 Volt (tentu ini sangat merepotkan karena tegangan kerja microcontroller AVR rata-rata 5 volt), Parallax menciptakan sebuah module integrasi H48C dengan ADC 12 bit MCP3204 yg dilengkapi regulator tegangan sehingga kita bisa menggunakannya dengan tegangan kerja 5 volt. Module buatan Parallax ini bisa dilihat seperti gambar di atas. Data yang dihasilkan Module H48C diakses dengan komunikasi Synchronous Serial Interface.Microcontroller memerlukan 3 pin untuk komunikasi ini yakni Clokc, DI/O dan CS.

Di artikel ini saya akan menyertakan contoh program CodeVision AVR untuk menampilkan data yg dihasilkan module H48C ke hyperterminal(anda bisa menggunakan aplikasi komunikasi serial RS232 yg lain) dengan baudrate 9600 bps.

#include

#include

#include

#define CS PORTB.2 //koneksi pin mikro ke H48C

#define Do PORTB.0

#define Di PINB.0

#define CLK PORTB.1

#define DATA_IN 0b11111110

#define DATA_OUT 0b11111111

#define RXB8 1

#define TXB8 0

#define UPE 2

#define OVR 3

#define FE 4

#define UDRE 5

#define RXC 7

#define FRAMING_ERROR(1<

#define PARITY_ERROR (1<

#define DATA_OVERRUN (1<

#define DATA_REGISTER_EMPTY (1<

#define RX_COMPLETE (1<

// USART Receiver buffer

#define RX_BUFFER_SIZE 8

char rx_buffer[RX_BUFFER_SIZE];

#if RX_BUFFER_SIZE<256

unsigned char rx_wr_index,rx_rd_index,rx_counter;

#else

unsigned int rx_wr_index,rx_rd_index,rx_counter;

#endif

// This flag is set on USART Receiver buffer overflow

bit rx_buffer_overflow;

// USART Receiver interrupt service routine

interrupt [USART_RXC] void usart_rx_isr(void)

{

char status,data;

status=UCSRA;

data=UDR;

if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)

{

rx_buffer[rx_wr_index]=data;

if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;

if (++rx_counter == RX_BUFFER_SIZE)

{

rx_counter=0;

rx_buffer_overflow=1;

};

};

}

#ifndef _DEBUG_TERMINAL_IO_

// Get a character from the USART Receiver buffer

#define _ALTERNATE_GETCHAR_

#pragma used+

char getchar(void)

{

char data;

while (rx_counter==0);

data=rx_buffer[rx_rd_index];

if (++rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;

#asm("cli")

--rx_counter;

#asm("sei")

return data;

}

#pragma used-

#endif

void clock()

{

CLK=0;

delay_us(5);

CLK=1;

delay_us(5);

}

int read_HC(unsigned char axis)

{

int looping,hc;

//start

DDRB=DATA_OUT;

CS=0;

Do=1; //start bit

clock();

Do=1; //SGL/DIFF bit

clock();

//pilih channel

for(looping=3;looping>0;looping--)

{

Do=(axis>>(looping-1)) & 0x01;

clock();

}

DDRB=DATA_IN;

Do=1;//Pull High pin Di/o

clock();// t sample bit

clock();//null bit

hc=0;

for(looping=0;looping<12;looping++)

{

CLK=0;

delay_us(5);

hc<<=1;

hc|=Di;

CLK=1;

delay_us(5);

}

CS=1;

//end

return hc;

}

float konversi(int vRef,int vAxis)

{

float f;

if (vAxis>=vRef)f=(vAxis-vRef)*0.0022;

if(vAxis

//f*=0.0022;

return f;

}

void main(void)

{

int vRef,vX,vY,vZ;

float f;

PORTB=0xff;

DDRB=0xff;

CLK=1;

// USART initialization

// Communication Parameters: 8 Data, 1 Stop, No Parity

// USART Baud rate: 9600

UCSRA=0x00;

UCSRB=0x98;

UCSRC=0x86;

UBRRH=0x00;

UBRRL=0x19;

ACSR=0x80;

SFIOR=0x00;

// Global enable interrupts

#asm("sei")

printf("ok");

putchar(13);

putchar(10);

delay_ms(1000);

while (1)

{

vX=read_HC(0);

printf("X axis= %d",vX);

putchar(13);

putchar(10);

vY=read_HC(1);

printf("Y axis= %d",vY);

putchar(13);

putchar(10);

vZ=read_HC(2);

printf("Z axis= %d",vZ);

putchar(13);

putchar(10);

vRef=read_HC(3);

printf("Vreff= %d",vRef);

putchar(13);

putchar(10);

f=konversi(vRef,vX);

printf("gForce X= %f",f);

putchar(13);

putchar(10);

f=konversi(vRef,vY);

printf("gForce Y= %f",f);

putchar(13);

putchar(10);

f=konversi(vRef,vZ);

printf("gForce Z= %f",f);

putchar(13);

putchar(10);

delay_ms(1000);

putchar(13);

putchar(10);

};

}

Di artikel ini saya akan menyertakan contoh program CodeVision AVR untuk menampilkan data yg dihasilkan module H48C ke hyperterminal(anda bisa menggunakan aplikasi komunikasi serial RS232 yg lain) dengan baudrate 9600 bps.

Saat pertama kali dijalankan, microcontroller akan mengirimkan karakter: ok ini untuk mengindikasikan bahwa komunikasi antara microcontroller dan PC sudah ok. Setelah itu setiap detik microcontroller akan mengirimkan data:

  • X axis
  • Y axis
  • Z axis
  • Vreff
  • Gforce X
  • Gforce Y
  • Gforce Z

Download Source Code klik disini Download Data Sheet klik disini program di atas hanya program contoh dan masih perlu perbaikan, mohon kritik dan sarannya ke zigan@ymail.com published in http://avrku.blogspot.com

Powered by Zoundry Raven

Selengkapnya...

Send SMS pakai Microcontroller

Jangan dibayangkan klo kita bakal ngirim SMS cuman pake microcontroller :-P

Di sini microcontroller dipake sebagai pengatur  kapan n kenomor mana SMS akan dikirim serta isi SMS yg mau dikirim. Kita membutuhkan modem GPRS M1206B (Q2403A) sebagai penghubung ke jaringan GSM.image

Microcontroller mengirimkan perintah  AT-Command ke  M1206B lewat komunikasi serial RS232. Lalu modem GSM ini akan mengirim data sesuai dengan AT-Command yg diterimanya.

Apa itu AT-Command?

AT-Command adalah perintah/instruksi yg diterima/dikenali  oleh modem GSM agar mau menjalankan fungsinya. Modem GSM bisa berupa HP atau M1206B seperti di atas.

 

Setting Baudrate Modem GSM:

Hal pertama yg dilakukan agar microcontroller bisa berkomunikasi dengan modem GPRS  yaitu menyamakan Baudrate. Baudrate default M1206B = 115200 Bps. Untuk mengubah nya kita gunakan Hyperterminal bawaan windows.

Masuk ke Start —> AllProgram --> Accessories—>Communications—> Hyper terminal.

di boxdialog Connect to pilih COM port yang anda sambung ke M1206B (kalau saya pake COM1). Lalu pada boxdialog COM Properties, ubah Bit per second menjadi 115200 dan Flow Control ubah ke None

image

Coba  ketik di layar Hyperterminal AT lalu tekan enter, jika koneksi yg kita buat udah benar maka akan muncul respon OK. Selanjutnya untuk mengubah baudrate modem GSM menjadi 9600 bps, ketikkan AT+IPR=9600 lalu tekan enter. Jika berhasil maka akan ada respon OK di layar Hyperterminal.

 

Menyimpan setting/konfigurasi modem GSM:

Sekarang disconnect kan Hyperterminal, lalu masuk menu File—> Properties. Ubah baudrate  menjadi 9600. Sekarang connectkan lagi hyperterminal. Ketikkan AT&W lalu tekan enter. Proses ini untuk menyimpan perubahan setting modem agar saat modem restart ulang konfigurasi modem tidak kembali ke default.

 

Program Microcontroller:

berikut program CodeVision AVR yang digunakan untuk send SMS.

 

/*****************************************************
Chip type           : ATmega8535
Program type        : Application
Clock frequency     : 4.000000 MHz
*****************************************************/

#include <mega8535.h>

// Standard Input/Output functions
#include <stdio.h>
#include <delay.h>

#define sensor0 PINA.0
#define sensor1 PINA.1

void main(void)
{
PORTA=0xff;
DDRA=0x00;

// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud Rate: 9600
UCSRA=0x00;
UCSRB=0x18;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x19;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

printf("AT+CMGS=");
putchar('"');
printf("03160542812");  //--->ini adalah no HP yg dituju
putchar('"');
putchar(',');
putchar(13);
putchar(10);

printf("test Send SMS OK");                                              
putchar(26);

delay_ms(500);
while (1)
      {
      // Place your code here
         if(sensor0==0)
         {
            printf("AT+CMGS=");
            putchar('"');
            printf("03160542812");  //--->ini adalah no HP yg dituju
            putchar('"');
            putchar(',');
            putchar(13);
            putchar(10);

            printf("sensor0 AKTIF");                                              
            putchar(26); 
         }
         if(sensor1==0)
         {
            printf("AT+CMGS=");
            putchar('"');
            printf("03160542812");  //--->ini adalah no HP yg dituju
            putchar('"');
            putchar(',');
            putchar(13);
            putchar(10);

            printf("sensor1 AKTIF");                                              
            putchar(26); 
         }
         delay_ms(500);

      };
}

Saat pertama dijalankan, microcontroller akan mengirim SMS  test Send SMS OK. Ini untuk test apakah koneksi  GSM berhasil? sending SMS test ini hanya dilakukan sekali saat microcontoller di ON kan.

 

Selanjutnya program akan memeriksa kondisi sensor0(PINA.0) dan sensor1 (PINA.1), jika salah satu atau kedua  pin diatas terhubung ke Ground maka microcontroller akan mengirimkan SMS berupa

 

 

sensor0 AKTIF

dan atau:

 

sensor1 AKTIF

 

Program diatas merupakan program simple untuk aplikasi deteksi Sensor berbasis SMS dan masih bisa dikembangkan kedalam aplikasi yang lebih rumit dan kompleks.

Semoga bermanfaat…….. ^_^

 

Download Source Code program klik disini

 

mohon kritik dan saran nya kirim  ke zigan@ymail.com

published in http://avrku.blogspot.com

Selengkapnya...

PWM menggunakan TIMER 0

Seorang temen  meminta saran tentang bagaimana menghasilkan signal PWM menggunakan microcontroller  AVR.  Dia menggunakan ATmega 16 dengan crystal 11.0592MHz. Dia  pengen 2 signal PWM, inverting dan non inverting. Tapi masalahnya  ada delay antara 2 signal tersebut.
berikut ilustrasi signal PWM yang diinginkan:
image
t0 : time delay antara 2 signal (1 millisecond)
tH : time signal HIGH (9 millisecond)
tL: time signal LOW (11 millisecond)

Pertama kali ide buat alur programmnya menggunakan Fast PWM.  Jadi untuk mengatur lebar PWM tinggal mengubah nilai OCR. Namun kita kesulitan dalam setting delay antara 2 signal.
Akhirnya kita coba pake interrupt Timer 0. Disini interrupt diatur tiap 1 millisecond.

Rumus yg digunakan untuk mengatur waktu interrupt Timer 0 adalah: 
TCNT0=(1+0xFF) – (waktu * (XTAL/PRESCALER))
nilai “waktu” adalah waktu interrupt yang kita inginkan.

Dalam kasus ini kita menggunakan XTAL (crystal) 11,0592 MHz dengan waktu interrupt 1 millisecond dan prescaler 256(bingung nilai prescaler itu apa??? klik disini).
Sesuai dengan karakter sistem diatas maka nilai yang diisikan ke TCNT0 adalah:
       TCNT0=256-(0.001*43200)
                 =212,8
       TCNT0=0xD4 (format heksadesimal) 

Dengan menggunakan interrupt timer 0 , signal PWM yang dihasilkan nampak seperti berikut:
image Code program yang digunakan:



#include <mega16.h>

#define Ch1 PORTB.3
#define Ch2 PORTD.7
unsigned int time_value;
// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
    TCNT0=0xd4;
    time_value++;
    if(time_value>=20)
    {
        time_value=0;
    }
     if(time_value<=1)
        {
            Ch1=0;
        }
        if((time_value>=1)&(time_value<=9))
        {
            Ch1=1;
        }
        else
        {
            Ch1=0;
        }
        if(time_value<=10)
        {
            Ch2=0;
        }
        else
        {
            Ch2=1;
        }

// Declare your global variables here
void main(void)
{
PORTA=0x00;
DDRA=0x00;
PORTB=0x00;
DDRB=0xff;
PORTC=0x00;
DDRC=0x00;
PORTD=0x00;
DDRD=0xff;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 43.200 kHz ---> XTAL/prescaler
// Mode: Normal top=FFh
// OC0 output: Disconnected
TCCR0=0x04;//--------->nilai ini utk menset nilai prescaler 256
TCNT0=0xd4;//-------> nilai dari rumus TCNT = (1+0xFF) - (waktu *( XTAL / prescaler) )
           //waktu yg diinginkan 1 ms
OCR0=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x01;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
// Global enable interrupts
#asm("sei")
while (1)
      {
      // Place your code here
      };
}

YOOO.. sekarang saatnya memenggal code-code program diatas:


#include <mega16.h>
menyertakan file library mega16.h  karena kita menggunakan ATmega16 klo menggunakan ATmega 8535 ya tinggal diganti #include<mega8535.h>


#define Ch1 PORTB.3
#define Ch2 PORTD.7

PORTB.3 diganti namanya menjadi Ch1
PORTD.7 diganti namanya menjadi Ch2
Ini untuk memudahkan penulisan program aja, biar lebih gampang diinget. Ch1 ato Ch2 bisa diubah sesuka hati misal: ChannelA, ChannelB dan seterusnya….
PORT yang digunakan pun terserah anda. Tinggal diganti aja. Disini enaknya menghasilkan PWM pake interrupt timer, port yg di pakai tidak harus menggunakan port PWM microcontroller (port PWM micrcontroller atmega 16 adalah: PORTB.3(OC0), PORTD.4(OC1B), PORTD.5(OC1A),  PORTD.7(OC2),)>_<.


unsigned int time_value;

mendefinisikan variabel bertipe unsigned integer dengan nama “time_value”.
varibel time_value ini yang nantinya dijadikan acuan dalam menghasilkan sinyal PWM.


// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
    …………..
   ……………. 
}

code-code  program yg ada di antara 2 kurung kurawal itu yang dijalankan jika terjadi interrupt Timer 0




TCNT0=0xd4;

nilai TCNT diisi nilai yg dihasilkan dari “rumus” (rumus diawal artikel). nilai ini yg menentukan interval waktu terjadinya interrupt


time_value++;

setiap terjadi interrupt nilai time_value ditambah 1.



if(time_value>=20)
    {
        time_value=0;
    }

jika nilai time_value  lebih atau sama dengan 20 maka nilai time_value di “nol” kan


if(time_value<=1)
        {
            Ch1=0;
        }
        if((time_value>=1)&(time_value<=9))
        {
            Ch1=1;
        }
        else
        {
            Ch1=0;
        }

code di atas untuk menghasilkan PWM di Ch1 (PORTB.3) sesuai dengan nilai variabel  time_value.


if(time_value<=10)
        {
            Ch2=0;
        }
        else
        {
            Ch2=1;
        }

code di atas untuk menghasilkan PWM di Ch2 (PORTD.7) sesuai dengan nilai variabel  time_value.


void main(void)
{
   ………..
  ………….
  ……………
}

main program,  program utama yang selalu dijalankan microcontroller.


PORTA=0x00;
DDRA=0x00;
PORTB=0x00;
DDRB=0xff;
PORTC=0x00;
DDRC=0x00;
PORTD=0x00;
DDRD=0xff;

setting port microntroller mau dijadikan input atau output.


// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 43.200 kHz ---> XTAL/prescaler
// Mode: Normal top=FFh
// OC0 output: Disconnected
TCCR0=0x04;//--------->nilai ini utk menset nilai prescaler 256
TCNT0=0xd4;//-------> nilai dari rumus TCNT = (1+0xFF) - (waktu *( XTAL / prescaler) )
           //waktu yg diinginkan 1 ms          
OCR0=0x00;

inisialisasi timer 0 sesuai rumus.


TIMSK=0x01;

inisialisasi interrupt Timer 0.


ACSR=0x80;
SFIOR=0x00;

me “non-aktifkan” analog comparator


#asm("sei")

mengaktifkan interrupt


while (1)
      {
      // Place your code here
      };

infinite looping.
mikro hanya muter disini di dalam while(1){...};
(inget !!! infinite looping di artikel BASIC I/O ).. Jadi mikro sama sekali tidak mengeksekusi perintah.
lha kok bisa????? bingungg.... ~_~ !
Disinilah bedanya pake Interrupt!!.
saat terjadi Interrupt Timer0, alur program mikro akan meloncat ke:



interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
......................................
......yoww..... program yg ada disini yg dijalanin...
......................................
}

setelah program yg ada di sub rutin INTERRUPT dijalankan, maka alur program mikro akan muter2 lagi di infinite looping
******************

jika ada yg kurang dari artikel di atas mohon kritik dan sarannya

any questions?? post comment on this blog: http://avrku.blogspot.com
or send email to: zigan@ymail.com

CodeVisionAVR C Compiler is copyright by Pavel Haiduc, HP InfoTech s.r.l.
AVR is a registered trademark of Atmel Corporation.

Selengkapnya...

Search

Entri Populer

 

Total Tayangan Halaman

Diberdayakan oleh Blogger.