Плавное включение адресной светодиодной ленты

DjafarT800

✩✩✩✩✩✩✩
15 Дек 2019
19
0
Добрый день. Пытаюсь запрограммировать плавное включение адресной ленты, помогите разобраться.
В void setup() устанавливаю при включении яркость на 0:
int k = 0;
FastLED.setBrightness(k);

Далее в void loop() прописал увеличение k до максимума:
if(k == 0)
{
for(int k=0; k<=255; k++)
{
delay(10);
}
}

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

DjafarT800

✩✩✩✩✩✩✩
15 Дек 2019
19
0
Вопрос закрыт, разобрался
if(k == 0)
{
for(int k=0; k<=255; k++)
{
FastLED.setBrightness(k);
FastLED.show();
delay(1000);
}
}
 

b707_2

★★✩✩✩✩✩
22 Июл 2020
182
51
Разобрался ли?

Вы понимаете, что переменная K в первой строчке (в условии if) и переменная K в цикле FOR - это две абсолютно разные переменные?
То что вы увеличиваете К в цикле - никак не влияет на первую K - она так и будет k =0 и при следующем заходе программы этот цикл запустится снова. С этим кодом вас лента будет плавно увеличивать яркость до максимума. потом резко сбрасывать в нуль и снова увеличивать... и так бесконечно
 

Эдуард Анисимов

★★★★★★✩
23 Сен 2019
2,412
978
58
Марий-Эл
@b707_2, Если "к" объявить до первого использования в if(k==0), это будет одна и та же переменная.
В его коде вопрос спорный. Если компилятор не ругнулся на код, значит "к" уже где то определена.
А вот в цикле for будет та же или нет переменная ХЗ.
Никогда так не писал. Т.К. это уже неоднозначность.
 

b707_2

★★✩✩✩✩✩
22 Июл 2020
182
51
  • Лойс +1
Реакции: Старик Похабыч

Эдуард Анисимов

★★★★★★✩
23 Сен 2019
2,412
978
58
Марий-Эл
А теперь пишем прогу на 5000 строк и везде применяем этот метод.
Отдаём другому программисту и через пару дней ты трупп.
Если компилятор позволяет так делать, это не значит, что так делать нужно.
И не факт что другие компиляторы примут такую конструкцию.
И гуру программирования, по книгам которых все учатся, открытым текстом говорят - если в конструкции есть неоднозначность, которую компилятор пропустил, не означает что это не приведёт к глюкам.
 

b707_2

★★✩✩✩✩✩
22 Июл 2020
182
51
Ты сам его применяешь многократно в каждой программе, например, когда используешь вызов какой-нить библиотечной функции внутри цикла for
C++:
for (int i =0; i<6; i++) {
    k = foo(i);
}
И ты не задумываешься о том, а вдруг внутри функции foo() уже есть своя переменная i ?
C++:
byte foo(int h) {
    int i =33;
    return i * h;
}
потому что в этом нет ничего страшного, эти две переменные i - разные и они никак не мешают друг другу.
А не будь этого "метода" - тебе нужно было бы заботится об уникальных именах для всех переменных, причем используемых не только в твоем коде, но и во всех подключенных либах.

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

Однако понимать, как это работает - надо обязательно. Именно непонимание того. как компилятор работает с переменными - и привело к ошибке в коде ТС
 
Изменено:

b707_2

★★✩✩✩✩✩
22 Июл 2020
182
51
цикл for - 'это тоже отдельный блок программы
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,272
1,303
Москва
вот неприятный код:
C++:
{
    int a=3;
    int i=a*3;
    for (int i=0;i<10;i++)
    {
        int k=2*i;      
    }
}
@b707_2, Если нет четкого понимания в областях видимости, то могут быть баги
 

b707_2

★★✩✩✩✩✩
22 Июл 2020
182
51
вот неприятный код:
не более непрятный, чем у ТС :)

можно же еще круче написать
C++:
for (int i=0; i < 2 ; i++) {
    for (int i=0; i < 2 ; i++) {
        for (int i=0; i < 2 ; i++) {
            Serial.println("Uraaa!!!");
}
}
}
но отлично компилируется и даже работает как надо - выводит Ура 8 раз, можете проверить

Если нет четкого понимания в областях видимости, то могут быть баги
это несомненно.
 

DjafarT800

✩✩✩✩✩✩✩
15 Дек 2019
19
0
Здравствуйте. У меня переменная k задана в самом начале кода еще до void setup() - int k = 0;
Не спорю, что код может быть кривым, только учусь ) Попробую по вашим советам сократить, спасибо
 

b707_2

★★✩✩✩✩✩
22 Июл 2020
182
51
У меня переменная k задана в самом начале кода еще до void setup() - int k = 0;
Вы ошибаетесь. у вас задано две переменные к. Прочитайте еще раз мое сообщение #3. а так же поищите в гугле какую-нить лекцию на тему "область видимости переменных в языке си"
Попробую по вашим советам сократить, спасибо
не надо ничего сокращать, разберитесь с переменными
 

DjafarT800

✩✩✩✩✩✩✩
15 Дек 2019
19
0
Но все работает как надо ) Я вас понял, получается что 2 переменных сейчас в коде, хотя и обе К, и по сути одна просто не нужна?
 

b707_2

★★✩✩✩✩✩
22 Июл 2020
182
51
получается что 2 переменных сейчас в коде, хотя и обе К, и по сути одна просто не нужна?
нужна она или нет - сложно сказать без остального кода. Но судя по тому кусочку, который Вы показали - мне кажется что спецификатор int в скобках for лишний
 

DjafarT800

✩✩✩✩✩✩✩
15 Дек 2019
19
0
Вот весь скетч:

C++:
#include "FastLED.h"
#define PIN 3
#define NUMPIXELS 36

CRGB strip[NUMPIXELS];

const int buttonPin = 4;
const int buttonPin2 = 5;
int buttonState = 0;
int buttonState2 = 0;
int k = 0;

void setup()
{
FastLED.addLeds<WS2812, PIN, GRB>(strip, NUMPIXELS);
pinMode(buttonPin, INPUT);
pinMode(buttonPin2, INPUT);
ledss();
}

void ledss(){
//{
//for (int i = 0; i < NUMPIXELS; i++)

    FastLED.setBrightness(k);

    strip[0] = CRGB::White; // Цвет по умолчанию.
    strip[1] = CRGB::White;
    strip[2] = CRGB::Red;
    strip[3] = CRGB::White;
    strip[4] = CRGB::White;
    strip[5] = CRGB::Blue;
    strip[6] = CRGB::White;
    strip[7] = CRGB::Blue;
    strip[8] = CRGB::White;
    strip[9] = CRGB::Blue;
    strip[10] = CRGB::White;
    strip[11] = CRGB::White;
    strip[12] = CRGB::White;
    strip[13] = CRGB::White;
    strip[14] = CRGB::White;
    strip[15] = CRGB::Red;
    strip[16] = CRGB::White;
    strip[17] = CRGB::Blue;
    strip[18] = CRGB::White;
    strip[19] = CRGB::White;
    strip[20] = CRGB::White;
    strip[21] = CRGB::White;
    strip[22] = CRGB::Blue;
    strip[23] = CRGB::White;
    strip[24] = CRGB::White;
    strip[25] = CRGB::Red;
    strip[26] = CRGB::White;
    strip[27] = CRGB::White;
    strip[28] = CRGB::Blue;
    strip[29] = CRGB::White;
    strip[30] = CRGB::White;
    strip[31] = CRGB::Red;
    strip[32] = CRGB::White;
    strip[33] = CRGB::White;
    strip[34] = CRGB::Blue;
    strip[35] = CRGB::White;
//  }
   FastLED.show();
   if(k == 0)   //и если свет не был включен
     {
       for(int k=0; k<=255; k++)  //то плавно включаем свет
       {
       FastLED.setBrightness(k);
       FastLED.show();
       delay(1000);   //каждые 10мс увелияение на 1
       }
     }
  
}

