Мини матрица 16х16 ws2812b

Вот, решил посмотреть генератор узоров на ней. В этой версии вместо математики просто массив-переходник, если вдруг придумается геометрия не поддающаяся формулам :slight_smile:
Забивать данные конечно тяжко, можно ошибиться. Пришлось рисовать цветную шпаргалку:


ролик демонстрационный

Спойлер
/////////////////////////////////////
// примеры для ws2812b
//Arduino UNO

#include "Adafruit_NeoPixel.h"

#define line_ 256 //число пикселей в ленте
uint8_t dataPin = 6;// вывод для подключения
Adafruit_NeoPixel strip = Adafruit_NeoPixel(line_,dataPin , NEO_GRB + NEO_KHZ800);// Создаем переменную strip для управления нашей лентой.

byte M=2;//мощность свечения

                         //1   2   3  4   5   6    7   8   9  10  11 12  13  14 15 16  
byte massiv_per[16][16]={{207,199,71, 79, 251,243,115,123,184,176,48,56,140,132, 4,12},//1
                         {223,215,87, 95, 250,242,114,122,168,160,32,40,141,133, 5,13},//2
                         {206,198,70, 78, 235,227,99, 107,185,177,49,57,156,148,20,28},//3
                         {205,197,69, 77, 219,211,83, 91, 186,178,50,58,172,164,36,44},//4
                         {222,214,86, 94, 234,226,98, 106,169,161,33,41,157,149,21,29},//5
                         {239,231,103,111,249,241,113,121,152,144,16,24,142,134, 6,14},//6
                         {255,248,119,127,247,240,112,120,136,128, 0, 8,143,135, 7,15},//7
                         {238,230,102,110,233,225,97, 105,153,145,17,25,158,150,22,30},//8
                         {221,213,85, 93, 218,210,82, 90, 170,162,34,42,173,165,37,45},//9
                         {204,196,68, 76, 203,195,67, 75, 187,179,51,59,188,180,52,60},//10
                         {220,212,84, 92, 202,194,66, 74, 171,163,35,43,189,181,53,61},//11
                         {237,229,101,109,217,209,81, 89, 154,146,18,26,174,166,38,46},//12
                         {254,246,118,126,232,224,96, 104,137,129, 1, 9,159,151,23,31},//13
                         {253,245,117,125,216,208,80, 88, 138,130, 2,10,175,167,39,47},//14
                         {236,228,100,108,201,193,65, 73, 155,147,19,27,190,182,54,62},//15
                         {252,244,116,124,200,192,64, 72, 139,131, 3,11,191,183,55,63},//16
};
byte massiv_kolzo[16]={2,2,2,2,0,0,0,0,6,6,5,6,0,0,0,0};// начальный набор цветов                      
///RGB
void setup() {
 strip.begin();
 
 }
void loop() {
for(int i=0;i<16;i++){  
gruppa(i,massiv_kolzo[i]);  
}
strip.show();
delay(200);//быстрота смены узора
kolzo();
if(millis()%5==0){massiv_kolzo[0]=random(0,8);}
if(millis()%5==1){massiv_kolzo[0]=0;}
}
/////////////////////////////////////
void gruppa(byte n,byte cv){
for(int in=0;in<16;in++){
strip.setPixelColor(massiv_per[n][in],(cv%2)*M,((cv/2)%2)*M ,((cv/4)%2)*M );    
}
//strip.show();
}
/////////////////////////////////////
void kolzo(){
 byte V=0; 
for(int in=0;in<16;in++){
 if(in!=0&&in!=15){massiv_kolzo[in]=massiv_kolzo[in+1];}
 if(in==0){V=massiv_kolzo[in];massiv_kolzo[0]=massiv_kolzo[1];}
 if(in==15){massiv_kolzo[in]=V;}   
}
}
/////////////////////////////////////


Думаю приделать прямо на корпус ПК, для релакса и чтоб под рукой было для макетирования.
…Нашёл маленькую нано с тремя умными пикселями на плате. Как раз приклеить сзади матрицы.

4 лайка

