Что-то не пойму с switch case

GennOk
Offline
Зарегистрирован: 30.03.2015

Здравствуйте господа! Сразу скажу - я только учусь. Нашел на просторах скетч (здесь уже с моими вставками!)

    // 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 1
     
    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 всего
    int sine[] = {20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0,23,22,21,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,24,25,26,27};
    int sine2[] = {20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0,23,22,21,27,26,25,24,47,46,46,44,43,42,41,40,39,38,37,36,35,34,33,32,31,30,29,28};

    void setup() {
    pixels.begin();
    pixels.setBrightness(120); // Пол яркости
    prevTime = millis();
    }
     
    void loop() {
    uint8_t i;
    uint32_t t;
     
    switch(mode) {
     
    case 0: // Хаотичные блики - вспышки разных диодов в разное время!
      i = random(48);
      pixels.setPixelColor(i, color);
      pixels.show();
      delay(10);
      pixels.setPixelColor(i, 0);
      break;
    case 1: // Spinny wheels (8 LED одновременно)
      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(50);
      break;
     case 2: //Змейка
       int r = random(255);
       int g = random(255);
       int b = random(255);
       for(int i=0; i<48; i++) {
        pixels.setPixelColor(sine[i], pixels.Color(0, 0, 0));
          for (int j=0; j<8; j++){
            pixels.setPixelColor(sine[(j+i+1)%48], pixels.Color(r, g, b)); //random RGB color value
          }
        pixels.show();
        delay(80);
      }
      break;
  }
     
    t = millis();
    if((t - prevTime) > 8000) { // Каждые< 8 seconds...
    mode++; // Следующий уровень
    if(mode > 2) { // Последний уровень?
    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);
  }
}

для двух Adafruit WS2812b колец. Скетч запускается и работает. Решил добавить еще один эффект Змейка2. Добавил sine2, изменил "if(mode > 3) { // Последний уровень?" и написал еще один case 3: //Змейка2

case 3: //Змейка2
       int r = random(255);
       int g = random(255);
       int b = random(255);
       for(int i=0; i<48; i++) {
        pixels.setPixelColor(sine2[i], pixels.Color(0, 0, 0));
          for (int j=0; j<8; j++){
            pixels.setPixelColor(sine2[(j+i+1)%48], pixels.Color(r, g, b)); //random RGB color value
          }
        pixels.show();
        delay(80);
      }
      break;

 Но не хочет работать. Пишет огромное количество букв! 

C:\Documents\Arduino\Mad_scientist_goggles\Mad_scientist_goggles.ino: In function 'void loop()':

Mad_scientist_goggles:61: error: jump to case label [-fpermissive]

       case 3: // Zmeyka2

            ^

Mad_scientist_goggles:51: error: crosses initialization of 'int b'

        int b = random(255);

            ^

Mad_scientist_goggles:50: error: crosses initialization of 'int g'

        int g = random(255);

            ^

Mad_scientist_goggles:49: error: crosses initialization of 'int r'

        int r = random(255);

            ^

Mad_scientist_goggles:62: error: redeclaration of 'int r'

        int r = random(255);

            ^

Mad_scientist_goggles:49: error: 'int r' previously declared here

        int r = random(255);

            ^

Mad_scientist_goggles:63: error: redeclaration of 'int g'

        int g = random(255);

            ^

Mad_scientist_goggles:50: error: 'int g' previously declared here

        int g = random(255);

            ^

Mad_scientist_goggles:64: error: redeclaration of 'int b'

        int b = random(255);

            ^

Mad_scientist_goggles:51: error: 'int b' previously declared here

        int b = random(255);

            ^

exit status 1
jump to case label [-fpermissive]

и останавливается при проверке. Помогите пожалуйста вставить этот case в код!

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

скорее всего, следующий после case 2: break затерли

покажите строки с 47 и ниже вместе

T.Rook
Offline
Зарегистрирован: 05.03.2016

Скорее всего вставили в 75 строку, а не до "}" в 74 строке

