NOBのArduino日記!

NOBのArduino日記!

趣味は車・バイク・自転車・ラジコン・電子工作です。

クリスマスツリー・イルミネーション!その6(フルカラーシリアルLEDテープ実験!)

イメージ 2
 
 Arduino IDEに先日インストールしたAdafruit_NeoPixel.hライブラリーを使ってArduino ProMiniに書き込むプログラムを書いてみました!

1. プログラム

 内容としては照度センサー(CDS)が感知した情報が暗く、かつ人感センサー(SB412A)が人の気配を感知した時のみフルカラーシリアルLEDテープを5つのパターンで点灯します。
 夕方以降の明るさで、尚且つ人の居るときだけ点灯するECO!クリスマスツリー・イルミネーションです!
 
/*
   * クリスマスツリー・イルミネーション!制御プログラム
   * 部品:フルカラーシリアルLEDテープ、人感センサー、CDS
   * 2016年12月18日作成
   * NOBのArduino日記!
*/
#include <Adafruit_NeoPixel.h> //ライブラリの読み込み
#define MAX_VAL 255  // 最大輝度の設定をする(暗い←0 ~ 255→明い)
#define DELAY_TIME 500 //待ち時間1の設定
#define DELAY_TIME2 20 //待ち時間2の設定
#define DELAY_TIME3 50 //待ち時間3の設定

//インスタンスの設定(実際の使用環境の設定の事)
//   NEO_RGB     Pixels are wired for RGB bitstream
//   NEO_GRB     Pixels are wired for GRB bitstream
//   LEDテープの制御ICがWS2812ならNEO_KHZ800 / WS2811ならNEO_KHZ400
//   NEO_KHZ400  400 KHz bitstream (e.g. FLORA pixels)
//   NEO_KHZ800  800 KHz bitstream (e.g. High Density LED strip)
//Adafruit_NeoPixel(LEDの使用個数、Arduinoのピン番号、色の並び+データの転送速度)
Adafruit_NeoPixel strip =  Adafruit_NeoPixel(3, 3,  NEO_GRB  + NEO_KHZ800);
 
void setup() {
    strip.begin(); //インスタンスの使用を開始、この時全てのLEDの状態を「0」とする。
    strip.show(); //Arduinoから全てのLEDへオフ信号「0」を転送し初期化する。
    Serial.begin(9600);             //CDS明るさ確認test用
}
 
void loop() {
    //暗くてかつ近くに人の動きが有る時にLEDを点灯する!
      Serial.println(analogRead(2)); //CDS明るさ確認test用
    if (digitalRead(A3) == LOW  ||  analogRead(2) > 500) {
    colorWipe(strip.Color(0, 0, 0), DELAY_TIME); // Black
     
  } else {
      //LEDへ出力する各色の設定例
      colorWipe(strip.Color(MAX_VAL, 0, 0), DELAY_TIME); // Red
      colorWipe(strip.Color(0, MAX_VAL, 0), DELAY_TIME); // Green
      colorWipe(strip.Color(MAX_VAL, MAX_VAL, 0), DELAY_TIME); // Yellow
      colorWipe(strip.Color(0, 0, MAX_VAL), DELAY_TIME); // Blue
      colorWipe(strip.Color(MAX_VAL, 0, MAX_VAL), DELAY_TIME); // Purple
      colorWipe(strip.Color(0, MAX_VAL, MAX_VAL), DELAY_TIME); // Cyan
      colorWipe(strip.Color(MAX_VAL, MAX_VAL, MAX_VAL), DELAY_TIME); // White
      
      //LEDを虹色に変化させる
      rainbow(DELAY_TIME2);
      rainbowCycle(DELAY_TIME2);
      
      // 劇場風の照明 
      theaterChase(strip.Color(MAX_VAL, MAX_VAL, MAX_VAL), DELAY_TIME3); // White
      theaterChase(strip.Color(MAX_VAL, 0, 0), DELAY_TIME3); // Red
      theaterChase(strip.Color(0, 0, MAX_VAL), DELAY_TIME3); // Blue
      theaterChaseRainbow(DELAY_TIME3);
  }
}
 
