Widget Ads

Coding

Capture Data Serial Menggunakan Arduino


Dalam perangkat elektronika digital tentu ada banyak sekali metode/protokol yang digunakan untuk kirim dan terima data. Metode ini dapat berupa kabel ataupun wirelles tergantung kebutuhan devicenya. Dalam berbagai metode tersebut kita kali ini akan bahas metode kirim dan terima data serial menggunakan arduino.

Berbagai perangkat elektronika sering menggunakan metode ini karena sangat mudah dengan hanya menggunakan 3 kabel kita dapat bertukar data. Bagi yang belum tau teknisnya dapat membaca artikel tentang protocol serial ini. Intinya data yang dikirim dari device keluar dari pin TX dia dan harus kita baca menggunakan pin RX, kebalikannya jika ingin kirim data maka kita kirim melalui TX kita ke RX dia. Dengan sama-sama terhubung jalur ground yang sama. Sebenarnya level tegangan koneksi ini ada beberapa namun yang akan kita bahas disini adalah sisi pemrogramannya menggunakan arduino, dengan kata lain kita beroprasi pada tipe serial TTL. Misalnya kita akan capture data dari modul-modul lainnya diantaranya xbee, sim800L, gps, dan sensor-sensor lain yang dikirim melalui port serial.

Untuk coding ini kita memerlukan 2 port serial untuk mengujinya yaitu port serial ke USB (yang kita pantau) dan port serial ke modul. Dalam coding ini kita menggunakan arduino uno yang hanya mempunyai satu port serial. Lalu untuk port serial lainnya bagaimana? Tenang saja, chip arduino uno (atmega328p) dapat ditambahkan beberapa serial virtual yang biasa disebut Software Serial. Pada prakteknya kita hanya menunjuk pin tertentu untuk memerankan sebagai RX dan TX secara virtual. Dalam percobaan kita akan menggunakan skema rangkaian berikut ini :

Hal yang akan kita coba dalam percobaan ada beberapa tingkatan, yaitu :
- Langsung cetak dilayar monitor
- Simpan dalam variable
- Simpan lalu difilter

- Langsung cetak dilayar monitor
Pada bagian ini kita akan mengambil data dari serial port kemudian langsung memunculkannya pada layar monitor (aplikasi), mencocokan datanya apakah sama dengan yang dikirim. Jika tidak sama apa kendalanya dan apa solusinya.
Coding dasar untuk melakukan transaksi data pada serial port adalah menggunakan Serial.begin(9600); dengan arti membuka port serial dengan baud rate 9600 untuk koneksi ke komputer pemantau dan xbee.begin(9600) untuk membuka koneksi ke modul yang akan dipantau (pada contoh kita menggunakan modul USB to TTL sumbernya data dari komputer juga hanya saja lain port).
Kemudian kita test koneksi dengan menuliskan sesuatu ke layar menggunakan Serial.println("Test"); yang memiliki arti mengirimkan data bertipe String dengan nilai "Test" ke komputer.
Untuk membaca data serial dari modul kita berganti ke perintah xbee.read(); dengan asumsi data sudah dikirim yang sebelumnya sudah dicek keberadaan data baru dengan perintah xbee.available().
Setelah terdeteksi adanya data baru tuliskan sesuatu untuk menandai data baru masuk, contohnya Serial.println("Data : "); maka apapun tulisan setelah Data : adalah nilai yang dikirimkan dari modul tersebut.
Perulangan sampai data tersebut terbaca semua menggunakan while(xbee.available()) {} dengan maksud eksekusi program akan terus berada disitu sampai tidak ada data lagi. Isi perulangannya adalah pembacaan data dan penampilan data ke monitor tadi.
Kode lengkapnya sebagai berikut :
 

#include ‹softwareserial.h›

const byte pin_rx_soft=4;
const byte pin_tx_soft=3;

SoftwareSerial xbee(pin_rx_soft, pin_tx_soft); // RX, TX

void setup() {
  Serial.begin(9600);
  xbee.begin(9600);
  Serial.println("Joatsy Serial Capture");
}

void loop() {
  xbee_read();
}

