Social Icons

Pages

Saturday, September 14, 2013

Dasar Sketch Pemrograman Arduino bagian I

Berikut adalah dasar-dasar sketch pemrograman Arduino, diharapkan sudah mengenal bahasa C sebelumnya, meskipun arduino menggunakan bahasa C, tapi didunia pemrograman chip selalu ada tambahan yang diberikan oleh vendor chip tersebut, arduino menggunakan chip AVR.

Arduino IDE




void setup() {
  // kode ini hanya akan dijalankan satu kali
}

void loop() {
  // kode ini akan dijalankan berulang-ulang
  }

Bahasa C adalah pemrograman "case sensitive" artinya penulisan hurup besar dan kecil akan diartikan berbeda, jadi mohon diperhatikan cara penulisan kode programnya.

Tulisan berwarna oranye yang diawali dengan void adalah blok kode fungsi, ga perlu dijelasin lagi ya kan udah tau dasar bahasa C. Void setup adalah blok kode untuk setup pin IO, serial monitor, baud rate, dll, sementara void loop adalah blok kode fungsi untuk looping statement.

Berikut adalah sketch blink :

//Sketch lampu kedip
int led = 13; //variabel

// setup
void setup() {               
  // inisialisasi pin sebagai output
  pinMode(led, OUTPUT);    
}

void loop() {
  digitalWrite(led, HIGH);   // led menyala
  delay(1000);               // delay 1s
  digitalWrite(led, LOW);    // led mati
  delay(1000);               // delay 1s
}

Sketch ini mengakibatkan lampu LED pada pin digital 13 akan on/off dalam selang waktu 1 detik.

//Sketch saklar lampu
// konstanta
// set pin
const int saklar = 2;     // pin saklar
const int LED =  13;      // pin LED

// variabel
int Sstatus = 0;         // variabel status dari saklar

void setup() {
  // inisialisasi pin LED sebagai output
  pinMode(LED, OUTPUT);     
  // inisialisasi pin saklar sebagai input
  pinMode(saklar, INPUT);    
}

void loop(){
  // membaca nilai saklar
  Ssaklar = digitalRead(saklar);

  // cek apabila saklar ditekan
  // jika iya maka status saklar adalah HIGH (on)
  if (Ssaklar == HIGH) {    
    // LED menyala:   
    digitalWrite(LED, HIGH); 
  }
  else {
    // LED mati:
    digitalWrite(LED, LOW);
  }
}

Sketch ini adalah aplikasi penggunaan saklar dan lampu LED, ketika saklar ditekan maka lampu menyala, dan sebaliknya lampu mati. Saklar manual biasanya mengalami efek "bouncing" yang mengakibatkan saklar akan dibaca oleh arduino sebagai on/off yang berlangsung dengan cepat, untuk menghindari hal ini bisa dengan menambahkan rangkaian anti-bouncing pada masukan digital, atau memanipulasi secara program, hal ini adalah kelas lanjutan.

//Sketch sensor analog
int sensorPin = A0;    
// pin sensor (gunakan potensio meter sebagai awal percobaan)
int LED = 13;      // pin led
int NilaiSensor = 0;  // variabel sensor

void setup() {
  // deklarasi pin sebagai output
  pinMode(LED, OUTPUT); 
}

void loop() {
  // membaca nilai sensor
  NilaiSensor = analogRead(sensorPin);   
  // menyalakan lampu
  digitalWrite(LED, HIGH); 
  // menghentikan program sebesar NilaiSensor
  delay(NilaiSensor);         
  // matkan lampu 
  digitalWrite(LED, LOW);  
  // menghentikan program sebesar NilaiSensor
  delay(NilaiSensor);                 
}

Sketch ini berfungsi sebagai langkah awal pengertian menggunakan sensor analog, untuk uji coba awal gunakan potensio meter, selanjutnya bisa menggunakan LDR sebagai sensor cahaya, sensor suhu yang memiliki output analog, dsb. Sedangkan untuk sensor dibutuhkan sketch yang lebih rumit untuk mengkalkulasikan nilai masukan menjadi satuan yang dikehendaki.

//LCD 16x2
// include file kode library, header file
#include <LiquidCrystal.h>

// inisialisasi pin LCD
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup() {
  // setup baris dan kolom
LCD
  lcd.begin(16, 2);
  // menampilkan tulisan pada LCD
  lcd.print("hello, world!");
}

void loop() {
  // setup kursor pada kolom 0 baris 1
  // baris 1 artinya baris ke-2, karena dimulai dari 0
  lcd.setCursor(0, 1);
  // menampilkan pada monitor beberapa detik setelah reset
  lcd.print(millis()/1000);
}

Sketch ini adalah dasar penggunaan LCD 16x2, jika anda ingin penggunakan LCD ini sebagai monitoring saklar dan lampu, tinggal menggabungkan sketch ini menjadi satu, perhatikan blok program, biasakan melakukan verify untuk mengecek program apakah ada kesalahan pengetikan atau tidak, jika tidak maka lakukan upload sketch dengan sebelumnya jika pemilihan board dan serial port sudah tepat.

Contoh sketch gauss meter :

