Lompat ke konten Lompat ke sidebar Lompat ke footer

WS2812B Arduino | Tutorial cara menggunakan LED WS2812B


Halo teman teman semuanya, pada kesempatan kali ini kita akan belajar menggunakan atau memprogram LED Strip, LED Strip ini sering kita jumpai pada kendaraan Bus, Truk, atau pasar malam, pasti temen-temen pernah melihatnya kan, apakah temen-temen pernah memikirkan bagaimana LED dapat menyala ber animasi ? Itu karena LED nya sudah terdapat program yang membuatnya LED nya menyala beranimasi

Nah sekarang kita akan belajar memprogram LED ini dari yang paling basic-basic dulu supaya temen-temen tidak bingung untuk mempelajarinya 

Pada kesempatan kali ini kita akan menggunakan LED Strip yang ber teype WS2812B, kenapa saya memilih teype ini untuk belajar, karena LED ini cukup menggunakan voltage 5.0V sudah dapat di nyalakan, dan sudah banyak yang menjualnya di internet, untuk banyaknya LED kita di sini menggunakan 15 LED 

Spesifikasi LED WS2812B

Tegangan input 5.0V
Jumlah 60/30 LED / meter
Memiliki 3 warna dasar RGB

Dibawah ini adalah Gambar LED WS2812B yang dimana chip controller nya sudah tertanam pada masing masing LED, berbeda dengan type yang lain, yang dimana chip controller nya ada di luar

Di bawah ini ada gambar LED WS2812B secara dekat sehingga kita dapat melihat struktur yang ada di dalam LED tersebut, bisa kita lihat di sana terdapat benda berbentuk persegi panjang, itu adalah chip controller nya, chip tersebut berfungsi untuk mengatur tingkat kecerdasan dari LED dan menentukan komposisi warna supaya menghasilkan warna yang sesuai, dengan 1 pin data saja kita sudah dapat mengontrol sepenuhnya dari LED ini, LED ini akan menerima sinyal yang di kirim melalui pin data yang sudah di sediakan, lalu sinyal itu akan di olah menjadi peringatan perintah² khusus untuk mengontrol LED tersebut. sinyal yang di terima adalah sinyal Binary yang berupa sinyal antara kombinasi 0 dan 1 atau HIGH dan LOW

Kita akan belajar mengontrol LED ini dengan bahasa pemograman Arduino, yang dimana bahasa pemograman arduino ini mendekati dengan bahasa manusia, jadi bahasa Arduino ini lebih mudah untuk di pelajari dibandingkan dengan bahasa pemograman yang lain 

Cara perakitan LED WS2812B ke Arduino

Cara memasang LED WS2812B ke board Arduino sangatlah mudah bisa lihat pada gambar di bawah ini
Saya di sini menghubungkan LED dengan soket supaya mudah untuk di bongkar pasang, saran saya ikutilah cara saya ini supaya mudah perakitannya, jika tidak temen-temen bisa langsung solder saja kabel jumper nya langsung ke LED nya 

Setelah itu hubungan LED dengan Arduino menggunakan kabel jumper sama seperti pada gambar di atas
+5V   ke VCC
GND ke GND
Din   ke Pin3

Cara memprogram LED WS1812B

Sebelum itu kita perlu download library FastLED terlebih dahulu karena kita akan menggunakan library tersebut, temen-temen bisa dapatkan library nya melalui tombol berikut ini DOWNLOAD
Jia sudah di download lalu di extrak, setelah di ekstrak lalu pindahkan ke folder Libraries pada software Arduino IDE kamu atau pada aplikasi Arduinodroid kamu
Jika sudah selesai menginstal Library nya temen-temen bisa upload program di bawah ini 

#include <FastLED.h>

#define NUM_LED  15 //jumlah LED
#define LED_PIN   3  //pin yang di gunakan
CRGB leds[NUM_LED];

void setup() {
  FastLED.addLeds<WS2812B, LED_PIN, GRB>(leds, NUM_LED);
  FastLED.setBrightness(50);
}

