Mahir Arduino Sketch dan Elektro secara praktek

Nah sebagai pemula, saya perlu memilih proyek yang sederhana namun cukup membuka pengertian akan akses pin pada Arduino Uno Board.

Led Blink, program akan mengakses pin 10 dan memerintahkan arduino untuk mengulang blink led. Dengan mengerjakan proyek ini, kita akan mempelajari beberapa dasar-dasar elektronik dan sketch programming Arduino.


Hal yang diperlukan

Skema



Note Karena saya mempelajari arduino dari nol, jadi saya share juga yang  hal-hal yang mungkin terlihat remeh bagi para expert. Warna kabel jumper tidak harus sesuai gambar, namun untuk kebiasaan yang baik, usahakn untuk positif gunakan warna merah, untuk ground gunakan hitam. Lubang pada breadboard pun tidak masalah, kita bisa memasang di lubang yang mana saja. Yang harus betul-betul diperhatikan adalah hubungan antar komponen dan pin pada arduino, harus sesuai gambar.

Sketch

// Project 1 - LED Flasher
int ledPin = 10;


void setup() {
  pinMode(ledPin, OUTPUT);
}
 

void loop() {
  digitalWrite(ledPin, HIGH);
  delay(1000);
  digitalWrite(ledPin, LOW);
  delay(1000);
}


setelah sketch diketik, tekan tombol verivy, bila tidak ada error, tekan tombol upload. (silakan lihat cara upload dan konek arduino uno dengan komputer).

Pembahasan Sketch

// Project 1 - LED Flasher
Ini adalah komentar baris yang berguna untuk dokumentasi program, kompiler akan mengabaikan bagian ini. Baris komentar berguna bagi programmer agar bisa mengerti maksud program.

int ledPin = 10;
Inisialisasi variable, dalam hal ini inisialisasi variable bernama ledPin dengan type data integer dan nilai 10.

void setup() {
  pinMode(ledPin, OUTPUT);
}

Setiap sketch arduino wajib memiliki fungsi setup() dan loop().  Fungsi setup() dipanggil hanya sekali saat pertama kali program berjalan. Fungsi setup() biasanya tempat untuk men-setup hal-hal umum agar program Anda siap dijalankan, seperti setup pin modes, setting serial baud rates, dan lainnya.

Pada sketch Led Blink, fungsi setup hanya memiliki 1 baris perintah yaitu

pinMode(ledPin, OUTPUT);

pinMode fungsi yang berguna untuk memberitahu arduino bahwa pin pada board akan digunakan sebagai input atau output.Dalam baris program diatas,  kita memberitahu arduino untuk menset pin 10 (nilai ledPin adalah 10) sebagai OUTPUT.

void loop() {
  digitalWrite(ledPin, HIGH);
  delay(1000);
  digitalWrite(ledPin, LOW);
  delay(1000);
}


Fungsi loop() function adalah program utama yang dipanggil secara continue selama arduino menyala (dialiri power). Setiap perintah dalam fungsi loop() akan dipanggil satu persatu sampai perintah terakhir dalam blok loop dicapai, lalu Arduino akan kembali ke awal perintah di blok fungsi loop(), sampai Arduino dimatikan atau tombol reset ditekan.

Jadi dalam proyek ini Arduino akan menyalakan led, menunggu selama 1 detik, lalu mematikan led, lalu menunggu 1 detik. Urutan perintah ini akan diulang terus menerus sampai arduino dimatikan atau direset.


Related Article

Artikel Sebelumnya Pengenalan Sketch
Artikel Selanjutnya Proyek Led Blinker Advanced
Dari rangkaian proyek LED Blinker sebelumnya, kita dapat membuat lebih advanced dengan kreatifitas dalam programming. Salah satu contohnya adalah S.O.S  kode morse dengan LED. LED akan menyala lebih lama untuk menunjukkan kode garis, dan menyala lebih sebentar untuk kode titik. (Morse merupakan code dengan garis dan titik, sekiranya saya tidak perlu menjelaskan morse terlalu mendetail, karena saya tidak lulus dari pramuka siaga...hehehe..just kidding)


Sketch S.O.S Morse

// LED connected to digital pin 10
int ledPin = 10;
 

// run once, when the sketch starts
void setup()
{
  // sets the digital pin as output
  pinMode(ledPin, OUTPUT);
}


// run over and over again
void loop()
{
  // 3 dits (3 titik atau huruf S)
  for (int x=0; x<3; x++) {
    digitalWrite(ledPin, HIGH); // sets the LED on
    delay(150); // waits for 150ms
    digitalWrite(ledPin, LOW); // sets the LED off
    delay(100); // waits for 100ms
  }


  // 100ms delay to cause slight gap between letters
  delay(100);


  // 3 dahs (3 garis atau huruf O)
  for (int x=0; x<3; x++) {
    digitalWrite(ledPin, HIGH); // sets the LED on
    delay(400); // waits for 400ms
    digitalWrite(ledPin, LOW); // sets the LED off
    delay(100); // waits for 100ms
  }

  // 100ms delay to cause slight gap between letters
  delay(100);
 

  // 3 dits again (3 titik atau huruf S)
  for (int x=0; x<3; x++) {
    digitalWrite(ledPin, HIGH); // sets the LED on
    delay(150); // waits for 150ms
    digitalWrite(ledPin, LOW); // sets the LED off
    delay(100); // waits for 100ms
  }


  // wait 5 seconds before repeating the SOS signal
  delay(5000);

}



Pembahasan Kode
Untuk fungsi setup, kita hanya mengidentifikasikan pinout dari LED, masih seperti sketch sebelumnya (proyek Led Blinker).

Perubahan cukup banyak, dilakukan pada fungsi loop(). Secara umum, fungsi loop() memiliki logika menyalakan LED dengan kode morse S.O.S secara terus menerus, diantara sinyal SOS diberikan jeda selama 5 detik.

Hal yang baru disini adalah fungsi for(), ini adalah fungsi perulangan. memiliki parameter nilai awal, nilai akhir dan nilai penambahan. Nilai awal untuk menentukan awal loop, nilai akhir untuk mengecek apakah nilai saat ini sudah mencapai nilai akhir, bila belum maka nilai sekarang akan ditambahkan sesuai nilai increment, dan blok kode didalam loop akan dijalankan.

Pada sketch diatas loop akan dilakukan sebanyak 3 kali

for (int x=0; x<3; x++) {
  //blok kode loop
}

For I : x=0, lalu akan dibandingkan, 0 < 3, bila betul maka, nilai x akan ditambah 1, menjadi 1, lalu blok kode didalam for akan dilakukan.

For II : x=1, lalu dibandingkan 1<3, kondisi betul, nilai x ditambah menjadi 2, lalu blok kode didalam for akan dijalankan.

For III : x=2,  lalu dibandingkan 2<3, kondisi betul, nilai x ditambah menjadi 3, lalu blok kode didalam for akan dijalankan.

For III : x=3,  lalu dibandingkan 3<3, kondisi salah, maka program akan melanjutkan kebaris perintah berikutnya, blok for akan dilewati.

Jadi blok for ke-1 akan membuat huruf S, blok for ke-2 membuat huruf O, blok for ke-3 membuat huruf S, lalu delay 5 detik. Mudahkan? Dengan kreatifitas programming, Rangkaian yang sederhana sudah bisa dibuat menjadi sesuatu yang bermanfaat.

Artikel Sebelumnya: Proyek Led Blinker
Artikel Selanjutnya: Proyek Lampu Lalu Lintas
Nah, kembali berkreasi dengan LED. Proyek kali ini adalah bikin lampu stopan yang menyala dari hijau, kuning lalu merah dan berulang terus selayaknya lampu merah.

Ngomong-ngomong soal lampu merah.. jadi teringat koran yang dibredel..hehehe.. just kidding yah.. berikut komponen yang diperlukan untuk proyek kali ini.
  • Breadboard
  • LED merah, kuning dan hijau
  • 3x Resistor 150 ohm
  • Kabel jumper

Rangkaian atau Skema


Note
Nah, seperti yang sudah dibahas sebelumnya, warna kabel jumper tidak masalah, anda bisa gunakan berbagai warna, namun untuk umumnya, kabel merah untuk positif. Jangan kebalik juga yah pasang kaki LED nya, silakan lihat artikel pengenal LED untuk menentukan kaki positif dan negatif.

Oya, Anda bisa mencolokkan LED dilubang yang mana saja..(maaf..bila terkesan vulgar..hahaha..) asalkan skemanya seperti diatas.

Perhatikan juga Pinout yang digunakan, disini digunakan pinout digital 8, 9 dan 10. Juga ground.

Sketch Lampu Lalu Lintas

// Project 3 - Traffic Lights
int ledDelay = 5000; // delay in between changes
int redPin = 10;
int yellowPin = 9;
int greenPin = 8;
 

void setup() {
  pinMode(redPin, OUTPUT);
  pinMode(yellowPin, OUTPUT);
  pinMode(greenPin, OUTPUT);
}




void loop() {
  digitalWrite(redPin, HIGH); // turn the red light on
  delay(ledDelay); // wait 5 seconds

  digitalWrite(yellowPin, HIGH); // turn on yellow
  delay(2000); // wait 2 seconds
 

  digitalWrite(greenPin, HIGH); // turn green on
  digitalWrite(redPin, LOW); // turn red off
  digitalWrite(yellowPin, LOW); // turn yellow off
  delay(ledDelay); // wait ledDelay milliseconds
 

  digitalWrite(yellowPin, HIGH); // turn yellow on
  digitalWrite(greenPin, LOW); // turn green off
  delay(2000); // wait 2 seconds


  
  digitalWrite(yellowPin, LOW); // turn yellow off

  // now our loop repeats
}



Nah.. logika programnya seperti ini:
  • nyalakan lampu merah, tunggu 5 detik
  • nyalakan lampu kuning, tunggu 2 detik
  • nyalakan lampu hijau, matikan lampu merah dan kuning lalu tunggu 5 detik
  • nyalakan lampu kuning, matikan lampu hijau, tunggu 2 detik.
  • matikan lampu kuning, dan program kembali ke awal fungsi loop()
Mungkin Anda merasa kurang ajar, motor ane belum maju koq udah kuning lagi, delaynya bisa ditambah..atau coba ditambah sensor, biar giliran agan selalu hijau.. :D

Artikel Sebelumnya Proyek LED Blinker Advanced
Artikel Selanjutnya Proyek Lampu Lalu lintas Advanced
Kali ini, proyek kita akan ditambah fungsinya dari proyek sebelumnya yaitu proyek Lampu Lintas. Fungsi yang ditambahkan adalah lampu penyebrang jalan. Saat penyebrang menekan saklar untuk menyebrang jalan, lampu lalu lintas akan berganti menjadi orange, lalu merah, kemudian lampu penyebrang jalan akan menyala hijau. Setelah sekian detik waktu, lampu penyebrang jalan akan berganti merah, lampu lalulintas akan kembali berjalan normal.


Jadi dalam proyek ini kita juga belajar menangkap input dari luar sistem, juga mengenal tipe data baru yaitu unsigned long.

Komponen
2 LED merah
1 LED kuning
2 LED hijau
1 resistor 10 kiloohm 
5 resistor
1 pushbutton

Skema


Sketch

// Project 4 - Interactive Traffic Lights
int carRed = 12; // assign the car lights
int carYellow = 11;
int carGreen = 10;
int pedRed = 9; // assign the pedestrian lights
int pedGreen = 8;
int button = 2; // button pin
int crossTime = 5000; // time allowed to cross
unsigned long changeTime = 0; // time last pedestrian cycle completed


void setup() {
  pinMode(carRed, OUTPUT);
  pinMode(carYellow, OUTPUT);
  pinMode(carGreen, OUTPUT);
  pinMode(pedRed, OUTPUT);
  pinMode(pedGreen, OUTPUT);
  pinMode(button, INPUT); // button on pin 2
 

  // turn on the green light
  digitalWrite(carGreen, HIGH);
  digitalWrite(pedRed, HIGH);
}


void loop() {
  int state = digitalRead(button);
  /* check if button is pressed and it is over 5 seconds since last button press */
  if (state == HIGH && (millis() - changeTime) > 5000) {
    // Call the function to change the lights
    changeLights();
  }
}
 

void changeLights() {
  digitalWrite(carGreen, LOW); // green off
  digitalWrite(carYellow, HIGH); // yellow on
  delay(2000); // wait 2 seconds
  digitalWrite(carYellow, LOW); // yellow off
  digitalWrite(carRed, HIGH); // red on
  delay(1000); // wait 1 second till its safe
  digitalWrite(pedRed, LOW); // ped red off
  digitalWrite(pedGreen, HIGH); // ped green on
  delay(crossTime); // wait for preset time period
 

  // flash the ped green
  for (int x=0; x<10; x++) {
    digitalWrite(pedGreen, HIGH);
    delay(250);
    digitalWrite(pedGreen, LOW);
    delay(250);
  }


  // turn ped red on
  digitalWrite(pedRed, HIGH);
  delay(500);
  digitalWrite(carYellow, HIGH); // yellow on
  digitalWrite(carRed, LOW); // red off
  delay(1000);
  digitalWrite(carGreen, HIGH);
  digitalWrite(carYellow, LOW); // yellow off

  
  // record the time since last change of lights
  changeTime = millis();


  // then return to the main program loop
}



Penjelasan Program
Kebanyakan dari program diatas sudah dapat Anda pahami, karena mirip dengan proyek sebelumnya. Disini ada hal baru yaitu tipe data baru unsigned long

unsigned long changeTime = 0;

tipe data integer mampu menyimpan angka dari  −32,768 and 32,767, sementara long −2,147,483,648 to 2,147,483,647. kata keyword unsigned membuat variable changeTime mampu menampung angka 0 to 4,294,967,295. Pemilihan tipe data diatas agar variable tidak overflow dan program menjadi error secara logik.

Sempat terpikir oleh saya, mengapa gak semua pake tipe data long aja.. biar gak pusing. Nah, dikarenakan chip ATMega328  ini dibuat dengan resource yang minimum, kita harus pintar memilah tipe data agar tidak memboroskan resource.

Untuk menunggu input dari luar sistem, kita harus menentukan pin mana yang akan menjadi input.

pinMode(button, INPUT); // set pin sebagai input


Kemudian pada fungsi loop() kita menunggu input dari user, dan melakukan pengecekan, apakah ada input dari luar sistem.

void loop() {
  int state = digitalRead(button);
  /* check if button is pressed and it is over 5 seconds since last button press */
  if (state == HIGH && (millis() - changeTime) > 5000) {
    // Call the function to change the lights
    changeLights();
  }
}


Perintah if diatas akan melakukan cek, jika button ditekan dan waktu sekarang (semenjak Arduino menyala) - kurangi variable changeTime lebih besar dari 5000. Jika kedua syarat dipenuhi maka perintah fungsi changeLights() didalam blok if akan dijalankan.

Pada Proyek ini, kita juga belajar mengenai pull-down resistor. Untuk lebih detail mengenai pull-down resistor click disini.

Artikel Sebelumnya : Proyek Lampu Lalu Lintas
Artikel Selanjutnya : Proyek LED Chase Effect
Di project ke-5 kita akan membuat LED yang memiliki efek bergerak saling mengejar. Disini kita akan belajar mengenai konsep dari arrays.

Komponen yang diperlukan
  • 10 x 5mm RED LEDs
  • 10 x Current-Limiting Resistors


Skema




Sketch

// Project 5 - LED Chase Effect
byte ledPin[] = {4, 5, 6, 7, 8, 9, 10, 11, 12, 13}; // Create array for LED pins
int ledDelay = 65; // delay between changes
int direction = 1;
int currentLED = 0;
unsigned long changeTime;
 

void setup() {
  for (int x=0; x<10; x++) { // set all pins to output
    pinMode(ledPin[x], OUTPUT);
  }
  changeTime = millis();
}


void loop() {
  if ((millis() - changeTime) > ledDelay) { // if it has been ledDelay ms since last change
    changeLED();
    changeTime = millis();
  }
}


void changeLED() {
  for (int x=0; x<10; x++) { //turn off all LED's
    digitalWrite(ledPin[x], LOW);
  }
  digitalWrite(ledPin[currentLED], HIGH); //turn on the current LED
  currentLED += direction; //increment by the direction value
  // change direction if we reach the end
  if (currentLED == 9) {direction = -1;}
  if (currentLED == 0) {direction = 1;}
}



Penjelasan Sketch

byte ledPin[] = {4, 5, 6, 7, 8, 9, 10, 11, 12, 13};

Perintah diatas untuk mendeklarasikan variable dengan tipe array dengan tipe data byte. semua element dapat diakses melalui nama yang sama, dalam hal ini adalah variable ledPin. contoh ledPin[0] akan menunjukkan nilai 4.

Tanda [] setelah nama variable menunjukkan pada compiler tipe array adalah array variable. Pada array ini kita inisialisasi nilai untuk menunjukkan pin Arduino.

Jika hendak mengdeklarasikan array tanpa inisialisasi nilai, kita perlu memberi tahu Arduino besar dari array. Contoh:  byte ledPin[10];

Pada sketch kita, variable array ini digunakan untuk mengakses LED. Pada fungsi loop(), kita cek apakah ledDelay sudah dilewati sejak perubahan LED terakhir, jika sudah, maka fungsi ChangeLED() akan dipanggil.

Yang dilakukan fungsi ChangeLEDadalah mematikan semua LED dan menyalakan LED yg harus aktif saat ini., yang disimpan di variable currentLED.


Setelah currentLED dinyalakan, nilai currentLED akan ditambahkan atau dikurangkan, berdasar variable direction. Variable direction ditentukan oleh blok if, jika currentLED bernilai 9, direction akan -1, bila currentLED bernilai 0 maka direction akan +1;