#define XRANGE  50
int x,gss;
void setup(){
  Serial.begin(9600);
}  
void loop(){
  int aValue =analogRead(0);
  x = map(aValue, 0, 1024, 0, XRANGE);
  gss = map(aValue, 102, 922, -640, 640);
  Serial.print("|");
  for (int i=0;i<x;i++){
    if(i==XRANGE/2-1) 
Serial.print("|");
    else  
Serial.print("-");
  }
  Serial.print("O");
  for (int i=x+1;i<XRANGE;i++){
    if(i==XRANGE/2-1)
Serial.print("|");
    else 
Serial.print("-");
  }
  Serial.print("|");
  Serial.print(gss);
  Serial.println("Gauss");
  delay(100);
}

Sketch ini banyak menggunakan Serial.print, artinya monitoring ditampilkan pada serial monitor, untuk memonitoring fluktuasi medan magnetik. Semua sketch ini berlaku bagi semua tipe arduino, hanya saja pada saat proses upload sesuaikan board yang digunakan, kemudian pin IO, juga baud rate jika anda bermain-main dengan bluetooth misalnya.

Contoh sketch sensor radiasi nuklir :

#include <LiquidCrystal.h>

LiquidCrystal lcd(3,4,5,6,7,8);

#define TH1 45
#define TH2 95
#define TH3 200
#define TH4 400
#define TH5 600

#define CONV_FACTOR 0.00812

int ledArray [] = {10,11,12,13,9};
int geiger_input = 2;
long count = 0;
long countPerMinute = 0;
long timePrevious = 0;
long timePreviousMeassure = 0;
long time = 0;
long countPrevious = 0;
float radiationValue = 0.0;

void setup(){
  pinMode(geiger_input, INPUT);
  digitalWrite(geiger_input,HIGH);
  for (int i=0;i<5;i++){
    pinMode(ledArray[i],OUTPUT);
  }

  Serial.begin(19200);

   lcd.begin(16, 2);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Radiation Sensor");
  lcd.setCursor(0,1);
  lcd.print("Board - Arduino");  
  delay(1000);

  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Program percobaan");
  delay(1000);

  lcd.clear();
  lcd.setCursor(0,1);  
  lcd.print("Radiasi nuklir");
  delay(500);
  for (int i=0;i<5;i++){
    delay(200);  
    lcd.scrollDisplayLeft();
  }
  delay(500);

  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("  - Libelium -");
  lcd.setCursor(0,1);
  lcd.print("www.libelium.com");    
  delay(1000);

  lcd.clear();  
  lcd.setCursor(0, 0);
  lcd.print("CPM=");
  lcd.setCursor(4,0);
  lcd.print(6*count);
  lcd.setCursor(0,1);
  lcd.print(radiationValue);

  attachInterrupt(0,countPulse,FALLING);
 }

void loop(){
  if (millis()-timePreviousMeassure > 10000){
    countPerMinute = 6*count;
    radiationValue = countPerMinute * CONV_FACTOR;
    timePreviousMeassure = millis();
    Serial.print("cpm = "); 
    Serial.print(countPerMinute,DEC);
    Serial.print(" - ");
    Serial.print("uSv/h = ");
    Serial.println(radiationValue,4);      
    lcd.clear();    
    lcd.setCursor(0, 0);
    lcd.print("CPM=");
    lcd.setCursor(4,0);
    lcd.print(countPerMinute);
    lcd.setCursor(0,1);
    lcd.print(radiationValue,4);
    lcd.setCursor(6,1);
    lcd.print(" uSv/h");

    if(countPerMinute <= TH1) ledVar(0);
    if((countPerMinute <= TH2)&&(countPerMinute>TH1)) ledVar(1);
    if((countPerMinute <= TH3)&&(countPerMinute>TH2)) ledVar(2);
    if((countPerMinute <= TH4)&&(countPerMinute>TH3)) ledVar(3);
    if((countPerMinute <= TH5)&&(countPerMinute>TH4)) ledVar(4);
    if(countPerMinute>TH5) ledVar(5);

    count = 0;
   }
}

void countPulse(){
  detachInterrupt(0);
  count++;
  while(digitalRead(2)==0){
  }
  attachInterrupt(0,countPulse,FALLING);
}

void ledVar(int value){
  if (value > 0){
    for(int i=0;i<=value;i++){
      digitalWrite(ledArray[i],HIGH);
    }
    for(int i=5;i>value;i--){
      digitalWrite(ledArray[i],LOW);
    }
  }
  else {
    for(int i=5;i>=0;i--){
      digitalWrite(ledArray[i],LOW);
    }
  }
}

Sketch diatas adalah sketch untuk mengukur dan mendeteksi kekuatan radiasi NUKLIR, jangan salah memang dinegara ini sulit mencari reaktor nuklir, tapi sebetulnya banyak barang-barang yang berada disekitar kita bahkan gadget yang kita gunakan itu mengandung radiasi nuklir yang berbahaya, coba anda gunakan sketch ini untuk mengukur jarum jam yang glow in the dark, hahaha... anda bisa membuat plutonium dari itu. Segitu dulu ya, yang penting punya ilmu sedikit langsung praktek, God!

Selamat meneliti dan berfikir, because science can find the essence of life.

Sampai ketemu di tulisan-tulisan saya selanjutnya.

No comments: