5 x 5 LED陣列

自行焊接的 5 x 5 LED 陣列, 依序測通各LED亮滅.
延伸的內容可以結合光敏電阻, 當手揮過光敏電阻上方時, LED陣列做出對應的亮滅效果. 請期待 5 x 5 x 5 高達125 LED 的 CAVE light cube !



====================================

#include <Metro.h>

//アニメーションのスピード
#define SPD 10

//Metro初期化
Metro metro = Metro(15000);

//anodeとcathodeのピンを配列に格納
int anode[25] = {0,1,2,3,4,5,6,7,8,9,10,11,12,14,15,16,17,18,19,20,21,22,23,24,25};
int cathode[5] = {13,26,27,28,29};

boolean bufkuru[6][16]={
  {1,0,0,0,
   0,1,0,0,
   0,0,1,0,
   0,0,0,1},
  {0,1,0,0,
   0,1,0,0,
   0,0,1,0,
   0,0,1,0},
  {0,0,1,0,
   0,0,1,0,
   0,1,0,0,
   0,1,0,0},
  {0,0,0,1,
   0,0,1,0,
   0,1,0,0,
   1,0,0,0},
  {0,0,0,0,
   0,0,1,1,
   1,1,0,0,
   0,0,0,0},
  {0,0,0,0,
   1,1,0,0,
   0,0,1,1,
   0,0,0,0}
};

//表示する点灯情報を用意
boolean buf[4][16];

void setup(){
  int i;
  //何もつながっていないアナログピンをリードして擬似乱数発生
  randomSeed(analogRead(0));
  for(i=0;i<21;i++){  //全てのpinをデジタルのアウトプットに設定
    pinMode(i,OUTPUT);
  }
  //一旦bufを0でクリア
  bufclear(0);
  //metroの時間をリセット
  metro.reset();
}

void loop(){
  //このようにすると指定した時間まで繰り返す動作になる
  while(metro.check()==0){
    randomdisplay();
  }
  //metroを2000ms=2秒に設定
  metro.interval(2000);
  while(metro.check()==0){
    randomoff();
  }
  metro.interval(10000);
  while(metro.check()==0){
    kurukuru(1);
  }
  while(metro.check()==0){
    kurukuru(0);
  }
}

//bufの中身をvalで埋める関数
//クリアなどに使う
void bufclear(boolean val){
  int i,j;
  for(i=0;i<4;i++){
    for(j=0;j<16;j++){
      buf[i][j] = val;
    }
  }
}

//bufの中身を実際に表示する関数
//timeは繰り返す回数でアニメーションのスピードなどに関係する
void displaybuf(int time){
  int i,j,count;
  for(count=0;count<time;count++){
    for(i=0;i<4;i++){
      for(j=0;j<16;j++){
        digitalWrite(anode[j],buf[i][j]);//各階層のアノードを出力
      }
      digitalWrite(cathode[i],1);//階層のカソードにH・・・GNDと接続
      delayMicroseconds(500);//少し待つ この時間を短くすると・・・・?
      digitalWrite(cathode[i],0);//カソードにLを出力・・・無接続
    }
  }
}

//ランダムに点灯
void randomdisplay(){
  int i,j;
  i = random(4);
  j = random(16);
  buf[i][j] = ~buf[i][j];
  displaybuf(SPD);
}

//ランダムに消灯
void randomoff(){
  int i,j;
  i = random(4);
  j = random(16);
  buf[i][j] = 0;
  displaybuf(SPD>>2);
}

//アニメーションパターン
//vで方向を決定
//bufに書き出さず、bufkuruをそのまま表示する
void kurukuru(boolean v){
  int layer[4] = {0,1,2,3};
  int layerNo,bufNo,count,i,j;
  for(layerNo=0;layerNo<6;layerNo++){
    for(bufNo=0;bufNo<4;bufNo++){
      if(v){
        if(layer[bufNo]==5){
          layer[bufNo]=0;
        }else{
          layer[bufNo]++;
        }
      }else{
        if(layer[bufNo]==0){
          layer[bufNo]=5;
        }else{
          layer[bufNo]–;
        }
      }
    }
    for(count=0;count<SPD;count++){
      for(bufNo=0;bufNo<4;bufNo++){
        for(i=0;i<4;i++){
          for(j=0;j<16;j++){
            digitalWrite(anode[j],bufkuru[layer[i]][j]);
          }
          digitalWrite(cathode[i],1);
          delayMicroseconds(500);
          digitalWrite(cathode[i],0);
        }
      }
    }
  }
}

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *