植物栽培LEDをPWM制御で節電、成長促進(?)

Arduino/ESP32BH1750FVI,ESP8266,GY-302,PWM制御,テープLED,ルクスメーター,文部科学省,植物用,水耕栽培

紫蘇を育てるのに植物栽培用LEDライトの効果について調べていたら、ちょっと興味深いものを発見。

植物が光合成を行う際、炭水化物を生成する暗反応の時には光を必要としないんだとか。

そしてその時間はおよそ200usほどあるのだとか。

マジで?

マジで?

文部科学省:第2章 豊かなくらしに寄与する光 2 光と植物-植物工場

ここではサラダ菜でデータを取っている様です。

特に周期400μs(パルス幅200μs)の間欠光で、サラダナの成長が目に見えて著しかったとの事。

そしてこれがなんと、文科省の研究だという事。

文科省の研究だという事。

これは早速取り入れて試してみねば

みねばっ

電気代の節約にもなるし。

というわけで先日無理をさせてみた植物栽培用のテープLEDをPWM制御してやろうと思うます。

といってもタイマーで作るのはダルいのでここは簡単マイコン様の出番。

ざわ・・

ESP8266でPWM制御

テープLEDをPWM制御するのであれば、それなりに電流が流れる事を想定しておかねばなりません。

12VのACアダプターから降圧した6.8V、テープLEDを60個くらいは点灯させたいという辺りで想定

LED一個あたりの電流が24mAとして1.44A 抵抗や接点等でロスするだろうからこれの1.5倍の2.16Aくらいまでゴリゴリスイッチできるものを調べる。

信号線ではなくLEDを点灯させるパワーラインなので、それなりのMOSFETを用意しなければと。

手持ちを漁ると、SI2300かFDD8447L辺りがよさげ。

FDD8447Lは少し大袈裟なので、大変リーズナブルなSI2300を使ってローサイドでPWM制御してみます。

一応スペックシートでは連続4.5Aまでいけるらしいので。ので。

DigiKey:SI2300-TP

で、この小さな小さなMOSFETがどのくらいリーズナブルかって、Aiiexpressで50個とかで百円とかそのくらい。

送料別にかかるけれど。

