100. makalemi basit ama çoğu kişinin işine yarayabilecek bir konuda açmak istedim.
Bildiğiniz gibi RGB LED'ler hayatımızın bir parçası artık. Her yerden RGB fışkıran odaları ya da bilgisayarları bir kenara bırakırsak, masanıza ya da odanızın bir kısmına aydınlatma amaçlı eklemek, gerçekten güzel olabiliyor. Ancak piyasadaki setler gerçekten pahalı. Phillips Hue ile bir set yapmak isteseniz, 1000 - 1200 TL'yi gözden çıkartmanız gerekiyor. Xiaomi'nin 400 TL bandında muadil bir ürünü var ama o da pahalı, ayrıca çok bulunmuyor piyasada. Kendinden kontrolcülü setler de var, ancak dandikler.
Tabii hal böyle olunca, DIY damarımız kabarmış oluyor. Ben de uzun süredir masama ARGB LED döşemeyi düşünüyordum ama gerek fiyat, gerekse uygun alternatfilerin pahalılığı nedeniyle erteliyordum.
Geçenlerde Robotistan'da Seeedunio XIAO diye minik bir Arduino tabanlı kart gördüm. Sonrasında aklıma bu proje geldi ve başlamak istedim.
Bu arkadaşın içinde ARM Cortex M0 işlemci var ve bir Arduino'ya göre kat kat güçlü.
Gelelim LED tarafına.
RGB şerti LED denince, akla genelde 4 pinli ve 12V ile çalışanlar geliyor. Ancak bunların daha iyileri var artık: ARGB 5V LED'ler. Bu LED şeritler 5V ile çalışıyor ve üç adet pini var:
Ben LED olarak, quadcopterim için aldığım WS2812B ARGB LED kartını kullandım. Ancak bunların LED şerit versiyonu da var:
Benim gibi birkaç LED'den oluşan bir demo yapacaksanız, 5V ve GND bağlantılarını yaptıktan sonra, LED'in data kısmını herhangi bir dijital porta takabilirsin. Eğer uzun bir şerit kullanacaksanız, LED'in güç bağlantılarını adaptöre yapın, ancak adaptörün GND hattını Arduino'nunki ile bağlamayı unutmayın.
Örnek bir bağlantı:
LED'leri kontrol etmek için, Arduino tarafında FastLED kütüphanesini kullanacağız. Kütüphaneyi buraya tıklayarak indirebilirsiniz.
Kütüphaneyi indirdiğimize ve bağlantılarımızı da yaptığımıza göre, kod kısmına geçebiliriz:
[CODE lang="cpp" title="Arduino ile ARGB Şerit LED Kontrolü" highlight="3-7"]#include <FastLED.h>
#define LED_PIN 5
#define NUM_LEDS 14
#define BRIGHTNESS 64
#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;
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 = ColorFromPalette( currentPalette, colorIndex, brightness, currentBlending);
colorIndex += 3;
}
}
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; }
}
}
void SetupTotallyRandomPalette()
{
for( int i = 0; i < 16; i++) {
currentPalette = CHSV( random8(), 255, random8());
}
}
void SetupBlackAndWhiteStripedPalette()
{
fill_solid( currentPalette, 16, CRGB::Black);
currentPalette[0] = CRGB::White;
currentPalette[4] = CRGB::White;
currentPalette[8] = CRGB::White;
currentPalette[12] = CRGB::White;
}
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 );
}
const TProgmemPalette16 myRedWhiteBluePalette_p PROGMEM =
{
CRGB::Red,
CRGB::Gray,
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
};[/CODE]
Bu kod, FastLED için demo kodu. İçinde çeşitli efektler bulunuyor ve program bunları döngü olarak çalıştırıyor. Kodda değiştirmemiz gereken kısımlar var:
Demo videosu:
Umarım güzel bir rehber olmuştur. Sipariş ettiğim şerit LED geldikten sonra, aynı rehberi ESP8266 ile ve daha detaylı yapacağım.
Okuduğunuz için teşekkürler.
Bildiğiniz gibi RGB LED'ler hayatımızın bir parçası artık. Her yerden RGB fışkıran odaları ya da bilgisayarları bir kenara bırakırsak, masanıza ya da odanızın bir kısmına aydınlatma amaçlı eklemek, gerçekten güzel olabiliyor. Ancak piyasadaki setler gerçekten pahalı. Phillips Hue ile bir set yapmak isteseniz, 1000 - 1200 TL'yi gözden çıkartmanız gerekiyor. Xiaomi'nin 400 TL bandında muadil bir ürünü var ama o da pahalı, ayrıca çok bulunmuyor piyasada. Kendinden kontrolcülü setler de var, ancak dandikler.
Tabii hal böyle olunca, DIY damarımız kabarmış oluyor. Ben de uzun süredir masama ARGB LED döşemeyi düşünüyordum ama gerek fiyat, gerekse uygun alternatfilerin pahalılığı nedeniyle erteliyordum.
Geçenlerde Robotistan'da Seeedunio XIAO diye minik bir Arduino tabanlı kart gördüm. Sonrasında aklıma bu proje geldi ve başlamak istedim.
Getting Started with Seeed Studio XIAO SAMD21 | Seeed Studio Wiki
Getting Started with Seeed Studio XIAO SAMD21
wiki.seeedstudio.com
Bu arkadaşın içinde ARM Cortex M0 işlemci var ve bir Arduino'ya göre kat kat güçlü.
Gelelim LED tarafına.
RGB şerti LED denince, akla genelde 4 pinli ve 12V ile çalışanlar geliyor. Ancak bunların daha iyileri var artık: ARGB 5V LED'ler. Bu LED şeritler 5V ile çalışıyor ve üç adet pini var:
- +5V
- Data
- GND
Ben LED olarak, quadcopterim için aldığım WS2812B ARGB LED kartını kullandım. Ancak bunların LED şerit versiyonu da var:
Ws2812B Ayrı Ayrı Adreslenebilir Argb Şerit Led 5V Fiyatları ve Özellikleri
Ws2812B Ayrı Ayrı Adreslenebilir Argb Şerit Led 5V en iyi özellikleri ve gerçek kullanıcı yorumları en ucuz fiyatlarla n11.com'da. Kampanyalı ve indirimli fiyatlarla satın al.
urun.n11.com
Benim gibi birkaç LED'den oluşan bir demo yapacaksanız, 5V ve GND bağlantılarını yaptıktan sonra, LED'in data kısmını herhangi bir dijital porta takabilirsin. Eğer uzun bir şerit kullanacaksanız, LED'in güç bağlantılarını adaptöre yapın, ancak adaptörün GND hattını Arduino'nunki ile bağlamayı unutmayın.
Örnek bir bağlantı:
LED'leri kontrol etmek için, Arduino tarafında FastLED kütüphanesini kullanacağız. Kütüphaneyi buraya tıklayarak indirebilirsiniz.
Kütüphaneyi indirdiğimize ve bağlantılarımızı da yaptığımıza göre, kod kısmına geçebiliriz:
[CODE lang="cpp" title="Arduino ile ARGB Şerit LED Kontrolü" highlight="3-7"]#include <FastLED.h>
#define LED_PIN 5
#define NUM_LEDS 14
#define BRIGHTNESS 64
#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;
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 = ColorFromPalette( currentPalette, colorIndex, brightness, currentBlending);
colorIndex += 3;
}
}
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; }
}
}
void SetupTotallyRandomPalette()
{
for( int i = 0; i < 16; i++) {
currentPalette = CHSV( random8(), 255, random8());
}
}
void SetupBlackAndWhiteStripedPalette()
{
fill_solid( currentPalette, 16, CRGB::Black);
currentPalette[0] = CRGB::White;
currentPalette[4] = CRGB::White;
currentPalette[8] = CRGB::White;
currentPalette[12] = CRGB::White;
}
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 );
}
const TProgmemPalette16 myRedWhiteBluePalette_p PROGMEM =
{
CRGB::Red,
CRGB::Gray,
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
};[/CODE]
Bu kod, FastLED için demo kodu. İçinde çeşitli efektler bulunuyor ve program bunları döngü olarak çalıştırıyor. Kodda değiştirmemiz gereken kısımlar var:
#define LED_PIN 5
--> Data pinini Arduino'da taktığınız port#define NUM_LEDS 14
--> Kullandığınız şerit LED'de ya da LED kartında, kaç adet LED çipi bulunuyorsa sayı olarak girin.#define BRIGHTNESS 64
--> LED'lerin maksimum parlaklığını ayarlayabilirsiniz.#define LED_TYPE WS2811
--> Taktığınız LED tipini değiştirebilirsiniz.#define COLOR_ORDER GRB
--> Taktığınız LED tipine göre, renk sıralamasını değiştirmeniz gerekir.
Demo videosu:
Umarım güzel bir rehber olmuştur. Sipariş ettiğim şerit LED geldikten sonra, aynı rehberi ESP8266 ile ve daha detaylı yapacağım.
Okuduğunuz için teşekkürler.