// ①全てのLEDを指定色で点灯させる関数
void colorWipe(uint32_t c,  uint8_t wait) {
    for (uint16_t i = 0; i < strip.numPixels(); i++) {
          strip.setPixelColor(i, c);
          strip.show();
          delay(wait);
  }
}

// ②LEDを連続的に虹色に変化させる関数
void rainbow(uint8_t wait) {
    uint16_t i, j;
    for (j = 0; j < 256; j++) {
        for (i = 0; i < strip.numPixels(); i++) {
            strip.setPixelColor(i, Wheel((i + j) & 255));
    }
        strip.show();
        delay(wait);
  }
}
 
// ③虹色を均等に分布させる関数
void rainbowCycle(uint8_t wait) {
    uint16_t i, j;
    for (j = 0; j < 256 * 5; j++) { // 5 cycles of all colors on wheel
        for (i = 0; i < strip.numPixels(); i++) {
            strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255));
    }
        strip.show();
        delay(wait);
  }
}

// ④劇場風のクロールライトにする関数
void theaterChase(uint32_t c,  uint8_t wait) {
    for  (int j = 0; j < 10; j++) {
     //do 10 cycles of chasing
        for  (int q = 0; q < 3; q++) {
            for  (uint16_t i = 0; i < strip.numPixels(); i = i + 3) {
                strip.setPixelColor(i + q, c);     //turn every third pixel on
      }
            strip.show();
            delay(wait);
            for  (uint16_t i = 0; i < strip.numPixels(); i = i + 3) {
                strip.setPixelColor(i + q, 0);         //turn every third pixel off
      }
    }
  }
}

// ⑤虹の様な劇場風クロールライトにする関数
void theaterChaseRainbow(uint8_t wait) {
    for  (int j = 0; j < 256; j++) {
        // cycle all 256 colors in the wheel
        for  (int q = 0; q < 3; q++) {
            for  (uint16_t i = 0; i < strip.numPixels(); i = i + 3) {
                strip.setPixelColor(i + q, Wheel( (i + j) % 255));     //turn every third pixel on
      }
            strip.show();
            delay(wait);
            for  (uint16_t i = 0; i < strip.numPixels(); i = i + 3) {
                strip.setPixelColor(i + q, 0);         //turn every third pixel off      
      }
    }
  }
}
 
// 色の値を取得するには、0〜255の値を入力します。
// 色の移り変わりはR(赤)→G(緑)→B(青)からR(赤)に戻ります。
uint32_t Wheel(byte WheelPos) {
    if (WheelPos < 85) {
       return strip.Color((WheelPos * 3) * MAX_VAL / 255, (255 - WheelPos * 3) * MAX_VAL / 255, 0);
  } else if (WheelPos < 170) {
       WheelPos -= 85;
       return strip.Color((255 - WheelPos * 3) * MAX_VAL / 255, 0, (WheelPos * 3) * MAX_VAL / 255);
  } else  {
         WheelPos -= 170;
         return strip.Color(0, (WheelPos * 3) * MAX_VAL / 255, (255 - WheelPos * 3) * MAX_VAL / 255);
    }
  }
イメージ 1
図1:プログラム例
 

2. 実験!

上のプログラムをArduinoに書き込んで点灯実験をしてみました!
 
2.1 準備
 Arduino ProMiniFTDI BasicPCArduinoIDE→プログラムを書き込むだけで準備OK!
イメージ 1
図1:作った制御基盤にとPCを接続してプログラムを書き込むと準備完了
 
2.2 点灯パターン
 5つの点灯パターンを動画に撮ってみました。
動画1:人(私)を感知した状態で電気を消すとLEDがオシャレに点灯します!

3. まとめ

 実験成功です!
 なかなか良い感じに光ってます!
 肝心の5V,20A電源まだ来ないのでもう少しプログラムを改良して遊んでみます
 
イメージ 1 イメージ 3
励みになりますのでよければクリック下さい(^o^)/

↩【クリスマスツリー・イルミネーション!】目次に戻る