Remote Relay menggunakan DTMF

Halo, ini tulisan pertama saya di tab eksperimen. seperti judul nya “Remote Relay menggunakan DTMF” project ini adalah membuat Relay yang bisa kita kendalikan secara remote atau jarak jauh. menggunakan link Radio.

Relay sendiri adalah sebuah komponen elektronik dengan fungsi utama nya adalah “switch” atau “saklar” hanya saja bukan dikendalikan secara manual. tetapi dikendalikan oleh tegangan listrik.

Lalu apa yang dimaksud dengan DTMF ? DTMF adalah singkatan dari “Dual Tone Multiple Frequency” adalah teknik mengirimkan angka melalui tone atau nada yang dikirimkan pada saat kita menekan salah satu tombol angka. mengapa dual tone karena saat kita menekan salah satu angka ada 2 tone yang berbunyi.

DTMF paling populer digunakan pada pesawat pesawat telepon rumahan.  kita sering mendengar bunyi nada pada saat kita menekan tombol2 angka untuk melakukan dial nomor tujuan “tet tot tet tot tet tot”  itulah salah satu pengaplikasian DTMF agar nomor yang kita tekan tadi di proses oleh mesin atau komputer di penyedia telekomunikasi sehingga kita bisa terhubung ke nomor telpon tujuan.

selain dari telepon rumahan yang menggunakan DTMF masih banyak perangkat lain yang masih menggunakan nada DTMF seperti  telepon selular atau Radio Komunikasi.

Dalam project ini kita lebih khususkan dibuat untuk pengaplikasian bersama radio komunikasi. Banyak sekali radio komunikasi yang menggunakan fitur DTMF pada tombol tombol angka. khusus nya HT.

OK saya rasa cukup perkenalan Relay dan DTMF nya, mari kita langsung ke pokok bahasan nya.

Remote Relay menggunakan DTMF

uln2803

 

bisa kita lihat pada gambar diatas, kita anggap terdiri dari 2 blok utama.  sebelah kanan ada blok Relay atau saklar dengan Led indikator. kemudian blok sebelah kiri adalah blok Control yang terdiri dari 3 IC yaitu MT8870 sebagai DTMF to BCD decoder, Atmega328 sebagai MCU, dan ULN2803 sebagai Relay Driver. kemudian di sebelah kiri atas ada tulisan input & 12V.  Input disambungkan dengan radio receiver yang akan menerima tone DTMF dari radio yang transmit atau dari radio pengendali jarak jauh. kemudian 12V disambungkan ke power supply.

cara kerja dari rangkaian diatas adalah menterjemahkan sinyal DTMF berupa angka kombinasi yang kita masukan. kita ambil contoh misal kita ingin menyalakan Relay nomor 1. angka kombinasi yang harus kita masukan adalah *123#01

dengan asumsi bahwa * adalah tombol awal kombinasi, disambung dengan 123 yaitu password kemudian # sebagai pembatas. dan terakhir adalah 01 yaitu nomor relay.  sehingga tidak semua orang bisa merubah kondisi relay. hanya yang mengetahui angka2 input kombinasi dan password nya saja yang bisa mengontrol relay relay diatas.

OK, kembali ke teknis. nada DTMF yang masuk pada input diterima oleh IC MT8870 kemudian sinyal dirubah dari nada DTMF menjadi BCD ( Binary Coded Desimal ). sehingga ada 5 titik output dari MT8870 yang kemudian di proses oleh MCU Atmega328. ke 5 titik output tersebut adalah Q1,Q2,Q3,Q4 & StD ( kaki 11 sampai 15 ). Q1 sampai Q4 adalah output BCD nya. semisal kita memberi input DTMF angka 1 output BCD nya adalah Q1= High, Q2 = Low, Q3 = LOW, Q4 = LOW.

atau perhatikan tabel dibawah, data dari datasheet sebagai referensi logic output dari Q1 hingga Q4 untuk setiap angka DTMF.

BCD

 

Kita ambil contoh lain semisal kita menkan angka 5 maka output dari Q1-Q4 adalah :

Q1 = HIGH

Q2 = LOW

Q3 = HIGH

Q4 = LOW

sama seperti datasheeet diatas. cukup mudah kan?

ok lanjut ke output StD pada kaki nomor 15 pada IC MT8870. pin tersebut meng indikasikan semua nada DTMF yang masuk, sehingga akan mengeluarkan Logic 1 pada saat menerima nada DTMF. dan Logic 0 pada saat standby tidak menerima nada DTMF.