Приклейте туда ESP8266. А в промежутках между экспериментами заливайте лампу гайвера “для релакса” :slightly_smiling_face:

блин лилик, я с уважением отношусь ко всему что вы делаете, но код ваш читать не возможно((
неужели отформатированный код, вам самому не легче воспринимать?

Спойлер
/////////////////////////////////////
// примеры для ws2812b
//Arduino UNO

#include "Adafruit_NeoPixel.h"

#define line_ 256 //число пикселей в ленте
uint8_t dataPin = 6;// вывод для подключения
Adafruit_NeoPixel strip = Adafruit_NeoPixel(line_, dataPin, NEO_GRB + NEO_KHZ800);// Создаем переменную strip для управления нашей лентой.

byte M = 2; //мощность свечения

//1   2   3  4   5   6    7   8   9  10  11 12  13  14 15 16
byte massiv_per[16][16] = {{207, 199, 71, 79, 251, 243, 115, 123, 184, 176, 48, 56, 140, 132, 4, 12}, //1
  {223, 215, 87, 95, 250, 242, 114, 122, 168, 160, 32, 40, 141, 133, 5, 13}, //2
  {206, 198, 70, 78, 235, 227, 99, 107, 185, 177, 49, 57, 156, 148, 20, 28}, //3
  {205, 197, 69, 77, 219, 211, 83, 91, 186, 178, 50, 58, 172, 164, 36, 44}, //4
  {222, 214, 86, 94, 234, 226, 98, 106, 169, 161, 33, 41, 157, 149, 21, 29}, //5
  {239, 231, 103, 111, 249, 241, 113, 121, 152, 144, 16, 24, 142, 134, 6, 14}, //6
  {255, 248, 119, 127, 247, 240, 112, 120, 136, 128, 0, 8, 143, 135, 7, 15}, //7
  {238, 230, 102, 110, 233, 225, 97, 105, 153, 145, 17, 25, 158, 150, 22, 30}, //8
  {221, 213, 85, 93, 218, 210, 82, 90, 170, 162, 34, 42, 173, 165, 37, 45}, //9
  {204, 196, 68, 76, 203, 195, 67, 75, 187, 179, 51, 59, 188, 180, 52, 60}, //10
  {220, 212, 84, 92, 202, 194, 66, 74, 171, 163, 35, 43, 189, 181, 53, 61}, //11
  {237, 229, 101, 109, 217, 209, 81, 89, 154, 146, 18, 26, 174, 166, 38, 46}, //12
  {254, 246, 118, 126, 232, 224, 96, 104, 137, 129, 1, 9, 159, 151, 23, 31}, //13
  {253, 245, 117, 125, 216, 208, 80, 88, 138, 130, 2, 10, 175, 167, 39, 47}, //14
  {236, 228, 100, 108, 201, 193, 65, 73, 155, 147, 19, 27, 190, 182, 54, 62}, //15
  {252, 244, 116, 124, 200, 192, 64, 72, 139, 131, 3, 11, 191, 183, 55, 63}, //16
};
byte massiv_kolzo[16] = {2, 2, 2, 2, 0, 0, 0, 0, 6, 6, 5, 6, 0, 0, 0, 0}; // начальный набор цветов
///RGB
void setup() {
  strip.begin();

}
void loop() {
  for (int i = 0; i < 16; i++) {
    gruppa(i, massiv_kolzo[i]);
  }
  strip.show();
  delay(200);//быстрота смены узора
  kolzo();
  if (millis() % 5 == 0) {
    massiv_kolzo[0] = random(0, 8);
  }
  if (millis() % 5 == 1) {
    massiv_kolzo[0] = 0;
  }
}
/////////////////////////////////////
void gruppa(byte n, byte cv) {
  for (int in = 0; in < 16; in++) {
    strip.setPixelColor(massiv_per[n][in], (cv % 2)*M, ((cv / 2) % 2)*M, ((cv / 4) % 2)*M );
  }
  //strip.show();
}
/////////////////////////////////////
void kolzo() {
  byte V = 0;
  for (int in = 0; in < 16; in++) {
    if (in != 0 && in != 15) {
      massiv_kolzo[in] = massiv_kolzo[in + 1];
    }
    if (in == 0) {
      V = massiv_kolzo[in];
      massiv_kolzo[0] = massiv_kolzo[1];
    }
    if (in == 15) {
      massiv_kolzo[in] = V;
    }
  }
}
/////////////////////////////////////
1 лайк

Он другой. Не очень легче :slight_smile:

Тут тонкий момент. Каждому своеобразному световому эффекту желательна своя степень размытости рассеивателя. Проще говоря надо рассеиватель с регулируемой дистанцией до пикселя. Узоры это одно, имитация огня совсем другое, эффекты Гайвера третье, а городить рассеиватель универсальный не хочется.

Пхе. Узоры и символы - без рассеивателя, эффекты с рассеивателем и капитальным(что бы пикселей гарантированно не видеть). У меня идеальный рассеиватель получился из полностью прозрачного стекла, но с хитрым рельефом по обеим сторонам.
Вот. Там и в старой версии было огней штук шесть видов, а сейчас и не знаю.

Ну так выложите тут картинки энтих гайверовских узоров-огней. Без рассеивателя узоры вообще в голове не узорятся… у меня :slight_smile:

Очень старая версия. Огонь один, но есть свеча!

Кстати, может вам wled попробовать? Частенько в отзывах на большие матрицы(на окно типа) народ перешивает и радуется :slightly_smiling_face:

Нет у меня ютюба никакими ухищрениями.

Я пробовал немецких авторов “гладиатор” и ещё подобную программу для управления с ПК. Интересно применять как шоу, на Новый год, например. А так нет.

Значицца нас уже трое :grinning_face: Мы тут как-то просили не выкладывать ссылок на ютюб, так нам в панамку напихали и обозвали жёлтым земляным червяком криворукими.
У меня нет “гайверовского” огня, да и статика не даст впечатлений, вот и нашёл авторское видео.

1 лайк

вот как надо писать)))

