Не простой бегущий огонь на WS2811, может кто подскажет.

oleg911
Offline
Зарегистрирован: 10.01.2018

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

sadman41
Offline
Зарегистрирован: 19.10.2016

Как пробовали - показывайте... Только кратенько.

oleg911
Offline
Зарегистрирован: 10.01.2018

sadman41 пишет:

Как пробовали - показывайте... Только кратенько.

На самом деле вариантов много было, и условия задавал, пробовал использовать две переменные в цикле,

for (int i,k=0; i<15; i++, k++){          
  strip.setPixelColor(i-1, 0, 0, 0);
  strip.setPixelColor(i, 100, 0, 0);
  strip.setPixelColor(k, 0, 0, 0);    
  strip.setPixelColor(k-1, 100, 0, 0);
  delay(pause);
  strip.show();

но, потом понимал, что они выполняются последовательно... Головой то понимаю, что нужно пускать непрерывный поток байтов в ленту, чтобы они все выключены были, а при нажатии кнопки, окрашивать несколько и пускать дальше... Но так как я в этом деле совсем зеленый, реализовать не могу. Уже думал о многопоточности, но к сожалению ее тут нет.

sadman41
Offline
Зарегистрирован: 19.10.2016

Так... Давайте проведем мысленный эксперимент. Как вы считаете, если в страйпе постоянно сдвигать цвет пикселя от 0-го к N-ному, но 4 раза на каждом проходе помещать в пиксель в позиции 0 заданный цвет, то это будет вашей "бегущей полоской"? А если каждый раз при нажатии кнопки инициировать это четырехкратное помещение в нулевую позицию заданного цвета - будет ли это желаемым эффектом?

oleg911
Offline
Зарегистрирован: 10.01.2018

sadman41 пишет:

Так... Давайте проведем мысленный эксперимент. Как вы считаете, если в страйпе постоянно сдвигать цвет пикселя от 0-го к N-ному, но 4 раза на каждом проходе помещать в пиксель в позиции 0 заданный цвет, то это будет вашей "бегущей полоской"? А если каждый раз при нажатии кнопки инициировать это четырехкратное помещение в нулевую позицию заданного цвета - будет ли это желаемым эффектом?

Вы так имели введу, или я что то не правильно понял?

for(int i=0; i<=15; i++){
    for(k=0; k<=3; k++)
      {
         strip.setPixelColor(0, 100, 0, 0);
}
 strip.show();
}
sadman41
Offline
Зарегистрирован: 19.10.2016

Нет, вам нужно немного изменить свое мышление.

На каждой итерации loop() вы можете делать так:

for(int i=PIXEL_NUM; i>1; i--){ strip.setPixelColor(i, strip.getPixelColor(i-1); } - "сдвигаем" все пиксели к концу.
 
 
Затем пишем в strip.setPixelColor(0) нужный цвет, но при условии, что отдельно заведенный счетчик (переменная) не превысил значения N (равному 4, к примеру). Для того, чтобы не терять его значения, объявляйте его как static переменную. Если по нажатию кнопки этот счетчик будет обнулятся, то вы получите, что желаете.
 
Скорее всего на данном этапе не всё понятно, но придется постараться, если хотите научится. Мне, конечно, написать код несложно, но вы ведь обратились в раздел для обучения ;)
 
oleg911
Offline
Зарегистрирован: 10.01.2018

Спасибо Вам большое, действительно я нехотел чтобы кто то писал код, потому, что хочу сам разобраться... Так вот, что у меня получилось. В принцепе результатом доволен, не знаю правильно я Вас понял или нет, но почитав про strip.getPixelColor я понял, как это работает. На analogRead() не обращайте внимания - это у меня микрофон вместо кнопки :)

  for(int i=15; i>=0; i--){
   z=analogRead(mic);
  strip.setPixelColor(i, strip.getPixelColor(i-1));
  strip.show();
  }
  if(z<1000){
    strip.setPixelColor(0, 0, 255, 0);
    strip.setPixelColor(1, 0, 255, 0);
}
}

Единственное скорость очень большая, но все работает. Еще раз Вам спасибо... Если что, то я не правильно сделал, укажите пожалуйста на ошибку.

sadman41
Offline
Зарегистрирован: 19.10.2016

Если результат устраивает, то цель достигнута. Для ускорения вызывайте strip.show() не в цикле, а один раз, когда все операции над пикселями (перемещение, закраска и пр.) уже закончены. Суть в том, что все манипуляции над пикселями виртуальны - на самом деле перемещаются числа внутри памяти микроконтроллера. Даже getPixelColor() со страйпа ничего не читает. Единственный метод, непосредственно работающий со светодиодами - это show(). Поэтому его имеет смысл вызывать, когда "картинка" сформирована.