ケースの照明→電球色FluxLED×2+TLC5940
電気スタンド照明→TLP626+TLP560のAC調光
を1つのArduinoでやってみた。
LED照明の方は、AC調光の割り込みのためか、ちらつく><改善の余地あり。色も電球色のわりには色温度が高いなぁ。。。
2つしかLED使わないんじゃ、TLC5940使うまでもなく、直接ポートから出力すればよかったかもしれない^^;;;
次は、リモコン照明の制御を赤外線LEDでやってみようかな。
コードはこうなりました。ループの方はまだテスト用にプログラム組んだだけ。
MsTimer2でTimer2のインターバルとコールバック関数を設定するのですが、Timer2のインターバルはTlcでいじられる(´・ω・`)
(最初は、FlexiTimerを使ってみたのだけど、これを使うとSerialが使えなくなる><)
計算式を見つけるのが面倒なのでインターバル周期は実測で見つけます。
約600カウントくらいがAC50Hzでの1/2周期(ACdimで設定)。
#include "Tlc5940.h"
#include "MsTimer2.h"
volatile int zc_counter=0;
volatile boolean zero_cross=false;
int AC_pin = 5;
volatile int ACdim = 500; // 0-600(?)
void zero_cross_detect()
{
zero_cross = true;
digitalWrite(AC_pin, LOW);
}
void ACdim_check()
{
if(zero_cross == true) {
if(zc_counter>=ACdim) {
digitalWrite(AC_pin, HIGH);
zc_counter = 0;
zero_cross = false;
} else {
zc_counter++;
}
}
}
void setup()
{
attachInterrupt(0, zero_cross_detect, RISING);
pinMode(AC_pin, OUTPUT);
MsTimer2::set(1, ACdim_check);
MsTimer2::start();
Tlc.init();
Tlc.clear();
Serial.begin(115200);
}
void loop()
{
if(Serial.available()>0){
int inByte=Serial.read();
if(inByte=='1'){
ACdim+=50;
if(ACdim>600) ACdim=0;
Serial.println(ACdim, DEC);
}else if(inByte=='2'){
Tlc.set(0, 2000);
Tlc.set(1, 2000);
Tlc.update();
}else if(inByte=='0'){
ACdim=600;
Tlc.set(0, 0);
Tlc.set(1, 0);
Tlc.update();
Serial.println("reset");
}
}
}
0 件のコメント:
コメントを投稿