void loop() {
  // read the state of the pushbutton value:
  buttonState = digitalRead(buttonPin);
  buttonState2 = digitalRead(buttonPin2);

  // check if the pushbutton is pressed. If it is, the buttonState is HIGH:
  if (buttonState == HIGH){
    int f = random(0, 255);
    // turn LED on:
    for (int i = 0; i < NUMPIXELS; i++)
    {
    //strip[i] = CHSV(random8(),255,255);
    strip[i] = CHSV(f,255,255);
    }
  // Передаем цвета ленте.
  FastLED.show();
  delay(1000);
  }
  if (buttonState2 == HIGH)
  //{
    // turn LED on:
    //for (int i = 0; i < NUMPIXELS; i++)
    {
    strip[0] = CRGB::White; // Цвет по умолчанию.
    strip[1] = CRGB::White;
    strip[2] = CRGB::Red;
    strip[3] = CRGB::White;
    strip[4] = CRGB::White;
    strip[5] = CRGB::Blue;
    strip[6] = CRGB::White;
    strip[7] = CRGB::Blue;
    strip[8] = CRGB::White;
    strip[9] = CRGB::Blue;
    strip[10] = CRGB::White;
    strip[11] = CRGB::White;
    strip[12] = CRGB::White;
    strip[13] = CRGB::White;
    strip[14] = CRGB::White;
    strip[15] = CRGB::Red;
    strip[16] = CRGB::White;
    strip[17] = CRGB::Blue;
    strip[18] = CRGB::White;
    strip[19] = CRGB::White;
    strip[20] = CRGB::White;
    strip[21] = CRGB::White;
    strip[22] = CRGB::Blue;
    strip[23] = CRGB::White;
    strip[24] = CRGB::White;
    strip[25] = CRGB::Red;
    strip[26] = CRGB::White;
    strip[27] = CRGB::White;
    strip[28] = CRGB::Blue;
    strip[29] = CRGB::White;
    strip[30] = CRGB::White;
    strip[31] = CRGB::Red;
    strip[32] = CRGB::White;
    strip[33] = CRGB::White;
    strip[34] = CRGB::Blue;
    strip[35] = CRGB::White;
    //}
  // Передаем цвета ленте.
  FastLED.show();
  delay(1000);
  }
}
Делал для аквариума, принцип такой: При включении плавное включение основного цвета, при нажатии на 1 кнопку цвет всей ленты меняется на рандом, при нажатии на 2ю кнопку возвращает цвет по умолчанию.
 

b707_2

★★✩✩✩✩✩
22 Июл 2020
182
51
Чтож вы, написали функцию ledss() . а не используете?
вот так вроде покороче будет, 100 строчек вместо 140 :)
C++:
#include "FastLED.h"
#define PIN 3
#define NUMPIXELS 36

CRGB strip[NUMPIXELS];

const int buttonPin = 4;
const int buttonPin2 = 5;
int buttonState = 0;
int buttonState2 = 0;
int k = 0;

void setup()
{
FastLED.addLeds<WS2812, PIN, GRB>(strip, NUMPIXELS);
pinMode(buttonPin, INPUT);
pinMode(buttonPin2, INPUT);
ledss();
}