dari ke 5 pin tersebut dimasukan ke Input Dijital Atmega328. (  kaki 2 sampai 6 ) silahkan perhatikan gambar layout pcb diatas.

Proses yang dilakukan MCU adalah mengenal semua input yang dimasukan kemudian memproses output nya ke relay.  mulai dari men decode output BCD sesuai tabel diatas menjadi angka2 kembali yang kemudian men seleksi angka2 yang dimasukan seperti *123#01 action nya adalah menghidupkan atau mematikan Relay nomor 1.

Bahasa Pemrograman Microcontroller yang saya gunakan adalah bahasa arduino,  berikut skrip lengkap yang dimasukan ke Atmega328 sebagai berikut :

[spoiler title=”Mantra”]

[pastacode lang=”c” message=”Remote DTMF ngoprekradio.com” highlight=”Remote DTMF ngoprekradio.com” provider=”manual”]

// 8 Relay Remote DTMF
// create by Angga S Arly  2014
// anggafunkadelic@gmail.com
// ngoprekradio.com
 
 
// load eeprom library
#include <EEPROM.h>
// alokasi pin BCD dari MT8870
const int BCDPin1 = 4;
const int BCDPin2 = 3;
const int BCDPin3 = 2;
const int BCDPin4 = 1;
const int BCDPinX = 0;
// state BCD dari MT8870
int BCDState1 = 0;
int BCDState2 = 0;
int BCDState3 = 0;
int BCDState4 = 0;
int BCDStateX = 0;
// state hasil decode ke desimal
int S0 = 0;
int S1 = 0;
int S2 = 0;
int S3 = 0;
int S4 = 0;
int S5 = 0;
int S6 = 0;
int S7 = 0;
int S8 = 0;
int S9 = 0;
int SB0 = 0; // bintang
int SP0 = 0; // pager
// state combination key
int D1 = 0; // *
int D2 = 0; // pass1
int D3 = 0; // pass2
int D4 = 0; // pass3
int D5 = 0; // *
int D6 = 0; // relaynumber
int D7 = 0; // ending
// alokasi pin output / relay
const int LedPin1 =  5;
const int LedPin2 =  6;
const int LedPin3 =  7;
const int LedPin4 =  8;
const int LedPin5 =  9;
const int LedPin6 =  10;
const int LedPin7 =  11;
const int LedPin8 =  12;
const int LedPin9 =  13;
// status relay
int rstat1 = 0;
int rstat2 = 0;
int rstat3 = 0;
int rstat4 = 0;
int rstat5 = 0;
int rstat6 = 0;
int rstat7 = 0;
int rstat8 = 0;
// loading status sebelum mati listrik
int lstat1 = 0;
int lstat2 = 0;
int lstat3 = 0;
int lstat4 = 0;
int lstat5 = 0;
int lstat6 = 0;
int lstat7 = 0;
int lstat8 = 0;
// bootstat
int bootstat0 = 0;
 
void setup() {
  //alokasi pin input ( BCD )
  pinMode(BCDPin1, INPUT);  
  pinMode(BCDPin2, INPUT);
  pinMode(BCDPin3, INPUT);
  pinMode(BCDPin4, INPUT);
  pinMode(BCDPinX, INPUT);  
  // alokasi pin output ( Relay )
  pinMode(LedPin1, OUTPUT);
  pinMode(LedPin2, OUTPUT);
  pinMode(LedPin3, OUTPUT);
  pinMode(LedPin4, OUTPUT);
  pinMode(LedPin5, OUTPUT);
  pinMode(LedPin6, OUTPUT);
  pinMode(LedPin7, OUTPUT);
  pinMode(LedPin8, OUTPUT);
  pinMode(LedPin9, OUTPUT);
 }
 
void checkboot() {
if (bootstat0 == 0) {
  lstat1 = EEPROM.read(1);
  lstat2 = EEPROM.read(2);
  lstat3 = EEPROM.read(3);
  lstat4 = EEPROM.read(4);
  lstat5 = EEPROM.read(5);
  lstat6 = EEPROM.read(6);
  lstat7 = EEPROM.read(7);
  lstat8 = EEPROM.read(8);
  if (lstat1 == 1) {
    digitalWrite(LedPin1, HIGH);
    rstat1 = lstat1;
  }
  if (lstat2 == 1) {
    digitalWrite(LedPin2, HIGH);
    rstat2 = lstat2;
  }
  if (lstat3 == 1) {
    digitalWrite(LedPin3, HIGH);
    rstat3 = lstat3;
  }
  if (lstat4 == 1) {
    digitalWrite(LedPin4, HIGH);
    rstat4 = lstat4;
  }
  if (lstat5 == 1) {
    digitalWrite(LedPin5, HIGH);
    rstat5 = lstat5;
  }
  if (lstat6 == 1) {
    digitalWrite(LedPin6, HIGH);
    rstat6 = lstat6;
  }
  if (lstat7 == 1) {
    digitalWrite(LedPin7, HIGH);
    rstat7 = lstat7;
  }
  if (lstat8 == 1) {
    digitalWrite(LedPin8, HIGH);
    rstat8 = lstat8;
  }
  bootstat0 = 1;
}
 
}
 
