Platformio #2

Merged
ingo merged 4 commits from platformio into main 2024-08-17 13:08:36 +02:00
7 changed files with 224 additions and 13 deletions
Showing only changes of commit d55d2036ed - Show all commits

View file

@ -4,7 +4,7 @@
# Please make sure to read documentation with examples first # Please make sure to read documentation with examples first
# http://docs.platformio.org/en/stable/projectconf.html # http://docs.platformio.org/en/stable/projectconf.html
# #
[env:nanoatmega168] [env:nanoatmega328]
platform = atmelavr platform = atmelavr
framework = arduino framework = arduino
board = nanoatmega168 board = nanoatmega328

View file

@ -7,8 +7,8 @@
CubeRegister myRegister = CubeRegister(); CubeRegister myRegister = CubeRegister();
#define CUBESIZE 5 #define CUBESIZE 5
#define FPS 60 #define FPS 50
#define LEDLEVEL 8 #define LEDLEVEL 16
byte cube[CUBESIZE][CUBESIZE][CUBESIZE]; 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) { void cube_rotate_cover(int steps, unsigned int frame_delay = 100) {
byte x = 0; byte x = 0;
byte y = 0; byte y = 0;

View file

@ -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 #endif

BIN
src/src/CubeEffects.h.gch Normal file

Binary file not shown.

BIN
src/src/CubeRegister.h.gch Normal file

Binary file not shown.

View file

@ -115,7 +115,7 @@ void cube_text_warp(const char *message) {
for (size_t mp = 0; mp < strlen(message); mp++) { for (size_t mp = 0; mp < strlen(message); mp++) {
int s = CUBESIZE - 1; int s = CUBESIZE - 1;
for (int i = 0; i < (CUBESIZE + LEDLEVEL); i++) { for (int i = 0; i < (CUBESIZE + LEDLEVEL); i++) {
dimm_cube(LEDLEVEL / -2); dimm_cube(LEDLEVEL / -4);
write_char(message[mp], max(s, 0), LEDLEVEL); write_char(message[mp], max(s, 0), LEDLEVEL);
s--; s--;
delay(50); delay(50);

View file

@ -5,37 +5,45 @@
#include "CubeTextEffects.h" #include "CubeTextEffects.h"
void setup() { void setup() {
Serial.begin(115200); // Serial.begin(115200);
init_cube(); init_cube();
cube_startup(); randomSeed(analogRead(A0) + analogRead(A1) + analogRead(A2));
// cube_startup();
} }
// const char* messages = {"I°U", "mama ist die allerbeste!°!°", "benjamin", // const char* messages = {"I°U", "mama ist die allerbeste!°!°", "benjamin",
// "annika", "5x5x5 led-cube"}; // "annika", "5x5x5 led-cube"};
static const char *const messages[] = {"I°U", "mama ist die allerbeste!°!°", //static const char *const messages[] = {"I°U", "mama ist die allerbeste!°!°",
"benjamin", "annika", "5x5x5 led-cube"}; // "benjamin", "annika", "5x5x5 led-cube"};
static const char *const messages[] = {"silvester", "2017>2018", "2018",
"ohh, ahh", "led-cube"};
int message_count = 5; int message_count = 5;
void loop() { void loop() {
// int next_duration = random(10, 20); // int next_duration = random(10, 20);
switch (random(0, 10)) { //switch (9) {
switch (random(20)) {
case 0: case 0:
cube_effect_glow(); cube_effect_glow();
break; break;
case 1: case 1:
cube_effect_glitzer(); cube_effect_glitzer_fade();
break; break;
case 2: case 2:
cube_effect_glitzer_levels(); cube_effect_glitzer_levels();
break; break;
case 3: case 3:
cube_effect_glitzer_fade(); cube_effect_glitzer();
break; break;
case 4: case 4:
cube_effect_dots(); cube_effect_dots();
break; break;
case 5: case 5:
cube_startup(); //cube_startup();
cube_effect_glitzer_levels();
break; break;
case 6: case 6:
cube_text_banner(messages[random(message_count)]); cube_text_banner(messages[random(message_count)]);
@ -43,6 +51,13 @@ void loop() {
case 7: case 7:
cube_text_warp(messages[random(message_count)]); cube_text_warp(messages[random(message_count)]);
break; break;
case 8:
cube_life();
break;
case 9:
// Serial.println("cube_moving_dots");
cube_moving_dots();
break;
/* /*
case 8: case 8:
if (random(10) > 5) if (random(10) > 5)