void loop() {
  
  leds[0] = CRGB::Blue;
  FastLED.show();
  delay(500);
  
  leds[0] = CRGB::Black;
  FastLED.show();
  delay(500);
  
}

Program di atas adalah program untuk membuat LED berkedip berwarna biru dengan jeda 1000ms dan hanya LED nomor 1 aja yang berkedip, tapi gimana caranya untuk membuat LED berkedip pada LED lainya ?


leds[0] = CRGB::Blue;

Kode di atas berfungsi untuk membuat led berwarna Biru, jika ingin mengganti warnanya, silahkan di ubah txt nya menjadi warna yang kami inginkan, untuk penulisan warna harus berbahasa Inggris ya dan di awali dengan huruf besar, 

Jika ingin mengganti LED nomor berapa yang mau berkedip, tinggal ganti saja angka yang ada pada kurung kotak itu dengan nomor yang kamu inginkan, kalau untuk membuat LED nomor 2 berkedip, tinggal ganti saja dengan angka 1, kenapa bukan angka 2 ?, Itu karena penghitungan dalam behasa pemograman di awali dengan 0 jadi jangan di bikin pusing ya 😁


leds[0] = CRGB::Black;

Program di atas berfungsi untuk mematikan led atau membuat led berwarna hitam, berwarna hitam di sini artinya membuat LED menjadi mati ya, bukan lednya berwarna hitam 🙈


#include <FastLED.h>

#define NUM_LED  15 //jumlah LED 
#define LED_PIN   3  //pin yang di gunakan
CRGB leds[NUM_LED];

void setup() {
  FastLED.addLeds<WS2812B, LED_PIN, GRB>(leds, NUM_LED);
  FastLED.setBrightness(50);
}

void loop() {
  
  leds[1] = CRGB::Yellow;
  FastLED.show();
  delay(500);
  
  leds[1] = CRGB::Black;
  FastLED.show();
  delay(500);
  
}

Program di atas tudak jauh berbeda dengan program sebelumnya hanya berubah oada warna led yang berkadip, dan led yang berkedip sekarang yang nomor 2, nah sekarang kita akan belajar membuat program running led dengan menggunakan LED WS2812 ini


#include <FastLED.h>

#define NUM_LED  15 //jumlah led
#define LED_PIN   3  //pin yang di gunakan
CRGB leds[NUM_LED];

void setup() {
  FastLED.addLeds<WS2812B, LED_PIN, GRB>(leds, NUM_LED);
  FastLED.setBrightness(50);
}

void loop() {
  for(int i=0; i<NUM_LED; i++){
  leds[i] = CRGB::Blue;
  FastLED.show();
  delay(50);
  }    
  for(int i=0; i<NUM_LED; i++){
  leds[i] = CRGB::Black;
  FastLED.show();
  delay(50);
  }        

}   

Program di atas akan membuat led seakan akan berjalan, drngan kecepatan 50ms


#include <FastLED.h>

#define NUM_LED  15 //jumlah led
#define LED_PIN   3  //pin yang di gunakan
CRGB leds[NUM_LED];

void setup() {
  FastLED.addLeds<WS2812B, LED_PIN, GRB>(leds, NUM_LED);
  FastLED.setBrightness(50);
}

void loop() {
  for(int i=0; i<NUM_LED; i++){
  leds[i] = CRGB::Blue;
  FastLED.show();
  delay(50);
  }    
  for(int i=15; i>=0; i--){
  leds[i] = CRGB::Black;
  FastLED.show();
  delay(50);
  }        

}   

Program di atas akam membuat led menyala berjalan dari nomor 1 menunggu nomor led 15, setelah nyala sampai nomor 15, laku LED akan pedam berurutan dari nomor 15 menuju nomor 1, setelah itu akan mengulanginya dari awal


#include <FastLED.h>

#define NUM_LED  15  //jumlah led
#define LED_PIN   3  //pin yang di gunakan
CRGB leds[NUM_LED];

