ソロでたのしむ

キャンプ、電子工作、DIY、乗り物などの趣味を紹介

IKEAのライトを観葉植物用に改造する! WS2812Bで超簡単に電子工作

こんにちは。

観葉植物を育て始めました!

f:id:solocamptouring:20220109152720j:plain

...と、唐突に電子工作とは程遠いご挨拶になってしまいましたが、一人暮らしの部屋を賑やかにしたくて、モンステラを部屋に迎えました。

これまで植物には全く興味がなかったのですが、モンステラに癒される日々から栽培の楽しさに目覚めてしまい、現在はセロームの水耕栽培にも挑戦しています。

元気な植物たちですが、成長スピードは普通なのか?が分からず、最近になって、

「もしかしたら、(部屋の窓の大きさや位置からすると、)明るさが足りていないのでは?」

と不安になってきました。

そこで今回は、Arduinoを使って観葉植物の育成ライトを作っちゃいましょう〜!というお話です。

IKEAのライトを観葉植物用に改造する! WS2812B

観葉植物 育成用ライトの波長

さて、植物を室内で育てる場合、どのような色(=波長)の光を当ててあげるといいのでしょうか?

ネットで検索をしてみると...

  • 光合成には赤色
  • 成長には青色

の波長の光が好影響するようです。

つまり、

  • 養分は赤色の光で作られる
  • 葉や茎は青色光の方向を向く

ということ!

そうであれば、赤色と青色の光を同じ方向(一般的には上側)から照射するのが、最も効果的だと思われます。

市販の植物育成用ライトで白色光のものは、 の3色が混ざっている筈なので、有効だということですね。

LEDの光なら波長は一定

色と色のピンポイントの波長の光」で植物育成ライトを作るとなると、うってつけの物があります。

WS2812Bで植物観察用ライトをつくる

いつも電子工作でお世話になっているRGB-LED、つまり光の三原色である それぞれの光の強さを調節して出すことで、遠目にはほぼ全ての可視光色を表現できるLEDです。

これを使えば、赤色と青色(つまり遠目には紫色)を重点的に発光させられるだけでなく、その割合を変えることも可能です。

そんなに細かく調節するの?と自問自答しつつも、「そろそろ電子工作をしたい!」という欲求も満たされることですし、とにかくRGB-LEDを使って、自分だけの植物育成ライトを作ってみましょう。

お部屋の雰囲気に合うライトスタンドを探す

植物育成ライトを作るにあたり、そのベースになるライトスタンドを探します。

いつもお世話になっているIKEAに来ましたよ〜

私が狙っているのは、関節付きのデスクライト

PIXERアニメーションの本編前に飛び跳ねているような、アレです。

IKEAにあることは、前週の定例パトロールでわかっていたので、売り場に直行して入手しました。

大きいフードは、私の部屋の雰囲気には合わない気がするので、使いません。

それでは、このデスクライトを植物育成ライトに変貌させましょう。

お洒落な植物育成ライトに仕立てます

こちらも、いつもお世話になっているものばかりですが、個別制御できるカラーLEDのWS2812Bと、Arduinoを使って、色を変えられる光源を作ります。

発光色のパターン

今回作るものは、ボリュームのツマミを回すことで、

  • 明るさ

を、自分好みに選択ができるようにします。

さらに色については、

  • 白色
  • フルカラーで好みの色
  • 自動で徐々に変化するフルカラー

から選択できるように、プログラム(スケッチ)を作ってみます。

植物育成ライトの回路図

RGB LEDのWS2812Bは5Vの直流電源で光らせることができます。

Arduinoも5Vで動かせるので、電源を共有する回路にしておきます。

他に使うものは、明るさと色を変えるための2個のボリュームだけ!という、大変シンプルな回路図...というより、もはやただの配線図です。

WS2812BでIKEAのライトをカラフルにする回路図

回路図は、直感的な操作でサクサク書けるFritzingで作成しました。

植物育成ライトの組立て

ArduinoとWS2812Bで観葉植物用のライトを自作 

今回の作業は、IKEAのデスクライトにLEDを移植するだけなので、ハンダ付けが主な作業になります。

作業風景を動画で撮っておいたので、よろしければご覧ください。

youtu.be

途中でハンダ付けを失敗して修正したりと無駄な作業もしていますが、暖かく見守っていただければ幸いです。

完成した植物育成ライトは、育成効果があるか確認できていませんが、植物鑑賞ライトとしては、我ながら上出来です。

お部屋が一段と妖艶な雰囲気になりました。

観葉植物をライトアップしたい!

植物育成ライトのプログラム(スケッチ)

最後に、ご参考でArduinoのプログラム(スケッチ)を紹介させていただきます。

GitHubのFastLEDライブラリを使っています。

#include "FastLED.h"

#define DATA_PIN    5
#define LED_TYPE    WS2812
#define COLOR_ORDER GRB
#define HEIGHT 20
#define WIDTH 1
#define NUM_LEDS HEIGHT*WIDTH
#define MAX_BRIGHTNESS 164      // Full is 164
#define MIN_BRIGHTNESS 41       // 25% is better
#define FRAMES_PER_SECOND  10

CRGB leds[NUM_LEDS];
CRGBPalette16 gPal;

int val = 0;
int BRIGHTNESS = 50;
int blightPin = 3;
int selectPin = 4;

void setup() {
  delay(1000); // 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);
}

// List of patterns to cycle through.  Each is defined as a separate function below.
typedef void (*SimplePatternList[])();
SimplePatternList gPatterns = {allWhite, allColor, allRainbow};

uint8_t gCurrentPatternNumber = 0;  // Index number of which pattern is current
uint8_t gHue = 96; // from 0 to 255
uint8_t colorSelect = 0; // from 0 to 255

void loop()
{

// Data collection
  // Choose the blightness
   if (analogRead(blightPin) < 50) {
    BRIGHTNESS = 0 ;
   } else {
    BRIGHTNESS = map(analogRead(blightPin), 50, 1024, MIN_BRIGHTNESS, MAX_BRIGHTNESS) ;
   } 
    FastLED.setBrightness(BRIGHTNESS); 

  // Choose the pattern
   val = analogRead(selectPin); //check the volume to choose the pattern
      if (val < 50) {
    gCurrentPatternNumber = 0;
      } else if (val > 949){
    gCurrentPatternNumber = 2;
       } else{
    gCurrentPatternNumber = 1;
    colorSelect = map(val, 50, 949, 0, 255) ;
 }
    gPatterns[gCurrentPatternNumber](); // Call the current pattern function once, updating the 'leds' array

// End of data collection

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

  // 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( 500 ) { gHue++; } // slowly cycle the "base color" through the rainbow
}


void allColor() 
{
  // all led selected color
  fill_solid( leds, NUM_LEDS, CHSV( colorSelect, 255, 192)); 
}


void allWhite() 
{
  // all led white color
  fill_solid( leds, NUM_LEDS, CRGB::White); 
}

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

それでは観葉植物と一緒に、リラックス時間を楽しみましょう!

モンステラをライトアップ