А можно ли проще?

strayker
Offline
Зарегистрирован: 04.11.2016

Заранее извеняюсь,  на ленте WS2812B нужно плано сменить все цвета на заданном светодиоде.

Я это решил так

 }
 for (int i= 0; i<256;i++)
{
    pixels.setPixelColor(0, pixels.Color(0, 0, i));
    pixels.show();
    delay (50);
}
 for (int i= 0; i<256;i++)
{
    pixels.setPixelColor(0, pixels.Color(0, i,255));
    pixels.show();
    delay (50);
}
 for (int i= 0; i<256;i++)
{
    pixels.setPixelColor(0, pixels.Color(0,255,255-i));
    pixels.show();
    delay (50);
}
 for (int i= 0; i<256;i++)
{
    pixels.setPixelColor(0, pixels.Color(i,255,0));
    pixels.show();
    delay (50);
}
 for (int i= 0; i<256;i++)
{
    pixels.setPixelColor(0, pixels.Color(255,255-i,0));
    pixels.show();
    delay (50);
}
 for (int i= 0; i<256;i++)
{
    pixels.setPixelColor(0, pixels.Color(255,0,i));
    pixels.show();
    delay (50);
}
 for (int i= 0; i<256;i++)
{
    pixels.setPixelColor(0, pixels.Color(255-i,0,255));
    pixels.show();
    delay (50);
}
 for (int i= 0; i<256;i++)
{
    pixels.setPixelColor(0, pixels.Color(0,0,255-i));
    pixels.show();
    delay (50);

Вопрос, а можно ли как-то упростить конструкцию? Моих знаний не хватает

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

strayker пишет:

Заранее извеняюсь,  на ленте WS2812B нужно плано сменить все цвета на заданном светодиоде.

Вопрос, а можно ли как-то упростить конструкцию? Моих знаний не хватает

Попробуйте сформулировать задачу так, чтобы Вы и сами её понимали и другие тоже. Так, как задача сформулирована сейчас, она во-первых - в Вашем коде решена неправильно. Во-вторых даже, если бы она была решена правильно, непонятно, что Вы понимаете по "упростить"? Чтобы программа легче читалась? Чтобы была короче в исходном коде? Чтобы занимала меньше памяти? Что такое "упростить"?

Предвидя вопрос "откуда видно, что задача решена неправильно?" сразу же отвечу.

В вашей программе 8 циклов. Каждый показывает по 256 различных цветов, так? Значит, всего Ваша программа показывает 256*8 = 2 048 цветов. Однако всего цветов при восьмибитном цвете, как известно 256 в кубе, т.е. 16 777 216.

Т.е. Всего цветов 16 777 216, Вы показываете 2 048, а кто будет показывать остальные 16 775 168 цветов? Значит Ваша программа показывает не "все цвета" как написано в задании, а только 0,012% из них!!!!

Для справки, чтобы показать все цвета, задерживаясь на каждом по 50мс (как у Вас), потребуется почти 10 суток непрерывной работы. Вы по-прежнему желаете показывать все цвета?

strayker
Offline
Зарегистрирован: 04.11.2016

Давайье уберём математику из вопроса.

Можноли сделать так чтобы было не 8 циклов а меньше(короче код)?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

strayker пишет:

Давайье уберём математику из вопроса.

Можноли сделать так чтобы было не 8 циклов а меньше(короче код)?

Можно ли сделать что? Все цвета надо показывать? Или как у Вас - меньше процента?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Если все, то пожалуйста. Но работать будет почти 10 суток пока все покажет

for (int r = 0; r < 256; r++) {
	for (int g = 0; g < 256; g++) {
		for (int b = 0; b < 256; b++) {
			pixels.setPixelColor(0, pixels.Color(r, g, b));
			pixels.show();
			delay (50);
		}
	}
}

 

strayker
Offline
Зарегистрирован: 04.11.2016

ЕвгенийП пишет:

Если все, то пожалуйста. Но работать будет почти 10 суток пока все покажет

for (int r = 0; r < 256; r++) {
	for (int g = 0; g < 256; g++) {
		for (int b = 0; b < 256; b++) {
			pixels.setPixelColor(0, pixels.Color(r, g, b));
			pixels.show();
			delay (50);
		}
	}
}

 

К такому решению я и сам приходил, но она ратотает не так как в моём варианте

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Блин, так я уже третий раз Вас спрашиваю. КАК она должна работать? ВСЕ цвета показывать или как у Вас? Вы не отвечаете. Чего Вы ждёте? Что я сам догадаюсь, что Вам нужно?

Если Вам нужны все цвета, так Ваш вариант неправильный. 

strayker
Offline
Зарегистрирован: 04.11.2016

Я же с самого начала написал, можно ли упростить тот код что я написал, но чтоб работа ло так же?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

strayker пишет:

Я же с самого начала написал, можно ли упростить тот код что я написал, но чтоб работа ло так же?

Да, но при этом Вы же написали "нужно плано сменить все цвета на заданном светодиоде". Одно другому противоречит, потому я и задал вопрос, на который ответ получил только сейчас.

Значит Ваш вопрос: можно ли написать. чтобы работала также, но при этом занимало меньше строк? Правильно? ответ: Можно.

strayker
Offline
Зарегистрирован: 04.11.2016

Спасибо за помощь, я нащёл способ решения своей задачи.

Правда наверное тоже не идиальный

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

А идеального ничего не бывает, разве что операционные усилители и то. только в расчётах :)