そしてパチもんかも知れんけど。(;´Д`)

MOSFETって使った事無いんだよなぁ的な不安は捨て置く。

なにしろ安いから。

パチもんかもしれんけど。

というわけでテキトーに結線。

plantled_pwm01

画像では6.8Vになってますが、面倒なのでESP8266に給電しているUSB電源5Vを使ってしまっています。

テストですしおすし。

ローサイドにMOSFETを持ってきて、ゲート抵抗は適当に100ohmくらい付けとく。

プルダウン抵抗も無いと勝手にONしちゃうのでテキトーに付けとく。

とりあえずこんな感じで

PWM制御のプログラム

なんか良さげなライブラリがあったので、こちらを使わせていただく事にします。

■GitHub:khoih-prog / ESP8266_PWM

ISRベースのPWMライブラリで、標準ライブラリに比べてかなり周波数を上げられる様です。

何故これを選んだかって、別段ISRを使いたかった訳ではなく、Arduinoライブラリだと500Hzまでしか上げられないみたいでして・・・

とりあえずとても簡単に使える様で、examplesからパクって来てこんな感じで

#if !defined(ESP8266)
#error This code is designed to run on ESP8266 and ESP8266-based boards! Please check your Tools->Board setting.
#endif

// These define's must be placed at the beginning before #include "ESP8266_PWM.h"
// _PWM_LOGLEVEL_ from 0 to 4
// Don't define _PWM_LOGLEVEL_ > 0. Only for special ISR debugging only. Can hang the system.
#define _PWM_LOGLEVEL_ 4

#define USING_MICROS_RESOLUTION true // false

// Default is true, uncomment to false
// #define CHANGING_PWM_END_OF_CYCLE     false

// Select a Timer Clock
#define USING_TIM_DIV1 true    // for shortest and most accurate timer
#define USING_TIM_DIV16 false  // for medium time and medium accurate timer
#define USING_TIM_DIV256 false // for longest timer but least accurate. Default

// To be included only in main(), .ino with setup() to avoid `Multiple Definitions` Linker Error
#include "ESP8266_PWM.h"

#ifndef LED_BUILTIN
#define LED_BUILTIN 2
#endif

#define HW_TIMER_INTERVAL_US 20L

volatile uint32_t startMicros = 0;

// Init ESP8266Timer
ESP8266Timer ITimer;

// Init ESP8266_ISR_PWM
ESP8266_PWM ISR_PWM;

void IRAM_ATTR TimerHandler()
{
  ISR_PWM.run();
}

#define PIN_D4 2  // Pin D4 mapped to pin GPIO2/TXD1 of ESP8266

// 周波数モードOFF
// #define USING_PWM_FREQUENCY true

// You can assign pins here. Be carefull to select good pin to use or crash
// uint32_t PWM_Pin    = LED_BUILTIN;
uint32_t PWM_Pin = PIN_D4;

// You can assign any interval for any timer here, in Hz
float PWM_Freq1 = 1.0f;
// You can assign any interval for any timer here, in Hz
float PWM_Freq2 = 1.0f;

// You can assign any interval for any timer here, in microseconds
uint32_t PWM_Period1 = 100000 / PWM_Freq1;
// You can assign any interval for any timer here, in microseconds
uint32_t PWM_Period2 = 400 / PWM_Freq2;

// You can assign any duty_cycle for any PWM here, from 0-100
float PWM_DutyCycle1 = 50.0;
// You can assign any duty_cycle for any PWM here, from 0-100
float PWM_DutyCycle2 = 50.0;

// Channel number used to identify associated channel
int channelNum;

////////////////////////////////////////////////

void setup()
{
  // Serial.begin(115200);
  Serial.begin(74880);

  while (!Serial)
    ;

  delay(2000);

  Serial.print(F("\nStarting ISR_Changing_PWM on "));
  Serial.println(ARDUINO_BOARD);
  Serial.println(ESP8266_PWM_VERSION);
  Serial.print(F("CPU Frequency = "));
  Serial.print(F_CPU / 1000000);
  Serial.println(F(" MHz"));

  // Interval in microsecs
  if (ITimer.attachInterruptInterval(HW_TIMER_INTERVAL_US, TimerHandler))
  {
    startMicros = micros();
    Serial.print(F("Starting ITimer OK, micros() = "));
    Serial.println(startMicros);
  }
  else
    Serial.println(F("Can't set ITimer. Select another freq. or timer"));

  // Just to demonstrate, don't use too many ISR Timers if not absolutely necessary
  // You can use up to 16 timer for each ISR_PWM
  // void setPWM(uint32_t pin, float frequency, float dutycycle
  // , timer_callback_p StartCallback = nullptr, timer_callback_p StopCallback = nullptr)
}

void loop()
{
  Serial.print(F("Using PWM Freq = "));
  Serial.print(PWM_Freq1);
  Serial.print(F(", PWM DutyCycle = "));
  Serial.println(PWM_DutyCycle1);

#if USING_PWM_FREQUENCY
  // You can use this with PWM_Freq in Hz
  channelNum = ISR_PWM.setPWM(PWM_Pin, PWM_Freq1, PWM_DutyCycle1);
#else
#if USING_MICROS_RESOLUTION
  // Or using period in microsecs resolution
  channelNum = ISR_PWM.setPWM_Period(PWM_Pin, PWM_Period1, PWM_DutyCycle1);
#else
  // Or using period in millisecs resolution
  channelNum = ISR_PWM.setPWM_Period(PWM_Pin, PWM_Period1 / 1000, PWM_DutyCycle1);
#endif
#endif

  // delay(10000);
  delay(3000);

  ISR_PWM.deleteChannel((unsigned)channelNum);

  Serial.print(F("Using PWM Freq = "));
  Serial.print(PWM_Freq2);
  Serial.print(F(", PWM DutyCycle = "));
  Serial.println(PWM_DutyCycle2);

#if USING_PWM_FREQUENCY
  // You can use this with PWM_Freq in Hz
  channelNum = ISR_PWM.setPWM(PWM_Pin, PWM_Freq2, PWM_DutyCycle2);
#else
#if USING_MICROS_RESOLUTION
  // Or using period in microsecs resolution
  channelNum = ISR_PWM.setPWM_Period(PWM_Pin, PWM_Period2, PWM_DutyCycle2);
#else
  // Or using period in millisecs resolution
  channelNum = ISR_PWM.setPWM_Period(PWM_Pin, PWM_Period2 / 1000, PWM_DutyCycle2);
#endif
#endif

  // delay(10000);
  delay(3000);

  ISR_PWM.deleteChannel((unsigned)channelNum);
}

じゃちょっと点灯してみます。

plantled_pwm02

上のバーは5V直

下のバーは2.5kHzのDuty比50%で200us毎に点いたり消えたりしている、、、筈

筈。

うーん、よく判らないっスね

PWM制御しているらしきLEDテープの方が僅かに暗いのでPWMしてるっぽいですが、本当に200usで点滅しているのかどうか

plantled_pwm03
plantled_pwm04

※上(左):543 lx @ PWM 2.5kHz Dytu 50%
 下(右):743 lx @ 5V直

先日使ってみた簡易ルクス計 GY-302(BH1750FVI I2C) で見てみると、一応数字でもPWM制御している方が若干暗い事がわかる。

しかし

ほんとに200usで点滅してんの・・・?

オシロスコープでもあれば測定できるのでしょうけれど、、、

確かめる術が無し夫

まぁいいや、その内パルスカウンターでも作ってみろというお告げ。

今は紫蘇にこの紫の光を浴びせてやる方が先なのだっ

だっ