ATTINY85 и NeoPixel rings дополните код кто сможет

Тема в разделе "Arduino & Shields", создана пользователем GennOk, 13 дек 2017.

Метки:
  1. GennOk

    GennOk Нерд

    Собрал себе на Новый год очки [​IMG] на 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);
      }
    }
       
    под Аттини, немного подкорректировал под себя. Есть вопрос. Может ли кто нибудь дополнить код дополнительными эффектами именно под два кольца? Пробовал сам, не получилось... видно не хватает познаний.
     

    Вложения:

    Последнее редактирование: 13 дек 2017
    Tomasina нравится это.
  2. ostrov

    ostrov Гуру

    Чем два отличаются от одного? Работают симметрично?
     
  3. GennOk

    GennOk Нерд

  4. ostrov

    ostrov Гуру

    Что мешает разобраться и сделать что угодно и как угодно? Оба "очка" сцепить последовательно и заталкивать туда кадры. Это всего лишь цепочка адресных светодиодов, хоть и расположеных в форме двух колец.
     
  5. GennOk

    GennOk Нерд

    да в том то и проблема... я не разбираюсь в программировании. Я вижу код, приблизительно понимаю что обозначают некоторые переменные и методом перебора пытаюсь посмотреть что получается. Но чтобы создать новый эффект - не смогу однозначно. Поэтому и попросил людей о помощи.

    да, и еще. два кольца соединены последовательно, как одна лента
     
    Последнее редактирование модератором: 14 дек 2017
  6. antey100

    antey100 Нерд

    Тоже интересуюсь данной темой, подскажите кто знает, можно ли две ленты подключить параллельно, т.е. с общим дата входом? Чтобы получить симметричный рисунок
     
  7. ostrov

    ostrov Гуру

    Почему нет? А зачем?
     
  8. antey100

    antey100 Нерд

    может это поможет мне , как новичку запустить некоторые симметричные рисунки на отрезках ленты ws2812b
     
  9. ostrov

    ostrov Гуру

    Запускайте на одном, вторую параллельно, не вижу причины почему на двух не заработает.
     
  10. antey100

    antey100 Нерд

    я так понимаю можно и десять параллельно запустить, лишь бы не перегрузить выход ардуины
     
  11. ostrov

    ostrov Гуру

    Этот выход сигнальный, питается лента от другого пина.
     
  12. GennOk

    GennOk Нерд

    в коде который я выложил выше есть интересные эффекты Шестеренки и Змейка. И тут не простое параллельное свечение... хотелось бы побольше таких эффектов!

    в субтитрах написал названия эффектов.
     
  13. Gomez

    Gomez Гик

    Попробуйте библиотеку 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 или в функции, отвечающие за эффекты.
    Но это неточно(с)
     
    Последнее редактирование: 18 дек 2017