Program kita akan membuat nyala LED bergerak bolak-balik.

Artikel Sebelumnya:  Proyek Lampu Lalulintas Advanced
Artikel Selanjutnya: Proyek Led Chase Advanced
Biarkan layout sirkuit  pada proyek 09, kita akan menambahkan potentiiometer pada rangkaian tersebut. Dengan potentiometer kita dapat mengubah kecepatan LED saat "berlari".


Komponen yang diperlukan


Skema




Sketch

byte ledPin[] = {4, 5, 6, 7, 8, 9, 10, 11, 12, 13}; // Create array for LED pins
int ledDelay; // delay between changes
int direction = 1;
int currentLED = 0;
unsigned long changeTime;
int potPin = 2; // select the input pin for the potentiomete


void setup() {
  for (int x=0; x<10; x++) { // set all pins to output
    pinMode(ledPin[x], OUTPUT);
  }
  changeTime = millis();
}


void loop() {
  ledDelay = analogRead(potPin); // read the value from the pot
  if ((millis() - changeTime) > ledDelay) { // if it has been   ledDelay ms since last change
    changeLED();
    changeTime = millis();
  }
}
 

void changeLED() {
  for (int x=0; x<10; x++) { // turn off all LED's
    digitalWrite(ledPin[x], LOW);
  }
  digitalWrite(ledPin[currentLED], HIGH); // turn on the current LED
  currentLED += direction; // increment by the direction value
 

  // change direction if we reach the end
  if (currentLED == 9) {direction = -1;}
  if (currentLED == 0) {direction = 1;}
}


Penjelasan Sketch
Sketch kita cukup mirip dengan proyek sebelumnya. Kita hanya menambahkan potentiometer pada sisi hardware dan pada sisi program kita menambahkan perintah untuk membaca input dari potenstiometer dan digunakan untuk mengatur kecepatan LED berlari.

int potPin = 2;
perintah diatas mendeklarasikan variable untuk menampung input dari potentiometer, tipe data adalah integer. Perintah yang digunakan untuk membaca input adalah analogRead.

Analog pin dapat membaca voltage dari 0 - 5 volts, dalam integer dari 0 (0 volts) sampai 1.023 (5 volts). Berarti resolusi 4.9mV per unit (5 volts / 1.024 units).

ledDelay = analogRead(potPin);
Kita membaca input dari potentiometer dan meng-adjust delay diantara 0 dan 1023 millisecond dengan menggunakan nilai dari ledDelay yang diperoleh dari input potentiometer. Perhatikan kita tidak perlu mengatur analog sebagai input atau output seperti juga dengan digital pin

Tantangan Programming
  1. Dengan mengubah program, Anda dapat membuat efek bouncing. Led bergerak dari kiri ke kanan, lalu langsung start dari kanan ke kiri.
  2. Tantangan kedua, ubah juga program Anda untuk efek bouncing bola yang makin lama makin melemah.

Artikel Terkait
Apa itu poteionsiometer

Artikel sebelumnya Proyek Led Chase Effect
Artikel selanjutnya Proyek Led Dimmer 
Proyek ini memiliki rangkaian sederhana, hanya untuk memberikan ide mengontrol tingkat kecerahan LED melalui arduino. Pada proyek sebelumnya, kita hanya mematikan dan menyalakan LED. Pada proyek ini kita akan menyalakan dari tingkat kecerahan rendah hingga maksimum, lalu mematikan dari dari tingkat kecerahan tinggi hingga padam.

Komponen yang digunakan
  • LED 5mm (silakan guanakan warna LED apa saja)
  • Resistor 
Skema



Sketch

// Project 11 - LED Dimmer
int ledPin = 11;
float sinVal;
int ledVal;


void setup() {
  pinMode(ledPin, OUTPUT);
}
 

void loop() {
  for (int x=0; x<180; x++) {
    // convert degrees to radians then obtain sin value
    sinVal = (sin(x*(3.1412/180)));
    ledVal = int(sinVal*255);
    analogWrite(ledPin, ledVal);
    delay(25);
  }
}


Verifikasi dan upload sketch diatas, LED akan menyala dari redup hingga terang, lalu dari terang, redup hingga padam. Mari kita lihat logika programnya.

Untuk melakukan hal tersebut, kita menggunakan gelombang sinus. Sinus memilki gelombang dari 0 merambat naik ke 1 dan kembali merambat turun ke 0 (seperti berbentuk setengah lingkaran).

Fungsi yang digunakan adalah sin(), fungsi trigonometri matematika untuk perhitungan sudut. Pada sketch, kiat  hanya menggunakan interval 0-179 (kita tidak memerlukan nilai negatif).

Fungsi sin memerlukan nilai dalam radian, bukan dalam sudut. Jadi persamaan yang digunakan adalah sin(x*(3.1412/180)), setelah mendapatkan nilai radian, untuk kebutuhan kita, nilai dari persamaan tadi dikalikan 255. Setelah itu kita akan menulis nilai tersebut ke pin dimana LED tersambung.

Nilai yang diperoleh dari perhitungan diatas akan berkisar dari 0 s/d 1. 0 untuk LED kondisi padam, 1 untuk LED menyala dengan tingkat kecerahan maksimum.

Artikel Sebelumnya Proyek Led Chase Advanced
Artikel Selanjutnya Proyek RGB Mood Lamp
Pada proyek kali ini, kita akan menggunakan fitur PWM dari Atmega untuk mengatur tingkat kecerahan pada LED.  Dengan menggunakan fitur ini, kita dapat menggunakan 3 LED (merah, hijau dan biru) untuk menghasilkan warna cahaya yang kita inginkan.

Gunakan Silinder Cover  untuk menutup 3 Led yang digunakan, agar gabungan warna cahaya dari led bisa disebarkan melalui cover.

Komponen yang dibutuhkan
  • Led Merah
  • Led Hijau
  • Led Biru
  • 3 Resistor

Skema

Sketch
// Project 12 - Mood Lamp
float RGB1[3];
float RGB2[3];
float INC[3];
int red, green, blue;
int RedPin = 11;
int GreenPin = 10;
int BluePin = 9;


