Jumat, 15 Januari 2016

Teknik Pemrograman Part VI - Fungsi - Fungsi Matematika

 

Apa Saja Fungsi Matematika Yang Akan Kita Bahas?


   Pada tutorial sebelumnya telah dibahas basic perhitungan dalam mengolah bilangan matematika dan beberapa fungsi yang disediakan oleh library Arduino terkait dengan trigonometri. Dalam tutorial kali ini, berikut adalah beberapa fungsi yang akan kita bahas berkaitan dengan pengolahan bilangan matematika yang disediakan oleh Arduino : sqrt( ), pow( ), abs( ), max( ), min( ), floor( ), ceil( ), exp( ), log( ), random(maks), dan fungsi random(min,maks) untuk mendapatkan bilangan acak.




A. Mencari Akar Bilangan dan Bilangan Berpangkat


Pada dasarnya Arduino tidak memiliki operator yang digunakan untuk menghitung akar kuadrat. Walaupun bagitu kita dapat menggunakan fungsi bernama sqrt( ) untuk menghitung akar kuadrat. Berikut sketch pengunaan fungsi  sqrt( ) untuk mencari akar kuadrat suatu bilangan.


void setup() {
  
  Serial.begin(9600);
  int nilai=81;
  float akar;

  akar=sqrt(nilai);
  Serial.print("akar dari ");
  Serial.print(nilai);
  Serial.print(" adalah ");
  Serial.println(akar);

}

void loop() {
  // put your main code here, to run repeatedly:

}

Silahkan coba dan lihat hasilnya pada serial monitor.

Sekarang mari mencoba fungsi untuk mencari bilangan berpangkat. Bentuk umum penggunaan fungsi mencari bilangan berpangkat adalah pow (bilangan,pangkat). Berikut sketch-nya.

void setup() {
  
  int x=10;
  Serial.begin(9600);


  Serial.print("2^x= ");
  Serial.println(pow(2,x));

  Serial.print("x^2= ");
  Serial.println(pow(x,2));

  Serial.print("x^0.5= ");
  Serial.println(pow(x,0.5));

  Serial.print("x^(1/3.0)= ");
  Serial.println(pow(x,(1/3.0)));

}

void loop() {
  // put your main code here, to run repeatedly:

}


Untuk sketch yang terakhir penulisan harus seperti diatas 1/3.0 bukan 1/3 karena akan memiliki hasil yang berbeda. Untuk memahaminya lihat penjelasannya pada tutorial sebelumnya disini.




B. Mencari Nilai Logaritma (Log) dan Nilai Exponensial (Exp)

Saya pernah menggunakan kedua fungsi ini ketika membantu teman, untuk keperluan pembaca warna dari kertas plastik yang memiliki warna yang berbeda-beda. Teman saya kuliah dengan jurusan fisika sehingga memiliki analisa dan perhitungan yang menurut saya cukup rumit meskipun dalam aplikasi yang sederhana. Dengan adanya materi ini saya harap  bisa membantu mereka yang membutuhkan perhitungan logaritma dan exponensial pada aplikasi yang dibuat. Bentuk umum dari kedua fungsi tersebut adalah

 log (bilangan)
 exp (bilangan) 

 Contoh sketch yang menggunakan kedua fungsi tersebut dapat dilihat berikut ini :


void setup() {
  
 Serial.begin(9600);
 Serial.print("exp(10)= ");
 Serial.println(exp(10));

 Serial.print("log(10)= ");
 Serial.println(log(10));
}

void loop() {
  // put your main code here, to run repeatedly:

}

 Saya yakin anda sudah mengerti cara menggunakan kedua fungsi diatas. Silahkan coba sendiri.




C. Mendapatkan Bilangan Acak dengan fungsi Random( )

