#include #include #include #include Adafruit_SSD1306 display(128, 64, &Wire, -1); #include MATRIX7219 mx(4,10,13,4); int musicScale[]={523,587,659,698,784,880,988,1047}; int disp_speed=2500, scan_timer=0, sw_old[]={0,0,0,0}, sw_new[4], sw_port[]={2,7,8,9}; int pattern[4][3], ttable[8][8]; void setup(){ for(int i=0; i<4; i++){ pinMode(sw_port[i], INPUT); for(int j=0; j<3; j++) pattern[i][j] = 0; } table_set(); mx.begin(); mx.clear(); mx.setBrightness(3); // develop = 1, final = 3 mx.setReverse(false); display.begin(SSD1306_SWITCHCAPVCC, 0x3C); text_menu(); randomSeed(analogRead(0)); tone(12,440); delay(50); noTone(12); delay(50); tone(12,880); delay(50); noTone(12);; } void loop(){ for(int i=0; i<4; i++) display_patterns(i); if(++scan_timer > 100){ scan_timer = 0; sw_scan(); } } void sw_scan(){ for(int i=0; i<4; i++){ sw_new[i] = ! digitalRead(sw_port[i]); if(sw_new[i] != sw_old[i]){ sw_old[i] = sw_new[i]; if(sw_new[i] == 1){ pattern[i][0] = random(0,34); // Random Range Setting !! pattern[i][1] = 0; pattern[i][2] = 0; tone(12,500+50*pattern[i][0]); delay(40); noTone(12); text_menu(); } } } } void display_patterns(int i){ int k,n; switch(pattern[i][0]){ case(33): if(pattern[i][2] == 0){ if(pattern[i][1] == 8) for(k=1; k<9; k++) mx.setRow(k, 0x00, i+1); else{ for(n=0; n<8; n++){ mx.setRow(1+n, bit_reverse(ttable[7-pattern[i][1]][n]), i+1); } } if(++pattern[i][1]>8) pattern[i][1] = 0; } if(++pattern[i][2] > disp_speed*3) pattern[i][2] = 0; break; case(32): if(pattern[i][2] == 0){ if(pattern[i][1] == 8) for(k=1; k<9; k++) mx.setRow(k, 0x00, i+1); else{ for(n=0; n<8; n++){ mx.setRow(1+n, bit_reverse(ttable[pattern[i][1]][n]), i+1); } } if(++pattern[i][1]>8) pattern[i][1] = 0; } if(++pattern[i][2] > disp_speed*3) pattern[i][2] = 0; break; case(31): if(pattern[i][2] == 0){ if(pattern[i][1] == 8) for(k=1; k<9; k++) mx.setRow(k, 0x00, i+1); else{ for(n=0; n<8; n++){ mx.setRow(8-n, bit_reverse(ttable[7-pattern[i][1]][n]), i+1); } } if(++pattern[i][1]>8) pattern[i][1] = 0; } if(++pattern[i][2] > disp_speed*3) pattern[i][2] = 0; break; case(30): if(pattern[i][2] == 0){ if(pattern[i][1] == 8) for(k=1; k<9; k++) mx.setRow(k, 0x00, i+1); else{ for(n=0; n<8; n++){ mx.setRow(8-n, bit_reverse(ttable[pattern[i][1]][n]), i+1); } } if(++pattern[i][1]>8) pattern[i][1] = 0; } if(++pattern[i][2] > disp_speed*3) pattern[i][2] = 0; break; case(29): if(pattern[i][2] == 0){ if(pattern[i][1] == 8) for(k=1; k<9; k++) mx.setRow(k, 0x00, i+1); else{ for(n=0; n<8; n++){ mx.setRow(1+n, ttable[7-pattern[i][1]][n], i+1); } } if(++pattern[i][1]>8) pattern[i][1] = 0; } if(++pattern[i][2] > disp_speed*3) pattern[i][2] = 0; break; case(28): if(pattern[i][2] == 0){ if(pattern[i][1] == 8) for(k=1; k<9; k++) mx.setRow(k, 0x00, i+1); else{ for(n=0; n<8; n++){ mx.setRow(1+n, ttable[pattern[i][1]][n], i+1); } } if(++pattern[i][1]>8) pattern[i][1] = 0; } if(++pattern[i][2] > disp_speed*3) pattern[i][2] = 0; break; case(27): if(pattern[i][2] == 0){ if(pattern[i][1] == 8) for(k=1; k<9; k++) mx.setRow(k, 0x00, i+1); else{ for(n=0; n<8; n++){ mx.setRow(8-n, ttable[7-pattern[i][1]][n], i+1); } } if(++pattern[i][1]>8) pattern[i][1] = 0; } if(++pattern[i][2] > disp_speed*3) pattern[i][2] = 0; break; case(26): if(pattern[i][2] == 0){ if(pattern[i][1] == 8) for(k=1; k<9; k++) mx.setRow(k, 0x00, i+1); else{ for(n=0; n<8; n++){ mx.setRow(8-n, ttable[pattern[i][1]][n], i+1); } } if(++pattern[i][1]>8) pattern[i][1] = 0; } if(++pattern[i][2] > disp_speed*3) pattern[i][2] = 0; break; case(25): if(pattern[i][2] == 0) for(n=0; n<8; n++) mx.setRow(n+1, 0xff, i+1); else if(pattern[i][2] == disp_speed*4) for(n=0; n<8; n++) mx.setRow(n+1, 0x00, i+1); if(++pattern[i][2] > disp_speed*12) pattern[i][2] = 0; break; case(24): if(pattern[i][2] == 0){ for(n=7; n>-1; n--){ if(n == pattern[i][1]) mx.setRow(8-n, 0xff, i+1); else mx.setRow(8-n, 0x80 >> pattern[i][1], i+1); } if(++pattern[i][1]>7) pattern[i][1] = 0; } if(++pattern[i][2] > disp_speed*4) pattern[i][2] = 0; break; case(23): if(pattern[i][2] == 0){ for(n=7; n>-1; n--){ if(n == pattern[i][1]) mx.setRow(8-n, 0xff, i+1); else mx.setRow(8-n, 1 << pattern[i][1], i+1); } if(++pattern[i][1]>7) pattern[i][1] = 0; } if(++pattern[i][2] > disp_speed*4) pattern[i][2] = 0; break; case(22): if(pattern[i][2] == 0){ for(n=0; n<8; n++){ if(n == pattern[i][1]) mx.setRow(n+1, 0xff, i+1); else mx.setRow(n+1, 0x80 >> pattern[i][1], i+1); } if(++pattern[i][1]>7) pattern[i][1] = 0; } if(++pattern[i][2] > disp_speed*4) pattern[i][2] = 0; break; case(21): if(pattern[i][2] == 0){ for(n=0; n<8; n++){ if(n == pattern[i][1]) mx.setRow(n+1, 0xff, i+1); else mx.setRow(n+1, 1 << pattern[i][1], i+1); } if(++pattern[i][1]>7) pattern[i][1] = 0; } if(++pattern[i][2] > disp_speed*4) pattern[i][2] = 0; break; case(20): if(pattern[i][2] == 0){ if(pattern[i][1] == 4){ for(k=1; k<9; k++) mx.setRow(k, 0x00, i+1); } else if(pattern[i][1] == 3){ mx.setRow(1, 0x81, i+1); mx.setRow(8, 0x81, i+1); mx.setRow(2, 0x00, i+1); mx.setRow(7, 0x00, i+1); mx.setRow(3, 0x00, i+1); mx.setRow(6, 0x00, i+1); mx.setRow(4, 0x00, i+1); mx.setRow(5, 0x00, i+1); } else if(pattern[i][1] == 2){ mx.setRow(1, 0x81, i+1); mx.setRow(8, 0x81, i+1); mx.setRow(2, 0x42, i+1); mx.setRow(7, 0x42, i+1); mx.setRow(3, 0x00, i+1); mx.setRow(6, 0x00, i+1); mx.setRow(4, 0x00, i+1); mx.setRow(5, 0x00, i+1); } else if(pattern[i][1] == 1){ mx.setRow(1, 0x81, i+1); mx.setRow(8, 0x81, i+1); mx.setRow(2, 0x42, i+1); mx.setRow(7, 0x42, i+1); mx.setRow(3, 0x24, i+1); mx.setRow(6, 0x24, i+1); mx.setRow(4, 0x00, i+1); mx.setRow(5, 0x00, i+1); } else{ mx.setRow(1, 0x81, i+1); mx.setRow(8, 0x81, i+1); mx.setRow(2, 0x42, i+1); mx.setRow(7, 0x42, i+1); mx.setRow(3, 0x24, i+1); mx.setRow(6, 0x24, i+1); mx.setRow(4, 0x18, i+1); mx.setRow(5, 0x18, i+1); } if(++pattern[i][1]>4) pattern[i][1] = 0; } if(++pattern[i][2] > disp_speed*6) pattern[i][2] = 0; break; case(19): if(pattern[i][2] == 0){ if(pattern[i][1] == 0){ for(k=1; k<9; k++) mx.setRow(k, 0x00, i+1); } else if(pattern[i][1] == 1){ mx.setRow(1, 0x81, i+1); mx.setRow(8, 0x81, i+1); mx.setRow(2, 0x00, i+1); mx.setRow(7, 0x00, i+1); mx.setRow(3, 0x00, i+1); mx.setRow(6, 0x00, i+1); mx.setRow(4, 0x00, i+1); mx.setRow(5, 0x00, i+1); } else if(pattern[i][1] == 2){ mx.setRow(1, 0x81, i+1); mx.setRow(8, 0x81, i+1); mx.setRow(2, 0x42, i+1); mx.setRow(7, 0x42, i+1); mx.setRow(3, 0x00, i+1); mx.setRow(6, 0x00, i+1); mx.setRow(4, 0x00, i+1); mx.setRow(5, 0x00, i+1); } else if(pattern[i][1] == 3){ mx.setRow(1, 0x81, i+1); mx.setRow(8, 0x81, i+1); mx.setRow(2, 0x42, i+1); mx.setRow(7, 0x42, i+1); mx.setRow(3, 0x24, i+1); mx.setRow(6, 0x24, i+1); mx.setRow(4, 0x00, i+1); mx.setRow(5, 0x00, i+1); } else{ mx.setRow(1, 0x81, i+1); mx.setRow(8, 0x81, i+1); mx.setRow(2, 0x42, i+1); mx.setRow(7, 0x42, i+1); mx.setRow(3, 0x24, i+1); mx.setRow(6, 0x24, i+1); mx.setRow(4, 0x18, i+1); mx.setRow(5, 0x18, i+1); } if(++pattern[i][1]>4) pattern[i][1] = 0; } if(++pattern[i][2] > disp_speed*6) pattern[i][2] = 0; break; case(18): if(pattern[i][2] == 0){ if(pattern[i][1] == 3){ mx.setRow(1, 0xff, i+1); mx.setRow(8, 0xff, i+1); mx.setRow(2, 0x81, i+1); mx.setRow(7, 0x81, i+1); mx.setRow(3, 0x81, i+1); mx.setRow(6, 0x81, i+1); mx.setRow(4, 0x81, i+1); mx.setRow(5, 0x81, i+1); } else if(pattern[i][1] == 2){ mx.setRow(1, 0x00, i+1); mx.setRow(8, 0x00, i+1); mx.setRow(2, 0x7e, i+1); mx.setRow(7, 0x7e, i+1); mx.setRow(3, 0x42, i+1); mx.setRow(6, 0x42, i+1); mx.setRow(4, 0x42, i+1); mx.setRow(5, 0x42, i+1); } else if(pattern[i][1] == 1){ mx.setRow(1, 0x00, i+1); mx.setRow(8, 0x00, i+1); mx.setRow(2, 0x00, i+1); mx.setRow(7, 0x00, i+1); mx.setRow(3, 0x3c, i+1); mx.setRow(6, 0x3c, i+1); mx.setRow(4, 0x24, i+1); mx.setRow(5, 0x24, i+1); } else{ mx.setRow(1, 0x00, i+1); mx.setRow(8, 0x00, i+1); mx.setRow(2, 0x00, i+1); mx.setRow(7, 0x00, i+1); mx.setRow(3, 0x00, i+1); mx.setRow(6, 0x00, i+1); mx.setRow(4, 0x18, i+1); mx.setRow(5, 0x18, i+1); } if(++pattern[i][1]>3) pattern[i][1] = 0; } if(++pattern[i][2] > disp_speed*8) pattern[i][2] = 0; break; case(17): if(pattern[i][2] == 0){ if(pattern[i][1] == 0){ mx.setRow(1, 0xff, i+1); mx.setRow(8, 0xff, i+1); mx.setRow(2, 0x81, i+1); mx.setRow(7, 0x81, i+1); mx.setRow(3, 0x81, i+1); mx.setRow(6, 0x81, i+1); mx.setRow(4, 0x81, i+1); mx.setRow(5, 0x81, i+1); } else if(pattern[i][1] == 1){ mx.setRow(1, 0x00, i+1); mx.setRow(8, 0x00, i+1); mx.setRow(2, 0x7e, i+1); mx.setRow(7, 0x7e, i+1); mx.setRow(3, 0x42, i+1); mx.setRow(6, 0x42, i+1); mx.setRow(4, 0x42, i+1); mx.setRow(5, 0x42, i+1); } else if(pattern[i][1] == 2){ mx.setRow(1, 0x00, i+1); mx.setRow(8, 0x00, i+1); mx.setRow(2, 0x00, i+1); mx.setRow(7, 0x00, i+1); mx.setRow(3, 0x3c, i+1); mx.setRow(6, 0x3c, i+1); mx.setRow(4, 0x24, i+1); mx.setRow(5, 0x24, i+1); } else{ mx.setRow(1, 0x00, i+1); mx.setRow(8, 0x00, i+1); mx.setRow(2, 0x00, i+1); mx.setRow(7, 0x00, i+1); mx.setRow(3, 0x00, i+1); mx.setRow(6, 0x00, i+1); mx.setRow(4, 0x18, i+1); mx.setRow(5, 0x18, i+1); } if(++pattern[i][1]>3) pattern[i][1] = 0; } if(++pattern[i][2] > disp_speed*8) pattern[i][2] = 0; break; case(16): if(pattern[i][2] == 0){ for(n=0; n<2; n++){ mx.setRow(4*n+1, 0x33, i+1); mx.setRow(4*n+2, 0x33, i+1); mx.setRow(4*n+3, 0xcc, i+1); mx.setRow(4*n+4, 0xcc, i+1); } } else if(pattern[i][2] == disp_speed*6){ for(n=0; n<2; n++){ mx.setRow(4*n+1, 0xcc, i+1); mx.setRow(4*n+2, 0xcc, i+1); mx.setRow(4*n+3, 0x33, i+1); mx.setRow(4*n+4, 0x33, i+1); } } if(++pattern[i][2] > disp_speed*12) pattern[i][2] = 0; break; case(15): if(pattern[i][2] == 0){ mx.setReverse(true); mx.setRow(((15-pattern[i][1])%8)+1, (0xaa00 >> (pattern[i][1]+1)) & 0xff, i+1); mx.setReverse(false); if(++pattern[i][1]>15) pattern[i][1] = 0; } if(++pattern[i][2] > disp_speed*2) pattern[i][2] = 0; break; case(14): if(pattern[i][2] == 0){ mx.setRow(((15-pattern[i][1])%8)+1, (0xaa00 >> (pattern[i][1]+1)) & 0xff, i+1); if(++pattern[i][1]>15) pattern[i][1] = 0; } if(++pattern[i][2] > disp_speed*2) pattern[i][2] = 0; break; case(13): if(pattern[i][2] == 0){ mx.setReverse(true); mx.setRow((pattern[i][1]%8)+1, (0xaa00 >> (pattern[i][1]+1)) & 0xff, i+1); mx.setReverse(false); if(++pattern[i][1]>15) pattern[i][1] = 0; } if(++pattern[i][2] > disp_speed*2) pattern[i][2] = 0; break; case(12): if(pattern[i][2] == 0){ mx.setRow((pattern[i][1]%8)+1, (0xaa00 >> (pattern[i][1]+1)) & 0xff, i+1); if(++pattern[i][1]>15) pattern[i][1] = 0; } if(++pattern[i][2] > disp_speed*2) pattern[i][2] = 0; break; case(11): if(pattern[i][2] == 0){ mx.setReverse(true); mx.setRow(((15-pattern[i][1])%8)+1, (0xcc00 >> (pattern[i][1]+1)) & 0xff, i+1); mx.setReverse(false); if(++pattern[i][1]>15) pattern[i][1] = 0; } if(++pattern[i][2] > disp_speed*2) pattern[i][2] = 0; break; case(10): if(pattern[i][2] == 0){ mx.setRow(((15-pattern[i][1])%8)+1, (0xcc00 >> (pattern[i][1]+1)) & 0xff, i+1); if(++pattern[i][1]>15) pattern[i][1] = 0; } if(++pattern[i][2]>disp_speed*2) pattern[i][2] = 0; break; case(9): if(pattern[i][2] == 0){ mx.setReverse(true); mx.setRow((pattern[i][1]%8)+1, (0xcc00 >> (pattern[i][1]+1)) & 0xff, i+1); mx.setReverse(false); if(++pattern[i][1]>15) pattern[i][1] = 0; } if(++pattern[i][2] > disp_speed*2) pattern[i][2] = 0; break; case(8): if(pattern[i][2] == 0){ mx.setRow((pattern[i][1]%8)+1, (0xcc00 >> (pattern[i][1]+1)) & 0xff, i+1); if(++pattern[i][1]>15) pattern[i][1] = 0; } if(++pattern[i][2] > disp_speed*2) pattern[i][2] = 0; break; case(7): if(pattern[i][2] == 0){ mx.setReverse(true); mx.setRow(((15-pattern[i][1])%8)+1, (0xff00 >> (pattern[i][1]+1)) & 0xff, i+1); mx.setReverse(false); if(++pattern[i][1]>15) pattern[i][1] = 0; } if(++pattern[i][2] > disp_speed*2) pattern[i][2] = 0; break; case(6): if(pattern[i][2] == 0){ mx.setRow(((15-pattern[i][1])%8)+1, (0xff00 >> (pattern[i][1]+1)) & 0xff, i+1); if(++pattern[i][1]>15) pattern[i][1] = 0; } if(++pattern[i][2] > disp_speed*2) pattern[i][2] = 0; break; case(5): if(pattern[i][2] == 0){ mx.setReverse(true); mx.setRow((pattern[i][1]%8)+1, (0xff00 >> (pattern[i][1]+1)) & 0xff, i+1); mx.setReverse(false); if(++pattern[i][1]>15) pattern[i][1] = 0; } if(++pattern[i][2] > disp_speed*2) pattern[i][2] = 0; break; case(4): if(pattern[i][2] == 0){ mx.setRow((pattern[i][1]%8)+1, (0xff00 >> (pattern[i][1]+1)) & 0xff, i+1); if(++pattern[i][1]>15) pattern[i][1] = 0; } if(++pattern[i][2] > disp_speed*2) pattern[i][2] = 0; break; case(3): if(pattern[i][2] == 0){ for(n=0; n<4; n++){ mx.setRow(2*n+1, 0x55, i+1); mx.setRow(2*n+2, 0xaa, i+1); } } else if(pattern[i][2] == disp_speed*6){ for(n=0; n<4; n++){ mx.setRow(2*n+1, 0xaa, i+1); mx.setRow(2*n+2, 0x55, i+1); } } if(++pattern[i][2] > disp_speed*12) pattern[i][2] = 0; break; case(2): if(pattern[i][2] == 0){ mx.setReverse(true); mx.setRow(pattern[i][1]+1, (1 << random(7)) - 1, i+1); mx.setReverse(false); if(++pattern[i][1]>7) pattern[i][1] = 0; } if(++pattern[i][2]>500) pattern[i][2] = 0; break; case(1): if(pattern[i][2] == 0){ mx.setRow(pattern[i][1]+1, (1 << random(7)) - 1, i+1); if(++pattern[i][1]>7) pattern[i][1] = 0; } if(++pattern[i][2]>500) pattern[i][2] = 0; break; case(0): if(pattern[i][2] == 0) for(int n=1; n<9; n++) mx.setRow(n, 0, i+1); if(++pattern[i][2]>10000) pattern[i][2] = 0; break; } } void text_menu(){ display.clearDisplay(); display.setTextSize(1); display.setCursor(0,0); display.setTextColor(BLACK, WHITE); display.print(" Hello, World ! "); display.setTextColor(WHITE); display.setCursor(20,15); display.print(" Yellow = "); display.print(pattern[0][0]); display.setCursor(20,27); display.print(" Blue = "); display.print(pattern[1][0]); display.setCursor(20,39); display.print(" Red = "); display.print(pattern[2][0]); display.setCursor(20,51); display.print(" Green = "); display.print(pattern[3][0]); display.display(); } int bit_reverse(int k){ return( ((k&1)<<7)|((k&2)<<5)|((k&4)<<3)|((k&8)<<1)|((k&16)>>1)|((k&32)>>3)|((k&64)>>5)|((k&128)>>7) ); } void table_set(){ int i; ttable[0][0] = 0x01; for(i=1; i<8; i++) ttable[0][i] = 0x00; ttable[1][0] = 0x02; ttable[1][1] = 0x03; for(i=2; i<8; i++) ttable[1][i] = 0x00; for(i=0; i<2; i++) ttable[2][i] = 0x04; ttable[2][2] = 0x07; for(i=3; i<8; i++) ttable[2][i] = 0x00; for(i=0; i<3; i++) ttable[3][i] = 0x08; ttable[3][3] = 0x0f; for(i=4; i<8; i++) ttable[3][i] = 0x00; for(i=0; i<4; i++) ttable[4][i] = 0x10; ttable[4][4] = 0x1f; for(i=5; i<8; i++) ttable[4][i] = 0x00; for(i=0; i<5; i++) ttable[5][i] = 0x20; ttable[5][5] = 0x3f; for(i=6; i<8; i++) ttable[5][i] = 0x00; for(i=0; i<6; i++) ttable[6][i] = 0x40; ttable[6][6] = 0x7f; ttable[6][7] = 0x00; for(i=0; i<7; i++) ttable[7][i] = 0x80; ttable[7][7] = 0xff; }