void reset() {  
 
 
D1 = 0; // *
D2 = 0; // pass1
D3 = 0; // pass2
D4 = 0; // pass3
D5 = 0; // *
D6 = 0; // relaynumber
D7 = 0;
}
 
void reset2() {
  S1 = 0;
  S2 = 0;
  S3 = 0;
  S4 = 0;
  S5 = 0;
  S6 = 0;
  S7 = 0;
  S8 = 0;
  S9 = 0;
  SB0 = 0;
  S0 = 0;
  SP0 = 0;
}
 
void exerelay1() {
  if (rstat1 == 0) {
    digitalWrite(LedPin1, HIGH);
    EEPROM.write(1,1);
    rstat1 = 1;
  }
  else if (rstat1 == 1) {
    digitalWrite(LedPin1, LOW);
    EEPROM.write(1,0);
    rstat1 = 0;
  }
}
 
 
void exerelay2() {
  if (rstat2 == 0) {
    digitalWrite(LedPin2, HIGH);
    EEPROM.write(2,1);
    rstat2 = 1;
  }
  else if (rstat2 == 1) {
    digitalWrite(LedPin2, LOW);
    EEPROM.write(2,0);
    rstat2 = 0;
  }
}
 
void exerelay3() {
  if (rstat3 == 0) {
    digitalWrite(LedPin3, HIGH);
    EEPROM.write(3,1);
    rstat3 = 1;
  }
  else if (rstat3 == 1) {
    digitalWrite(LedPin3, LOW);
    EEPROM.write(3,0);
    rstat3 = 0;
  }
}  
 
void exerelay4() {
  if (rstat4 == 0) {
    digitalWrite(LedPin4, HIGH);
    EEPROM.write(4,1);
    rstat4 = 1;
  }
  else if (rstat4 == 1) {
    digitalWrite(LedPin4, LOW);
    EEPROM.write(4,0);
    rstat4 = 0;
  }
}
 
void exerelay5() {
  if (rstat5 == 0) {
    digitalWrite(LedPin5, HIGH);
    EEPROM.write(5,1);
    rstat5 = 1;
  }
  else if (rstat5 == 1) {
    digitalWrite(LedPin5, LOW);
    EEPROM.write(5,0);
    rstat5 = 0;
  }
}  
 
void exerelay6() {
  if (rstat6 == 0) {
    digitalWrite(LedPin6, HIGH);
    EEPROM.write(6,1);
    rstat6 = 1;
  }
  else if (rstat6 == 1) {
    digitalWrite(LedPin6, LOW);
    EEPROM.write(6,0);
    rstat6 = 0;
  }
}
 
 
 
void exerelay7() {
  if (rstat7 == 0) {
    digitalWrite(LedPin7, HIGH);
    EEPROM.write(7,1);
    rstat7 = 1;
  }
  else if (rstat7 == 1) {
    digitalWrite(LedPin7, LOW);
    EEPROM.write(7,0);
    rstat7 = 0;
  }
}
 