Untuk mendapatkan nilai random dari Arduino kita harus mengetahui dengan baik sifat dari fungsi tersebut dan trik yang digunakan untuk mendapatkan nilai acak yang benar-benar acak. Berikut bentuk umum dari fungsi random( )


 random(maks)
 random(min,maks)
 randomseed(bilangan) 

  Pada bentuk pertama bilangan yang didapat adalah antara 0 sampai nilai maks-1 (nilai maks dikurangi satu). Pada bentuk yang kedua nilai yang didapat adalah antara nilai min sampai nilai maks-1. Lalau apa itu randomseed( ) ? Fungsi randomseed( ) berguna untuk memberikan nilai awal (inisialisai nilai awal) sebagai generator bilangan acak. Perhatikan dua point dibawah agar anda dapat memahami dengan baik cara pembangkitan bilangan acak dengan fungsi random( ) dan randomseed( ).

  • Untuk mendapatkan bilangan acak yang benar-benar acak maka bilangan yang diisikan pada randomseed( ) adalah nilai pembacaan dari pin analog Arduino. Pin ini sendiri sebenarnya tidak dihubungan kemana-mana. Namun justru karena itulah kita akan mendapatkan bilangan yang benar-benar acak. Ketika kita taruh fungsi randomseed( ) dengan pembacaan pin analog Arduino pada fungsi loop maka nilai pembacaan pin analog akan terus berubah-ubah ketika dieksekusi sehingga bilangan yang digenerated juga akan terus berubah ubah.
  • Sebaliknya, untuk mendapatkan bilangan acak namun bilangan acak tersebut dapat mengulang persis maka dilakukan dengan memberikan bilangan randomSeed ( ) dengan nomor tetap. Fungsi randomseed( ) dimulai terlebih dahulu baru kemudian digenerated bilangan acaknya.

Mungkin ada yang bingung untuk pernyataan point kedua. Untuk memahami point kedua secara lebih baik maka silahkan tiru sketch dibawah ini. Fungsi randomseed( ) akan dideklarasi terlebih dahulu baru kemudian bilangan acak akan ditampilkan sebanyak 3 buah.

int minimum=10,maximum=90;

void setup() {
  
  Serial.begin(9600); 
}

void loop() {
  
  Serial.print("Fungsi Random( ) Tanpa Fungsi RandomSeed( )");
  Serial.println(random(minimum,maximum));
  Serial.println(random(minimum,maximum));
  Serial.println(random(minimum,maximum));
  Serial.println("");

  Serial.print("Fungsi Random( ) dgn Fungsi RandomSeed(67)");
  randomSeed(67);
  Serial.println(random(minimum,maximum));
  Serial.println(random(minimum,maximum));
  Serial.println(random(minimum,maximum));
  Serial.println("");

  Serial.print("Fungsi Random( ) dgn Fungsi RandomSeed(analogRead(0))");
  randomSeed(analogRead(0));
  Serial.println(random(minimum,maximum));
  Serial.println(random(minimum,maximum));
  Serial.println(random(minimum,maximum));
  Serial.println("");

  delay(3000);
  
}


Bagaimana? Setelah melihat nilai acak yang dibangkitkan pada serial monitor saya yakin anda telah faham sepenuhnya...




D. Cara Mendapatkan Bilangan Absolut x atau |x|

Untuk mendapatkan nilai absolut suatu bilangan maka dapat digunakan fungsi abs( ). Berikut contoh sketchnya


void setup() {
  int nilai1=9;
  int nilai2=-5;

  Serial.begin(9600);
  Serial.print("nilai1-nilai2= ");
  Serial.println(abs(nilai1-nilai2));
  Serial.println("");

  Serial.print("nilai1*nilai2= ");
  Serial.println(abs(nilai1*nilai2));
  Serial.println("");

}

void loop() {
  // put your main code here, to run repeatedly:

}





