/* * Spalten: Layer: * 15 14 13 12 0 * 11 10 9 8 1 * 7 6 5 4 2 * 3 2 1 0 3 * * * * * Spalten: Layer: * 11 14 13 8 0 * 12 9 10 15 1 * 7 6 5 4 2 * 3 2 1 0 3 * */ #include "Arduino.h" #include #include "Adafruit_MCP23017.h" Adafruit_MCP23017 mcp; int layer1Pin = 15; int layer2Pin = 16; int layer3Pin = 17; int layer4Pin = 14; int layers[4] = {layer1Pin, layer2Pin, layer3Pin, layer4Pin}; int cols[4][4] = {{3, 2, 1, 0},{7, 6, 5, 4},{12, 9, 10, 15},{11, 14, 13, 8}}; void setup() { Serial.begin(9600); mcp.begin(); for (int i=0; i <= 15; i++){ mcp.pinMode(i, OUTPUT); mcp.digitalWrite(i, HIGH); delay(10); } pinMode(layer1Pin, OUTPUT); pinMode(layer2Pin, OUTPUT); pinMode(layer3Pin, OUTPUT); pinMode(layer4Pin, OUTPUT); digitalWrite(layer1Pin, HIGH); digitalWrite(layer2Pin, HIGH); digitalWrite(layer3Pin, HIGH); digitalWrite(layer4Pin, HIGH); } void loop() { circle(); mixer(4); full_scan(2); stamp(2); ball(60); rain(25); randomflicker(250); } void clear() { for (int i=0; i <= 15; i++){ mcp.digitalWrite(i, HIGH); } } void mixer(int rounds) { digitalWrite(layer1Pin, LOW); digitalWrite(layer2Pin, LOW); digitalWrite(layer3Pin, LOW); digitalWrite(layer4Pin, LOW); for(int i=0; i<=rounds; i++){ mcp.digitalWrite(cols[3][1], LOW); mcp.digitalWrite(cols[3][2], LOW); mcp.digitalWrite(cols[2][1], LOW); mcp.digitalWrite(cols[2][2], LOW); mcp.digitalWrite(cols[1][1], LOW); mcp.digitalWrite(cols[1][2], LOW); mcp.digitalWrite(cols[0][1], LOW); mcp.digitalWrite(cols[0][2], LOW); delay(165); clear(); mcp.digitalWrite(cols[3][0], LOW); mcp.digitalWrite(cols[2][1], LOW); mcp.digitalWrite(cols[1][2], LOW); mcp.digitalWrite(cols[0][3], LOW); delay(165); clear(); mcp.digitalWrite(cols[2][0], LOW); mcp.digitalWrite(cols[2][1], LOW); mcp.digitalWrite(cols[2][2], LOW); mcp.digitalWrite(cols[2][3], LOW); mcp.digitalWrite(cols[1][0], LOW); mcp.digitalWrite(cols[1][2], LOW); mcp.digitalWrite(cols[0][1], LOW); mcp.digitalWrite(cols[1][3], LOW); delay(165); clear(); mcp.digitalWrite(cols[0][0], LOW); mcp.digitalWrite(cols[1][1], LOW); mcp.digitalWrite(cols[2][2], LOW); mcp.digitalWrite(cols[3][3], LOW); delay(165); clear(); } } void full_scan(int rounds) { for(int i=0; i<=rounds; i++){ digitalWrite(layer1Pin, LOW); digitalWrite(layer2Pin, LOW); digitalWrite(layer3Pin, LOW); digitalWrite(layer4Pin, LOW); mcp.digitalWrite(cols[3][0], LOW); mcp.digitalWrite(cols[2][0], LOW); mcp.digitalWrite(cols[1][0], LOW); mcp.digitalWrite(cols[0][0], LOW); delay(100); clear(); mcp.digitalWrite(cols[3][1], LOW); mcp.digitalWrite(cols[2][1], LOW); mcp.digitalWrite(cols[1][1], LOW); mcp.digitalWrite(cols[0][1], LOW); delay(100); clear(); mcp.digitalWrite(cols[3][2], LOW); mcp.digitalWrite(cols[2][2], LOW); mcp.digitalWrite(cols[1][2], LOW); mcp.digitalWrite(cols[0][2], LOW); delay(100); clear(); mcp.digitalWrite(cols[3][3], LOW); mcp.digitalWrite(cols[2][3], LOW); mcp.digitalWrite(cols[1][3], LOW); mcp.digitalWrite(cols[0][3], LOW); delay(100); clear(); mcp.digitalWrite(cols[3][3], LOW); mcp.digitalWrite(cols[2][3], LOW); mcp.digitalWrite(cols[1][3], LOW); mcp.digitalWrite(cols[0][3], LOW); delay(100); clear(); mcp.digitalWrite(cols[3][2], LOW); mcp.digitalWrite(cols[2][2], LOW); mcp.digitalWrite(cols[1][2], LOW); mcp.digitalWrite(cols[0][2], LOW); delay(100); clear(); mcp.digitalWrite(cols[3][1], LOW); mcp.digitalWrite(cols[2][1], LOW); mcp.digitalWrite(cols[1][1], LOW); mcp.digitalWrite(cols[0][1], LOW); delay(100); clear(); mcp.digitalWrite(cols[3][0], LOW); mcp.digitalWrite(cols[2][0], LOW); mcp.digitalWrite(cols[1][0], LOW); mcp.digitalWrite(cols[0][0], LOW); delay(100); clear(); for (int i=0; i <= 15; i++){ mcp.digitalWrite(i, LOW); } digitalWrite(layer1Pin, HIGH); digitalWrite(layer2Pin, HIGH); digitalWrite(layer3Pin, HIGH); digitalWrite(layer4Pin, LOW); delay(100); digitalWrite(layer1Pin, HIGH); digitalWrite(layer2Pin, HIGH); digitalWrite(layer3Pin, LOW); digitalWrite(layer4Pin, HIGH); delay(100); digitalWrite(layer1Pin, HIGH); digitalWrite(layer2Pin, LOW); digitalWrite(layer3Pin, HIGH); digitalWrite(layer4Pin, HIGH); delay(100); digitalWrite(layer1Pin, LOW); digitalWrite(layer2Pin, HIGH); digitalWrite(layer3Pin, HIGH); digitalWrite(layer4Pin, HIGH); delay(100); digitalWrite(layer1Pin, LOW); digitalWrite(layer2Pin, HIGH); digitalWrite(layer3Pin, HIGH); digitalWrite(layer4Pin, HIGH); delay(100); digitalWrite(layer1Pin, HIGH); digitalWrite(layer2Pin, LOW); digitalWrite(layer3Pin, HIGH); digitalWrite(layer4Pin, HIGH); delay(100); digitalWrite(layer1Pin, HIGH); digitalWrite(layer2Pin, HIGH); digitalWrite(layer3Pin, LOW); digitalWrite(layer4Pin, HIGH); delay(100); digitalWrite(layer1Pin, HIGH); digitalWrite(layer2Pin, HIGH); digitalWrite(layer3Pin, HIGH); digitalWrite(layer4Pin, LOW); delay(100); clear(); } } void ball(int rounds) { // https://electronics.stackexchange.com/a/67140 // size of the space int height = 4; int width = 4; int depth = 4; // Starting position of the shape int xpos = 2; int ypos = 2; int zpos = 1; // Speed of the shape along each axis int xspeed = 1; int yspeed = 2; int zspeed = 1; int choice[2] = {-1, 1}; int xdirection = 1; // Left or Right int ydirection = 1; // Top to Bottom int zdirection = 1; // front or back for(int i=0; i<=rounds; i++){ clear(); digitalWrite(layer1Pin, HIGH); digitalWrite(layer2Pin, HIGH); digitalWrite(layer3Pin, HIGH); digitalWrite(layer4Pin, HIGH); // Update the position of the shape xpos = xpos + ( xspeed * xdirection ); ypos = ypos + ( yspeed * ydirection ); zpos = zpos + ( zspeed * zdirection ); if (xpos >= width || xpos < 0) { xpos = constrain(xpos, 0, width-1); xdirection *= -1; } if (ypos >= height || ypos < 0) { ypos = constrain(ypos, 0, height-1); ydirection *= -1; } if (zpos >= depth || zpos < 0) { zpos = constrain(zpos, 0, depth-1); zdirection *= -1; } if(random(0, 6) == 1) { xdirection *= -1; } else if(random(0, 6) == 1) { ydirection *= -1; } else if(random(0, 6) == 1) { zdirection *= -1; } digitalWrite(layers[ypos], LOW); mcp.digitalWrite(cols[xpos][3-zpos], LOW); delay(150); } } void randomflicker(int rounds) { for(int i=0; i<=rounds; i++){ clear(); digitalWrite(layer1Pin, HIGH); digitalWrite(layer2Pin, HIGH); digitalWrite(layer3Pin, HIGH); digitalWrite(layer4Pin, HIGH); int randomLayer = random(0, 4); int randomLed = random(0, 16); digitalWrite(layers[randomLayer], LOW); mcp.digitalWrite(randomLed, LOW); delay(10); } } void stamp(int rounds) { for(int i=0; i<=rounds; i++){ digitalWrite(layer1Pin, LOW); digitalWrite(layer2Pin, HIGH); digitalWrite(layer3Pin, HIGH); digitalWrite(layer4Pin, HIGH); clear(); for (int i=0; i <= 15; i++){ mcp.digitalWrite(i, LOW); } delay(1500); digitalWrite(layer1Pin, HIGH); digitalWrite(layer2Pin, LOW); digitalWrite(layer3Pin, HIGH); digitalWrite(layer4Pin, HIGH); delay(50); digitalWrite(layer1Pin, HIGH); digitalWrite(layer2Pin, HIGH); digitalWrite(layer3Pin, LOW); digitalWrite(layer4Pin, HIGH); delay(50); digitalWrite(layer1Pin, HIGH); digitalWrite(layer2Pin, HIGH); digitalWrite(layer3Pin, HIGH); digitalWrite(layer4Pin, LOW); delay(1000); digitalWrite(layer1Pin, HIGH); digitalWrite(layer2Pin, HIGH); digitalWrite(layer3Pin, LOW); digitalWrite(layer4Pin, HIGH); delay(400); digitalWrite(layer1Pin, HIGH); digitalWrite(layer2Pin, LOW); digitalWrite(layer3Pin, HIGH); digitalWrite(layer4Pin, HIGH); delay(400); } } void rain(int rounds) { for(int i=0; i<=rounds; i++){ digitalWrite(layer1Pin, HIGH); digitalWrite(layer2Pin, HIGH); digitalWrite(layer3Pin, HIGH); digitalWrite(layer4Pin, HIGH); clear(); mcp.digitalWrite(random(0, 15), LOW); digitalWrite(layer1Pin, LOW); digitalWrite(layer2Pin, HIGH); digitalWrite(layer3Pin, HIGH); digitalWrite(layer4Pin, HIGH); delay(85); digitalWrite(layer1Pin, HIGH); digitalWrite(layer2Pin, LOW); digitalWrite(layer3Pin, HIGH); digitalWrite(layer4Pin, HIGH); delay(85); digitalWrite(layer1Pin, HIGH); digitalWrite(layer2Pin, HIGH); digitalWrite(layer3Pin, LOW); digitalWrite(layer4Pin, HIGH); delay(85); digitalWrite(layer1Pin, HIGH); digitalWrite(layer2Pin, HIGH); digitalWrite(layer3Pin, HIGH); digitalWrite(layer4Pin, LOW); delay(85); digitalWrite(layer1Pin, HIGH); digitalWrite(layer2Pin, HIGH); digitalWrite(layer3Pin, HIGH); digitalWrite(layer4Pin, HIGH); delay(150); } } void circle() { clear(); digitalWrite(layer1Pin, LOW); digitalWrite(layer2Pin, LOW); digitalWrite(layer3Pin, LOW); digitalWrite(layer4Pin, LOW); mcp.digitalWrite(cols[0][3], LOW); delay(150); mcp.digitalWrite(cols[0][2], LOW); delay(150); mcp.digitalWrite(cols[0][1], LOW); delay(150); mcp.digitalWrite(cols[0][0], LOW); delay(150); mcp.digitalWrite(cols[1][0], LOW); delay(150); mcp.digitalWrite(cols[2][0], LOW); delay(150); mcp.digitalWrite(cols[3][0], LOW); delay(150); mcp.digitalWrite(cols[3][1], LOW); delay(150); mcp.digitalWrite(cols[3][2], LOW); delay(150); mcp.digitalWrite(cols[3][3], LOW); delay(150); mcp.digitalWrite(cols[2][3], LOW); delay(150); mcp.digitalWrite(cols[1][3], LOW); delay(150); mcp.digitalWrite(cols[1][2], LOW); delay(150); mcp.digitalWrite(cols[1][1], LOW); delay(150); mcp.digitalWrite(cols[2][1], LOW); delay(150); mcp.digitalWrite(cols[2][2], LOW); delay(150); delay(1500); mcp.digitalWrite(cols[2][2], HIGH); delay(150); mcp.digitalWrite(cols[2][1], HIGH); delay(150); mcp.digitalWrite(cols[1][1], HIGH); delay(150); mcp.digitalWrite(cols[1][2], HIGH); delay(150); mcp.digitalWrite(cols[1][3], HIGH); delay(150); mcp.digitalWrite(cols[2][3], HIGH); delay(150); mcp.digitalWrite(cols[3][3], HIGH); delay(150); mcp.digitalWrite(cols[3][2], HIGH); delay(150); mcp.digitalWrite(cols[3][1], HIGH); delay(150); mcp.digitalWrite(cols[3][0], HIGH); delay(150); mcp.digitalWrite(cols[2][0], HIGH); delay(150); mcp.digitalWrite(cols[1][0], HIGH); delay(150); mcp.digitalWrite(cols[0][0], HIGH); delay(150); mcp.digitalWrite(cols[0][1], HIGH); delay(150); mcp.digitalWrite(cols[0][2], HIGH); delay(150); mcp.digitalWrite(cols[0][3], HIGH); delay(150); delay(1500); }