#1 Re: Програмування Arduino » Led Cub 4*4*4 » 2025-01-09 20:05:30

Добрий вечір! Другий день намагаюсь написати повідомлення і не виходить. Пишу через "Цитувати", едине що то це додаю посилання на файл. Якщо зайти у "Цитувати" або "Відповісти", то там вже два моїх повідомлення, а у темі їх немає. Чому так?

#2 Re: Програмування Arduino » Led Cub 4*4*4 » 2025-01-09 19:41:33

dimich пише:
Filaka пише:

Чи можете Ви допомогти та зробити приклад?

Оголошуєм константу з розміром масиву та сам масив:

const size_t N = 16;
uint8_t cols[N];

Набираєм ентропію для генерації випадкових чисел. Достатньо один раз на початку, десь в setup():

unsigned long seed = 0;
for (size_t i = 0; i < sizeof(seed)*8; i++) {
    seed <<= 1;
    seed |= analogRead(10) & 1;
}
randomSeed(seed ? seed : 1);

Заповнюємо масив послідовними значеннями:

for (size_t i = 0; i < N; i++) {
    cols[i] = i;
}

і перемішуємо:

for (size_t i = 0; i < N-1; i++) {
    size_t j = random(i, N);
    auto tmp = cols[i];
    cols[i] = cols[j];
    cols[j] = tmp;
}

Далі можете послідовно вибирати значення з масиву і робити з ними, що вам там потрібно. Наприклад, вивод в послідовний порт:

Serial.println();
for (auto i : cols) {
    Serial.print("X: ");
    Serial.print(i % 4);
    Serial.print(", Y: ");
    Serial.print(i / 4);
    Serial.println();
}

Якщо потрібна ще одна випадкова перестановка, можна не заповнювати послідовними значеннями заново, а лише перемішати існуючу.

Дуже дякую за допомогу та пояснення! Але мені ще поки що складно було розібратись в коді та синтаксису smile Інтернет моцна штука, допоміг! Спробував виводити у Монітор Порта Arduino, щоб зрозуміти що тут відбувається. Але поки що не зрозумів як це все реалізувати у своєму проєкт Куба. Та поєднати з :

 digitalWrite (column[i] , 1);
 digitalWrite (layer[j] , 0);

Можливо я не так пояснив свій задум, ось посилання на приклад. Куб повинен повністю заповнитись.
drive.google.com/file/d/1bFwaPjvazLKD6y … drive_link

#3 Re: Програмування Arduino » Led Cub 4*4*4 » 2025-01-07 22:26:31

dimich пише:
Filaka пише:

Чи можете Ви допомогти та зробити приклад?

Оголошуєм константу з розміром масиву та сам масив:

const size_t N = 16;
uint8_t cols[N];

Набираєм ентропію для генерації випадкових чисел. Достатньо один раз на початку, десь в setup():

unsigned long seed = 0;
for (size_t i = 0; i < sizeof(seed)*8; i++) {
    seed <<= 1;
    seed |= analogRead(10) & 1;
}
randomSeed(seed ? seed : 1);

Заповнюємо масив послідовними значеннями:

for (size_t i = 0; i < N; i++) {
    cols[i] = i;
}

і перемішуємо:

for (size_t i = 0; i < N-1; i++) {
    size_t j = random(i, N);
    auto tmp = cols[i];
    cols[i] = cols[j];
    cols[j] = tmp;
}

Далі можете послідовно вибирати значення з масиву і робити з ними, що вам там потрібно. Наприклад, вивод в послідовний порт:

Serial.println();
for (auto i : cols) {
    Serial.print("X: ");
    Serial.print(i % 4);
    Serial.print(", Y: ");
    Serial.print(i / 4);
    Serial.println();
}

Якщо потрібна ще одна випадкова перестановка, можна не заповнювати послідовними значеннями заново, а лише перемішати існуючу.

Дуже дякую за допомогу та пояснення! Але мені ще поки що складно було розібратись в коді та синтаксису smile Інтернет моцна штука, допоміг! Спробував виводити у Монітор Порта Arduino, щоб зрозуміти що тут відбувається. Але поки що не зрозумів як це все реалізувати у своєму проєкт Куба. Та поєднати з :

 digitalWrite (column[i] , 1);
 digitalWrite (layer[j] , 0);

Можливо я не так пояснив свій задум, ось посилання на приклад. Куб повинен повністю заповнитись.
https://drive.google.com/file/d/1bFwaPj … drive_link