#include <Adafruit_NeoPixel.h>
#define LED_PIN 6
#define LED_COUNT 64  // 8x8 matrix

Adafruit_NeoPixel matrix(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);

// Определение цветов (можно добавлять свои)
uint32_t colors[] = {
  matrix.Color(80, 80, 80),    // 0 - серый (фон)
  matrix.Color(150, 0, 150),   // 1 - фиолетовый
  matrix.Color(0, 0, 0),       // 2 - черный
  matrix.Color(0, 255, 0),     // 3 - зеленый
  matrix.Color(255, 0, 0),     // 4 - красный
  matrix.Color(0, 0, 255),     // 5 - синий
  matrix.Color(255, 255, 0),   // 6 - желтый
  matrix.Color(0, 255, 255),   // 7 - циановый
  matrix.Color(255, 0, 255),   // 8 - магента
  matrix.Color(255, 165, 0),   // 9 - оранжевый
  matrix.Color(128, 0, 128),   // 10 - пурпурный
  matrix.Color(255, 192, 203),  // 11 - розовый
  matrix.Color(128, 128, 0),   // 12 - оливковый
  matrix.Color(128, 128, 128),  // 13 - серый (темный)
  matrix.Color(192, 192, 192)   // 14 - светло-серый
};

// Массив анимационных кадров, где:
// 0-серый, 1-фиолетовый, 2-черный, 3-зеленый и т.д.
const byte animation[][64] = {
// Кадр 1
{0,0,0,1,1,0,0,0,
 0,1,0,0,0,1,0,0,
 1,0,0,2,0,0,1,0,
 1,0,2,2,2,0,1,0,
 1,0,0,2,0,0,1,0,
 0,1,0,0,0,1,0,0,
 0,0,1,1,1,0,0,0,
 0,0,0,0,0,0,0,0},
// Кадр 2
{0,0,1,0,1,0,0,0,
 0,1,0,0,0,1,0,0,
 1,0,0,2,0,0,1,0,
 1,0,2,2,2,0,1,0,
 1,0,0,2,0,0,1,0,
 0,1,0,0,0,1,0,0,
 0,0,1,1,1,0,0,0,
 0,0,0,0,0,0,0,0},
 // Кадр 3
{0,0,1,1,0,0,0,0,
 0,1,0,0,0,1,0,0,
 1,0,0,2,0,0,1,0,
 1,0,2,2,2,0,1,0,
 1,0,0,2,0,0,1,0,
 0,1,0,0,0,1,0,0,
 0,0,1,1,1,0,0,0,
 0,0,0,0,0,0,0,0},
 // Кадр 4
{0,0,1,1,1,0,0,0,
 0,1,0,0,0,0,0,0,
 1,0,0,2,0,0,1,0,
 1,0,2,2,2,0,1,0,
 1,0,0,2,0,0,1,0,
 0,1,0,0,0,1,0,0,
 0,0,1,1,1,0,0,0,
 0,0,0,0,0,0,0,0},
 // Кадр 5
{0,0,1,1,1,0,0,0,
 0,1,0,0,0,1,0,0,
 1,0,0,2,0,0,0,0,
 1,0,2,2,2,0,1,0,
 1,0,0,2,0,0,1,0,
 0,1,0,0,0,1,0,0,
 0,0,1,1,1,0,0,0,
 0,0,0,0,0,0,0,0},
 // Кадр 6
{0,0,1,1,1,0,0,0,
 0,1,0,0,0,1,0,0,
 1,0,0,2,0,0,1,0,
 1,0,2,2,2,0,0,0,
 1,0,0,2,0,0,1,0,
 0,1,0,0,0,1,0,0,
 0,0,1,1,1,0,0,0,
 0,0,0,0,0,0,0,0},
 // Кадр 7
{0,0,1,1,1,0,0,0,
 0,1,0,0,0,1,0,0,
 1,0,0,2,0,0,1,0,
 1,0,2,2,2,0,1,0,
 1,0,0,2,0,0,0,0,
 0,1,0,0,0,1,0,0,
 0,0,1,1,1,0,0,0,
 0,0,0,0,0,0,0,0},
 // Кадр 8
{0,0,1,1,1,0,0,0,
 0,1,0,0,0,1,0,0,
 1,0,0,2,0,0,1,0,
 1,0,2,2,2,0,1,0,
 1,0,0,2,0,0,1,0,
 0,1,0,0,0,0,0,0,
 0,0,1,1,1,0,0,0,
 0,0,0,0,0,0,0,0},
 // Кадр 9
{0,0,1,1,1,0,0,0,
 0,1,0,0,0,1,0,0,
 1,0,0,2,0,0,1,0,
 1,0,2,2,2,0,1,0,
 1,0,0,2,0,0,1,0,
 0,1,0,0,0,1,0,0,
 0,0,1,1,0,0,0,0,
 0,0,0,0,0,0,0,0},
 // Кадр 11
{0,0,1,1,1,0,0,0,
 0,1,0,0,0,1,0,0,
 1,0,0,2,0,0,1,0,
 1,0,2,2,2,0,1,0,
 1,0,0,2,0,0,1,0,
 0,1,0,0,0,1,0,0,
 0,0,1,0,1,0,0,0,
 0,0,0,0,0,0,0,0},
 // Кадр 12
{0,0,1,1,1,0,0,0,
 0,1,0,0,0,1,0,0,
 1,0,0,2,0,0,1,0,
 1,0,2,2,2,0,1,0,
 1,0,0,2,0,0,1,0,
 0,1,0,0,0,1,0,0,
 0,0,0,1,1,0,0,0,
 0,0,0,0,0,0,0,0},
 // Кадр 13
{0,0,1,1,1,0,0,0,
 0,1,0,0,0,1,0,0,
 1,0,0,2,0,0,1,0,
 1,0,2,2,2,0,1,0,
 1,0,0,2,0,0,1,0,
 0,0,0,0,0,1,0,0,
 0,0,1,1,1,0,0,0,
 0,0,0,0,0,0,0,0},
 // Кадр 14
{0,0,1,1,1,0,0,0,
 0,1,0,0,0,1,0,0,
 1,0,0,2,0,0,1,0,
 1,0,2,2,2,0,1,0,
 0,0,0,2,0,0,1,0,
 0,1,0,0,0,1,0,0,
 0,0,1,1,1,0,0,0,
 0,0,0,0,0,0,0,0},
 // Кадр 15
{0,0,1,1,1,0,0,0,
 0,1,0,0,0,1,0,0,
 1,0,0,2,0,0,1,0,
 0,0,2,2,2,0,1,0,
 1,0,0,2,0,0,1,0,
 0,1,0,0,0,1,0,0,
 0,0,1,1,1,0,0,0,
 0,0,0,0,0,0,0,0},
// Кадр 16
 {0,0,1,1,1,0,0,0,
 0,1,0,0,0,1,0,0,
 0,0,0,2,0,0,1,0,
 1,0,2,2,2,0,1,0,
 1,0,0,2,0,0,1,0,
 0,1,0,0,0,1,0,0,
 0,0,1,1,1,0,0,0,
 0,0,0,0,0,0,0,0},
 // Кадр 17
 {0,0,1,1,1,0,0,0,
 0,0,0,0,0,1,0,0,
 1,0,0,2,0,0,1,0,
 1,0,2,2,2,0,1,0,
 1,0,0,2,0,0,1,0,
 0,1,0,0,0,1,0,0,
 0,0,1,1,1,0,0,0,
 0,0,0,0,0,0,0,0},
};

