From d55d2036ed7b5fff8558af81b71b36e79a31e1be Mon Sep 17 00:00:00 2001 From: Ingo Rohlf Date: Sat, 17 Aug 2024 12:58:45 +0200 Subject: [PATCH] Arduino 368, mehr Effekte, mehr Helligkeitsstufen --- src/platformio.ini | 4 +- src/src/CubeBase.h | 44 ++++++++++- src/src/CubeEffects.h | 156 +++++++++++++++++++++++++++++++++++++ src/src/CubeEffects.h.gch | Bin 0 -> 9475 bytes src/src/CubeRegister.h.gch | Bin 0 -> 9475 bytes src/src/CubeTextEffects.h | 2 +- src/src/LedCube555_V3.ino | 31 ++++++-- 7 files changed, 224 insertions(+), 13 deletions(-) create mode 100644 src/src/CubeEffects.h.gch create mode 100644 src/src/CubeRegister.h.gch diff --git a/src/platformio.ini b/src/platformio.ini index 4b88ea8..580f312 100644 --- a/src/platformio.ini +++ b/src/platformio.ini @@ -4,7 +4,7 @@ # Please make sure to read documentation with examples first # http://docs.platformio.org/en/stable/projectconf.html # -[env:nanoatmega168] +[env:nanoatmega328] platform = atmelavr framework = arduino -board = nanoatmega168 +board = nanoatmega328 diff --git a/src/src/CubeBase.h b/src/src/CubeBase.h index 5b8842d..407f032 100644 --- a/src/src/CubeBase.h +++ b/src/src/CubeBase.h @@ -7,8 +7,8 @@ CubeRegister myRegister = CubeRegister(); #define CUBESIZE 5 -#define FPS 60 -#define LEDLEVEL 8 +#define FPS 50 +#define LEDLEVEL 16 byte cube[CUBESIZE][CUBESIZE][CUBESIZE]; @@ -54,6 +54,46 @@ void dimm_cube(int diff = -1) { } } +void cube_move_x(int diff) { + diff = constrain(diff, -CUBESIZE, CUBESIZE); + byte from; + for (byte v = 0; v < CUBESIZE; v++) { + from = (v + diff) % CUBESIZE; + for (byte a = 0; a < CUBESIZE; a++) { + for (byte b = 0; b < CUBESIZE; b++) { + cube[v][a][b] = cube[from][a][b]; + } + } + } +} +void cube_move_y(int diff) { + diff = constrain(diff, -CUBESIZE, CUBESIZE); + byte from; + for (byte v = 0; v < CUBESIZE; v++) { + from = (v + diff) % CUBESIZE; + for (byte a = 0; a < CUBESIZE; a++) { + for (byte b = 0; b < CUBESIZE; b++) { + cube[a][v][b] = cube[a][from][b]; + } + } + } +} + + +void cube_move_z(int diff) { + diff = constrain(diff, -CUBESIZE, CUBESIZE); + byte from; + for (byte v = 0; v < CUBESIZE; v++) { + from = (v + diff) % CUBESIZE; + for (byte a = 0; a < CUBESIZE; a++) { + for (byte b = 0; b < CUBESIZE; b++) { + cube[a][b][v] = cube[a][b][from]; + } + } + } +} + + void cube_rotate_cover(int steps, unsigned int frame_delay = 100) { byte x = 0; byte y = 0; diff --git a/src/src/CubeEffects.h b/src/src/CubeEffects.h index 7b67b75..5536c48 100644 --- a/src/src/CubeEffects.h +++ b/src/src/CubeEffects.h @@ -177,5 +177,161 @@ void cube_effect_dots(int duration = 0) { } } }; +void cube_life(int duration = 0) { + int speed = 50; + int value; + int min = LEDLEVEL * 2; + int max = LEDLEVEL * 4; + + if (duration <= 0) + duration = random(MIN_DURATION, MAX_DURATION); + + // mit zufallsmuster füllen + fill_cube(0); + + for (byte x = 0; x < CUBESIZE; x++) { + for (byte y = 0; y < CUBESIZE; y++) { + for (byte z = 0; z < CUBESIZE; z++) { + if (random(100) >= 50) { + cube[x][y][z] = random(LEDLEVEL + 1); + } + } + } + } + effect_ende = millis() + duration * 1000; + + while (millis() < effect_ende) { + + for (byte x = 0; x < CUBESIZE; x++) { + for (byte y = 0; y < CUBESIZE; y++) { + for (byte z = 0; z < CUBESIZE; z++) { + value = 0; + value += cube[(x - 1) % CUBESIZE][y][z]; + value += cube[(x + 1) % CUBESIZE][y][z]; + value += cube[x][(y - 1) % CUBESIZE][z]; + value += cube[x][(y + 1) % CUBESIZE][z]; + value += cube[x][y][(z - 1) % CUBESIZE]; + value += cube[x][y][(z + 1) % CUBESIZE]; + if ((value < min) || (value >= max)) { + if (cube[x][y][z] > 0) { + cube[x][y][z]--; + }; + + } else { + if (cube[x][y][z] < LEDLEVEL) { + cube[x][y][z]++; + }; + } + } + } + } + + delay(speed); + } +} + +struct Dot { + byte x; + byte y; + byte z; + int vx; + int vy; + int vz; + byte value; +}; + +void cube_moving_dots(int duration = 0) { + int speed = 100; + int dotcount = 2; + Dot dots[dotcount]; + //Dot dot; + for (byte d = 0; d < dotcount; d++) { + dots[d].x = random(CUBESIZE) * 10; + dots[d].y = random(CUBESIZE) * 10; + dots[d].z = random(CUBESIZE) * 10; + dots[d].vx = random(20) - 10; + dots[d].vy = random(20) - 10; + dots[d].vz = random(20) - 10; + dots[d].value = random(LEDLEVEL / 2, LEDLEVEL); + } + // Serial.println("cube: moving "+String(dotcount)+" dots"); + if (duration <= 0) + duration = random(MIN_DURATION, MAX_DURATION); + effect_ende = millis() + duration * 1000; + + // mit zufallsmuster füllen + fill_cube(0); + while (millis() < effect_ende) { + // dimm_cube(LEDLEVEL/-4); + // fill_cube(0); + for (byte d = 0; d < dotcount; d++) { + + cube[dots[d].x / 10][dots[d].y / 10][dots[d].z / 10] = 0; + + if (((dots[d].x + dots[d].vx) <= 0) || + ((dots[d].x + dots[d].vx) >= CUBESIZE * 10)) + dots[d].vx = -dots[d].vx; + if (((dots[d].y + dots[d].vy) <= 0) || + ((dots[d].y + dots[d].vy) >= CUBESIZE * 10)) + dots[d].vy = -dots[d].vy; + if (((dots[d].z + dots[d].vz) <= 0) || + ((dots[d].z + dots[d].vz) >= CUBESIZE * 10)) + dots[d].vz = -dots[d].vz; + + dots[d].x = (dots[d].x + dots[d].vx); + dots[d].y = (dots[d].y + dots[d].vy); + dots[d].z = (dots[d].z + dots[d].vz); + + // Serial.println("Dot + // ["+String(dot.x)+"]["+String(dot.y)+"]["+String(dot.z)+"] / + // ["+String((int)dot.vx)+"]["+String((int)dot.vy)+"]["+String((int)dot.vz)+"] + // = "+String(dot.value)); + cube[dots[d].x / 10][dots[d].y / 10][dots[d].z / 10] = dots[d].value; + } + + delay(speed); + } +} + +void cube_shifting_layer(int duration = 0) { + int speed = 50; + int value,x,y; + fill_cube(0); + for (x = 0; x < CUBESIZE; x++) { + for (y = 0; y < CUBESIZE; y++) { + cube[x][y][0] = LEDLEVEL; + } + } + + if (duration <= 0) + duration = random(MIN_DURATION, MAX_DURATION); + effect_ende = millis() + duration * 1000; + + while (millis() < effect_ende) { + value = random(4); + + switch (value) { + case 0: + cube_move_x(1); + break; + case 1: + cube_move_x(-1); + break; + case 2: + cube_move_y(1); + break; + case 3: + cube_move_y(-1); + break; + case 4: + cube_move_z(1); + break; + case 5: + cube_move_z(-1); + break; + } + delay(speed); + } +} #endif diff --git a/src/src/CubeEffects.h.gch b/src/src/CubeEffects.h.gch new file mode 100644 index 0000000000000000000000000000000000000000..e4bf2984d99e2ab98701cf72f988de8b79277b4f GIT binary patch literal 9475 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 SA%dpWn3h}K-by_~cmD?}9iLAC literal 0 HcmV?d00001 diff --git a/src/src/CubeRegister.h.gch b/src/src/CubeRegister.h.gch new file mode 100644 index 0000000000000000000000000000000000000000..e4bf2984d99e2ab98701cf72f988de8b79277b4f GIT binary patch literal 9475 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 SA%dpWn3h}K-by_~cmD?}9iLAC literal 0 HcmV?d00001 diff --git a/src/src/CubeTextEffects.h b/src/src/CubeTextEffects.h index f817773..99f2b58 100644 --- a/src/src/CubeTextEffects.h +++ b/src/src/CubeTextEffects.h @@ -115,7 +115,7 @@ void cube_text_warp(const char *message) { for (size_t mp = 0; mp < strlen(message); mp++) { int s = CUBESIZE - 1; for (int i = 0; i < (CUBESIZE + LEDLEVEL); i++) { - dimm_cube(LEDLEVEL / -2); + dimm_cube(LEDLEVEL / -4); write_char(message[mp], max(s, 0), LEDLEVEL); s--; delay(50); diff --git a/src/src/LedCube555_V3.ino b/src/src/LedCube555_V3.ino index c20dcaa..48f376e 100644 --- a/src/src/LedCube555_V3.ino +++ b/src/src/LedCube555_V3.ino @@ -5,37 +5,45 @@ #include "CubeTextEffects.h" void setup() { - Serial.begin(115200); +// Serial.begin(115200); init_cube(); - cube_startup(); + randomSeed(analogRead(A0) + analogRead(A1) + analogRead(A2)); +// cube_startup(); } // const char* messages = {"I°U", "mama ist die allerbeste!°!°", "benjamin", // "annika", "5x5x5 led-cube"}; -static const char *const messages[] = {"I°U", "mama ist die allerbeste!°!°", - "benjamin", "annika", "5x5x5 led-cube"}; +//static const char *const messages[] = {"I°U", "mama ist die allerbeste!°!°", +// "benjamin", "annika", "5x5x5 led-cube"}; +static const char *const messages[] = {"silvester", "2017>2018", "2018", + "ohh, ahh", "led-cube"}; + int message_count = 5; void loop() { + + // int next_duration = random(10, 20); - switch (random(0, 10)) { + //switch (9) { + switch (random(20)) { case 0: cube_effect_glow(); break; case 1: - cube_effect_glitzer(); + cube_effect_glitzer_fade(); break; case 2: cube_effect_glitzer_levels(); break; case 3: - cube_effect_glitzer_fade(); + cube_effect_glitzer(); break; case 4: cube_effect_dots(); break; case 5: - cube_startup(); + //cube_startup(); + cube_effect_glitzer_levels(); break; case 6: cube_text_banner(messages[random(message_count)]); @@ -43,6 +51,13 @@ void loop() { case 7: cube_text_warp(messages[random(message_count)]); break; + case 8: + cube_life(); + break; + case 9: + // Serial.println("cube_moving_dots"); + cube_moving_dots(); + break; /* case 8: if (random(10) > 5)