подскажите пожалуйста насчет кода по диодам ws2812b

lifegame
Offline
Зарегистрирован: 12.12.2016

Здравствуйте комрады! Я в целом то с программированием дружу, но вот с учетом усталости на работе дома уже сил совсем на всякие интересности не остается. Играюсь с отрезком программируемой диодной ленты длинною 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();
 }
}

Видео работы правильной прилагаю

https://youtu.be/b62qUJmoM0Y

А вот код где я сократил первую часть

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

И видео его работы

https://youtu.be/ybtlCaxghrE

2 вечера над этим думаю, уж сюда в качестве крайнего метода обращаюсь)

b707
Offline
Зарегистрирован: 26.05.2017

непонятно, над чем тут думать 2 вечера? - сравните парfметры r и b в первом и во втором варианте.

lifegame
Offline
Зарегистрирован: 12.12.2016

b707 пишет:

непонятно, над чем тут думать 2 вечера? - сравните парfметры r и b в первом и во втором варианте.

я просто игрался, это не играет тут роли, косяк то в цикле где то

а диапазон 0-20 входит и в int и в char

Logik
Offline
Зарегистрирован: 05.08.2014

в первом pixels.show(); вызывается после всех pixels.setPixelColor, а во втором - после каждого и без делея.

Я похожий эффект делал разноцветным. Тут http://arduino.ru/forum/proekty/pokhvalimsya-khudozhestvennoi-samodeyatelnostyu-na-ws2812 . Ща видео выкачу https://youtu.be/er6NhEBZyQ0

lifegame
Offline
Зарегистрирован: 12.12.2016

боюсь что манипуляции с вызовом pixel.show в разных местах кода результата не дали

b707
Offline
Зарегистрирован: 26.05.2017

у вас в первом коде 11 операторов pixels.setPixelColor, а во втором цикл исполняется только десять раз. В строке 22 напишите

while (j <= 10)

Logik
Offline
Зарегистрирован: 05.08.2014

lifegame пишет:

боюсь что манипуляции с вызовом pixel.show в разных местах кода результата не дали

Код?

Хотя не надо. Надо j=0 перед внутреним циклом делать.

ПС. Совет - пользуйтесь for(... с ним меньше глупых ошибок обычно.

satelit 2
Offline
Зарегистрирован: 04.12.2016

я просто написал, что бы сохранить ветку. тоже балуюсь, но времени нет

 

Sergeyevd
Sergeyevd аватар
Offline
Зарегистрирован: 25.03.2014
#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)

Sergeyevd
Sergeyevd аватар
Offline
Зарегистрирован: 25.03.2014

Если установить RGBW, то работает не корректно, цвет неверный и диод не тот

dliss
Offline
Зарегистрирован: 28.06.2013

кто подскажет как  сократить код включения диодов на ws2812b

к примеру вместо 

pixels.setPixelColor(5, pixels.Color(0,0,0));
pixels.setPixelColor(6, pixels.Color(0,0,0));
pixels.setPixelColor(7, pixels.Color(0,0,0));
pixels.setPixelColor(8, pixels.Color(0,0,0));
pixels.setPixelColor(9, pixels.Color(0,0,0));
pixels.setPixelColor(10, pixels.Color(0,0,0));
pixels.setPixelColor(11, pixels.Color(0,0,0));
pixels.setPixelColor(12, pixels.Color(0,0,0));
pixels.setPixelColor(13, pixels.Color(0,0,0));
pixels.setPixelColor(14, pixels.Color(0,0,0));
pixels.setPixelColor(15, pixels.Color(0,0,0));
pixels.setPixelColor(35, pixels.Color(0,0,0));
pixels.setPixelColor(45, pixels.Color(0,0,0));
pixels.setPixelColor(55, pixels.Color(0,0,0));
pixels.show();

чтобы было ондной строкой с 1 по 144 по типу

pixels.setPixelColor(1-144, pixels.Color(0,0,0));

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

 
Клапауций 775
Offline
Зарегистрирован: 24.11.2017

dliss пишет:

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

подключи все диоды к одному пину.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

dliss, вот я читатаю вас и плачу. Отправка значений идет методом show(). А то что выше это занесение в буфер и все. Светодиоды от этого цвет не меняют. Дальше светодиоды получают информацию по цепочке.  Кто первый получил, тот и изменил. И еслицепочка длиная то у конечного будет запаздывание.  И сократить это не удастся в данных условиях. 

ПС: Ну разве что в паралель в 8-12 цепей. Но библиотеку заливку в 8 цепей вы не осилите написать.

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

dliss пишет:

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

Нужно вынести pixels.show() за цикл for

 for (byte i=0; i<144; i++)
 {
   pixels.setPixelColor(i, pixels.Color(0,0,0));
 }
 pixels.show();

 

dliss
Offline
Зарегистрирован: 28.06.2013

qwone пишет:

dliss, вот я читатаю вас и плачу. Отправка значений идет методом show(). А то что выше это занесение в буфер и все. Светодиоды от этого цвет не меняют. Дальше светодиоды получают информацию по цепочке.  Кто первый получил, тот и изменил. И еслицепочка длиная то у конечного будет запаздывание.  И сократить это не удастся в данных условиях. 

ПС: Ну разве что в паралель в 8-12 цепей. Но библиотеку заливку в 8 цепей вы не осилите написать.

Как же меня бомбит от таких советов, так редко пользуюсь форумами, и знаю что всегда кто то найдется вроде вас, из за этого и спрашивать  лишний раз не хочется.

По моему вопросу.., я знаю или по крайней мере догадывался что там цепочкой все идет. Но когда отдельно записывал те строки, было без задержек, я и решил что можно сделать одной строкой. Может у вас осцилограф в голове и вы в силах это заметить как идет сигнал задержки во времени. И получилось так что плачу я теперь читая вас. Делайте вывод, незнешь идем дальше, знаешь подскажи. Большое спасибо Jeka_M, все коротко и по делу. Все заработало прекрасно так как я хотел все 144 диода светят разом и мигают под музыку

Jeka_M пишет:

dliss пишет:

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

Нужно вынести pixels.show() за цикл for

 for (byte i=0; i<144; i++)
 {
   pixels.setPixelColor(i, pixels.Color(0,0,0));
 }
 pixels.show();

 

vdm
vdm аватар
Offline
Зарегистрирован: 29.08.2016

del