ARDUINO Помогите изменить код (снежинка на адресной ленте)

15.09.2019
17
0
1
#1
Помогите изменить код снежинки на адресной ленте. Скетч написан для одной снежинки. Но хочется сделать на одной ардуинке несколько снежинок, либо с одного пина последовательно (желательно), либо каждая со своего пина. Уже весь мозг сломал, не получается, знаний не хватает. Пробовал объявлять класс и менять выводящий на ленту пин, но так не получается.
сам проект отсюда https://mysku.ru/blog/aliexpress/47632.html
 

Вложения

15.09.2019
17
0
1
#3
Неужели действительно нет решения, чтобы по очереди на разные пины сигналы выводить.
 
15.09.2019
17
0
1
#5
Да это понятно, но я думал, что есть решение чтобы не перелопачивать весь код, т.е. создать класс, в конструкторе указывать пин, подставлять его в строчку в которой описывается лента и апдейтом выполнять весь остальной код программы.
 

Старик Похабыч

Проходящий мимо
13.08.2019
192
25
28
#6
Если не перелопачивать весь код, то теоретически сигнал данных можно продублировать используя мосфет ( что бы не спалить порт). Будут синхронно работать. Если последовательно обрабатывать несколько портов в разных режимах, то при простейшем изменении кода в разы увеличится размер программы , это если под каждую модель тупо скопировать нужные функции и изменением пина и ленты, если переписать функции с выбором нужной ленты от скажем просто номера, то увеличится используемая память под массив светодиодов и все. Программа увеличится незначительно, НО! Управление снежинкой использует функции задержки, пусть и самописные, не тормозящие внешние процессы, но на время одного эффекта остальные снежинки будут замирать.
Для работы нескольких звезд в параллеле от разных пинов достаточно сделать так
описать нужное кол-во пинов
#define PIN 3
#define PIN1 4
#define PIN2 5
и т.д.
объявить несколько лент
Adafruit_NeoPixel strip = Adafruit_NeoPixel(total_pixels, PIN, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel strip1= Adafruit_NeoPixel(total_pixels, PIN1, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel strip2 = Adafruit_NeoPixel(total_pixels, PIN2, NEO_GRB + NEO_KHZ800);

а далее прошерстить весь код по поиску strip и везде где найдено ниже добавить точно такую же строку, но с strip1 и strip2 (и сколько их там). т.е. понадобиться инициация в setup (по 3 строки на ленту), в loop после strip.show(); добавить нужное. Ну и далее дополнить все функции. покажу пример
Было:
C++:
void buffer_to_ray(uint8_t ray_num, uint8_t inverse) {
  if (ray_num >= ray_number) return;

  for (uint8_t i = 0; i < ray_pixel; i++) {
    if (inverse) {
      strip.setPixelColor(i + ray_num * ray_pixel, one_ray[ray_pixel - 1 - i]);
    } else {
      strip.setPixelColor(i + ray_num * ray_pixel, one_ray[i]);
    }
  }
}
СТАЛО
C++:
void buffer_to_ray(uint8_t ray_num, uint8_t inverse) {
  if (ray_num >= ray_number) return;

  for (uint8_t i = 0; i < ray_pixel; i++) {
    if (inverse) {
      strip.setPixelColor(i + ray_num * ray_pixel, one_ray[ray_pixel - 1 - i]);
      strip1.setPixelColor(i + ray_num * ray_pixel, one_ray[ray_pixel - 1 - i]);
      strip1.setPixelColor(i + ray_num * ray_pixel, one_ray[ray_pixel - 1 - i]);
    } else {
      strip.setPixelColor(i + ray_num * ray_pixel, one_ray[i]);
      strip1.setPixelColor(i + ray_num * ray_pixel, one_ray[i]);
      strip2.setPixelColor(i + ray_num * ray_pixel, one_ray[i]);
    }
  }
}
 
15.09.2019
17
0
1
#7
Да, это первое что я делал, но в коде некоторых эффектов используются ссылки на функции которые описаны в самом низу листинга программы и вот здесь вот затык. В этих функциях тоже используется strip. Тогда, нужно сделать эти функции для каждой ленты и соответственно ссылаться уже на них.
ЗЫ: Хотя можно попробовать и в них продублировать строки с разными номерами strip.
 

Старик Похабыч

Проходящий мимо
13.08.2019
192
25
28
#8
Их тоже править. как указал в примере, если писать под каждую будут фризы для неактивных снежинок
 

Александр Симонов

Проходящий мимо
02.08.2018
304
56
38
#9
И получится то же самое, что подключить несколько одинаковых снежинок к пину управления лентой.
 
15.09.2019
17
0
1
#10
И получится то же самое, что подключить несколько одинаковых снежинок к пину управления лентой.
Это да, чтобы такого не было, я думал продублировать те места, где выбор режима и поменять порядок режимы для разных лент. Но в итоге опять уперся в функции которые завязаны на strip. Почему и пришел к решению сделать класс, но он у меня не заработал, думал, что есть решения класса для вот этого Adafruit_NeoPixel strip = Adafruit_NeoPixel(total_pixels, PIN, NEO_GRB + NEO_KHZ800); т.е. заменять PIN нужным числом, но не получилось. Может неправильно, что-то делал?
 

Старик Похабыч

Проходящий мимо
13.08.2019
192
25
28
#11
тут беда в том, что надо распараллеливать процессы , а это уже гораздо более сложное дело , чем просто класс написать.
 
15.09.2019
17
0
1
#12
Есть еще вариант, продублировать весь код (это для двух снежинок) и поменять названия переменных, чтобы дублей не было. Но это очень уж дурацкое решение.
 

Старик Похабыч

Проходящий мимо
13.08.2019
192
25
28
#13
15.09.2019
17
0
1
#14
тут беда в том, что надо распараллеливать процессы , а это уже гораздо более сложное дело , чем просто класс написать.
А разве так не должно получаться http://robotosha.ru/arduino/multi-tasking-arduino.html внизу пример для светодиодов, я по такому алгоритму хотел сделать.
 

Старик Похабыч

Проходящий мимо
13.08.2019
192
25
28
#15
светодиоды имеют только 2 состояния, вкл и выкл. А у звезд помимо множества светодиодов еще и 6 режимов. Программа как включает 1 режим, то пока не отработает не возвращает управление циклу. Попробуй сделать к примеру ShowMode2() в сетапе, а луп отстаить пустым. у тебя будет 1 эффект полностью, посмотри сколько времени займет. вот столько времени другая звезда будет в бессознательном состоянии.
 

Александр Симонов

Проходящий мимо
02.08.2018
304
56
38
#16
Это да, чтобы такого не было, я думал продублировать те места, где выбор режима и поменять порядок режимы для разных лент. Но в итоге опять уперся в функции которые завязаны на strip. Почему и пришел к решению сделать класс, но он у меня не заработал, думал, что есть решения класса для вот этого Adafruit_NeoPixel strip = Adafruit_NeoPixel(total_pixels, PIN, NEO_GRB + NEO_KHZ800); т.е. заменять PIN нужным числом, но не получилось. Может неправильно, что-то делал?
Почти весь скетч придётся переделать в класс, плюс убрать delay. В общем, не для начального уровня задачка