мысли разные мои
авторский проект

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

Сегодня будем разбираться, как работает последовательное включение светодиодов.

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

Возьмем наш прошлый скетч.

#include <Adafruit_NeoPixel.h>             // подключаем библиотеку

#define PIN 6                                             // Это выход #6, куда подключено управление лентой.

#define NUMPIXELS 3                            //Число светодиодов в ленте

Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

 

void setup() {

  strip.begin();

  strip.show();

}

//заменяемый ниже фрагмент кода

void loop() {

   {

    strip.setPixelColor(0, strip.Color(100, 0, 0)); // R=255, G=0, B=0 — цвет светодиода

    strip.show();

   }

}

Напомню, что у нас есть определенные переменные PIN, отвечающие за номер пина, с помощью которого мы управляем светодиодной лентой, и NUMPIXELS, в которой указано количество светодиодов в нашей ленте.

Хочу заметить, что у вас в ленте может быть любое количество светодиодов, но работать скетч будет только с тем количеством, которое вы указали в переменной.  Тот кусок кода, который я буду изменять, я пометил в скетче комментарием.

А теперь легким движением руки мы организуем простой цикл, добавив еще одну переменную.

И получаем вот такую конструкцию:

void loop() {

  for(int i=0; i<NUMPIXELS; i++) {

    strip.setPixelColor(i, strip.Color(1, 0, 55));

    strip.show();

    delay(50); // задержка 50 мс, т.е. обновляем 20 светодиодов в секунду

  }

}

Кратко алгоритм для тех, кто как и я, совершенно не понимает в программировании.

Вводим переменную i для цикла, начальное значение которой равно 0, и увеличивается на 1 после каждого прохода цикла (i++). А затем эту переменную мы подставляем вместо номера зажигаемого светика в нашей ленте. strip.setPixelColor(i, strip.Color(1, 0, 55)); После зажигания светодиода с помощью оператора delay() делаем паузу в миллисекундах, и продолжаем цикл. Если убрать оператор delay(), то вся лента у нас загорится сразу.

А теперь давайте зажжем наши светодиоды через один. Делается это так же элементарно.

void loop() {

  for(int i=0; i<NUMPIXELS; i=i+2) {

    strip.setPixelColor(i, strip.Color(1, 0, 55));

    strip.show();

    delay(50); // задержка 50 мс, т.е. обновляем 20 светодиодов в секунду

  }

}

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

Ну хорошо, а если наоборот? Попробовать зажигать светодиоды не сначала, а с конца ленты.

Наш кусок кода будет выглядеть так:

void loop() {

  for(int i=NUMPIXELS; i>0; i=i-1) {

    strip.setPixelColor(i, strip.Color(1, 0, 55));

    strip.show();

    delay(50); // задержка 50 мс, т.е. обновляем 20 светодиодов в секунду

  }

}

То есть,  переменной цикла i мы присвоили значение из переменной NUMPIXELS, которое отвечает за количество светодиодов, которыми мы управляем в нашей ленте. И пока это значение не станет равным 0, мы уменьшаем его на единицу. Кстати, i=i-1 можно записать, как i--. Это я еще помню. Точно так же, можно зажигать светодиоды с любой стороны ленты, кратно 2,3  и т.д.

Вроде бы пока все просто. 

А в финале покажу еще одну небольшую модификацию кода, которая позволит реализовать небольшой цветовой эффект.

void loop() {

  for(int i=NUMPIXELS; i>0; i--) {

    strip.setPixelColor(i, strip.Color(1, 0, 55));

    strip.setPixelColor(NUMPIXELS-i, strip.Color(55, 0, 0));

    strip.show();

    delay(50); // задержка 50 мс, т.е. обновляем 20 светодиодов в секунду

  }

}

То есть добавив еще один оператор, мы одновременно зажигаем светодиоды с обеих сторон ленты, с одной стороны красным, с другой – синим. В середине эти огни пересекаются, и половинки ленты меняют свой цвет. Реализовано все просто. В новом операторе мы берем переменную NUMPIXELS, вычитаем из нее переменную цикла, таким образом определяя, какой светодиод еще будет зажигаться другим цветом.

Комментарии  
+3 # Александр 13.01.2017 07:49
Спасибо большое за статьи по ws2812b. То что нужно для меня- самые азы. Если вы будете продолжать Вашу работу то хотелось бы увидеть разбор кода позволяющий организовать переливы цвета и эффект метеора. Все эти коды есть в интернете но у вас я нашёл именно описание действия каждого оператора кода. Спасибо Вам
Ответить | Ответить с цитатой | Цитировать | Сообщить модератору
0 # Артем 01.03.2017 17:59
А как зажечь всю ленту одновременно одним цветом, или ее можно зажигать только волной?
Ответить | Ответить с цитатой | Цитировать | Сообщить модератору
0 # Сергей 10.07.2019 14:22
Очень хорошо всё расписали и лучше не посоветуешь :lol:
Можно еще продолжение на эту тему? :sigh:
Ответить | Ответить с цитатой | Цитировать | Сообщить модератору
0 # Владимир 25.09.2019 17:12
Большое спасибо.Везде только скетчи, а тут все разборчиво написано, как все это делать, как все работает.
Ответить | Ответить с цитатой | Цитировать | Сообщить модератору