void setup() {
  FastLED.addLeds<WS2812B, LED_PIN, GRB>(leds, NUM_LED);
  FastLED.setBrightness(50);
}

void loop() {
  for(int i=0; i<NUM_LED; i++){
  leds[i] = CRGB::Red;
  FastLED.show();
  delay(50);
  }    
  for(int i=0; i<NUM_LED; i++){
  leds[i] = CRGB::Green;
  FastLED.show();
  delay(50);
  } 
  for(int i=0; i<NUM_LED; i++){
  leds[i] = CRGB::Blue;
  FastLED.show();
  delay(50);
  }   
  for(int i=0; i<NUM_LED; i++){
  leds[i] = CRGB::Yellow;
  FastLED.show();
  delay(50);
  }                     
  for(int i=0; i<NUM_LED; i++){
  leds[i] = CRGB::Purple;
  FastLED.show();
  delay(50);
  }    
}

Program di atas akan membuat led berubah warna dari LED nomor 1 menuju led nomor 15, setelah itua akan mengulanginya namun berbeda warna


#include <FastLED.h>

#define NUM_LED  15  //jumlah led
#define LED_PIN   3  //pin yang di gunakan
CRGB leds[NUM_LED];

void setup() {
  FastLED.addLeds<WS2812B, LED_PIN, GRB>(leds, NUM_LED);
  FastLED.setBrightness(50);
}

void loop() {
  for(int i=0; i<NUM_LED; i++){
  leds[i] = CRGB::Red;
  FastLED.show();
  delay(50);
  }    
  for(int i=15; i>=0; i--){
  leds[i] = CRGB::Black;
  FastLED.show();
  delay(50);
  }    
  for(int i=0; i<NUM_LED; i++){
  leds[i] = CRGB::Green;
  FastLED.show();
  delay(50);
  } 
  for(int i=15; i>=0; i--){
  leds[i] = CRGB::Black;
  FastLED.show();
  delay(50);
  }    
  for(int i=0; i<NUM_LED; i++){
  leds[i] = CRGB::Blue;
  FastLED.show();
  delay(50);
  }   
  for(int i=15; i>=0; i--){
  leds[i] = CRGB::Black;
  FastLED.show();
  delay(50);
  }    
  for(int i=0; i<NUM_LED; i++){
  leds[i] = CRGB::Yellow;
  FastLED.show();
  delay(50);
  }      
  for(int i=15; i>=0; i--){
  leds[i] = CRGB::Black;
  FastLED.show();
  delay(50);
  }                   
  for(int i=0; i<NUM_LED; i++){
  leds[i] = CRGB::Purple;
  FastLED.show();
  delay(50);
  }   
  for(int i=15; i>=0; i--){
  leds[i] = CRGB::Black;
  FastLED.show();
  delay(50);
  }     
}

Program di atas akan membuat LED menyala dari LED nomor 1 menuju nomor 15 setelah itu akan mati perlahan dari nomor LED 15 menuju LED nomor 1 setelah itu akan menulangi animasi yang sama namu dengan warna led yang berbeda, 

Kalau ada pertanyaan, Bang kalau LED nya lebih dari 15 gimana cara buat program nya bang ?, Tenang semua itu akan kita bahas di artikel ini, kalau kamu mau mengubah jumlah LED nya kamu bisa ubah pada code ini


#define NUM_LED  15

kode di atas tinggal di ubah aja angka nya sesuai banyaknya led kamu, mudah bukan cara memprogram LED WS2812B nya, kalau ada pertanyaan silahkan tanyakan di kolom komentar, dan jangan lupa subscribe channel YouTube Badar Teknog juga ya supaya mendapatkan informasi menarik dan informatif lainnya 

Bonus program keren dan beranimasi yang bisa kamu coba


Demo Reel 100


#include <FastLED.h>

FASTLED_USING_NAMESPACE

// FastLED "100-lines-of-code" demo reel, showing just a few 
// of the kinds of animation patterns you can quickly and easily 
// compose using FastLED.  
//
// This example also shows one easy way to define multiple 
// animations patterns and have them automatically rotate.
//
// -Mark Kriegsman, December 2014