void setup(){
  Serial.begin(9600);
  randomSeed(analogRead(0));
  RGB1[0] = 0;
  RGB1[1] = 0;
  RGB1[2] = 0;


  RGB2[0] = random(256);
  RGB2[1] = random(256);
  RGB2[2] = random(256);

}
 

void loop(){
  randomSeed(analogRead(0));
  for (int x=0; x<3; x++) {
    INC[x] = (RGB1[x] - RGB2[x]) / 256;

  }
  for (int x=0; x<256; x++) {
    red = int(RGB1[0]);
    green = int(RGB1[1]);
    blue = int(RGB1[2]);
    analogWrite (RedPin, red);
    analogWrite (GreenPin, green);
    analogWrite (BluePin, blue);
    delay(100);
    RGB1[0] -= INC[0];
    RGB1[1] -= INC[1];
    RGB1[2] -= INC[2];
  }
  for (int x=0; x<3; x++) {
    RGB2[x] = random(556)-300;
    RGB2[x] = constrain(RGB2[x], 0, 255);
    delay(1000);
  }

}

Setelah diupload, LED akan berubah warna secara perlahan menjadi mood lamp.

Penjelasan Code
Yang perlu diperhatikan adalah aturan warna dari cahaya, dengan kombinasi 3 elemen dasar cahaya yaitu Red, Green dan Blue, kita bisa menghasilkan warna yang kita ingingkan dengan mengatur intesitas masing-masing warna.

Gambar dibawah menunjukkan pencampuran warna dari RGB.




Dengan mengatur tingkat brightness menggunakan PWM, kita dapat menghasilkan variasi warna. Gunakan plastic diffuser untuk menutupi 3 LED pada skema kita, agar cahaya menyatu. Contoh masukkan 3 LED kedalam bola pingpong.

Total rentang warna yang dapat diperoleh dengan menggunakan PWM adalah 16.777.216 warna (256 x  256 x 256).

Pada code, kita deklarasikan floating point arrays dan integer untuk menyimpan nilai RGB.

float RGB1[3];
float RGB2[3];
float INC[3];
int red, green, blue;



randomSeed(analogRead(0));
Perintah randomSeed untuk menghasilkan angka random, sebetulnya chip komputer tidak bisa menghasilkan angka random. Prosesor akan menggunakan fungsi matematika untuk menghasilkan angka pseudo-random. Dengan “seed,” kita memberitahu processor kapan untuk mengembalikan nilai random. Pada code kita, value yang kita berikan pada perintah randomSeed adalah value dari hasil pembacaan pada analog pin ke -0. Dimana kita tidak melakukan koneksi apa-apa di pin analog 0, angka random akan dihasilkan dari analog noise. Setelah kita mengatur "seed" untuk angka random, kita dapat menghasilkan angka random melalui fungsi random(). Dari sini kita memiliki 2 angka random RGB yang disimpan dalam variable array.

RGB1 adalah variable untuk menyimpan warna awal. Dalam hal ini 0, alias tidak ada cahaya sama sekali.

  RGB1[0] = 0;
  RGB1[1] = 0;
  RGB1[2] = 0;


RGB2 adalah variable untuk menyimpan warna yang dituju. Program akan membuat peralihan warna dari RGB1 ke RGB2.

  RGB2[0] = random(256);
  RGB2[1] = random(256);
  RGB2[2] = random(256);


Dalam hal ini kita membuat warna random dengan fungsi random(256) dimana value yang diperoleh diantara 0 -255. Fungsi random juga bisa menggunakan 2 parameter, contoh random (10-50) angka menghasilan value antara 10-49.

Logika program selanjutnya adalah, kita akan menentukan nilai increment warna. Lalu code akan menuliskan ke pinout arduino. Saat sesudah melewati 256 loop, nilai RGB1 akan sama atau mendekati nilai RGB2, pada blok for ke-3 kita akan mengatur nilai RGB2 yang baru. Perintah constrain untuk memastikan nilai positif (PWM tidak bisa menerima nilai negatif).

Fungsi constrain memerlukan 3 parameter, yaitu constrain(x, a, b)
x adalah angka yang akan di constrain
a adalah range terendah
b adalah range tertinggi.

Dalam hal ini kita akan membatasi fungsi contrain dari 0 hingga 255.


  for (int x=0; x<3; x++) {
    INC[x] = (RGB1[x] - RGB2[x]) / 256;

  }
  for (int x=0; x<256; x++) {
    red = int(RGB1[0]);
    green = int(RGB1[1]);
    blue = int(RGB1[2]);
    analogWrite (RedPin, red);
    analogWrite (GreenPin, green);
    analogWrite (BluePin, blue);
    delay(100);
    RGB1[0] -= INC[0];
    RGB1[1] -= INC[1];
    RGB1[2] -= INC[2];
  }
  for (int x=0; x<3; x++) {
    RGB2[x] = random(556)-300;
    RGB2[x] = constrain(RGB2[x], 0, 255);
    delay(1000);
  }



Chalange
Untuk meningkatkan kreatifitas dalam programming, coba buat perubahan warna beradarkan urutan tertentu, misalnya urutan warna pelangi.

Artikel Sebelumnya Proyek Led Dimmer
Artikel Selanjutnya Piezo Sound Alarm
Nah, bila sudah mulai fasih bermain led, kita coba ke projek selanjutnya, kita coba bermain sound. Kita menggunakan piezo sounder sebagai latihan awal. Aplikasi dari suara bisa banyak, alarm, warning beeps atau alert notification. Code yang digunakan adalah tone(). Pada project 11 ini kita akan mencoba membuat alarm sederhana, seperti alarm mobil.

Komponen yang digunakan

  • Piezo Sounder 
  • 2 way screw terminal 


Saat memilih piezo sounder, pastikan jangan membeli tipe active buzzer, yang digunakan pada proyek ini adalah piezo sounder pasif AC.

Skema



Sketch

// Project 11 - Piezo Sounder Alarm
float sinVal;
int toneVal;

void setup() {
  pinMode(8, OUTPUT);
}

void loop() {
  for (int x=0; x<180; x++) {
    // convert degrees to radians then obtain sin value
    sinVal = (sin(x*(3.1412/180)));
    // generate a frequency from the sin value
    toneVal = 2000+(int(sinVal*1000));
    tone(8, toneVal);
    delay(2);
  }
}

Program diatas mirip dengan projek led dimmer, hanya saja output pada projek ini menggunakan piezo sounder.

Pertama kita siapkan 2 variables

  float sinVal;
  int toneVal;

variable sinVal float digunakan untuk menyimpang nilai sin, yang menghasilkan suara naik turun sesuai nilai sin. Variabel toneVal untuk menyimpan nilai sinVal yang telah kita konversi ke frekuensi yang dibutuhkan.

Pada fungsi setup, kita assign pin 8 sebagai output.

  void setup() {
    pinMode(8, OUTPUT);
  }

Pada fungsi main loop, kita akan melakukan loop dari 0 - 179.

  for (int x=0; x<180; x++) 

lalu nilai x akan kita convert ke radian dan ditampung dalam variable sinVal. Setelah nilai sinVal kita peroleh, kita convert ke frequency dan ditampung dalam variable toneVal.

    sinVal = (sin(x*(3.1412/180)));
    // generate a frequency from the sin value
    toneVal = 2000+(int(sinVal*1000));


Berikutnya kita menggunakan perintah tone() untuk menghasilkan suara pada piezo sounder.

    tone(8, toneVal);

Perintah tone()  membutuhkan 2  atau 3 parameters.
tone(pin, frequency)
tone(pin, frequency, duration)

Parameter pin adalah digital pin yang digunakan sebagai output ke piezo dan frequency adalah frequency dari tone dalam hertz. Parameter duration adalah optional, dalam satuan milisekon. Jika tidak diisi, maka tone akan terus dibunyikan hingga kita memainkan nada lainnya, atau hingga kita memberikan perintah berhenti dengan perintah noTone(pin).

Pada akhir sketch, kita memberikan perintah delay selama 2 milliseconds untuk memberikan jeda antara bunyi.

    delay(2);


Mungkin timbul pertanyaan, kenapa gak pake perintah seperti ini saja  tone(8, toneVal, 2); Karena loop yang kita gunakan sangat pendek, akan menyebabkan perubahan frequency kurang dari millisecond, jadi bila menggunakan perintah diatas, maka perubahan suara tidak akan terdengar. Dengan perintah delay 2 millisecond, kita memastikan piezo akan berbunyi di frekuensi yang kita assign selama 2 milliseconds.

Projek ini dapat dikembangkan sesuai kebutuhan dan kreatifitas Anda, bisa digunakan sebagai alert bila suhu mencapai derajat tertentu, atau bila ada orang mendekat atau apa saja.. silakan berimajinasi.. :)

Nilai 2000 dan 1000 pada perhitungan toneVal  dan waktu delay dapat Anda mainkan juga, silakan bereksperimen untuk mendapatkan suara yang Anda inginkan.

Related Article
Apa itu piezo sounder / disc
Referensi Perintah tone()

Proyek Sebelumnya RGB Mood Lamp
Proyek Selanjut Piezo Sounder Melody Player

Daripada bikin bunyi yang mengganggu, bagaimana bila kita bikin piezo memainkan melodi. Pada proyek ini akan kita bikin arduino memainkan lagu "Oh My Darling Clementine". Biarkan rangkaian tetap seperti proyek sebelumnya.

Code

// Project 14 - Piezo Sounder Melody Player

#define NOTE_C3 131
#define NOTE_CS3 139
#define NOTE_D3 147
#define NOTE_DS3 156
#define NOTE_E3 165
#define NOTE_F3 175
#define NOTE_FS3 185
#define NOTE_G3 196
#define NOTE_GS3 208
#define NOTE_A3 220
#define NOTE_AS3 233
#define NOTE_B3 247
#define NOTE_C4 262
#define NOTE_CS4 277
#define NOTE_D4 294
#define NOTE_DS4 311
#define NOTE_E4 330
#define NOTE_F4 349
#define NOTE_FS4 370
#define NOTE_G4 392
#define NOTE_GS4 415
#define NOTE_A4 440
#define NOTE_AS4 466
#define NOTE_B4 494

#define WHOLE 1
#define HALF 0.5
#define QUARTER 0.25
#define EIGHTH 0.125
#define SIXTEENTH 0.0625

int tune[] = {
 NOTE_F3, NOTE_F3, NOTE_F3, NOTE_C3,
 NOTE_A3, NOTE_A3, NOTE_A3, NOTE_F3,
 NOTE_F3, NOTE_A3, NOTE_C4, NOTE_C4, NOTE_AS3, NOTE_A3, NOTE_G3,
 NOTE_G3, NOTE_A3, NOTE_AS3, NOTE_AS3,
 NOTE_A3, NOTE_G3, NOTE_A3, NOTE_F3,
 NOTE_F3, NOTE_A3, NOTE_G3, NOTE_C3, NOTE_E3, NOTE_G3, NOTE_F3
};

float duration[] = {
 EIGHTH+SIXTEENTH, SIXTEENTH, QUARTER, QUARTER,
 EIGHTH+SIXTEENTH, SIXTEENTH, QUARTER, QUARTER,
 EIGHTH+SIXTEENTH, SIXTEENTH, QUARTER+EIGHTH, EIGHTH, EIGHTH, EIGHTH, HALF,
 EIGHTH, SIXTEENTH, QUARTER, QUARTER,
 EIGHTH+SIXTEENTH, SIXTEENTH, QUARTER, QUARTER,
 EIGHTH+SIXTEENTH, SIXTEENTH, QUARTER+EIGHTH, EIGHTH, EIGHTH, SIXTEENTH, HALF
};

int length;

void setup() {
  pinMode(8, OUTPUT);
  length = sizeof(tune) / sizeof(tune[0]);
}

void loop() {
  for (int x=0; x<length; x++) {
    tone(8, tune[x]);
    delay(1500 * duration[x]);
    noTone(8);
  }
  delay(5000);
}