void xbee_read()
{
  if (xbee.available()>0)
  {
    Serial.print("Data : ");
    while(xbee.available())
    {
      Serial.write(xbee.read());
      delay(10);
    }
    Serial.println();
  }  
}

Jika di-upload ke arduino dan dikirimi data serial hasilnya akan seperti gambar berikut :

- Simpan dalam variable
Data dari serial biasanya dalam pengaplikasiannya akan diproses untuk sesuatu aksi maka data tersebut tidak semata-mata hanya dilewatkan saja melainkan ditampung dulu pada suatu variable. Jenis-jenis data yang akan digunakan untuk menampung ada beberapa yang paling sering digunakan adalah String dan array byte. Walau sebenarnya secara teknis data yang dikirim semuanya bentuknya byte (kode ASCII). Sehingga jika kita mengirimkan angka 1 yang terkirim adalah nilai 31 (dalam heksa). Kenapa kita harus tau mengenai hal ini? Dikarenakan banyak modul yang komunikasinya diluar karakter normal (A-Z 0-9), semisalnya adalah modul xbee. Dia akan mengirimkan frame yang isinya jajaran angka byte jika dikonfersi ke karakter akan amburadul tidak terbaca. Nah untuk itu dalam bahasan ini akan disimpan juga dalam array byte. Contoh programnya ada dibawah ini :

#include ‹softwareserial.h›

const byte pin_rx_soft=4;
const byte pin_tx_soft=3;

SoftwareSerial xbee(pin_rx_soft, pin_tx_soft); // RX, TX

void setup() {
  Serial.begin(9600);
  xbee.begin(9600);
  Serial.println("Joatsy Serial Capture");
}

void loop() {
  xbee_read();
}

void xbee_read()
{
  if (xbee.available()›0)
  {
    String data_string="";
    byte data_byte[100];
    byte data_index=0;
    while(xbee.available())
    {
      char data_char=xbee.read();
      
      data_string+=data_char;
      
      data_byte[data_index]=data_char;
      data_index++;
      
      delay(10);
    }
    
    Serial.print("Data String : ");
    Serial.println(data_string);
    
    Serial.print("Data Byte : ");
    for (byte i=0;i‹data_index;i++)
    {
      String data_hex;
      if (data_byte[i]‹16)
        data_hex="0" + String (data_byte[i], HEX);
      else
        data_hex=String (data_byte[i], HEX);
      data_hex.toUpperCase();
      Serial.print(data_hex);
      Serial.print(" ");
    }
    Serial.println();
  }  
}

Hasilnya dapat kita lihat dalam gambar berikut :

Dalam penyimpanan data ke variable hanya melakukan pemesanan variable lalu memasukan nilainya ke variable tersebut. Karena data yang diambil ada di xbee.read() dan bertipe byte maka kita perlu memesan var bertipe char untuk langsung menampung nilai tersebut ke bentuk karakter sehingga langsung bisa ditambahkan ke String. Perintah untuk menyimpan data dari serial adalah char data_char=xbee.read();. Untuk menyusun data utuh bertipe string (susunan huruf) maka menggunakan data_string+=data_char artinya data_string akan ditambah dengan karakter yang terbaca dari port serial yang sebelumnya tertampung pada var data_char. Nah nilai data_char sebenarnya byte sehinga dapat langsung disimpan juga kedalam var array data_byte, maka untuk menyimpannya cukup dengan perintah data_byte[data_index]=data_char.
Perlu diingat bahwa array adalah kumpulan variable yang mempunyai index, dengan nama data_byte tapi dia punya 100 data dari index 0-99 sehingga untuk menggunakannya memanfaatkan nilai data_index yang selalu ditambahkan 1 menggunakan data_index++; maka secara detail data_byte[0] akan bernilai karakter pertama, data_byte[1] akan bernilai karakter kedua sampai jumlah data tersebut.
Untuk menampilkan data byte dalam bentuk hex kita membutuhkan perulangan dari 0 sampai index terakhir. Nilai tersebut kemudian dicek apakah lebih kecil dari 16 atau 0x16 atau 10hexsa untuk menambahkan karakter 0 di depannya karena 15 hex nya adalah F saja sehingga agar 2 digit ditambahkan 0.
Perulangan yang dipakai adalah for, untuk mengingatkan perulangan tersebut dengan perintah for (byte i=0;i<data_index;i++) yang mempunyai arti mulailah perulangan dari i=0 sampai nilai i lebih kecil dari nilai data_index dengan menambahkan nilai i setiap kali berulang. Misalnya data yg diterima adalah Test jumlah datanya (nilai data_index nya juga sama) adalah 4, maka nilai i akan ditambahkan 1 per 1 sampai dibawah 4 persis (3). Itu berarti nilai data_byte[0] = T, data_byte[1] = e, data_byte[2] = s, data_byte[3] = t.