#4 Re: Програмування Arduino » Led Cub 4*4*4 » 2025-01-02 12:55:39

Honey пише:

Зробіь масив int random_index[16]; спочатку заповніть його числами від 0 до 15, а потім їх перетасуйте (google: shuffle), з масиву послідовно берете індекс і заповнюєте цей стовпчик

Дякую! Але моїх знань ще замало щоб це все зрозуміти та зробити) Чи можете Ви допомогти та зробити приклад? Дуже вдячний за допомогу та розуміння

#5 Re: Програмування Arduino » Led Cub 4*4*4 » 2025-01-01 21:54:22

Filaka пише:
Honey пише:

Вилазите за межі масива
i=4 замінити на i=3
i<=4 замінити на i<4

Дякую! Працює )))

Підкажіть будь ласка ще, як реалізувати поступове заповнення всього куба по одному стовпчику. Так як в прикладах вище, але щоб поступово рандомно кожен стовпчик заповнився з верху до низу і так у весь куб

#6 Re: Програмування Arduino » Led Cub 4*4*4 » 2025-01-01 18:56:11

Honey пише:

Вилазите за межі масива
i=4 замінити на i=3
i<=4 замінити на i<4

Дякую! Працює )))

#7 Програмування Arduino » Led Cub 4*4*4 » 2025-01-01 17:58:25

Filaka
відповідей: 15

Всім доброго дня та з Новим Роком! Допоможіть розібратись з кодом. Зробили з сином Led Cub 4*4*4. Куб працює, все добре. Програму взяли з GitHub, також все працює добре. Але хочемо створювати свої ефекти. По маленьку щось виходить, разом вчимо програмування ))). Стикнулись з таким. Два ефекти. Один (randomRain_v2) - рандомне заповнення одного стовпчика з низу до верху, Другий (randomRain_v3) навпаки - рандомне заповнення одного стовпчика з верху до низу. У першому випадку все добре, у другому сам ефект працюе, але чомусь спрацьовує ще один стовпчик. Буду дуже вдячний за допомогу та роз'яснення.

 #include <avr/wdt.h>

//initializing and declaring led rows
  int column[16]={13,12,11,10,9,8,7,6,5,4,3,2,1,0,A5,A4};
//initializing and declaring led layers
  int layer[4]={A3,A2,A1,A0};


void setup() {
   //настройка колонок для вывода
  for(int i = 0; i<16; i++)
  {
    pinMode(column[i], OUTPUT);
  }
  //настройка слоев для вывода
  for(int i = 0; i<4; i++)
  {
    pinMode(layer[i], OUTPUT);
  }
  //seeding random for random pattern
  randomSeed(analogRead(10));
}
void loop() {

//randomRain_v2();
randomRain_v3();
//onCube();
//reboot();
}

void reboot() {  // перезагрузка платы
  wdt_disable();
  wdt_enable(WDTO_1S);
  while (1) {}
};
void offCube() {  // выключение куба
  for (int i = 0; i < 16; i++) {
    for (int j = 0; j < 4; j++) {
      digitalWrite (column[i] , 1);
      digitalWrite (layer[j] , 0);
    }
  }
}
void onCube() {  // включение куба
  for (int i = 0; i < 16; i++) {
    for (int j = 0; j < 4; j++) {
      digitalWrite (column[i] , 0);
      digitalWrite (layer[j] , 1);
    }
  }
}


void randomRain_v2(){
  offCube();
  for(int i = 0; i!=60; i+=2)
  {
    int randomColumn = random(0,16);
    digitalWrite(column[randomColumn], 0);
    for(int i = 4; i >= 0; i--) {
    digitalWrite(layer[i], 1);
    delay(50);
    }
    delay(300);
    for(int j = 0; j <= 4; j++) {
     digitalWrite(layer[j], 0);
     delay(300);
    }    
    digitalWrite(column[randomColumn], 1);  
  }
}
void randomRain_v3(){
  offCube();
  for(int i = 0; i!=60; i+=2)
  {
    int randomColumn = random(0,16);
    digitalWrite(column[randomColumn], 0);
    for(int i = 0; i <= 4; i++) {
    digitalWrite(layer[i], 1);
    delay(100);
    }
    delay(300);
    for(int i = 4; i >= 0; i--) {
     digitalWrite(layer[i], 0);
     delay(100);
    }
    digitalWrite(column[randomColumn], 1);
    
  }
} 

Підвал форуму