#if defined(FASTLED_VERSION) && (FASTLED_VERSION < 3001000)
#warning "Requires FastLED 3.1 or later; check github for latest code."
#endif

#define DATA_PIN    3
//#define CLK_PIN   4
#define LED_TYPE    WS2811
#define COLOR_ORDER GRB
#define NUM_LEDS    15
CRGB leds[NUM_LEDS];

#define BRIGHTNESS          50
#define FRAMES_PER_SECOND  120

void setup() {
  delay(3000); // 3 second delay for recovery
  
  // tell FastLED about the LED strip configuration
  FastLED.addLeds<LED_TYPE,DATA_PIN,COLOR_ORDER>(leds, NUM_LEDS).setCorrection(TypicalLEDStrip);
  //FastLED.addLeds<LED_TYPE,DATA_PIN,CLK_PIN,COLOR_ORDER>(leds, NUM_LEDS).setCorrection(TypicalLEDStrip);

  // set master brightness control
  FastLED.setBrightness(BRIGHTNESS);
}


// List of patterns to cycle through.  Each is defined as a separate function below.
typedef void (*SimplePatternList[])();
SimplePatternList gPatterns = { rainbow, rainbowWithGlitter, confetti, sinelon, juggle, bpm };

uint8_t gCurrentPatternNumber = 0; // Index number of which pattern is current
uint8_t gHue = 0; // rotating "base color" used by many of the patterns
  
void loop()
{
  // Call the current pattern function once, updating the 'leds' array
  gPatterns[gCurrentPatternNumber]();

  // send the 'leds' array out to the actual LED strip
  FastLED.show();  
  // insert a delay to keep the framerate modest
  FastLED.delay(1000/FRAMES_PER_SECOND); 

  // do some periodic updates
  EVERY_N_MILLISECONDS( 20 ) { gHue++; } // slowly cycle the "base color" through the rainbow
  EVERY_N_SECONDS( 10 ) { nextPattern(); } // change patterns periodically
}

#define ARRAY_SIZE(A) (sizeof(A) / sizeof((A)[0]))

void nextPattern()
{
  // add one to the current pattern number, and wrap around at the end
  gCurrentPatternNumber = (gCurrentPatternNumber + 1) % ARRAY_SIZE( gPatterns);
}

void rainbow() 
{
  // FastLED's built-in rainbow generator
  fill_rainbow( leds, NUM_LEDS, gHue, 7);
}

void rainbowWithGlitter() 
{
  // built-in FastLED rainbow, plus some random sparkly glitter
  rainbow();
  addGlitter(80);
}

void addGlitter( fract8 chanceOfGlitter) 
{
  if( random8() < chanceOfGlitter) {
    leds[ random16(NUM_LEDS) ] += CRGB::White;
  }
}

void confetti() 
{
  // random colored speckles that blink in and fade smoothly
  fadeToBlackBy( leds, NUM_LEDS, 10);
  int pos = random16(NUM_LEDS);
  leds[pos] += CHSV( gHue + random8(64), 200, 255);
}

void sinelon()
{
  // a colored dot sweeping back and forth, with fading trails
  fadeToBlackBy( leds, NUM_LEDS, 20);
  int pos = beatsin16( 13, 0, NUM_LEDS-1 );
  leds[pos] += CHSV( gHue, 255, 192);
}

void bpm()
{
  // colored stripes pulsing at a defined Beats-Per-Minute (BPM)
  uint8_t BeatsPerMinute = 62;
  CRGBPalette16 palette = PartyColors_p;
  uint8_t beat = beatsin8( BeatsPerMinute, 64, 255);
  for( int i = 0; i < NUM_LEDS; i++) { //9948
    leds[i] = ColorFromPalette(palette, gHue+(i*2), beat-gHue+(i*10));
  }
}