Pembahasan Kode
Kode kali ini diawali dengan perintah define, perintah ini berguna untuk mendifinisikan sebuah token berserta nilainya.

Pada proyek ini kita melakukan perintah define untuk set not dari C3 - B4 beserta nilai frekuensi tiap-tiap not. Sebetulnya lagu pada proyek ini tidak menggunakan semua lagu, namun kita sediakan, barangkali pembaca hendak bikin lagu pilihan sendiri.

Direktif berikutnya adalah panjang not. Yang sudah lupa pelajaran seni musik waktu SMP atau SMA, monggo dibuka-buka lagi bukunya.. ;)  Panjang note bisa berupa penuh, setengah, seperempat, seperdelapan atau seperenambelas. Angka tersebut akan kita gunakan untuk perhitungan panjang setiap note. Sebagai contoh note seperempat adalah 0.25, pada contoh kasus kita maka 1500 x 0.25 untuk mendapatkan panjang sebuah note seperempat.


Berikutnya kita akan mendefinisikan tune yang berisi lagu ‘Oh My Darling Clementine’.

int tune[] = {
 NOTE_F3, NOTE_F3, NOTE_F3, NOTE_C3,
 NOTE_A3, NOTE_A3, NOTE_A3, NOTE_F3,
 NOTE_F3, NOTE_A3, NOTE_C4, NOTE_C4, NOTE_AS3, NOTE_A3, NOTE_G3,
 NOTE_G3, NOTE_A3, NOTE_AS3, NOTE_AS3,
 NOTE_A3, NOTE_G3, NOTE_A3, NOTE_F3,
 NOTE_F3, NOTE_A3, NOTE_G3, NOTE_C3, NOTE_E3, NOTE_G3, NOTE_F3
};


Setelah itu, kita buat array baru dengan tipe float, untuk mengatur durasi setiap note pada array int.

float duration[] = {
 EIGHTH+SIXTEENTH, SIXTEENTH, QUARTER, QUARTER,
 EIGHTH+SIXTEENTH, SIXTEENTH, QUARTER, QUARTER,
 EIGHTH+SIXTEENTH, SIXTEENTH, QUARTER+EIGHTH, EIGHTH, EIGHTH, EIGHTH, HALF,
 EIGHTH, SIXTEENTH, QUARTER, QUARTER,
 EIGHTH+SIXTEENTH, SIXTEENTH, QUARTER, QUARTER,
 EIGHTH+SIXTEENTH, SIXTEENTH, QUARTER+EIGHTH, EIGHTH, EIGHTH, SIXTEENTH, HALF
};


Nah, tentu sekarang jelaskan, kenapa kita menggunakan perintah define, karena dengan perintah define, kode program kita akan lebih terbaca, dan bila ada salah, cukup merubah value di area define.

Berikutnya kita buat satu variable integer length.

int length;

variable length ini digunakan untuk menghitung dan menyimpan panjang array.

Pada routing setup, pertama kali kita atur digital pin 8 sebagai output.

  pinMode(8, OUTPUT);

kemudian initialisasi variable lenght

  length = sizeof(tune) / sizeof(tune[0]);


Fungsi sizeof()  mengembalikan nilai bytes dari parameter yang kita kirimkan. Pada contoh kasus kita maka hasilnya adalah 26 / 2, yaitu 13.

Pada main loop, kita gunakan perintah for untuk looping seluruh note dari lagu.
  for (int x=0; x<length; x++) {

Kemudian memainkan note tersebut pada pin 8 dengan perintah berikut

    tone(8, tune[x]);

Kemudian kita gunakan delay, panjang delay adalah  1500 milliseconds dikalikan dengan panjang note.

delay(1500 * duration[x]);

Sebelum dilanjut ke note berikutnya, kita matikan dahulu tone yang telah kita assign di pin 8

noTone(8);

Perintah ini untuk memastikan tidak ada 2 nada yang  bermain bersamaan. Tanpa perintah noTone, note akan bercampur, anda bisa bereksperimen untuk melihat hasilnya dengan menghapus perintah noTone.

Akhir program, setelah lagu selesai dimainkan oleh perintah for, kita delay selama 5 detik sebelum memulai lagu dari awal lagi.

delay(5000);

Jika kamu ingin mempercepat atau memperlambat lagu, dapat mengubah nilai 1500 pada delay fuction.


Related Artikel
Projek Sebelumnya Piezo Sounder Alarm
Projek Berikutnya Piezo Knock Sensor
Piezo disc bekerja ketika terjadi medan listrik pada materi ceramic pada disc yang menyebabkan ceramic berubah bentuk dan menimbulkan suara. Piezo juga bekerja sebaliknya, saat kita mengetuknya atau menekan, gaya pada material dapat menimbulkan arus listrik dan dengan menggunakan arduino, kita dapat membaca arus yang terjadi. Nah ini dapat kita gunakan sebagai sensor ketuk.

Komponen

  • Piezo Sounder (or piezo disc)
  • 2-Way Screw Terminal
  • 5mm LED (any color)
  • 1MW Resistor
  • 150W Current-Limiting Resistor


Skema




Sketch
// Project 15 - Piezo Knock Sensor
int ledPin = 9; // LED on Digital Pin 9
int piezoPin = 5; // Piezo on Analog Pin 5
int threshold = 120; // The sensor value to reach before activation
int sensorValue = 0; // A variable to store the value read from the sensor
float ledValue = 0; // The brightness of the LED

void setup() {
  pinMode(ledPin, OUTPUT); // Set the ledPin to an OUTPUT

  // Flash the LED twice to show the program has started
  digitalWrite(ledPin, HIGH); delay(150); digitalWrite(ledPin, LOW); delay(150);
  digitalWrite(ledPin, HIGH); delay(150); digitalWrite(ledPin, LOW); delay(150);
}

void loop() {
  sensorValue = analogRead(piezoPin); // Read the value from the sensor
  if (sensorValue >= threshold) { // If knock detected set brightness to max
    ledValue = 255;
  }
  analogWrite(ledPin, int(ledValue) ); // Write brightness value to LED
  ledValue = ledValue - 0.05; // Dim the LED slowly
  if (ledValue <= 0) { ledValue = 0;} // Make sure value does not go below zero
}

Setelah kode diupload, LED akan berkedip cepat sebanyak dua kali, menunjukan program telah jalan. Kita dapat coba sensor ketuk kita. Bila ingin test ketuk, letakan pada permukaan datar, lalu coba ketuk atau tekan dengan jari kamu. Setiap Arduino mendeteksi ketukan atau tekanan, LED akan menyala dan meredup hingga padam secara perlahan.

Nilai treshold sensitive untuk piezo disc bisa berbeda, kamu mesti coba-coba. Makin rendah makin sensitif, makan tinggi makin tidak sensitif.

Pembahasan Kode
Pada projek ini, kita belum ada perintah baru, namun mari kita bahas ;)

