Mahir Arduino Sketch dan Elektro secara praktek

12 - 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

1 comment: