Официальный сайт компании Arduino по адресу arduino.cc
Что-то не пойму с switch case
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Чт, 30/03/2017 - 13:09
Здравствуйте господа! Сразу скажу - я только учусь. Нашел на просторах скетч (здесь уже с моими вставками!)
// 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 в код!
скорее всего, следующий после case 2: break затерли
покажите строки с 47 и ниже вместе
Скорее всего вставили в 75 строку, а не до "}" в 74 строке
В строках 62-64 убираем int. Тоже самое делаем в строках 49-51.
А после строки 26 вставляем
Просто почему я сделал именно так? Я посмотрел как был сделан case2 и по его аналогии сделал свой. Видимо в switch case переменные нужно объявлять вне case, ну или чтото типа того. Ладно. Спасибо. Буду пробовать чуть позже. Пока перетыкал в USB и обратно, два раза! замкнул нагрузку и накрыл две! платки Digispark. Надеюсь только диоды погорели... Завтра на третьей попробую.
Эта "ошибка" обходится легко, например, так:
Т.е. если есть что-то, что объявляется в ветке case ...: то этот case ...: нужно поместить в фигурные скобки.
В строках 62-64 убираем int. Тоже самое делаем в строках 49-51.
А после строки 26 вставляем
Всё сделал почти так, разве что добавил
А код где? Откуда я знаю, что Вы там сделали и что и куда добавили
А разве говорил, что что-то будет светится? У Вас не компилировалось, Вы спросили что сделать, я подсказал и написал, что
После этого всё нормально компилируется.
Всё ведь так и есть, стало компилироваться? А про то, чтобы оно нормально заработало - об этом я Вам ничего не говорил.
Ремирую 3 кейс - снова всё работает... НЕ пойму где трабла?
Потрудитесь изъясняться по-русски. Этой фразы я вообще не понял.
Прошу прощения, я без претензий! Я просто ни как не могу понять причину происходящего. Вот мной изменённый код.
По поводу ремирования. Если я убираю из кода последний кейс (case3) и меняю в 81 строке на "if(mode > 2) { // Если последний уровень" - то всё грузится и всё работает. Никак не пойму почему у меня не получается вставить еще один кейс? Может быть потому что я использую Atiny85?
Ремирую 3 кейс - снова всё работает... НЕ пойму где трабла?
Потрудитесь изъясняться по-русски. Этой фразы я вообще не понял.
дорогой, Вы из новых. REM - апиратор Васика из 90-х. Обозначает - закомментировал.
Не знаю, я логику не совсем понимаю, а Вы не обяхсняеете что проихсодит. Например, добавили Вы третий режим. А при этом режимы 0-2 по-прежднему работают, а сдыхает только на третьем или как?
Что говорит про память после компиляции?
Кстати, Вы забыли вызвать randomSeed для инициализации псевдослучайной последовательности.
А что про то сколько памяти скетч занимает не пишет, что-ли?
Вот это болиже к делу. Вроде, всё как бы должно быть нормально.
Давайте договоримся так. Ваш скетч по сути (не по синтаксису) я толком ещё не смотрел. Сейчас мне надо убегать, но в течение дня я найду время посмотреть. Если хоть что-то менялось (хоть комментарий), то обязательно выложите, пожалуйста, свежую версию.
А если case 3 не убрать из кода, но 81 строку написать как : "if (mode>2)....", работает?
не, не запускается.
т.е. проблема в объеме кода
А зачем в коде процедурка whell () (строка 94 ....)?
ради интереса, вставил case3 c немного измененным case1, чтобы проверить объем - все работает! Значит какая-то проблема именно со змейкой...
whell - этоя планировал сделать еще и меняющиеся цвета. оно пока еще не работает.
https://youtu.be/EqEk0tliedQ три эффекта которые работают.
есть стандарный скетч от Adafruit
издесь немного по другому сделаны эффекты. Может можно сюда как-то вставить эту мою //Zmeyku?
Вы сейчас здесь? Давайте поработаем немного в режиме чата.
Итак,
1. Пост №9 содержит последний код?
2. Он совсем не работает - даже не начинает или сдыхает, когда доходит до последнего эффекта?
3. Дайте ссылку на ту версию библиотеки, которую Вы используете
Так, делаем следующее. После строки 18 вставляем
Запускаем без Вашей змейки, чтобы работало. Затем со змейкой, чтобы не работало. И говорим мне, что печатается в обоих случаях.
1. да
2. совсем не работает
3. 1.0.6
к сожалению монитор порта в Atiny85 не работает
Пин-то хоть один свободный есть? Или, я не знаю, там есть встроенный светодиод, как на Uno на 13 пине?
В общем, по-любому, сделайте так, чтобы на неком пине SV_PIN был светодиод (если уже есть, то и слава Богу).
Тогда так. По идее pixels.numPixels() возвращает количество пикселов. Поэтому делайте так.
Если память под pixels успешно выделилась, должен загореться светодиод.
Проделайте оба теста и скажите мне в обоих ли случаях он загорается?
да - светодиод горит в обоих случаях
Ага, значит память выделяется. Нормально. Сейчас посмотрю, что можно дальше проверить.
Поскольку Вы не выложили свежий скетч, вся нумерация строк в данном посте идёт по посту №9
1. В строках 15 и 16 заменяем int на byte
2. В строках 55, 66 удаляем int вовсе
3. В строках 57, 68 заменяем int на byte
Пробуем как оно и отписываемся.
Не понял, проблема решилась или Вы на неё просто забили?
нет нет. просто на выходных уезжал. а сегодня платку забыл дома. вот только сел, пробую.
о чудо! всё заработало! моя змейка побежала другим путем! Спасибо Евгений, я уж точно не додумался и не догадался бы. К сожалению моих познаний хватило лишь на попытки просто скопировать и немного изменить код. Спасибо еще раз!
всё заработало!
Значит, у Вас проблема с памятью. Если планируете что-то ещё добавлять, то лучше бы пройтись по коду и посмотреть где и что можно сэкономить. Или больше добавлять не планируете?
я хотел попробовать поперетаскивать в этот скетч эффекты из стандартного пост 22, но там немного по другому сделано. Эффекты меняются не switch-ем, а насколько я понял, они написаны отдельными блоками и loop крутит только их названия. В принципе это у меня хобби проект, буду разбираться потихоньку, не без помощи конечно Добрых людей!
хотя не страшно. немного поковырялся и вставил еще парочку case - ов.
к примеру:
ну вообщем - получается!
Новый и рабочий скетч! У меня стоит на Attint85. Может кому пригодится!