подскажите пожалуйста насчет кода по диодам ws2812b
- Войдите на сайт для отправки комментариев
Здравствуйте комрады! Я в целом то с программированием дружу, но вот с учетом усталости на работе дома уже сил совсем на всякие интересности не остается. Играюсь с отрезком программируемой диодной ленты длинною 10 диодов, придумываю всякие эффекты. Написал один эффект довольно простым способом и решил укоротить код с помощью циклов что бы красивее было, но укороченный код не работает так как нужно, хотя моя логика говорит мне что я вроде все верно делаю. Подсобите советом если кто может)
данный код "грубой" реализации, здесь все работает как задумывалось.
#include <Adafruit_NeoPixel.h>
#define PIN 6 // номер порта к которому подключен модуль
#define count_led 10 // количество светодиодов
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(count_led, PIN, NEO_GRB + NEO_KHZ800); //first number change does distance between colors
void setup() {
pixels.begin();
pixels.show(); // Устанавливаем все светодиоды в состояние "Выключено"
}
void loop()
{
int i = 0; // счетчик для цикла переключения диодов
int j = 0; // счетчик цикла уровней яркости для разных диодов
int d = 0; // номер диода
char r = 0;
char g = 20;
char b = 0;
int a = 60; // временная задержка
int n = 19; // количество диодов в ленте + 8
while (i < n+1) //я не знаю зачем +1 но так не горит постоянно последний диод
{
pixels.setPixelColor (d,pixels.Color(r,20,b));
pixels.setPixelColor (d-1,pixels.Color(0,18,0));
pixels.setPixelColor (d-2,pixels.Color(0,16,0));
pixels.setPixelColor (d-3,pixels.Color(0,14,0));
pixels.setPixelColor (d-4,pixels.Color(0,12,0));
pixels.setPixelColor (d-5,pixels.Color(0,10,0));
pixels.setPixelColor (d-6,pixels.Color(0,8,0));
pixels.setPixelColor (d-7,pixels.Color(0,6,0));
pixels.setPixelColor (d-8,pixels.Color(0,4,0));
pixels.setPixelColor (d-9,pixels.Color(0,2,0));
pixels.setPixelColor (d-10,pixels.Color(0,0,0));
delay (a);
d=d+1;
i++;
pixels.show();
}
while (i > -n)
{
pixels.setPixelColor (d,pixels.Color(r,20,b));
pixels.setPixelColor (d+1,pixels.Color(0,18,0));
pixels.setPixelColor (d+2,pixels.Color(0,16,0));
pixels.setPixelColor (d+3,pixels.Color(0,14,0));
pixels.setPixelColor (d+4,pixels.Color(0,12,0));
pixels.setPixelColor (d+5,pixels.Color(0,10,0));
pixels.setPixelColor (d+6,pixels.Color(0,8,0));
pixels.setPixelColor (d+7,pixels.Color(0,6,0));
pixels.setPixelColor (d+8,pixels.Color(0,4,0));
pixels.setPixelColor (d+9,pixels.Color(0,2,0));
pixels.setPixelColor (d+10,pixels.Color(0,0,0));
delay (a);
d=d-1;
i--;
pixels.show();
}
}
Видео работы правильной прилагаю
А вот код где я сократил первую часть
#include <Adafruit_NeoPixel.h>
#define PIN 6 // номер порта к которому подключен модуль
#define count_led 10 // количество светодиодов
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(count_led, PIN, NEO_GRB + NEO_KHZ800); //first number change does distance between colors
void setup() {
pixels.begin();
pixels.show(); // Устанавливаем все светодиоды в состояние "Выключено"
}
void loop()
{
int i = 0; // счетчик для цикла переключения диодов
int j = 0; // счетчик цикла уровней яркости для разных диодов
int d = 0; // номер диода
int r = 0;
int g = 20;
int b = 0;
int a = 60; // временная задержка
int n = 19; // количество диодов в ленте + 8
while (i < n+1) //я не знаю зачем +1 но так не горит постоянно последний диод
{
while (j < 10)
{
pixels.setPixelColor (d, pixels.Color (r, g, b));
pixels.show();
d--;
g=g-2;
j++;
}
delay (a);
d++;
i++;
}
while (i > -n)
{
pixels.setPixelColor (d,pixels.Color(r,20,b));
pixels.setPixelColor (d+1,pixels.Color(0,18,0));
pixels.setPixelColor (d+2,pixels.Color(0,16,0));
pixels.setPixelColor (d+3,pixels.Color(0,14,0));
pixels.setPixelColor (d+4,pixels.Color(0,12,0));
pixels.setPixelColor (d+5,pixels.Color(0,10,0));
pixels.setPixelColor (d+6,pixels.Color(0,8,0));
pixels.setPixelColor (d+7,pixels.Color(0,6,0));
pixels.setPixelColor (d+8,pixels.Color(0,4,0));
pixels.setPixelColor (d+9,pixels.Color(0,2,0));
pixels.setPixelColor (d+10,pixels.Color(0,0,0));
delay (a);
d=d-1;
i--;
pixels.show();
}
}
И видео его работы
2 вечера над этим думаю, уж сюда в качестве крайнего метода обращаюсь)
непонятно, над чем тут думать 2 вечера? - сравните парfметры r и b в первом и во втором варианте.
непонятно, над чем тут думать 2 вечера? - сравните парfметры r и b в первом и во втором варианте.
я просто игрался, это не играет тут роли, косяк то в цикле где то
а диапазон 0-20 входит и в int и в char
в первом pixels.show(); вызывается после всех pixels.setPixelColor, а во втором - после каждого и без делея.
Я похожий эффект делал разноцветным. Тут http://arduino.ru/forum/proekty/pokhvalimsya-khudozhestvennoi-samodeyatelnostyu-na-ws2812 . Ща видео выкачу https://youtu.be/er6NhEBZyQ0
боюсь что манипуляции с вызовом pixel.show в разных местах кода результата не дали
у вас в первом коде 11 операторов pixels.setPixelColor, а во втором цикл исполняется только десять раз. В строке 22 напишите
while (j <= 10)
боюсь что манипуляции с вызовом pixel.show в разных местах кода результата не дали
Код?
Хотя не надо. Надо j=0 перед внутреним циклом делать.
ПС. Совет - пользуйтесь for(... с ним меньше глупых ошибок обычно.
я просто написал, что бы сохранить ветку. тоже балуюсь, но времени нет
#include <Adafruit_NeoPixel.h> Adafruit_NeoPixel strip = Adafruit_NeoPixel(10, 6, NEO_RGB + NEO_KHZ800); void setup() { strip.begin(); strip.show(); } void loop() { strip.setPixelColor (1,0,0,255,100); strip.show(); }Почему не устанавливается яркость? (значение 100)
Если установить RGBW, то работает не корректно, цвет неверный и диод не тот
кто подскажет как сократить код включения диодов на ws2812b
к примеру вместо
чтобы было ондной строкой с 1 по 144 по типу
pixels.setPixelColor(1-144, pixels.Color(0,0,0));
с циклом for они включаються поочередно, а нужно чтобы синхронно включались
с циклом for они включаються поочередно, а нужно чтобы синхронно включались
подключи все диоды к одному пину.
dliss, вот я читатаю вас и плачу. Отправка значений идет методом show(). А то что выше это занесение в буфер и все. Светодиоды от этого цвет не меняют. Дальше светодиоды получают информацию по цепочке. Кто первый получил, тот и изменил. И еслицепочка длиная то у конечного будет запаздывание. И сократить это не удастся в данных условиях.
ПС: Ну разве что в паралель в 8-12 цепей. Но библиотеку заливку в 8 цепей вы не осилите написать.
с циклом for они включаються поочередно, а нужно чтобы синхронно включались
Нужно вынести pixels.show() за цикл for
for (byte i=0; i<144; i++) { pixels.setPixelColor(i, pixels.Color(0,0,0)); } pixels.show();dliss, вот я читатаю вас и плачу. Отправка значений идет методом show(). А то что выше это занесение в буфер и все. Светодиоды от этого цвет не меняют. Дальше светодиоды получают информацию по цепочке. Кто первый получил, тот и изменил. И еслицепочка длиная то у конечного будет запаздывание. И сократить это не удастся в данных условиях.
ПС: Ну разве что в паралель в 8-12 цепей. Но библиотеку заливку в 8 цепей вы не осилите написать.
Как же меня бомбит от таких советов, так редко пользуюсь форумами, и знаю что всегда кто то найдется вроде вас, из за этого и спрашивать лишний раз не хочется.
По моему вопросу.., я знаю или по крайней мере догадывался что там цепочкой все идет. Но когда отдельно записывал те строки, было без задержек, я и решил что можно сделать одной строкой. Может у вас осцилограф в голове и вы в силах это заметить как идет сигнал задержки во времени. И получилось так что плачу я теперь читая вас. Делайте вывод, незнешь идем дальше, знаешь подскажи. Большое спасибо Jeka_M, все коротко и по делу. Все заработало прекрасно так как я хотел все 144 диода светят разом и мигают под музыку
с циклом for они включаються поочередно, а нужно чтобы синхронно включались
Нужно вынести pixels.show() за цикл for
for (byte i=0; i<144; i++) { pixels.setPixelColor(i, pixels.Color(0,0,0)); } pixels.show();del