#include "MATRIX7219.h" MATRIX7219 mx(2,10,13,3); #define max_pattern 16 int musicScale[]={523,587,659,698,784,880,988,1047}; int sw_old=0, sw_new, ad_timer=0, scan_timer=0; long disp_timer=0, disp_timer_limit=70000; int mode[3], idou[3], stopper[4]; char pt[max_pattern][8], disp[max_pattern][8][3]; void setup() { pinMode(4,INPUT); table_set(); mx.begin(); mx.setBrightness(3); // develop = 1, final = 3 mx.setReverse(false); startup(); } void loop() { int i,j,p,q,analog_data; if(++disp_timer > disp_timer_limit){ disp_timer = 0; for(i=0; i<3; i++) display_patterns(i); } if(++scan_timer > 100){ scan_timer = 0; sw_scan(); if(++ad_timer > 100){ ad_timer = 0; analog_data = analogRead(A0); disp_timer_limit = map(analog_data, 0, 1023, 27000, 700); } } if(stopper[2] == 2){ if( (mode[0] == mode[1]) && (mode[0] == mode[2]) ){ for(i=0; i<9; i++){ tone(12, musicScale[i]); delay(40); noTone(12); delay(60); } p = mode[0]; for(q=0; q<3; q++){ for(i=0; i<8; i++){ for(j=0; j<3; j++) mx.setRow(i+1, 255-disp[p][i][j], j+1); } delay(150); for(i=0; i<8; i++){ for(j=0; j<3; j++) mx.setRow(i+1, disp[p][i][j], j+1); } delay(300); } delay(700); } else{ tone(12,500); delay(100); for(i=8; i>0; i--){ for(j=1; j<4; j++) mx.setRow(i, 0, j); delay(100); } noTone(12); } delay(1000); sw_old = 0; startup(); } } void sw_scan(){ int i; sw_new = ! digitalRead(4); if(sw_new != sw_old){ sw_old = sw_new; if(sw_new == 1){ tone(12,1000); delay(40); noTone(12); if(stopper[0] == 0){ stopper[0]++; stopper[3]++; } else if(stopper[1] == 0){ stopper[1]++; stopper[3]++; } else if(stopper[2] == 0){ stopper[2]++; stopper[3]++; } } } } void display_patterns(int i){ int k,n,p; k = (mode[i]+15) % max_pattern; p = mode[i]; switch(idou[i]){ case 0: for(n=0; n<7; n++) mx.setRow(n+1, disp[k][n+1][i], i+1); mx.setRow(8, 0, i+1); break; case 1: for(n=0; n<6; n++) mx.setRow(n+1, disp[k][n+2][i], i+1); for(n=8; n>6; n--) mx.setRow(n, 0, i+1); break; case 2: for(n=0; n<5; n++) mx.setRow(n+1, disp[k][n+3][i], i+1); for(n=8; n>5; n--) mx.setRow(n, 0, i+1); break; case 3: for(n=0; n<4; n++) mx.setRow(n+1, disp[k][n+4][i], i+1); for(n=8; n>4; n--) mx.setRow(n, 0, i+1); break; case 4: for(n=0; n<3; n++) mx.setRow(n+1, disp[k][n+5][i], i+1); for(n=7; n>3; n--) mx.setRow(n, 0, i+1); mx.setRow(8, disp[p][0][i], i+1); break; case 5: for(n=0; n<2; n++) mx.setRow(n+1, disp[k][n+6][i], i+1); for(n=6; n>2; n--) mx.setRow(n, 0, i+1); for(n=0; n<2; n++) mx.setRow(n+7, disp[p][n][i], i+1); break; case 6: mx.setRow(1, disp[k][7][i], i+1); for(n=5; n>1; n--) mx.setRow(n, 0, i+1); for(n=0; n<3; n++) mx.setRow(n+6, disp[p][n][i], i+1); break; case 7: for(n=4; n>0; n--) mx.setRow(n, 0, i+1); for(n=0; n<4; n++) mx.setRow(n+5, disp[p][n][i], i+1); break; case 8: for(n=3; n>0; n--) mx.setRow(n, 0, i+1); for(n=0; n<5; n++) mx.setRow(n+4, disp[p][n][i], i+1); break; case 9: for(n=2; n>0; n--) mx.setRow(n, 0, i+1); for(n=0; n<6; n++) mx.setRow(n+3, disp[p][n][i], i+1); break; case 10: mx.setRow(1, 0, i+1); for(n=0; n<7; n++) mx.setRow(n+2, disp[p][n][i], i+1); break; case 11: for(n=0; n<8; n++) mx.setRow(n+1, disp[p][n][i], i+1); if(stopper[i] == 1) stopper[i]++; if(stopper[i] != 2) mode[i] = (mode[i]+1) % max_pattern; break; } if(stopper[i] != 2) idou[i] = (idou[i]+1) % 12; } void startup(){ int i; for(i=0; i<3; i++) idou[i] = 0; for(i=0; i<4; i++) stopper[i] = 0; mode[0] = random(0,6); mode[1] = random(5,11); mode[2] = random(10,15); mx.clear(); tone(12,700); delay(50); noTone(12); delay(50); tone(12,1400); delay(50); noTone(12); } void table_set(){ int i,j,k; k=0; pt[k][0]=pt[k][7]=0x10; pt[k][1]=pt[k][6]=0x30; pt[k][2]=pt[k][5]=0x7e; pt[k][3]=pt[k][4]=0xfe; k=1; pt[k][0]=pt[k][7]=0xff; for(i=1;i<7;i++){pt[k][i]=0x81;} k=2; pt[k][0]=pt[k][7]=0x18; pt[k][1]=pt[k][6]=0x24; pt[k][2]=pt[k][5]=0x42; pt[k][3]=pt[k][4]=0x81; k=3; pt[k][0]=pt[k][7]=0x81; pt[k][1]=pt[k][6]=0x42; pt[k][2]=pt[k][5]=0x24; pt[k][3]=pt[k][4]=0x18; k=4; pt[k][0]=pt[k][7]=0x08; pt[k][1]=pt[k][6]=0x0c; pt[k][2]=pt[k][5]=0x7e; pt[k][3]=pt[k][4]=0x7f; k=5; pt[k][0]=pt[k][7]=0xc3; pt[k][1]=pt[k][6]=0xa5; pt[k][2]=pt[k][5]=0x5a; pt[k][3]=pt[k][4]=0x24; k=6; pt[k][0]=pt[k][7]=0x3c; pt[k][1]=pt[k][6]=0x42; pt[k][2]=pt[k][5]=0x81; pt[k][3]=pt[k][4]=0x99; k=7; pt[k][0]=pt[k][7]=0xc3; pt[k][1]=pt[k][6]=0x42; pt[k][2]=pt[k][5]=0x24; pt[k][3]=pt[k][4]=0x18; k=8; pt[k][0]=0; for(i=1;i<4;i++){pt[k][i]=0x3c;} pt[k][4]=0xff; pt[k][5]=0x7e; pt[k][6]=0x3c; pt[k][7]=0x18; k=9; pt[k][0]=pt[k][7]=0xff; pt[k][1]=pt[k][6]=0x81; pt[k][2]=pt[k][5]=0x81; pt[k][3]=pt[k][4]=0x99; k=10; pt[k][0]=pt[k][7]=0x3c; pt[k][1]=pt[k][6]=0x42; pt[k][2]=pt[k][5]=0x99; pt[k][3]=pt[k][4]=0xa5; k=11; pt[k][0]=pt[k][7]=0xbd; pt[k][1]=pt[k][6]=0x81; pt[k][2]=pt[k][5]=0; pt[k][3]=pt[k][4]=0x81; k=12; pt[k][0]=0x18; pt[k][1]=0x3c; pt[k][2]=0x7e; pt[k][3]=0xff; for(i=4;i<7;i++){pt[k][i]=0x3c;} pt[k][7]=0; k=13; pt[k][0]=pt[k][7]=0x3c; pt[k][1]=pt[k][6]=0x24; pt[k][2]=pt[k][5]=0xe7; pt[k][3]=pt[k][4]=0x81; k=14; pt[k][0]=pt[k][7]=0x42; pt[k][1]=pt[k][6]=0xc3; pt[k][2]=pt[k][5]=0x24; pt[k][3]=pt[k][4]=0x18; k=15; pt[k][0]=pt[k][7]=0xc3; pt[k][1]=pt[k][6]=0x81; pt[k][2]=pt[k][5]=0x3c; pt[k][3]=pt[k][4]=0x3c; for(i=0; i