2012年2月6日月曜日

ここまでの成果

ケースの照明→電球色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 件のコメント:

コメントを投稿