Библиотека microLED v3.5. Работа с strip.fill()

_Максим_

✩✩✩✩✩✩✩
19 Ноя 2020
4
0
Здравствуйте, хочу сделать режим светомузыки "заполнение ленты в зависимости от громкости звука" от центра ленты к краям, использую библиотеки microLED и Volanalyzer. С 25 по 50 пиксель заполнение работает идеально а в обратную сторону с 24 по 0 не хочет. Помогите пожалуйста.
C++:
//https://kit.alexgyver.ru/tutorials/microphone/
//https://alexgyver.ru/microled/
//AR-Gain 5+

#define STRIP_PIN 4     // пин ленты
#define NUMLEDS 50      // кол-во светодиодов
#define COLOR_DEBTH 3
#include <microLED.h>   // подключаем библу
#include "VolAnalyzer.h"
VolAnalyzer analyzer(A0);
microLED< NUMLEDS, STRIP_PIN, -1, LED_WS2812, ORDER_RGB> strip;
int i = 0;


void setup() {
strip.setBrightness(255);
  Serial.begin(9600);
  //analogReference(DEFAULT);
  //analyzer.setVolK(1);        // снизим фильтрацию громкости (макс. 31)
  analyzer.setVolMax(50);     // выход громкости 0-255
  //analyzer.setPulseMax(200);   // сигнал пульса
  //analyzer.setPulseMin(200);
}

void loop() {
analyzer.tick();
//for (int r = 0; r < 255; r++){
analyzer.tick();
strip.show();
analyzer.tick();
//Serial.println(analyzer.getVol());
analyzer.tick();
int i = map(analyzer.getVol(), 0, 50, 25, 50);
int t = map(analyzer.getVol(), 0, 50, 24, 0);
Serial.println(i);
analyzer.tick();
strip.fill(25, i, mWheel8(100));  
strip.show();
strip.fill(25, t , mWheel8(100));  
strip.show();
strip.fill(25, i , mWheel8(100, 0 ));  
strip.show();
strip.fill(24, t , mWheel8(100, 0 ));  
strip.show();
}
 
Изменено:

Геннадий П

★★★★★★✩
14 Апр 2021
1,969
632
44
Для начала обычным циклом позвполняй, дабы исключить неправильную обработку данных.
И да, колво светодиодов 50, а работаешь с 51 (0..50)
 

bort707

★★★★★★✩
21 Сен 2020
3,056
910
@_Максим_, в методе fill первый индекс должен быть меньше второго. Так что для верхнец части вот это правильно
C++:
strip.fill(25, i , mWheel8(100));
а для нижней надо так:
C++:
strip.fill(t, 24 , mWheel8(100));
 
Изменено:
  • Лойс +1
Реакции: poty

_Максим_

✩✩✩✩✩✩✩
19 Ноя 2020
4
0
@bort707,
Вот так начало работать но скорость обработки и реакции уменьшилась. Добавил Delay(1). Спасибо.
C++:
//https://kit.alexgyver.ru/tutorials/microphone/
//https://alexgyver.ru/microled/
//AR-Gain 5+

#define STRIP_PIN 4     // пин ленты
#define NUMLEDS 50      // кол-во светодиодов
#define COLOR_DEBTH 3
#include <microLED.h>   // подключаем библу
#include "VolAnalyzer.h"
VolAnalyzer analyzer(A0);
microLED< NUMLEDS, STRIP_PIN, -1, LED_WS2812, ORDER_RGB> strip;


void setup() {
strip.setBrightness(255);
  Serial.begin(9600);
  analyzer.setVolMax(50);     // выход громкости 0-255
}

void loop() {
analyzer.tick();
strip.show();
analyzer.tick();
//Serial.println(analyzer.getVol());
analyzer.tick();
int i = map(analyzer.getVol(), 0, 50, 25, 50);
int t = map(analyzer.getVol(), 0, 50, 24, 0);
Serial.println(t);
analyzer.tick();
strip.fill(25, i, mWheel8(100));
strip.show();
strip.fill(t, 24 , mWheel8(100));
strip.show();
delay(1);
strip.fill(25, i , mWheel8(100, 0 ));
strip.show();
strip.fill(t, 24 , mWheel8(100,0 ));
strip.show();
}
@Геннадий П, Обработка данных идет хорошо поставил delay(1) и все заработало. Спасибо.
 

poty

★★★★★★✩
19 Фев 2020
3,230
940

@_Максим_, метод fill работает с памятью, отображение памяти на ленту осуществляется методом show. В связи с этим пересмотрите свой код. В каждом цикле должно быть:
1. Расчёт новых значений i и t, сравнение с предыдущими для определения необходимости перерисовки ленты.
2. В случае необходимости: очистка (чёрным цветом, а не вызовом функции преобразования цвета с нулевой яркостью) всей ленты (а не пары кусочков) единым вызовом fill + отрисовка одним вызовом fill обеих сторон (от t до i) горящего участка. В этом случае один раз вызывается show.
3. Один вызов tick.