- Filter Data
Jika data sudah tersimpan dalam variable (RAM) maka kita dapat memfilternya sesuai aturan yang kita buat. Misalnya kita akan meneliti data tersebut mengandung karakter khusus atau dengan karakter byte khusus, nah untuk itu filter diperlukan. Filter sebenarnya hanya menggunakan perintah if dengan kondisi tertentu. Dalam contoh kita akan meneliti data input adalah kata "tes" atau bukan. Maka yang diperlukan hanya menggunakan perintah If (data_serial=="tes") jika iya munjulkan tulisan Data valid dan jika tidak munculkan data tidak valid. Filter lainnya misal kita dapatkan data dari xbee dengan format frame data transmit. Kita akan filter data ke 1 dan 4, dalam xbee data trasmkt karakter 1 adalah selalu 0x7e dan karakter 4 adalah 0x10 jika tidak kedua itu maka data tidak valid.
Coding lengkapnya seperti dibawah ini :
 

#include ‹softwareserial.h›
const byte pin_rx_soft=4;
const byte pin_tx_soft=3;

SoftwareSerial xbee(pin_rx_soft, pin_tx_soft); // RX, TX

void setup() {
  Serial.begin(9600);
  xbee.begin(9600);
  Serial.println("Joatsy Serial Capture");
}

void loop() {
  xbee_read();
}

void xbee_read()
{
  if (xbee.available()›0)
  {
    String data_string="";
    byte data_byte[100];
    byte data_index=0;
    while(xbee.available())
    {
      char data_char=xbee.read();
      
      data_string+=data_char;
      
      data_byte[data_index]=data_char;
      data_index++;
      
      delay(10);
    }
    
    Serial.print("Data String : ");
    Serial.println(data_string);
    
    Serial.print("Data Byte : ");
    for (byte i=0;i‹data_index;i++)
    {
      String data_hex;
      if (data_byte[i]‹16)
        data_hex="0" + String (data_byte[i], HEX);
      else
        data_hex=String (data_byte[i], HEX);
      data_hex.toUpperCase();
      Serial.print(data_hex);
      Serial.print(" ");
    }
    Serial.println();


    //filter 1:
//    if (data_string=="test")
//    {
//      Serial.println("Data test diterima");
//    }
//    else
//    {
//      Serial.println("Data tidak valid!");
//    }

    //filter 2:
    byte match_byte=0;
    for (byte i=0;i‹data_index;i++)
    {
      if (i==0 && data_byte[i]==0x7E)
      {
        match_byte++;
      }
      else if (i==0 && data_byte[i]!=0x7E)
      {
        break;
      }
      if (i==3 && data_byte[i]==0x10)
      {
        match_byte++;
      }
      else if (i==3 && data_byte[i]!=0x10)
      {
        break;
      }
    }
    if (match_byte!=2)
    {
      Serial.println("Data tidak valid!");
    }
    else
    {
      Serial.println("Data frame valid :)");
    }
  }  
}

Hasilnya akan terlihat seperti gambar berikut :

Baca Juga

1 komentar

  1. farid

    mas, klo saya ingin mengambil sebagian data saja misal <12,05,2023,05,02,57,32> nah, saya mau ambil data di dalam tanda < dan > saja bagaimana ya? makasih...

TULISKAN KOMENTAR KAMU

Wajib diisi (No.hp akan kami rahasiakan)*

Nama *

Alamat *

No.hp *