void ledss(){
//{
//for (int i = 0; i < NUMPIXELS; i++)

    FastLED.setBrightness(k);

    strip[0] = CRGB::White; // Цвет по умолчанию.
    strip[1] = CRGB::White;
    strip[2] = CRGB::Red;
    strip[3] = CRGB::White;
    strip[4] = CRGB::White;
    strip[5] = CRGB::Blue;
    strip[6] = CRGB::White;
    strip[7] = CRGB::Blue;
    strip[8] = CRGB::White;
    strip[9] = CRGB::Blue;
    strip[10] = CRGB::White;
    strip[11] = CRGB::White;
    strip[12] = CRGB::White;
    strip[13] = CRGB::White;
    strip[14] = CRGB::White;
    strip[15] = CRGB::Red;
    strip[16] = CRGB::White;
    strip[17] = CRGB::Blue;
    strip[18] = CRGB::White;
    strip[19] = CRGB::White;
    strip[20] = CRGB::White;
    strip[21] = CRGB::White;
    strip[22] = CRGB::Blue;
    strip[23] = CRGB::White;
    strip[24] = CRGB::White;
    strip[25] = CRGB::Red;
    strip[26] = CRGB::White;
    strip[27] = CRGB::White;
    strip[28] = CRGB::Blue;
    strip[29] = CRGB::White;
    strip[30] = CRGB::White;
    strip[31] = CRGB::Red;
    strip[32] = CRGB::White;
    strip[33] = CRGB::White;
    strip[34] = CRGB::Blue;
    strip[35] = CRGB::White;
//  }
   FastLED.show();
   if(k == 0)   //и если свет не был включен
     {
       for(k=0; k<=255; k++)  //то плавно включаем свет
       {
       FastLED.setBrightness(k);
       FastLED.show();
       delay(1000);   //каждые 10мс увелияение на 1
       }
     }

}

void loop() {
  // read the state of the pushbutton value:
  buttonState = digitalRead(buttonPin);
  buttonState2 = digitalRead(buttonPin2);

  // check if the pushbutton is pressed. If it is, the buttonState is HIGH:
  if (buttonState == HIGH){
    int f = random(0, 255);
    // turn LED on:
    for (int i = 0; i < NUMPIXELS; i++)
    {
    //strip[i] = CHSV(random8(),255,255);
    strip[i] = CHSV(f,255,255);
    }
  // Передаем цвета ленте.
  FastLED.show();
  delay(1000);
  }
  if (buttonState2 == HIGH)
  {
    ledss();
  }
}
откомпилировать сейчас нечем. так что проверяйте на опечатки
 

DjafarT800

✩✩✩✩✩✩✩
15 Дек 2019
19
0
Ок, спасибо, сейчас тоже нет возможности, к вечеру протестирую и отпишусь. Подскажите, а можно ли как-то сокращать strip[1], чтоб не расписывать каждый светодиод, а например все белые расписать в одну строку через запятую номера светодиодов или что то типа этого strip[1-10]...
 

b707_2

★★✩✩✩✩✩
22 Июл 2020
182
51
Подскажите, а можно ли как-то сокращать strip[1], чтоб не расписывать каждый светодиод, а например все белые расписать в одну строку через запятую номера светодиодов или что то типа этого strip[1-10]...
можно, но если у вас цвета расбросаны по ленте хаотично - сильно короче не будет. все равно придется задавать цвет КАЖДОГО диода, не важно. через массив или присваиванием. как у вас.
Значительно выиграть можно в том случае. если раскидать цвета по ленте по какой-то системе - например каждый четвертый - красный. каждый шестой - синий. остальные белые...
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,272
1,303
Москва
Если я правильно понял. то лентой вы пытаетесь сделать фитолампу. Тогда можно сделать так
1) Задать все светодиоды белым.
2) В цикле задавать каждый 3 или 5 , у вас равный вроде график. красным
3) аналогично с определенным интервалом задать синий цвет.
Цвета задаются только один раз при влючении мк. не а далее меняется только яркость.
 

DjafarT800

✩✩✩✩✩✩✩
15 Дек 2019
19
0
Если сделать отличные от белого цвете через равные промежутки и циклом их прописывать, то это так же через strip[1]? Можете посоветовать мануал, где можно этот вопрос более детально изучить?
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,272
1,303
Москва
для примера. есть лента 1234 диода, надо установить каждый 7 диод красным. Далее пишу прям тут, на опечатки не обращать внимания
C++:
int n_led=1234; общее число светодиодов
int ev_r_led=7; красные светодиоды каджый 7-ой
int start_r_led=4; начинать с 4-го. по счету это 5, 1-ый это светодиод 0
int n_r_led=(n_led-start_r_led)/ev_r_led; общее число красных светодиодв
for (int i=0;i<n_r_led;i++)
{
    int nomer=start_r_led+i*ev_r_led; // номер карсного светодиода
}