void juggle() {
  // eight colored dots, weaving in and out of sync with each other
  fadeToBlackBy( leds, NUM_LEDS, 20);
  byte dothue = 0;
  for( int i = 0; i < 8; i++) {
    leds[beatsin16( i+7, 0, NUM_LEDS-1 )] |= CHSV(dothue, 200, 255);
    dothue += 32;
  }
}

Collor Palette


#include <FastLED.h>

#define LED_PIN     3
#define NUM_LEDS    15
#define BRIGHTNESS  50
#define LED_TYPE    WS2811
#define COLOR_ORDER GRB
CRGB leds[NUM_LEDS];

#define UPDATES_PER_SECOND 100

CRGBPalette16 currentPalette;
TBlendType    currentBlending;

extern CRGBPalette16 myRedWhiteBluePalette;
extern const TProgmemPalette16 myRedWhiteBluePalette_p PROGMEM;


void setup() {
    delay( 3000 ); // power-up safety delay
    FastLED.addLeds<LED_TYPE, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );
    FastLED.setBrightness(  BRIGHTNESS );
    
    currentPalette = RainbowColors_p;
    currentBlending = LINEARBLEND;
}


void loop()
{
    ChangePalettePeriodically();
    
    static uint8_t startIndex = 0;
    startIndex = startIndex + 1; /* motion speed */
    
    FillLEDsFromPaletteColors( startIndex);
    
    FastLED.show();
    FastLED.delay(1000 / UPDATES_PER_SECOND);
}

void FillLEDsFromPaletteColors( uint8_t colorIndex)
{
    uint8_t brightness = 255;
    
    for( int i = 0; i < NUM_LEDS; ++i) {
        leds[i] = ColorFromPalette( currentPalette, colorIndex, brightness, currentBlending);
        colorIndex += 3;
    }
}


// There are several different palettes of colors demonstrated here.
//
// FastLED provides several 'preset' palettes: RainbowColors_p, RainbowStripeColors_p,
// OceanColors_p, CloudColors_p, LavaColors_p, ForestColors_p, and PartyColors_p.
//
// Additionally, you can manually define your own color palettes, or you can write
// code that creates color palettes on the fly.  All are shown here.

void ChangePalettePeriodically()
{
    uint8_t secondHand = (millis() / 1000) % 60;
    static uint8_t lastSecond = 99;
    
    if( lastSecond != secondHand) {
        lastSecond = secondHand;
        if( secondHand ==  0)  { currentPalette = RainbowColors_p;         currentBlending = LINEARBLEND; }
        if( secondHand == 10)  { currentPalette = RainbowStripeColors_p;   currentBlending = NOBLEND;  }
        if( secondHand == 15)  { currentPalette = RainbowStripeColors_p;   currentBlending = LINEARBLEND; }
        if( secondHand == 20)  { SetupPurpleAndGreenPalette();             currentBlending = LINEARBLEND; }
        if( secondHand == 25)  { SetupTotallyRandomPalette();              currentBlending = LINEARBLEND; }
        if( secondHand == 30)  { SetupBlackAndWhiteStripedPalette();       currentBlending = NOBLEND; }
        if( secondHand == 35)  { SetupBlackAndWhiteStripedPalette();       currentBlending = LINEARBLEND; }
        if( secondHand == 40)  { currentPalette = CloudColors_p;           currentBlending = LINEARBLEND; }
        if( secondHand == 45)  { currentPalette = PartyColors_p;           currentBlending = LINEARBLEND; }
        if( secondHand == 50)  { currentPalette = myRedWhiteBluePalette_p; currentBlending = NOBLEND;  }
        if( secondHand == 55)  { currentPalette = myRedWhiteBluePalette_p; currentBlending = LINEARBLEND; }
    }
}

// This function fills the palette with totally random colors.
void SetupTotallyRandomPalette()
{
    for( int i = 0; i < 16; ++i) {
        currentPalette[i] = CHSV( random8(), 255, random8());
    }
}

