植物栽培LEDをPWM制御で節電、成長促進(?)
紫蘇を育てるのに植物栽培用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って使った事無いんだよなぁ的な不安は捨て置く。
なにしろ安いから。
パチもんかもしれんけど。
というわけでテキトーに結線。
画像では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);
}
じゃちょっと点灯してみます。
上のバーは5V直
下のバーは2.5kHzのDuty比50%で200us毎に点いたり消えたりしている、、、筈
筈。
うーん、よく判らないっスね
PWM制御しているらしきLEDテープの方が僅かに暗いのでPWMしてるっぽいですが、本当に200usで点滅しているのかどうか
※上(左):543 lx @ PWM 2.5kHz Dytu 50%
下(右):743 lx @ 5V直
先日使ってみた簡易ルクス計 GY-302(BH1750FVI I2C) で見てみると、一応数字でもPWM制御している方が若干暗い事がわかる。
しかし
ほんとに200usで点滅してんの・・・?
オシロスコープでもあれば測定できるのでしょうけれど、、、
確かめる術が無し夫
まぁいいや、その内パルスカウンターでも作ってみろというお告げ。
今は紫蘇にこの紫の光を浴びせてやる方が先なのだっ
だっ
ディスカッション
コメント一覧
まだ、コメントがありません