void exerelay8() {
  if (rstat8 == 0) {
    digitalWrite(LedPin8, HIGH);
    EEPROM.write(8,1);
    rstat8 = 1;
  }
  else if (rstat8 == 1) {
    digitalWrite(LedPin8, LOW);
    EEPROM.write(8,0);
    rstat8 = 0;
  }
}
 
 
 
 
// final check
void check2() {
 
  if (D6 == 1) {
  if (S1 == 1) {
    exerelay1();    
     reset();
  }
}
 
  if (D6 == 1) {
  if (S2 == 1) {
    exerelay2();
    reset();
  }
}
 
  if (D6 == 1) {
  if (S3 == 1) {
    exerelay3();
    reset();
  }
}
 
  if (D6 == 1) {
  if (S4 == 1) {
    exerelay4();
    reset();
  }
}
 
  if (D6 == 1) {
  if (S5 == 1) {
    exerelay5();
    reset();
  }
}
 
  if (D6 == 1) {
  if (S6 == 1) {
    exerelay6();
    reset();
  }
}
 
  if (D6 == 1) {
  if (S7 == 1) {
    exerelay7();
    reset();
  }
}
 
  if (D6 == 1) {
  if (S8 == 1) {
    exerelay8();
    reset();
  }
}
 
}
 
 
void check() {
 
    BCDState1 = digitalRead(BCDPin1);
    BCDState2 = digitalRead(BCDPin2);
    BCDState3 = digitalRead(BCDPin3);
    BCDState4 = digitalRead(BCDPin4);
    BCDStateX = digitalRead(BCDPinX);
 
   
  if (BCDStateX == HIGH) {
        // detek 0    
        if (BCDState1 == LOW) {
          if (BCDState2 == HIGH) {
            if (BCDState3 == LOW) {
              if (BCDState4 == HIGH) {
                S0 = 1;
               
               
              }
            }
          }
        }
 
        // detek 1
        if (BCDState1 == HIGH) {
          if (BCDState2 == LOW) {
            if (BCDState3 == LOW) {
              if (BCDState4 == LOW) {
                S1 = 1;
               
              }
            }
          }
        }
       
        // detek 2
        if (BCDState1 == LOW) {
          if (BCDState2 == HIGH) {
            if (BCDState3 == LOW) {
              if (BCDState4 == LOW) {
                S2 = 1;
               
              }
            }
          }
        }
       
        // detek 3
        if (BCDState1 == HIGH) {
          if (BCDState2 == HIGH) {
            if (BCDState3 == LOW) {
              if (BCDState4 == LOW) {
                S3 = 1;
               
              }
            }
          }
        }
       
        // detek 4
        if (BCDState1 == LOW) {
          if (BCDState2 == LOW) {
            if (BCDState3 == HIGH) {
              if (BCDState4 == LOW) {
                S4 = 1;
               
              }
            }
          }
        }
       
        // detek 5
        if (BCDState1 == HIGH) {
          if (BCDState2 == LOW) {
            if (BCDState3 == HIGH) {
              if (BCDState4 == LOW) {
                S5 = 1;
               
              }
            }
          }
        }
       
        // detek 6
        if (BCDState1 == LOW) {
          if (BCDState2 == HIGH) {
            if (BCDState3 == HIGH) {
              if (BCDState4 == LOW) {
                S6 = 1;
               
              }
            }
          }
        }
       
        // detek 7
        if (BCDState1 == HIGH) {
          if (BCDState2 == HIGH) {
            if (BCDState3 == HIGH) {
              if (BCDState4 == LOW) {
                S7 = 1;
               
              }
            }
          }
        }
       
        // detek 8
        if (BCDState1 == LOW) {
          if (BCDState2 == LOW) {
            if (BCDState3 == LOW) {
              if (BCDState4 == HIGH) {
                S8 = 1;
               
              }
            }
          }
        }
       
        // detek 9
        if (BCDState1 == HIGH) {
          if (BCDState2 == LOW) {
            if (BCDState3 == LOW) {
              if (BCDState4 == HIGH) {
                SP0 = 1;
               
              }
            }
          }
        }
       
        // detek *
        if (BCDState1 == HIGH) {
          if (BCDState2 == HIGH) {
            if (BCDState3 == LOW) {
              if (BCDState4 == HIGH) {
                SB0 = 1;
               
              }
            }
          }
        }
       
        // detek #
        if (BCDState1 == LOW) {
          if (BCDState2 == LOW) {
            if (BCDState3 == HIGH) {
              if (BCDState4 == HIGH) {
                SP0 = 1;
               
              }
            }
          }
        }
 
// end of state BCDStateX
  }
 
 
 // end of check  
}
 
 
 
 
 