Pertama kita inisialisasi variable.

int ledPin = 9; // LED on Digital Pin 9
int piezoPin = 5; // Piezo on Analog Pin 5
int threshold = 120; // The sensor value to reach before activation
int sensorValue = 0; // A variable to store the value read from the sensor
float ledValue = 0; // The brightness of the LED


Pada fungsi setuup, set output dengan variable ledPin  dan LED akan berkedip 2 kali sebagai indikator program telah berjalan.

void setup() {
  pinMode(ledPin, OUTPUT); // Set the ledPin to an OUTPUT

  // Flash the LED twice to show the program has started
  digitalWrite(ledPin, HIGH); delay(150); digitalWrite(ledPin, LOW); delay(150);
  digitalWrite(ledPin, HIGH); delay(150); digitalWrite(ledPin, LOW); delay(150);
}


Pada main loop, pertama kita membaca nilai analog dari pin 5 yang terhubung dengan piezo

sensorValue = analogRead(piezoPin); // Read the value from the sensor

Lalu kita akan bandingkan nilai tersebut dengan  varaible treshold untuk menentukan apakah terjadi ketukan atau tekanan pada piezo. Jika terjadi, set ledValue ke 255, yaitu voltage maksimum pin PWM di no 9.

  if (sensorValue >= threshold) { // If knock detected set brightness to max
    ledValue = 255;
  }

Kemudian tulis nilai tersebut ke pin PWM 9.  perintah int() adalah cara kita mengkonversi tipe data, karena variable ledValue bertipe float.

  analogWrite(ledPin, int(ledValue) ); // Write brightness value to LED


Kemudian kita kurangi nilai dari variable ledValue sebesear 0.05. LED akan meredup dengan perlahan, karena kita menggunakan angka 0.05 untuk menurunkan tingkat kecerahan LED. Bila ingin lebih cepat atau lebih lambat, bisa diubah nilai 0.05 tersebut.

  ledValue = ledValue - 0.05; // Dim the LED slowly


Pada akhir program, kita periksa nilai ledValue tidak dibawah 0, karena PWM pin 9 hanya menerima nilai 0-255. Jika lebih kecil atau sama dengan 0, kita kembalikan ke nilai 0.

  if (ledValue <= 0) { ledValue = 0;} // Make sure value does not go below zero

Program akan kembali  keawal,  LED akan meredup perlahan hingga padam atau ketukan berikutnya terdeteksi dan kecerahan LED akan kembali ke maksimum.

Related Artikel
Projek Sebelumnya Piezo Sounder Melody Player
Proyek Selanjutnya Light Sensor Dengan Piezo
Pada proyek kali ini, kita akan menggunakan LDR (Light Dependent Resistor), sesuai dengan namanya, komponen resistor ini tergantung pada cahaya. Pada situasi gelap nilai resistance akan tinggi. Saat terang, nilai resistance akan rendah. Makin terang, makin rendah nilai resistance.

Proyek ini akan membaca nilai resistance pada LDR dan menggunakan piezo untuk output suara.

Click disini untuk Pengenalan LDR

Rangkain pada proyek ini menggunakan rangkaian dasar potential divider, merupakan rangkaian dasar elektro yang cukup penting. Untuk memahami lebih lanjut, click disini Rangkaian Potential Divider.


Komponen yang digunakan

  • Piezo Sounder (or Piezo Disc)
  • 2-Way Screw Terminal
  • Light-Dependent Resistor
  • 10kW Resistor


Skema


LDR dapat dipasang bolak-balik, karena tidak memiliki kaki polarity. Pada proyek ini, digunakan 10kW resistor, mungkin pada kasus yang lain dibutuhkan resistor yang berbeda yang sesuai dengan LDR yang kamu gunakan. Kamu bisa gunakan resistor antara 1kW and 10kW.

Sketch
// Project 16 - Light Sensor
int piezoPin = 8; // Piezo on Pin 8
int ldrPin = 0; // LDR on Analog Pin 0
int ldrValue = 0; // Value read from the LDR

void setup() {
  // nothing to do here
}

void loop() {
  ldrValue = analogRead(ldrPin); // read the value from the LDR
  tone(piezoPin,1000); // play a 1000Hz tone from the piezo
  delay(25); // wait a bit
  noTone(piezoPin); // stop the tone
  delay(ldrValue); // wait the amount of milliseconds in ldrValue
}


Setelah diupload, Arduino akan mengeluarkan beep pendek. Interval antara beep akan panjang bila LDR kurang mendapat cahaya, dan jarak antara beep akan pendek bila LDR cukup mendapat cahaya.

Jadi proyek ini seperti geiger counter, namun fungsinya adalah mendeteksi photon cahaya. Coba solder LDR pada kabel yang panjang untuk memudahkan kamu memposisikan LDR, misalnya dibawah meja, dekat lampu atau lainnya.

Untuk pembahasan kode/sketch sekiranya tidak diperlukan karena cukup simple dan kamu bisa memahaminya dengan mudah.

Related Article
Proyek Sebelumnya : Piezo Knock Sensor
Proyek Selanjutnya : Controling DC Motor

Pengenalan LDR
Pengenalan Rangkaian Potential Divider