// This function sets up a palette of black and white stripes,
// using code.  Since the palette is effectively an array of
// sixteen CRGB colors, the various fill_* functions can be used
// to set them up.
void SetupBlackAndWhiteStripedPalette()
{
    // 'black out' all 16 palette entries...
    fill_solid( currentPalette, 16, CRGB::Black);
    // and set every fourth one to white.
    currentPalette[0] = CRGB::White;
    currentPalette[4] = CRGB::White;
    currentPalette[8] = CRGB::White;
    currentPalette[12] = CRGB::White;
    
}

// This function sets up a palette of purple and green stripes.
void SetupPurpleAndGreenPalette()
{
    CRGB purple = CHSV( HUE_PURPLE, 255, 255);
    CRGB green  = CHSV( HUE_GREEN, 255, 255);
    CRGB black  = CRGB::Black;
    
    currentPalette = CRGBPalette16(
                                   green,  green,  black,  black,
                                   purple, purple, black,  black,
                                   green,  green,  black,  black,
                                   purple, purple, black,  black );
}


// This example shows how to set up a static color palette
// which is stored in PROGMEM (flash), which is almost always more
// plentiful than RAM.  A static PROGMEM palette like this
// takes up 64 bytes of flash.
const TProgmemPalette16 myRedWhiteBluePalette_p PROGMEM =
{
    CRGB::Red,
    CRGB::Gray, // 'white' is too bright compared to red and blue
    CRGB::Blue,
    CRGB::Black,
    
    CRGB::Red,
    CRGB::Gray,
    CRGB::Blue,
    CRGB::Black,
    
    CRGB::Red,
    CRGB::Red,
    CRGB::Gray,
    CRGB::Gray,
    CRGB::Blue,
    CRGB::Blue,
    CRGB::Black,
    CRGB::Black
};

Fire 2012


#include <FastLED.h>

#define LED_PIN     3
#define COLOR_ORDER GRB
#define CHIPSET     WS2811
#define NUM_LEDS    15

#define BRIGHTNESS  50
#define FRAMES_PER_SECOND 60

bool gReverseDirection = false;

CRGB leds[NUM_LEDS];

void setup() {
  delay(1000); // sanity delay
  FastLED.addLeds<CHIPSET, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );
  FastLED.setBrightness( BRIGHTNESS );
}

void loop()
{
  // Add entropy to random number generator; we use a lot of it.
  // random16_add_entropy( random());

  Fire2012(); // run simulation frame
  
  FastLED.show(); // display this frame
  FastLED.delay(1000 / FRAMES_PER_SECOND);
}


// Fire2012 by Mark Kriegsman, July 2012
// as part of "Five Elements" shown here: http://youtu.be/knWiGsmgycY
//// 

// Default 50, suggested range 20-100 
#define COOLING  55

// Default 120, suggested range 50-200.
#define SPARKING 120


void Fire2012()
{
// Array of temperature readings at each simulation cell
  static byte heat[NUM_LEDS];

  // Step 1.  Cool down every cell a little
    for( int i = 0; i < NUM_LEDS; i++) {
      heat[i] = qsub8( heat[i],  random8(0, ((COOLING * 10) / NUM_LEDS) + 2));
    }
  
    // Step 2.  Heat from each cell drifts 'up' and diffuses a little
    for( int k= NUM_LEDS - 1; k >= 2; k--) {
      heat[k] = (heat[k - 1] + heat[k - 2] + heat[k - 2] ) / 3;
    }
    
    // Step 3.  Randomly ignite new 'sparks' of heat near the bottom
    if( random8() < SPARKING ) {
      int y = random8(7);
      heat[y] = qadd8( heat[y], random8(160,255) );
    }

    // Step 4.  Map from heat cells to LED colors
    for( int j = 0; j < NUM_LEDS; j++) {
      CRGB color = HeatColor( heat[j]);
      int pixelnumber;
      if( gReverseDirection ) {
        pixelnumber = (NUM_LEDS-1) - j;
      } else {
        pixelnumber = j;
      }
      leds[pixelnumber] = color;
    }
}