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

DjafarT800

✩✩✩✩✩✩✩
15 Дек 2019
19
0
Чтож вы, написали функцию 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();
  }
}
откомпилировать сейчас нечем. так что проверяйте на опечатки
Проверил, при нажатии на 2ю кнопку для выбора цвета по умолчанию свет выключается и больше ни одна кнопка не реагирует. Починил добавлением int k = 0; в тело void ledss()
Я так понял что ардуина только при включении определяла что К равна 0, но при нажатии на кнопку и повторении цикла ардуина уже не понимает 0 или нет. Есть ли у адресной ленты обратная связь, чтоб понимать какой цвет и яркость на данный момент? Например для вывода на экран
 

b707_2

★★✩✩✩✩✩
22 Июл 2020
182
51
Я так понял что ардуина только при включении определяла что К равна 0, но при нажатии на кнопку и повторении цикла ардуина уже не понимает 0 или нет.
что-то я вас не понимаю, можете код показать?
При нажатии кнопки 2 в моем коде свет должен сменится на дефолтный. а яркость не меняется, сколько была до того - столько и остается, параметр k при этом ни на что не влияет
Есть ли у адресной ленты обратная связь, чтоб понимать какой цвет и яркость на данный момент?
нет, единственный вариант - запоминать в программе, что выводите на ленту
 

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

★★★★★★★
14 Авг 2019
4,272
1,303
Москва
Не совсем так. У железки обратной связи нет, но вы же не пишете напрямую в железку ?
Если это фастлед, то она объявляет массив, и в массив можно не только писать , но и читать из него. А для яркости есть не только setBrightness , но и getBrightness
 

b707_2

★★✩✩✩✩✩
22 Июл 2020
182
51
Не совсем так. У железки обратной связи нет, но вы же не пишете напрямую в железку ?
Если это фастлед, то она объявляет массив, и в массив можно не только писать , но и читать из него.
ну это и есть "запоминать в программе" :)
С чипов эту инфу не получить
 

DjafarT800

✩✩✩✩✩✩✩
15 Дек 2019
19
0
Понял, спасибо.
Вот ваш код, добавил строчку только в void ledss() в начале int k = 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++)
int k = 0;
    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(500);   //каждые 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();
  }
}
 

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

★★★★★★★
14 Авг 2019
4,272
1,303
Москва
О, еще один вариант расставления кажого 5-го светодиорда красным , а 7 синим.
for (int i=0;i<numled;i++)
{
strip[i] = CRGB::White;
if (i%5==0) strip[i] = CRGB::Red;
if (i%7==0) strip[i] = CRGB::Blue;
}

правда 35, 70 , 105 и т.д. светодиоды будут исключительно синими
 
  • Лойс +1
Реакции: b707_2

b707_2

★★✩✩✩✩✩
22 Июл 2020
182
51
Вот ваш код, добавил строчку только в void ledss() в начале int k = 0;
нашел ошибку.
Добавленную Вами строчку уберите, она не нужна.
Ошибка в другом месте - в условиях цикла for в этой же процедуре
Напишите вот так и попробуйте:
C++:
for(k=0; k<255; k++)
 

DjafarT800

✩✩✩✩✩✩✩
15 Дек 2019
19
0
О, еще один вариант расставления кажого 5-го светодиорда красным , а 7 синим.
for (int i=0;i<numled;i++)
{
strip[i] = CRGB::White;
if (i%5==0) strip[i] = CRGB::Red;
if (i%7==0) strip[i] = CRGB::Blue;
}

правда 35, 70 , 105 и т.д. светодиоды будут исключительно синими
а numled это откуда берется?
 

DjafarT800

✩✩✩✩✩✩✩
15 Дек 2019
19
0
О, еще один вариант расставления кажого 5-го светодиорда красным , а 7 синим.
for (int i=0;i<numled;i++)
{
strip[i] = CRGB::White;
if (i%5==0) strip[i] = CRGB::Red;
if (i%7==0) strip[i] = CRGB::Blue;
}

правда 35, 70 , 105 и т.д. светодиоды будут исключительно синими
Работает как надо, спасибо, теперь буду знать

нашел ошибку.
Добавленную Вами строчку уберите, она не нужна.
Ошибка в другом месте - в условиях цикла for в этой же процедуре
Напишите вот так и попробуйте:
C++:
for(k=0; k<255; k++)
Тоже работает, спасибо