strayker
Offline
Зарегистрирован: 04.11.2016

)))шикароно

knack
knack аватар
Offline
Зарегистрирован: 27.03.2012

тип так?

byte a[3];
byte b=0;
void setup(){
  Serial.begin(9600);
}
void loop(){
for (int i= 0; i<256;i++){
if(a[b] < 255 && a[b-2] != 255)a[b]++;
else if (a[b-1] !=255)b++;
if(a[b-1] > 0 && a[b] > 0)a[b-1]--;
if(b == 3 && a[b-1] == 254)b=0;
if(b == 0 && a[2] > 0)a[2]--;

    Serial.print("r:");
    Serial.print(a[0]);
    Serial.print("  g:");
    Serial.print(a[1]);
    Serial.print("  b:");
    Serial.print(a[2]);
    Serial.print("  bbbb:");
    delay (50);

}
}

 

knack
knack аватар
Offline
Зарегистрирован: 27.03.2012
byte a[3];
byte b=0;
void setup(){
  Serial.begin(9600);
}
void loop(){
for (int i= 0; i<256;i++){
if(b==0&& a[2]>0)a[2]--;
if(b>0)a[b-1]=255-a[b];
if(a[b]!=255)a[b]++;
else {
  b++;
  if(b >2)b=0;
}
    Serial.print("r:");
    Serial.print(a[0]);
    Serial.print("  g:");
    Serial.print(a[1]);
    Serial.print("  b:");
    Serial.print(a[2]);
    Serial.print("  bbbb:");
    Serial.print(b);
    Serial.println();
    delay (50);
}
}

или так, те же яйца, чёт меня вставило :)

knack
knack аватар
Offline
Зарегистрирован: 27.03.2012

strayker пишет:

Спасибо за помощь, я нащёл способ решения своей задачи.

Правда наверное тоже не идиальный

а у вас какой?

