Диодная лента WS2812B. Как заставить 10 пикселей пробежаться из конца в конец и обратно?
- Войдите на сайт для отправки комментариев
Уважаемые форумчане. Помогите пожалуйста дописать код.
Ардуино и программированием в целом я занимаюсь не больше месяца. Поэтому мои вопросы и подход к их решению возможно покажутся вам детскими но всё-же спрошу.
Есть адресная светодиодная лента на 278 пикселей WS2812B, есть библиотека Adafruit NeoPixel, есть рабочий пример выдернутый из примера библиотеки:
// Подключаем библиотеку Adafruit NeoPixel. #include "Adafruit_NeoPixel.h" // Указываем, какое количество пикселей у нашей ленты. #define LED_COUNT 278 // Указываем, к какому порту подключен вход ленты DIN. #define LED_PIN 3 // Создаем переменную strip для управления нашей лентой. Adafruit_NeoPixel strip = Adafruit_NeoPixel(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800); void setup() { strip.begin(); strip.show(); // Устанавливаем все светодиоды в состояние "Выключено" } void loop() { theaterChase(strip.Color(127, 127, 127), 50); // White theaterChase(strip.Color(127, 0, 0), 50); // Red theaterChase(strip.Color( 0, 0, 127), 50); // Blue } //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 } } } }
Он зажигает и последовательно гасит каждый третий пиксель сдвигая следующий загоревшийся на один с повторением 10 раз для каждого цвета (бегущий огонь).
Немного изменив код:
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 < strip.numPixels(); q++) { for (int i=0; i <10; i++) { strip.setPixelColor(i+q, c); //включит 10 пикселей } strip.show(); delay(wait); for (int i=0; i < 10; i++) { strip.setPixelColor(i+q, 0); //выключит 10 пикселей } } } }
я получаю 10 бегущих пикселей от начала лента к концу.
Если написать вот так:
void theaterChase(uint32_t c, uint8_t wait) { for (int j=0; j<10; j++) { //do 10 cycles of chasing for (int q=278; q > 0; q--) { for (int i=0; i <10; i++) { strip.setPixelColor(i+q, c); //включит 10 пикселей } strip.show(); delay(wait); for (int i=0; i < 10; i++) { strip.setPixelColor(i+q, 0); //выключит 10 пикселей } } } }
то от конца к началу.
Задача сделать пробегающие пиксели от начала к концу и сразу от конца к началу.
Пробовал так:
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 < strip.numPixels(); q++) { for (int i=0; i <10; i++) { strip.setPixelColor(i+q, c); //включит 10 пикселей } strip.show(); delay(wait); for (int i=0; i < 10; i++) { strip.setPixelColor(i+q, 0); //выключит 10 пикселей } } } for (int q=278; q > 0; q--) { for (int i=0; i <10; i++) { strip.setPixelColor(i+q, c); //включит 10 пикселей } strip.show(); delay(wait); for (int i=0; i < 10; i++) { strip.setPixelColor(i+q, 0); //выключит 10 пикселей } } }
Лента моргнёт 10-ю пикселями в начале и начинает движение с конца.
Вынос в отдельную переменную:
void loop() { theaterChase(strip.Color(127, 127, 127), 50); // White theaterChase2(strip.Color(127, 127, 127), 50); // White theaterChase(strip.Color(127, 0, 0), 50); // Red theaterChase(strip.Color( 0, 0, 127), 50); // Blue } 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 < strip.numPixels(); q++) { for (int i=0; i <10; i++) { strip.setPixelColor(i+q, c); //включит 10 пикселей } strip.show(); delay(wait); for (int i=0; i < 10; i++) { strip.setPixelColor(i+q, 0); //выключит 10 пикселей } } } } void theaterChase2(uint32_t c, uint8_t wait) { for (int j=0; j<10; j++) { //do 10 cycles of chasing for (int q=278; q > 0; q--) { for (int i=0; i <10; i++) { strip.setPixelColor(i+q, c); //включит 10 пикселей } strip.show(); delay(wait); for (int i=0; i < 10; i++) { strip.setPixelColor(i+q, 0); //выключит 10 пикселей } } } }
работает, но соответственно по 10 раз в каждую сторону, а мне надо 10 раз туда обратно.
Другие библиотеки не пробую, потому как я хочу сначала решить вопрос на этой.
Уважаемый, а почему в строке, например 38, не стоит strip.show()? Вы это выводить не собираетесь?
Я ставил ничего не меняеться, оригинальный код приведённый сверху работает как с ним так и без него, мне это тоже непонятно. Если это поможет вот оригинальный скетч.
Эффект от оригинального кода вот такой: https://youtu.be/MrCMiSieVWQ?t=90
Я хочу добиться такого только в обе стороны https://www.youtube.com/watch?v=oZc-aXTybuw
Коллеги, я начинаю все подобные темы переправлять в "Песочницу", собственно для того и создавалась. Предлагаю последовать примеру.
Благодарю, сам разобрался.