void setup() {
  matrix.begin();
  matrix.setBrightness(50);
  matrix.show();
}

void loop() {
for(int frame = 0; frame < 17; frame++) { // Измените на количество ваших кадров
renderFrame(frame);
delay(500); // Пауза между кадрами
}
}

void renderFrame(int frame) { // clear
for(int y = 0; y < 8; y++) {
for(int x = 0; x < 8; x++) {
int pixelPos = (y * 8) + x;
int colorIndex = animation[frame][pixelPos];
matrix.setPixelColor(pixelPos, colors[colorIndex]); }
}
matrix.show();
}

естественно надо доделать самим))) основной посыл я передал)))

Ну, что же вы, товарищ - “Гипс снимают, клиент уезжает!” Использование шилда для ардуино нано - #9 от пользователя NickGlasgo

толстый лениво)) и вообще думаю что не стоит не кому писать, если они цену сами сразу не указали))) а то получается что это мне надо а не им, в общем я устал от таких заказчиков, я в отпуске!!!)))

Тут нет кадров. Это генератор! Математика простенькая. Калейдоскоп, сказала жена… и почти угадала.

Для калейдоскопа нужен random.

Отнюдь.
Для калейдоскопа нужна симметрия. А рандом там или не рандом - дело десятое.

да, прикольно, но у меня матрицы 8 на 8 только, + немного не понятен код и ваш и xDriver и это натолкнуло на такое творчество))) если хватит памяти, на моем можно запустить вообще все, и если будет соревнование напиши код понятнее, я участвую)))

Код дело десятое.
Тут главное подход. Этот концепт узора состоит из нескольких идей:

  1. Узор состоит из одного фрагмента в многих повторениях.
  2. Фрагмент сдвинут, отзеркален, повёрнут относительно соседнего (варианты сочетаний).
  3. Пиксели (данные по цвету) каждого фрагмента смещаются в массиве по кольцу от кадра к кадру.
  4. Иногда в массив псевдослучайно попадает новое значение цвета пикселя или 0.
  5. Нумерация пикселей в ленте-матрице(ах) никак не совпадает с нумерацией в фрагменте, поэтому (как вариант) нужен массив-переходник номеров.

Вот ещё вариант по этому концепту.


ролик 1
ролик 12

…первая,.. для сравнения
ролик 2

Пиши-делай под свои, фоткай, выкладывай :slight_smile:

1 лайк

Проектируем прибор для лечения тяжёлых форм эпилепсии ?

3 лайка