GennOk
Offline
Зарегистрирован: 30.03.2015
    // 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 1
     
    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 всего
    int sine[] = {20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0,23,22,21,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,24,25,26,27};
    int sine2[] = {20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0,23,22,21,27,26,25,24,47,46,45,44,43,42,41,40,39,38,37,36,35,34,33,32,31,30,29,28};

    void setup() {
    pixels.begin();
    pixels.setBrightness(120); // Пол яркости
    prevTime = millis();
    }
     
    void loop() {
    uint8_t i;
    uint32_t t;
     
    switch(mode) {
     
    case 0: // Хаотичные блики - вспышки разных диодов в разное время!
      i = random(48);
      pixels.setPixelColor(i, color);
      pixels.show();
      delay(10);
      pixels.setPixelColor(i, 0);
      break;
    case 1: // Spinny wheels (8 LED одновременно)
      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(50);
      break;
     case 2: // Zmeyka
       int r = random(255);
       int g = random(255);
       int b = random(255);
       for(int i=0; i<48; i++) {
        pixels.setPixelColor(sine[i], pixels.Color(0, 0, 0));
          for (int j=0; j<8; j++){
            pixels.setPixelColor(sine[(j+i+1)%48], pixels.Color(r, g, b)); //random RGB color value
          }
        pixels.show();
        delay(80);
      }
      break;
      case 3: // Zmeyka2
       int r = random(255);
       int g = random(255);
       int b = random(255);
       for(int i=0; i<48; i++) {
        pixels.setPixelColor(sine2[i], pixels.Color(0, 0, 0));
          for (int j=0; j<8; j++){
            pixels.setPixelColor(sine2[(j+i+1)%48], pixels.Color(r, g, b)); //random RGB color value
          }
        pixels.show();
        delay(80);
      }
      break;
}
     
    t = millis();
    if((t - prevTime) > 8000) { // Каждые< 8 seconds...
    mode++; // Следующий уровень
    if(mode > 3) { // Последний уровень?
    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);
  }
}
  

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

В строках 62-64 убираем int. Тоже самое делаем в строках 49-51.

А после строки 26 вставляем 

int r, g, b;
 
После этого всё нормально компилируется.
 
Заодно читаем какую-нибудь книжку по языку на котором собираемся программировать, т.к. такого рода грабли будут возникать постоянно.
GennOk
Offline
Зарегистрирован: 30.03.2015

Просто почему я сделал именно так? Я посмотрел как был сделан case2 и по его аналогии сделал свой. Видимо в switch case переменные нужно объявлять вне case, ну или чтото типа того. Ладно. Спасибо. Буду пробовать чуть позже. Пока перетыкал в USB и обратно, два раза! замкнул нагрузку и накрыл две! платки Digispark. Надеюсь только диоды погорели... Завтра на третьей попробую.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Эта "ошибка" обходится легко, например, так:

switch(var)
{
case 0:
  {
    int a, b, c;
    ...
  }
  break;
case 1:
  {
    int var1, var2, var4;
    ...
  }
  break;
};

Т.е. если есть что-то, что объявляется в ветке case ...: то этот case ...: нужно поместить в фигурные скобки.
 

GennOk
Offline
Зарегистрирован: 30.03.2015

ЕвгенийП пишет:

В строках 62-64 убираем int. Тоже самое делаем в строках 49-51.

А после строки 26 вставляем 

int r, g, b;
 
После этого всё нормально компилируется.
 
 Всё сделал почти так, разве что добавил рандом
int r = random(255);
int g = random(255);
int b = random(255);
Компилируется на 100%, но кольца вообще не светятся. Ремирую 3 кейс - снова всё работает... НЕ пойму где трабла?
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

GennOk пишет:

Всё сделал почти так, разве что добавил 

А код где? Откуда я знаю, что Вы там сделали и что и куда добавили

GennOk пишет:
Компилируется на 100%, но кольца вообще не светятся.

А разве говорил, что что-то будет светится? У Вас не компилировалось, Вы спросили что сделать, я подсказал и написал, что 

ЕвгенийП пишет:

После этого всё нормально компилируется.

Всё ведь так и есть, стало компилироваться? А про то, чтобы оно нормально заработало - об этом я Вам ничего не говорил.

GennOk пишет:

Ремирую 3 кейс - снова всё работает... НЕ пойму где трабла?

Потрудитесь изъясняться по-русски. Этой фразы я вообще не понял.

 

GennOk
Offline
Зарегистрирован: 30.03.2015