void loop(){
 
 
 
 
checkboot();  
check();  
check2();
 
 
// password 123
// lengkap nya *123#0x
// x = nomor relay
 
 
// x & * menjadi D1
if (BCDStateX == HIGH) {
  if (SB0 == 1) {
    D1 = 1;
  }
}
 
// 1 & D1 menjadi D2
if (S1 == 1) {
  if (D1 == 1) {
    D2 = 1;
  }
}
 
 
// 2 dan D2 menjadi D3
if (S2 == 1) {
  if (D2 == 1) {
    D3 = 1;
  }
}
 
// S3 dan D3 menjadi D4
 
if (S3 == 1) {
  if ( D3 == 1) {
    D4 = 1;
  }
}
 
// pager & D4 menjadi D5
 
if (SP0 == 1) {
  if (D4 == 1) {
    D5 = 1;
  }
}
 
 
 
// detek password kao D nya sudah up tidak ada action tapi kalo D nya off langsung reset ajahhhh
 
if (S1 == 1) {
  if ( D2 == 1 ) {
    // no action
  }
  else {
    reset();
  }
}
 
if (S2 == 1) {
  if ( D3 == 1 ) {
    // no action
  }
  else {
    reset();
  }
}
 
if (S3 == 1) {
  if ( D4 == 1 ) {
    // no action
  }
  else {
    reset();
  }
}
 
 
if (SP0 == 1) {
  if ( D5 == 1 ) {
    // no action
  }
  else {
    reset();
  }
}
 
 
// selain angka2 password reset ajah sikat coyy
 
 
if (S4 == 1) {
  reset();
}
 
if (S5 == 1) {
  reset();
}
 
if (S6 == 1) {
  reset();
}
 
if (S7 == 1) {
  reset();
}
 
if (S8 == 1) {
  reset();
}
 
if (S9 == 1) {
  reset();
}
 
if (S0 == 1) {
  if (D5 == 1) {
    D6 = 1;
  }
  else {
    reset();
  }
}
 
 
if (D1 == 1) {
  digitalWrite(LedPin9, HIGH);
}
else if (D1 == 0) {
  digitalWrite(LedPin9, LOW);
}
 
 
reset2();
 
 
delay(10);
// end of state loop
  }

[/pastacode]

[/spoiler]

untuk rekan2 yang ingin membuat project ini silahkan copy paste kode kode aneh diatas ke software arduino IDE lalu upload ke IC atmega328 menggunakan downloader seperti USBasp.

selain dari 8 relay yg ada di blok sebelah kanan ada 1 relay lagi yg tempat nya terpisah paling kiri. relay tersebut bekerja untuk memutuskan sinyal audio apabila rangkaian ini digunakan untuk RPU. sinyal audio diputuskan pada saat menerima angka2 kombinasi DTMF dengan tujuan agar tidak bisa terdengar oleh semua pengguna RPU. sebagai contoh kita ingin menyalakan atau mematikan relay nomor 8.  kita harus mengetik *123#08. pada saat memasuki digit pertama yaitu * relay tersebut bekerja. sampai pengguna selesai menginput angka2 kombinasi diatas.  sehingga tone DTMF tidak bisa didengarkan orang lain.

ada fitur lain yaitu eeprom. posisi2 relay tersimpan di memory atmega, sehingga ketika mati listrik atau kehilangan supply. kemudian on lagi kondisi relay akan mengikuti pada saat sebelum mati listrik. misal kita ambil contoh relay yang menyala hanya nomor 5 dan 7… relay lain posisi off..  pada saat mati listrik dan kemudian listrik on kembali. relay 5 dan 7 akan kembali on. seperti sebelum mati listrik.

yang terakhir adalah IC ULN2803 yaitu 8 channel Darlington Array. berfungsi sebagai driver Relay.  karena output sinyal dari atmega ini cukup kecil. tidak mampu menggerakan relay secara langsung. sehingga dibantu oleh IC ini.

untuk rekan rekan yang ingin membuat alat ini dibutuhkan bahan sekitar 300 – 350rb dimulai dari bahan2 komponen, pembuatan PCB,  dan downloader AVR seperti USBasp.

Demikian sedikit tulisan saya tentang eksperimen “remote relay DTMF” ini.. saran dan masukan dengan senang hati dari rekan2 untuk berdiskusi.

berikut foto kit yang sudah jadi.

beres

berikut cuplikan Video nya teman teman :

bagi yang kesulitan membuat dan tidak terbiasa menyolder jangan berkecil hati karena kami siapkan kit sudah jadi dengan harga 500rb per unit dan sudah tested.

barang bisa diambil di bandung atau kirim via JNE

Contact :
Angga S Arly
sms / call / whatsapp 081802279880
pin bbm : 5FC54392
email : angga@ngoprekradio.com
web : www.ngoprekradio.com

info Nomor Rekening :
atas Nama : Angga Sudrahanggara Arly
BCA 8100362245
BNI 0190860738

atau order via Tokopedia KLIK DISINI

3 thoughts on “Remote Relay menggunakan DTMF”

Leave a Reply to nenda Cancel reply

Your email address will not be published. Required fields are marked *