Итак, у вас есть или светодиоды WS2812b, или светодиодная лента из этих светодиодов, или светодиодное кольцо. Теперь хочется научиться всем этим управлять. Желательно так, как хочется, а не просто используя готовые решения.
Давайте вместе будем учиться делать это (я тоже хочу этому научиться).
Для управления я использую микроконтроллер Arduino. Осталось малость – научиться его программировать.
Думаю, что если вы попали в этот раздел, с Arduino так или иначе вы уже знакомы. Поэтому не буду подробно копипастить информацию с профильных ресурсов – плагиат мне не интересен. Для программирования я использую Arduino Software (IDE). Так же я пропущу то, как устанавливаются различные библиотеки для этой среды разработки – все это, повторюсь, есть на профильных форумах.
Итак, для управления «умными» светодиодами есть две основные библиотеки: Adafruit NeoPixel и FastLED. Я не могу сказать, чем они отличаются, в чем их достоинства и недостатки, ибо не знаю. Поэтому буду рад комментариям знающих людей.
Ну а начнем с самого простого – научимся просто зажигать произвольный светодиод произвольным цветом.
Как вы уже, наверняка, знаете, конструкция Arduino скетча выглядит так:
Две части, в которых мы описываем наши переменные, и их действие, причем вторая часть – эта то, что «воспроизводится» «по кругу» (ну не знаю я профессиональных терминов на этот счет).
Сегодня работаем с библиотекой Adafruit NeoPixel
Первый скетч выглядит так:
- #include <Adafruit_NeoPixel.h> // подключаем библиотеку
- #define PIN 6 // Это 6 выход, куда подцеплена лента.
- #define NUMPIXELS 10 //Число светодиодов в ленте
- Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
- void setup() {
- strip.begin(); //Инициализируем библиотеку Adafruit_NeoPixel
- strip.show(); //гасим светодиоды из указанного диапазона
- }
- void loop() {
- strip.setPixelColor(3, strip.Color(1, 0, 55)); // R=255, G=0, B=0 — цвет светодиода
- strip.show();
- }
Не копируйте его, поскольку я привел его для примера, с нумерацией строк, чтобы рассказать, что каждая строка означает.
Итак, первая строка. С ее помощью мы подключаем к нашей среде разработки библиотеку 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 и зажечь тринадцатый светодиод, указав его номер в программе. Увы, он не загорится.
Теперь вы можете потренироваться, чтобы зажечь лубой светодиод в ленте любым цветом. Хочу еще отметить то, что не обязательно указывать номера светодиодов по порядку. Можно указывать их в произвольной форме.