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

Итак, у вас есть или светодиоды WS2812b, или светодиодная лента из этих светодиодов, или светодиодное кольцо. Теперь хочется научиться всем этим управлять. Желательно так, как хочется, а не просто используя готовые решения.

Давайте вместе будем учиться делать это (я тоже хочу этому научиться). 

Для управления я использую микроконтроллер Arduino. Осталось малость – научиться его программировать.

 Думаю, что если вы попали в этот раздел, с Arduino так или иначе вы уже знакомы. Поэтому не буду подробно копипастить информацию с профильных ресурсов – плагиат мне не интересен. Для программирования я использую Arduino Software (IDE). Так же я пропущу то, как устанавливаются различные библиотеки для этой среды разработки – все это, повторюсь, есть на профильных форумах.

Итак, для управления «умными» светодиодами есть две основные библиотеки: Adafruit NeoPixel  и FastLED. Я не могу сказать, чем они отличаются, в чем их достоинства и недостатки, ибо не знаю. Поэтому буду рад комментариям знающих людей.

Ну а начнем с самого простого – научимся просто зажигать произвольный светодиод произвольным цветом.

Как вы уже, наверняка, знаете, конструкция Arduino скетча выглядит так:

void setup() {
  // put your setup code here, to run once:
}
 
void loop() {
  // put your main code here, to run repeatedly:
}

Две части, в которых мы описываем наши переменные, и их действие, причем вторая часть – эта то, что «воспроизводится» «по кругу» (ну не знаю я профессиональных терминов на этот счет).

Сегодня работаем с библиотекой Adafruit NeoPixel

Первый скетч выглядит так:

  1. #include <Adafruit_NeoPixel.h>                            // подключаем библиотеку
  2. #define PIN 6                                             // Это 6 выход, куда подцеплена лента.
  3. #define NUMPIXELS 10                                      //Число светодиодов в ленте
  4. Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
  5. void setup() {
  6. strip.begin(); //Инициализируем библиотеку Adafruit_NeoPixel
  7. strip.show(); //гасим светодиоды из указанного диапазона
  8. }
  9. void loop() {
  10. strip.setPixelColor(3, strip.Color(1, 0, 55)); // R=255, G=0, B=0 — цвет светодиода
  11. strip.show();
  12. }

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

Итак, первая строка. С ее помощью мы подключаем к нашей среде разработки библиотеку Adafruit_NeoPixel.h, в которой уже прописаны базовые функции.

Строка 2. В этой строке мы определяем переменную PIN, то есть номер пина на плате Ардуино, на который будут выводится результаты наших трудов, и который будет управлять светодиодами.

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

Строка 4. В ней, как я понял, описывается основная конструкция.
Adafruit_NeoPixelstrip = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); Вместо «strip» вы можете написать все, что угодно, главное, чтобы далее в программе вы использовали все точно так же, как написано тут. При работе программы в переменные NUMPIXELS, PIN подставляется значения, определяемые во второй и третьей строке. Поэтому вполне можно записать эту конструкцию, как Adafruit_NeoPixelstrip = Adafruit_NeoPixel(10, 6, NEO_GRB + NEO_KHZ800); и все будет работать точно так же. Просто это во-первых менее удобно, во вторых уже не так универсально. В последнем параметре вы можете менять тайминги для различного типа светодиодов. Для светодиодов 2811 этот параметр будет выглядеть, как NEO_KHZ400.

Строка 5. Инициализирует программу.

Строка 6. Стандартный оператор конструкции скетча

Строка 7. В моем примере, в коде программы написано, что с помощью оператора strip.show(); мы гасим светодиоды в том диапазоне, который у нас указан в переменных программы. Но на самом деле, без этого оператора можно обойтись. Я пробовал – ничего не меняется.

Строка 8. Закрываем первый блок.

Строка 9. Основная часть программы, которая выполняется «по кругу».

Строка 10. Готовим сигнал на нужный нам светодиод, указав его номер светодиода первым в скобках, с учетом того, что адрес первого светодиода у нас – это 0. strip.setPixelColor(25, strip.Color(1, 0, 55)); То есть, 25 – это номер зажигаемого светодиода, strip.Color(1, 0, 55) – цвет, каким мы зажигаем светодиод, в формате RGB. То есть значение каждого цвета может быть указано в диапазоне 0..255.

То есть, чтобы зажечь первый светодиод в ленте красным цветом, пишем:

strip.setPixelColor(0, strip.Color(255, 0, 0));

Строка11. Зажигаем светик(и)

Строка 12. Закрывающая скобка.

Теперь о том, почему в строке 11 я написал в единственном и множественном числе одновременно. На самом деле, в 11 строке у нас происходит основная работа программы – мы определяем, какие светики должны гореть, и указываем их цвет.

Теперь листинг программы.

#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();

   }

}

Вместо 11 строки мы можем вполне написать следующее:

  strip.setPixelColor(0, strip.Color(100, 0, 0));

  strip.setPixelColor(2, strip.Color(0, 100, 0));

  strip.setPixelColor(5, strip.Color(0, 0, 100));

  strip.show();

После компиляции скетча на вашей ленте должны загореться первый от начала ленты светодиод красным цветом, третий от начала зеленым, и шестой – синим. Причем все цвета будут гореть менее, чем в пол-накала.

Хочу обратить ваше внимание вот еще на какой момент. Хотя мы ни как не используем переменную, определяющую число светодиодов в ленте, тем не менее, она функционирует. Попробуйте выставить число светодиодов в 10 и зажечь тринадцатый светодиод, указав его номер в программе. Увы, он не загорится.

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

Комментарии  

+1 #1 Андрей 16.05.2017 11:25
Здраствуйте. Прошу помощи с лентой с WS2812? Есть лента с WS2812 на 144 диода. Нужно чтоб загорались в конци и начале по 32 диода, на секуну и гасли, следующий эфект моргали поочередно эти массивы диодов (сначала загорались 32 те что сначала расположены, потом гасли, и загорались те 32 что в конце, типа стробоскопа.). Третий эфект бегущий огонек. Переключать эти эфекты одной кнопкой (с запоминанием последнего эфекта после выключения питания). Можете помочь? Есть ардуино нано, уно. Спасибо
Цитировать
+4 #2 Игорь 19.06.2018 09:04
Большое спасибо. Готовых скетчей полно, но в них много лишнего и непонятного. А на Вашем примере за час построил бегущие поворотники) Для новичка самое оно)
Цитировать