I made a 3x3x3 ledcube using a shiftregister and FETs. By sending three 8 bit values to the function writeLeds() wich uses digitalShiftOut() i can control the 3 layers individually by writing the FETs high or low. The lasts 3 leds i control with an Arduino pin. Now i want to add buttons to switch between patterns. This means I have to replace the delay() in the writeleds() function. But I can't figure out how I can do that while keeping the same functionality.
const int dataPin = 2; // DS
const int clockPin = 4; // SHCP
const int latchPin = 3; // STCP
int FET1 = 5;
int FET2 = 6;
int FET3 = 7;
int led = A0;
#define vertraging_leds 200
void setup() {
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(latchPin, OUTPUT);
pinMode(FET1, OUTPUT);
pinMode(FET2, OUTPUT);
pinMode(FET3, OUTPUT);
pinMode(led, OUTPUT);
digitalWrite(FET1, LOW);
digitalWrite(FET2, LOW);
digitalWrite(FET3, LOW);
randomSeed(A3);
Serial.begin(9600);
}
void loop() {
int aantal = 5;
for (int i = 0; i < 1; i++) {
looplicht();
}
for (int i = 0; i < 10; i++) {
randomVolgorde();
}
for (int i = 0; i < aantal; i++) {
zwaailicht();
}
for (int i = 0; i < aantal; i++) {
verticaal_cascaderen();
}
}
//void horizontaal_cascaderen() {
// int patroon = 0xFF;
// writeLeds(patroon, 0x00, 0x00, 20);
// writeLeds(0x00, patroon, 0x00, 20);
// writeLeds(0x00, 0x00, patroon, 20);
// writeLeds(0x00, patroon, 0x00, 20);
//}
void verticaal_cascaderen() {
static int vertraging = 10;
for (int i = 0; i < 3; i++) {
writeLeds(0b11100000, 0b11100000, 0b11100000, vertraging);
writeLeds(0b00011100, 0b00011100, 0b00011100, vertraging);
digitalWrite(led, HIGH);
digitalWrite(FET1, HIGH);
digitalWrite(FET2, HIGH);
digitalWrite(FET3, HIGH);
writeLeds(0b00000011, 0b00000011, 0b00000011, vertraging);
digitalWrite(led, LOW);
digitalWrite(FET1, LOW);
digitalWrite(FET2, LOW);
digitalWrite(FET3, LOW);
writeLeds(0b00011100, 0b00011100, 0b00011100, vertraging);
}
//linksRechts
for (int i = 0; i < 3; i++) {
digitalWrite(led, HIGH);
digitalWrite(FET1, HIGH);
digitalWrite(FET2, HIGH);
digitalWrite(FET3, HIGH);
writeLeds(0b00100100, 0b00100100, 0b00100100, vertraging);
digitalWrite(led, LOW);
digitalWrite(FET1, LOW);
digitalWrite(FET2, LOW);
digitalWrite(FET3, LOW);
writeLeds(0b01001001, 0b01001001, 0b01001001, vertraging);
writeLeds(0b10010010, 0b10010010, 0b10010010, vertraging);
writeLeds(0b01001001, 0b01001001, 0b01001001, vertraging);
}
}
void zwaailicht_midden() {
static int vertraging = 25;
int patroon = 0b00001000;
writeLeds(0b00101010, 0b00101010, 0b00101010, vertraging);
writeLeds(0b00011100, 0b00011100, 0b00011100, vertraging);
digitalWrite(led, HIGH);
digitalWrite(FET1, HIGH);
digitalWrite(FET2, HIGH);
digitalWrite(FET3, HIGH);
writeLeds(0b10001000, 0b10001000, 0b10001000, vertraging);
digitalWrite(led, LOW);
digitalWrite(FET1, LOW);
digitalWrite(FET2, LOW);
digitalWrite(FET3, LOW);
writeLeds(0b01001001, 0b01001001, 0b01001001, vertraging);
}
void zwaailicht() {
static int vertraging = 25;
writeLeds(0b00100010, 0b00100010, 0b00100010, vertraging);
writeLeds(0b00010100, 0b00010100, 0b00010100, vertraging);
digitalWrite(led, HIGH);
digitalWrite(FET1, HIGH);
digitalWrite(FET2, HIGH);
digitalWrite(FET3, HIGH);
writeLeds(0b10000000, 0b10000000, 0b10000000, vertraging);
digitalWrite(led, LOW);
digitalWrite(FET1, LOW);
digitalWrite(FET2, LOW);
digitalWrite(FET3, LOW);
writeLeds(0b01000001, 0b01000001, 0b01000001, vertraging);
}
void randomVolgorde() {
int vertraging = 25;
int laag = random(1, 7);
int patroon = 1 << random(0, 8);
switch (laag) {
case 1:
digitalWrite(led, LOW);
writeLeds(patroon, 0x00, 0x00, vertraging);
break;
case 2:
digitalWrite(led, LOW);
writeLeds(0x00, patroon, 0x00, vertraging);
break;
case 3:
digitalWrite(led, LOW);
writeLeds(0x00, 0x00, patroon, vertraging);
break;
case 4:
led_laag(1, 0, 0);
break;
case 5:
led_laag(0, 1, 0);
break;
case 6:
led_laag(0, 0, 1);
break;
}
}
void looplicht() {
static int patroon = 0;
int vertraging = 10;
// Looplicht horizontaal door alle lagen
for (int j = 0; j < 1; j++) {
for (int i = 0; i < 8; i++) {
patroon = 0b10000000 >> i;
digitalWrite(led, LOW);
writeLeds(patroon, 0x00, 0x00, vertraging);
Serial.println("laag 1");
}
led_laag(1, 0, 0);
for (int i = 0; i < 8; i++) {
patroon = 0b10000000 >> i;
digitalWrite(led, LOW);
writeLeds(0x00, patroon, 0x00, vertraging);
Serial.println("laag 2");
}
led_laag(0, 1, 0);
for (int i = 0; i < 8; i++) {
patroon = 0b10000000 >> i;
digitalWrite(led, LOW);
writeLeds(0x00, 0x00, patroon, vertraging);
Serial.println("laag 3");
}
led_laag(0, 0, 1);
}
for (int j = 0; j < 1; j++) {
// Van laag 3 naar laag 1
for (int i = 0; i < 8; i++) {
patroon = 0b00000001 << i;
digitalWrite(led, LOW);
writeLeds(0x00, 0x00, patroon, vertraging);
}
led_laag(0, 1, 0);
for (int i = 0; i < 8; i++) {
patroon = 0b00000001 << i;
digitalWrite(led, LOW);
writeLeds(0x00, patroon, 0x00, vertraging);
}
led_laag(1, 0, 0);
for (int i = 0; i < 8; i++) {
patroon = 0b00000001 << i;
digitalWrite(led, LOW);
writeLeds(patroon, 0x00, 0x00, vertraging);
}
}
}
void writeLeds(int laag1, int laag2, int laag3, int tijd) {
for (int i = 0; i < tijd; i++) {
DigitalShiftOut(laag1);
digitalWrite(FET1, HIGH);
delay(5);
digitalWrite(FET1, LOW);
DigitalShiftOut(laag2);
digitalWrite(FET2, HIGH);
delay(5);
digitalWrite(FET2, LOW);
DigitalShiftOut(laag3);
digitalWrite(FET3, HIGH);
delay(5);
digitalWrite(FET3, LOW);
}
}
void DigitalShiftOut(int data) {
for (int i = 0; i < 8; i++) {
int bitValue = (data >> i) & 1;
digitalWrite(dataPin, bitValue);
digitalWrite(clockPin, HIGH);
digitalWrite(clockPin, LOW);
}
digitalWrite(latchPin, HIGH);
delayMicroseconds(10);
digitalWrite(latchPin, LOW);
}
void led_laag(bool laag1, bool laag2, bool laag3) {
writeLeds(0x00, 0x00, 0x00, 1);
digitalWrite(led, HIGH);
digitalWrite(FET1, laag1 ? HIGH : LOW); // verkorte if-else
digitalWrite(FET2, laag2 ? HIGH : LOW);
digitalWrite(FET3, laag3 ? HIGH : LOW);
delay(vertraging_leds);
digitalWrite(led, LOW);
digitalWrite(FET1, LOW);
digitalWrite(FET2, LOW);
digitalWrite(FET3, LOW);
}