Прошу прощения, я без претензий! Я просто ни как не могу понять причину происходящего. Вот мной изменённый код. 

    // 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 1
     
    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 всего
    int sine1[] = {20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0,23,22,21,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,24,25,26,27};
    int sine2[] = {20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0,23,22,21,27,26,25,24,47,46,45,44,43,42,41,40,39,38,37,36,35,34,33,32,31,30,29,28};

    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(10);
      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: // Zmeyka
       for(int i=0; i<48; i++) {
        pixels.setPixelColor(sine2[i], pixels.Color(0, 0, 0));
          for (int j=0; j<8; j++){
            pixels.setPixelColor(sine2[(j+i+1)%48], pixels.Color(r, g, b)); //random RGB color value
          }
        pixels.show();
        delay(80);
      }
      break;
    
    case 3: // Zmeyka2
      for(int i=0; i<48; i++) {
        pixels.setPixelColor(sine1[i], pixels.Color(0, 0, 0));
          for (int j=0; j<8; j++){
            pixels.setPixelColor(sine1[(j+i+1)%48], pixels.Color(r, g, b)); //random RGB color value
          }
        pixels.show();
        delay(80);
      }
       break;
      
}
     
    t = millis();
    if((t - prevTime) > 8000) { // Каждые< 8 seconds...
    mode++; // Следующий уровень
    if(mode > 3) { // Если последний уровень
    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);
  }
} 

По поводу ремирования. Если я убираю из кода последний кейс (case3) и меняю в 81 строке на "if(mode > 2) { // Если последний уровень" - то всё грузится и всё работает. Никак не пойму почему у меня не получается вставить еще один кейс? Может быть потому что я использую Atiny85? 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

ЕвгенийП пишет:

Ремирую 3 кейс - снова всё работает... НЕ пойму где трабла?

Потрудитесь изъясняться по-русски. Этой фразы я вообще не понял.

дорогой, Вы из новых. REM - апиратор Васика из 90-х. Обозначает - закомментировал. 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Не знаю, я логику не совсем понимаю, а Вы не обяхсняеете что проихсодит. Например, добавили Вы третий режим. А при этом режимы 0-2 по-прежднему работают, а сдыхает только на третьем или как?

Что говорит про память после компиляции?

Кстати, Вы забыли вызвать randomSeed для инициализации псевдослучайной последовательности.

GennOk
Offline
Зарегистрирован: 30.03.2015
После добавления третьего режима, программа заливается!
Это пишет по окончании заливки!
Running Digispark Uploader...
Plug in device now... (will timeout in 60 seconds)
> Please plug in the device ... 
> Press CTRL+C to terminate the program.
> Device is found!
connecting: 16% complete
connecting: 22% complete
connecting: 28% complete
connecting: 33% complete
> Device has firmware version 1.6
> Available space for user applications: 6012 bytes
> Suggested sleep time between sending pages: 8ms
> Whole page count: 94  page size: 64
> Erase function sleep duration: 752ms
parsing: 50% complete
> Erasing the memory ...
erasing: 55% complete
erasing: 60% complete
erasing: 65% complete
> Starting to upload ...
writing: 70% complete
writing: 75% complete
writing: 80% complete
> Starting the user app ...
running: 100% complete
>> Micronucleus done. Thank you!
 
Но светодиоды вообще не светятся. Если я убираю третий (новый) режим и перезаливаю - то всё работает, огоньки мигают как и должны.
 
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

А что про то сколько памяти скетч занимает не пишет, что-ли?

GennOk
Offline
Зарегистрирован: 30.03.2015
Скетч использует 4162 байт (69%) памяти устройства. Всего доступно 6012 байт.
Глобальные переменные используют 245 байт динамической памяти.
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Вот это болиже к делу. Вроде, всё как бы должно быть нормально.

Давайте договоримся так. Ваш скетч по сути (не по синтаксису) я толком ещё не смотрел. Сейчас мне надо убегать, но в течение дня я найду время посмотреть. Если хоть что-то менялось (хоть комментарий), то обязательно выложите, пожалуйста, свежую версию.

T.Rook
Offline
Зарегистрирован: 05.03.2016

А если case 3 не убрать из кода, но 81 строку написать как : "if (mode>2)....", работает?