E. Fungsi Untuk Mendapatkan Nilai Terkecil atau Terbesar dari Dua Nilai


   Fungsi max( ) berguna untuk mendapatkan nilai terbesar di antara dua nilai argumennya, sedangkan fungsi min( ) berguna untuk mendapatkan nilai terkecil di antara dua nilai argumennya. bentuk umum dari kedua fungsi tersebut adalah sebagai berikut

 max(nilai 1, nilai 2) 
 min(nilai 1, nilai 2)

Berikut contoh sketchnya :

void setup() {
  int nilai1=9,nilai2=10;

  Serial.begin(9600);
  Serial.print("fungsi max()");
  Serial.println(max(9,10));
  Serial.println(max(10,9));
  Serial.println("");

  Serial.print("fungsi min");
  Serial.println(min(9,10));
  Serial.println(min(10,9));

}

void loop() {
  // put your main code here, to run repeatedly:

}






F. Fungsi Untuk Membulatkan Bilangan

  Fungsi yang terkait dengan pembulatan bilangan adalah floor( ) dan ceil( ). Kita akan membahasnya satu-persatu :
  1. Fungsi Floor( )
    Fungsi ini memberikan nilai balik berupa bilangan bulat terdekat yang nilainya lebih kecil atau sama dengan argumennya. contohnya sebagai berikut :
    floor(-6.7) → -7
    floor(6.7) → 6
    floor(4.6) → 4
  2.  
  3. Fungsi Ceil( )
    Fungsi ini memberikan nilai balik berupa bilangan bulat terdekat yang nilainya lebih besar atau sama dengan argumennya.
    contonya sebagai berikut :
    ceil(-6.7) → -6
    ceil(6.7) → 7
    ceil(4.6) → 5
  4.  
  5. Cara ketiga untuk mendapatkan pembulatan bilangan adalah dengan melakukan konversi. Dari situs resmi Arduino hal ini dikenal dengan cast. Klik disini jika ingin lihat penjelasan dari Arduino.  Berikut contoh penggunaannya :

    int i;
    float f;

    f = 3.6;
    i = (int) f; //  i sekarang adalah 3

    Namun dari ketiga cara diatas pembulatan tidak bisa secara otomatis mengenali angka dibelakang koma untuk menentukan pembulatan, apakah pembulatan menjadi nilai lebih besar atau lebih kecil dari argumen. Untuk mendapatkannya anda dapat membaca pada forum Arduino disini. Pada Forum tersebut seseorang memberikan contoh sketch agar pembulatan dapat mengenali nilai angka dibelakang koma sehingga secara otomatis bilangan dapat dibulatkan lebih besar atau lebih kecil dari argumennya.
Berikut ini sketch untuk ketiga contoh diatas :

void setup() {
   
  Serial.begin(9600);
  
  Serial.print("Fungsi floor");
  Serial.println(floor(-6.7));
  Serial.println(floor(6.7));
  Serial.println(floor(4.6));

  Serial.print("Fungsi ceil");
  Serial.println(ceil(-6.7));
  Serial.println(ceil(6.7));
  Serial.println(ceil(4.6));

}

void loop() {
  // put your main code here, to run repeatedly:

}



Atok harap semua meteri diatas dapat difahami dengan baik oleh pembaca. Silahkan mencoba dan jangan menyerah, sukses selalu.


5 komentar:

  1. Bang Ane mau nanya, kita mau mendapatkan nilai maximal dan minimal dari suatu data tetapi dalam jangka waktu (misalkan selama 1 jam) maka nilai maximal : x dan nilai minimal : y . Gimana untuk scriptnya di arduino ? 🙏 Mohon pencerahannya

    BalasHapus
    Balasan
    1. simpan dlo datanya dalam array... kmudian cek data 1 dan 2 seterusnya mna yg lbh besar

      Hapus
  2. Bg saya mau nanya, untuk mencari nilai minimum dari 3 buah data gmana caranya bg? Mohon bantuannya🙏

    BalasHapus
  3. Bang mau nanya. Untuk membulatkan rupiah misal 455 = 500. 450 = 400. Mohon bantuannya

    BalasHapus