плавный сдвиг трёх светодиодов на адресной ленте

azalis
Offline
Зарегистрирован: 02.05.2021

Добрый день! Прошу помощи разобраться с переполнение стека. Плата ESP8266. Скетч перемещает по адресной ленте три светодиода вправо на 10 позиций. Во время выполнения происходит переполнение стека. Так же почему то светодиоды с leds[].fadeLightBy(255) не гаснут полностью, а еле светятся разным цветом. Буду благодарен, если подскажите иной способ реализации (не через .fadeLightBy).

#include <FastLED.h>
#define NUM_LEDS 50
#define LED_PIN 2
#define CLOCK_PIN 13
CRGB leds[NUM_LEDS]; // Define the array of leds
#define COLOR_ORDER RGB
#define CHIPSET     WS2811
int flag =1; 

void setup() 
{ 
 FastLED.addLeds<CHIPSET, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection(TypicalSMD5050);
 Serial.begin(9600);
 Clear ();          // гасим все светодиоды
 FastLED.show();
}
void loop() 
{
 if (flag ==1){
  Run();
 }
}

void Clear ()
{
 for(int i = 0; i < NUM_LEDS; i++ )  {
  leds[i] = CRGB::Black;
 }
}

void Run()
{
  Dot(); //плавно зажигаем три точки
  int br=255;
  for (int a=1; a != 10; a++){ //сдвигаем три точки вправо пока центр не станет = 10
    for (int i=1; i<255; i++){
      leds[a-1] = CRGB::White;
      leds[a-1].fadeLightBy(i); //плавно гасим левую от target точку
      leds[a+2] = CRGB::White;
      leds[a+2].fadeLightBy(br); //плавно зажигаем вторую справа от target точку
      FastLED.show();
      br--;
    }
  }
flag = 2;
}

void Dot ()
{
 for (int br = 255; br >= 0; br--){
  for (int i = 0; i < 3; i++){
  leds[i] = CRGB::White;
  leds[i].fadeLightBy(br);
  }
  FastLED.show();
 }
 flag = 2;
}

 

rkit
Offline
Зарегистрирован: 23.11.2016

Продолжительность процесса вообще нигде не контролируется. Нет смысла чинить фундаментально нерабочий код.

azalis
Offline
Зарегистрирован: 02.05.2021

Смысл скетча следующий: имеется темный коридор, проход контролирует сенсор VL53L1X. На потолке вдоль коридора параллельно соединенные адресные ленты. Когда появляется движение, над ним зажигается пятно и следует за передвижением. Вот этот фрагмент - попытка плавно сдвинуть пятно.

azalis
Offline
Зарегистрирован: 02.05.2021

Или хотя бы подскажите как реализовать именно плавный белый бегущий огонь на адресной ленте, через leds[].fadeLightBy() как то не очень получается...

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

Так если ты даже такую чепуху ни сам написать, ни с либки зацепить не можно - это же чем тебе поможет?! Безнадега. Ну глянь тут http://arduino.ru/forum/proekty/pokhvalimsya-khudozhestvennoi-samodeyatelnostyu-na-ws2812 И бегают и блымают. Но видно не для тебя это

azalis
Offline
Зарегистрирован: 02.05.2021

Я вообще-то помощи попросил, по скетчу разве не видно, что уровень 0+? Это для тебя чепуха, а я только познаю. Первые шаги всегда сложные, много не понятного, потому и написал, что не получается... А тут сразу- безнадёга... 

rkit
Offline
Зарегистрирован: 23.11.2016

Может быть, для первых шагов нужно выбрать что-нибудь попроще?

sadman41
Offline
Зарегистрирован: 19.10.2016

Что такое "плавный сдвиг"? Я вот из приведенного кода абсолютно ничего не понял. 

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

Человек пытается управлять каждым светодиодом по отдельности. 

azalis
Offline
Зарегистрирован: 02.05.2021

Горят три светодиода, крайний левый начинает медленно гаснуть, справа от этих трёх начинает медленно зажигаться. Происходит смещение с фейдом. Можно сказать бегущие огни из трёх светодиодов с плавным угасанием хвоста и плавным зажиганием головы.

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

Как делаются мультфильмы знаете? Ряд быстро сменяемых статичных кадров создают впечатление движения. Кто вам не дает сделать так же?

Формируете кадр и выводите его на ленту
01232100000
Формируете новый кадр и выводите его на ленту
00123210000
Формируете новый кадр и выводите его на ленту
00012321000
И так далее

Здесь для наглядности, каждая цифра - светодиод, значение - условное значение яркости, 0 - светодиод погашен, 3 - светодиод горит максимальной яркостью, промежуточные значения - соответственно, промежуточная яркость. В итоге вы получите бегущий огонь с плавных розжигом впереди и плавным угасанием сзади

rkit
Offline
Зарегистрирован: 23.11.2016
#include <FastLED.h>

#define NUM_LEDS 8
#define DATA_PIN A3
CRGB leds[NUM_LEDS];

constexpr int16_t 
  tscale = 200,
  sin_scale = 4,
  downscale = tscale / (256 / sin_scale);

void setup() {
  FastLED.addLeds<WS2812B, DATA_PIN, GRB>(leds, NUM_LEDS);
}

void loop() { 
  auto t = millis();
  int16_t offset = t % ((NUM_LEDS + sin_scale) * tscale);
  for (int8_t i; i < NUM_LEDS; i++) {
    int16_t cycle = ((NUM_LEDS - i - sin_scale * 2) * tscale + offset) / downscale;
    if (cycle >= 0 && cycle < 256) {
      leds[i] = 0xFF1493;
      leds[i].nscale8(quadwave8(cycle)/4);
    } else {
      leds[i] = 0;
    }
  }
  FastLED.show();
}

Как-то так. Ошибки округления больно большие получаются, но тут уж что поделаешь с авр.