GennOk
Offline
Зарегистрирован: 30.03.2015

не, не запускается.

T.Rook
Offline
Зарегистрирован: 05.03.2016

т.е. проблема в объеме кода

А зачем в коде процедурка whell ()  (строка 94 ....)?

GennOk
Offline
Зарегистрирован: 30.03.2015

ради интереса, вставил case3 c немного измененным case1, чтобы проверить объем - все работает! Значит какая-то проблема именно со змейкой...

GennOk
Offline
Зарегистрирован: 30.03.2015

whell - этоя планировал сделать еще и меняющиеся цвета. оно пока еще не работает.

GennOk
Offline
Зарегистрирован: 30.03.2015

https://youtu.be/EqEk0tliedQ три эффекта которые работают.

GennOk
Offline
Зарегистрирован: 30.03.2015

есть стандарный скетч от Adafruit

#include <Adafruit_NeoPixel.h>

#define PIN 1

// Parameter 1 = number of pixels in strip
// Parameter 2 = Arduino pin number (most are valid)
// Parameter 3 = pixel type flags, add together as needed:
//   NEO_KHZ800  800 KHz bitstream (most NeoPixel products w/WS2812 LEDs)
//   NEO_KHZ400  400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers)
//   NEO_GRB     Pixels are wired for GRB bitstream (most NeoPixel products)
//   NEO_RGB     Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2)
Adafruit_NeoPixel strip = Adafruit_NeoPixel(48, PIN, NEO_GRB + NEO_KHZ800);
// IMPORTANT: To reduce NeoPixel burnout risk, add 1000 uF capacitor across
// pixel power leads, add 300 - 500 Ohm resistor on first pixel's data input
// and minimize distance between Arduino and first pixel.  Avoid connecting
// on a live circuit...if you must, connect GND first.

void setup() {
  strip.begin();
  strip.show(); // Initialize all pixels to 'off'
}

void loop() {
  // Some example procedures showing how to display to the pixels:
  colorWipe(strip.Color(255, 0, 0), 50); // Red
  colorWipe(strip.Color(0, 255, 0), 50); // Green
  colorWipe(strip.Color(0, 0, 255), 50); // Blue
  // Send a theater pixel chase in...
  theaterChase(strip.Color(127, 127, 127), 50); // White
  theaterChase(strip.Color(127,   0,   0), 50); // Red
  theaterChase(strip.Color(  0,   0, 127), 50); // Blue

  rainbow(20);
  rainbowCycle(20);
  theaterChaseRainbow(50);
}

// Fill the dots one after the other with a color
void colorWipe(uint32_t c, uint8_t wait) {
  for(uint16_t i=0; i<strip.numPixels(); i++) {
      strip.setPixelColor(i, c);
      strip.show();
      delay(wait);
  }
}

void rainbow(uint8_t wait) {
  uint16_t i, j;

  for(j=0; j<256; j++) {
    for(i=0; i<strip.numPixels(); i++) {
      strip.setPixelColor(i, Wheel((i+j) & 255));
    }
    strip.show();
    delay(wait);
  }
}

// Slightly different, this makes the rainbow equally distributed throughout
void rainbowCycle(uint8_t wait) {
  uint16_t i, j;

  for(j=0; j<256*5; j++) { // 5 cycles of all colors on wheel
    for(i=0; i< strip.numPixels(); i++) {
      strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255));
    }
    strip.show();
    delay(wait);
  }
}

//Theatre-style crawling lights.
void theaterChase(uint32_t c, uint8_t wait) {
  for (int j=0; j<10; j++) {  //do 10 cycles of chasing
    for (int q=0; q < 3; q++) {
      for (int i=0; i < strip.numPixels(); i=i+3) {
        strip.setPixelColor(i+q, c);    //turn every third pixel on
      }
      strip.show();
     
      delay(wait);
     
      for (int i=0; i < strip.numPixels(); i=i+3) {
        strip.setPixelColor(i+q, 0);        //turn every third pixel off
      }
    }
  }
}