strayker
Offline
Зарегистрирован: 04.11.2016
{
for(int i=0;i<256*8;i++){
if(i < 256) {
    pixels.setPixelColor(0, pixels.Color(i, 0, 0));
         pixels.show();
         delay (50);
  } 
 if((i > 256)and(i<512) {
    pixels.setPixelColor(0, pixels.Color(255, i, 0));
         pixels.show();
         delay (50);
  } 
if(i > 512) {
    pixels.setPixelColor(0, pixels.Color(768-i, 255, 0));
         pixels.show();
         delay (50);
  } 

Ну и так далее, лень все расписывать

Vlan
Offline
Зарегистрирован: 13.12.2016

А разве для ардуино нельзя использовать процедуры с параметрами?
У вас по сути меняются только три переменные. Было бы красиво. Мне проверить не на чем.

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

Vlan пишет:

А разве для ардуино нельзя использовать процедуры с параметрами?

я запретил.

strayker
Offline
Зарегистрирован: 04.11.2016

Я в программировании не селен, делаю как знаний хватает.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Vlan пишет:

А разве для ардуино нельзя использовать процедуры с параметрами?

Увы, в языке С нет процедур :(

Vlan
Offline
Зарегистрирован: 13.12.2016

ЕвгенийП пишет:

Увы, в языке С нет процедур :(

Так функции есть. Тот же Фаберже, только сбоку. :-)

releyshic
Offline
Зарегистрирован: 20.11.2015

ЕвгенийП пишет:

Vlan пишет:

А разве для ардуино нельзя использовать процедуры с параметрами?

Увы, в языке С нет процедур :(

таки есть #define sum(A,B) A+B

ну почти )

releyshic
Offline
Зарегистрирован: 20.11.2015

strayker пишет:

Заранее извеняюсь,  на ленте WS2812B нужно плано сменить все цвета на заданном светодиоде.

Я это решил так

 }
 for (int i= 0; i<256;i++)
{
    pixels.setPixelColor(0, pixels.Color(0, 0, i));
    pixels.show();
    delay (50);
}
 for (int i= 0; i<256;i++)
{
    pixels.setPixelColor(0, pixels.Color(0, i,255));
    pixels.show();
    delay (50);
}
 for (int i= 0; i<256;i++)
{
    pixels.setPixelColor(0, pixels.Color(0,255,255-i));
    pixels.show();
    delay (50);
}
 for (int i= 0; i<256;i++)
{
    pixels.setPixelColor(0, pixels.Color(i,255,0));
    pixels.show();
    delay (50);
}
 for (int i= 0; i<256;i++)
{
    pixels.setPixelColor(0, pixels.Color(255,255-i,0));
    pixels.show();
    delay (50);
}
 for (int i= 0; i<256;i++)
{
    pixels.setPixelColor(0, pixels.Color(255,0,i));
    pixels.show();
    delay (50);
}
 for (int i= 0; i<256;i++)
{
    pixels.setPixelColor(0, pixels.Color(255-i,0,255));
    pixels.show();
    delay (50);
}
 for (int i= 0; i<256;i++)
{
    pixels.setPixelColor(0, pixels.Color(0,0,255-i));
    pixels.show();
    delay (50);

Вопрос, а можно ли как-то упростить конструкцию? Моих знаний не хватает

for (int i=0, R=0, G=0, B=0; i<256*8; i++)
{
	switch(i%256)
	{
		case 0: 
		{
			R=0; G=0; B=i;			
			break;
		}
		case 1: 
		{
			R=0; G=i; B=255;
			break;
		}
		case 2: 
		{
			R=0; G=255; B=255-i;			
			break;
		}
		case 3: 
		{
			R=i; G=255; B=0;
			break;
		}
		case 4: 
		{
			R=255; G=255-i; B=0;
			break;
		}
		case 5: 
		{
			R=255; G=0; B=i;
			break;
		}
		case 6: 
		{
			R=255-i; G=0; B=255;	
			break;
		}
		case 7: 
		{
			R=0; G=0; B=255-i;	
			break;
		}
	}   
	pixels.setPixelColor(0, pixels.Color(R, G, B));
	pixels.show();
	delay (50);
}

наврятли можно проще

macros
Offline
Зарегистрирован: 07.11.2016

releyshic пишет:

наврятли можно проще

можно вообще без for, бесконечный цикл в МК же уже есть!

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Можно и без case.

arduino328
Offline
Зарегистрирован: 01.09.2016

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

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

releyshic пишет:

ну почти )

Почти - нещитово!

Vlan
Offline
Зарегистрирован: 13.12.2016

ЕвгенийП пишет:
Почти - нещитово!

Ничего не возвращающая функция и есть процедура. Даже без "почти".

Замечательный учебник на этом сайте пишет:
Для программистов, работающих с BASIC, функции в Arduino позволяют использовать подпрограммы (GOSUB в BASIC).

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Vlan пишет:

Ничего не возвращающая функция и есть процедура. Даже без "почти".

Это "по понятиям", а "по закону" нет такого слова в стандарте языка.

Vlan
Offline
Зарегистрирован: 13.12.2016

ЕвгенийП пишет:

Это "по понятиям", а "по закону" нет такого слова в стандарте языка.

Прямо как в песне...

strayker
Offline
Зарегистрирован: 04.11.2016

releyshic пишет:

strayker пишет:

Заранее извеняюсь,  на ленте WS2812B нужно плано сменить все цвета на заданном светодиоде.

Я это решил так

 }
 for (int i= 0; i<256;i++)
{
    pixels.setPixelColor(0, pixels.Color(0, 0, i));
    pixels.show();
    delay (50);
}
 for (int i= 0; i<256;i++)
{
    pixels.setPixelColor(0, pixels.Color(0, i,255));
    pixels.show();
    delay (50);
}
 for (int i= 0; i<256;i++)
{
    pixels.setPixelColor(0, pixels.Color(0,255,255-i));
    pixels.show();
    delay (50);
}
 for (int i= 0; i<256;i++)
{
    pixels.setPixelColor(0, pixels.Color(i,255,0));
    pixels.show();
    delay (50);
}
 for (int i= 0; i<256;i++)
{
    pixels.setPixelColor(0, pixels.Color(255,255-i,0));
    pixels.show();
    delay (50);
}
 for (int i= 0; i<256;i++)
{
    pixels.setPixelColor(0, pixels.Color(255,0,i));
    pixels.show();
    delay (50);
}
 for (int i= 0; i<256;i++)
{
    pixels.setPixelColor(0, pixels.Color(255-i,0,255));
    pixels.show();
    delay (50);
}
 for (int i= 0; i<256;i++)
{
    pixels.setPixelColor(0, pixels.Color(0,0,255-i));
    pixels.show();
    delay (50);

Вопрос, а можно ли как-то упростить конструкцию? Моих знаний не хватает

for (int i=0, R=0, G=0, B=0; i<256*8; i++)
{
	switch(i%256)
	{
		case 0: 
		{
			R=0; G=0; B=i;			
			break;
		}
		case 1: 
		{
			R=0; G=i; B=255;
			break;
		}
		case 2: 
		{
			R=0; G=255; B=255-i;			
			break;
		}
		case 3: 
		{
			R=i; G=255; B=0;
			break;
		}
		case 4: 
		{
			R=255; G=255-i; B=0;
			break;
		}
		case 5: 
		{
			R=255; G=0; B=i;
			break;
		}
		case 6: 
		{
			R=255-i; G=0; B=255;	
			break;
		}
		case 7: 
		{
			R=0; G=0; B=255-i;	
			break;
		}
	}   
	pixels.setPixelColor(0, pixels.Color(R, G, B));
	pixels.show();
	delay (50);
}

наврятли можно проще

Чтоб заработал данный вариант надо switch(i%256) заменить наswitch(i/256)

strayker
Offline
Зарегистрирован: 04.11.2016
void loop() {
for (int i=0, R=0, G=0, B=0; i<256*8; i++)
{
    switch(i/256)
    {
        case 0:
        {
            R=0; G=0; B=i;         
            break;
        }
        case 1:
        {
           R=0; G=i; B=255;
            break;
        }
        case 2:
        {
            R=0; G=255; B=255-i;           
            break;
        }
        case 3:
        {
            R=i; G=255; B=0;
            break;
        }
        case 4:
        {
            R=255; G=255-i; B=0;
            break;
        }
        case 5:
        {
            R=255; G=0; B=i;
            break;
        }
        case 6:
        {
            R=255-i; G=0; B=255;   
            break;
        }
        case 7:
        {
            R=0; G=0; B=255-i; 
            break;
        }

А можно ли вынести этот код в void setup() чтоб потом всегда обращаться к переменным R G B?

releyshic
Offline
Зарегистрирован: 20.11.2015

Нет нельзя

Зато можно переменные R G B сделать глобальными и тогда можно будет

arduino328
Offline
Зарегистрирован: 01.09.2016

strayker пишет:

Заранее извеняюсь,  на ленте WS2812B нужно плано сменить все цвета на заданном светодиоде.

Вопрос, а можно ли как-то упростить конструкцию? Моих знаний не хватает

Для получения бегущей радуги достаточно 6 периодов вместо 8.