自行焊接的 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);
}
}
}
}
}