//Theatre-style crawling lights with rainbow effect
void theaterChaseRainbow(uint8_t wait) {
  for (int j=0; j < 256; j++) {     // cycle all 256 colors in the wheel
    for (int q=0; q < 3; q++) {
        for (int i=0; i < strip.numPixels(); i=i+3) {
          strip.setPixelColor(i+q, Wheel( (i+j) % 255));    //turn every third pixel on
        }
        strip.show();
       
        delay(wait);
       
        for (int i=0; i < strip.numPixels(); i=i+3) {
          strip.setPixelColor(i+q, 0);        //turn every third pixel off
        }
    }
  }
}

// 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 strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
  } else if(WheelPos < 170) {
    WheelPos -= 85;
   return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  } else {
   WheelPos -= 170;
   return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
  }
}

 издесь немного по другому сделаны эффекты. Может можно сюда как-то вставить эту мою //Zmeyku?  

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Вы сейчас здесь? Давайте поработаем немного в режиме чата.

Итак,

1. Пост №9 содержит последний код?

2. Он совсем не работает - даже не начинает или сдыхает, когда доходит до последнего эффекта?

3. Дайте ссылку на ту версию библиотеки, которую Вы используете

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Так, делаем следующее. После строки 18 вставляем

Serial.begin(115200);
Serial.println(pixels.numPixels());

Запускаем без Вашей змейки, чтобы работало. Затем со змейкой, чтобы не работало. И говорим мне, что печатается в обоих случаях.

GennOk
Offline
Зарегистрирован: 30.03.2015

1. да 

2. совсем не работает

3. 1.0.6

GennOk
Offline
Зарегистрирован: 30.03.2015

к сожалению монитор порта в Atiny85 не работает

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Пин-то хоть один свободный есть? Или, я не знаю, там есть встроенный светодиод, как на Uno на 13 пине?

В общем, по-любому, сделайте так, чтобы на неком пине SV_PIN был светодиод (если уже есть, то и слава Богу).

Тогда так. По идее pixels.numPixels() возвращает количество пикселов. Поэтому делайте так.

pinMode(SV_PIN, OUTPUT):
digitalWrite(SV_PIN, pixels.numPixels() == 48);

Если память под pixels успешно выделилась, должен загореться светодиод. 

Проделайте оба теста и скажите мне в обоих ли случаях он загорается?

GennOk
Offline
Зарегистрирован: 30.03.2015

да - светодиод горит в обоих случаях

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ага, значит память выделяется. Нормально. Сейчас посмотрю, что можно дальше проверить.

Поскольку Вы не выложили свежий скетч, вся нумерация строк в данном посте идёт по посту №9

1. В строках 15 и 16 заменяем int на byte

2. В строках 55, 66 удаляем int вовсе

3. В строках 57, 68 заменяем int на byte

Пробуем как оно и отписываемся.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Не понял, проблема решилась или Вы на неё просто забили?

GennOk
Offline
Зарегистрирован: 30.03.2015

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

GennOk
Offline
Зарегистрирован: 30.03.2015

о чудо! всё заработало! моя змейка побежала другим путем! Спасибо Евгений, я уж точно не додумался и не догадался бы. К сожалению моих познаний хватило лишь на попытки просто скопировать и немного изменить код. Спасибо еще раз!

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

GennOk пишет:

всё заработало!

Значит, у Вас проблема с памятью. Если планируете что-то ещё добавлять, то лучше бы пройтись по коду и посмотреть где и что можно сэкономить. Или больше добавлять не планируете?

GennOk
Offline
Зарегистрирован: 30.03.2015

я хотел попробовать поперетаскивать в этот скетч эффекты из стандартного пост 22, но там немного по другому сделано. Эффекты меняются не switch-ем, а насколько я понял, они написаны отдельными блоками и loop крутит только их названия. В принципе это у меня хобби проект, буду разбираться потихоньку, не без помощи конечно Добрых людей!

GennOk
Offline
Зарегистрирован: 30.03.2015

хотя не страшно. немного поковырялся и вставил еще парочку case - ов.

к примеру:


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; 

ну вообщем - получается!

Новый и рабочий скетч! У меня стоит на Attint85. Может кому пригодится!

    // 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[] = {23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47};
    byte sine2[] = {23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0,47,46,45,44,43,42,41,40,39,38,37,36,35,34,33,32,31,30,29,28,27,26,25,24};

    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(10);
      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);
  }
}