Собрал себе на Новый год очки на ATTINY85 и NeoPixel rings. Нашел на просторах Инета код Код (C++): // https://youtu.be/_hnk5jNTudk Low power NeoPixel goggles example. Makes a nice blinky display // with just a few LEDs on at any time. #include <Adafruit_NeoPixel.h> #define PIN 0 Adafruit_NeoPixel pixels = Adafruit_NeoPixel(48, PIN); uint8_t mode = 0, // Эффект по умолчанию offset = 0; // Position of spinny eyes uint32_t color = 0xFF0000; // Start red uint32_t prevTime; //Путь пикселей при змейке - 48 всего byte sine1[] = {43,42,41,40,39,38,37,36,35,34,33,32,31,30,29,28,27,26,25,24,47,46,45,44,3,2,1,0,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4}; byte sine2[] = {43,42,41,40,39,38,37,36,35,34,33,32,31,30,29,28,27,26,25,24,47,46,45,44,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,0,1,2,3}; void setup() { pixels.begin(); pixels.setBrightness(120); // Пол яркости prevTime = millis(); } void loop() { uint8_t i; uint32_t t; int r = random(255); int g = random(255); int b = random(255); switch(mode) { case 0: // Хаотичные блики - вспышки разных диодов в разное время! i = random(48); pixels.setPixelColor(i, color); pixels.show(); delay(15); pixels.setPixelColor(i, 0); break; case 1: // Spinny wheels (Вращение 3 по 3 покругу) for(i=0; i<24; i++) { uint32_t c = 0; if(((offset + i) & 7) < 2) c = color; // 4 pixels on... pixels.setPixelColor( i, c); // Первое очко pixels.setPixelColor(47-i, c); // Второе очко (инверсия) } pixels.show(); offset++; delay(80); break; case 2: // rainbow uint16_t i, j; for(j=0; j<256; j++) { for(i=0; i<24; i++) { pixels.setPixelColor(i, Wheel((i+j) & 255)); pixels.setPixelColor(47-i, Wheel((i+j) & 255)); } pixels.show(); delay(80); } break; case 3: // Zmeyka1 for(i=0; i<48; i++) { pixels.setPixelColor(sine2[i], pixels.Color(0, 0, 0)); for (byte j=0; j<8; j++){ pixels.setPixelColor(sine2[(j+i+1)%48], Wheel((i+j) & 255)); //random RGB color value } pixels.show(); delay(80); } break; case 4: // Zmeyka2 for(i=0; i<48; i++) { pixels.setPixelColor(sine1[i], pixels.Color(0, 0, 0)); for (byte j=0; j<8; j++){ pixels.setPixelColor(sine1[(j+i+1)%48], Wheel((i+j) & 255)); //random RGB color value } pixels.show(); delay(80); } break; case 5: // rainbowCycle for(j=0; j<256; j++) { // 5 cycles of all colors on wheel for(i=0; i<24; i++) { pixels.setPixelColor(i, Wheel(((i * 256 / pixels.numPixels()) + j) & 255)); pixels.setPixelColor(47-i, Wheel(((i * 256 / pixels.numPixels()) + j) & 255)); } pixels.show(); delay(80); } break; } t = millis(); if((t - prevTime) > 8000) { // Каждые< 8 seconds... mode++; // Следующий уровень if(mode > 5) { // Если последний уровень mode = 0; // Уровни сначала color >>= 8; // Следующий цвет R->G->B if(!color) color = 0xFF0000; // Сброс на красный } for(i=0; i<48; i++) pixels.setPixelColor(i, 0); prevTime = t; } } // Input a value 0 to 255 to get a color value. // The colours are a transition r - g - b - back to r. uint32_t Wheel(byte WheelPos) { WheelPos = 255 - WheelPos; if(WheelPos < 85) { return pixels.Color(255 - WheelPos * 3, 0, WheelPos * 3); } else if(WheelPos < 170) { WheelPos -= 85; return pixels.Color(0, WheelPos * 3, 255 - WheelPos * 3); } else { WheelPos -= 170; return pixels.Color(WheelPos * 3, 255 - WheelPos * 3, 0); } } под Аттини, немного подкорректировал под себя. Есть вопрос. Может ли кто нибудь дополнить код дополнительными эффектами именно под два кольца? Пробовал сам, не получилось... видно не хватает познаний.
не совсем симметрично (хотя...). Дело в том, что нужны эффекты именно для очков. Вот к примеру Case 3 и 4 (Змейка) -там вообще нет симметрии, при этом используются оба очка (глаза). https://drive.google.com/file/d/1x-a6CQiirrIbBZfPU97ahkVAoV-Zd-3a/view?usp=sharing
Что мешает разобраться и сделать что угодно и как угодно? Оба "очка" сцепить последовательно и заталкивать туда кадры. Это всего лишь цепочка адресных светодиодов, хоть и расположеных в форме двух колец.
да в том то и проблема... я не разбираюсь в программировании. Я вижу код, приблизительно понимаю что обозначают некоторые переменные и методом перебора пытаюсь посмотреть что получается. Но чтобы создать новый эффект - не смогу однозначно. Поэтому и попросил людей о помощи. да, и еще. два кольца соединены последовательно, как одна лента
Тоже интересуюсь данной темой, подскажите кто знает, можно ли две ленты подключить параллельно, т.е. с общим дата входом? Чтобы получить симметричный рисунок
может это поможет мне , как новичку запустить некоторые симметричные рисунки на отрезках ленты ws2812b
в коде который я выложил выше есть интересные эффекты Шестеренки и Змейка. И тут не простое параллельное свечение... хотелось бы побольше таких эффектов! в субтитрах написал названия эффектов.
Попробуйте библиотеку FastLed. В библиотеке FastLed есть копирование состояния пикселей Код (C++): // Copy the CRGB color from one pixel to another leds[i] = leds[j]; // Copy ten led colors from leds[src .. src+9] to leds[dest .. dest+9] memmove( &leds[dest], &leds[src], 10 * sizeof( CRGB) ); Не сомневаюсь, что у адских фруктов есть что-то подобное, но FastLed все же пошустрее, да и я где-то видел готовые примеры под несколько светодиодных линеек. Составить таблицу соответствия пикселей на каждом очке и в любом примере, используя этот массив с соответствиями, копировать всю движуху на второе очко. То есть, банально вставить memmove в loop или в функции, отвечающие за эффекты. Но это неточно(с)