Бегущая строка, можно ли убрать инерцию.

Xomyc
Offline
Зарегистрирован: 10.04.2020

Не знаю в ту ли ветку задаю вопрос, но попробую. Есть у меня часы с бегущей строкой на адресных светодиодных матрицах 16х16 4 штуки в ряд. Так вот когда бежит строка она как бы размазывается. Буква шириной в 2 точки видится в 3 точки. А вот скажем в метро бегущая строка не размазывается. Буква шириной 2 точки так и бежит как 2 точки. Вот я самый простенький код написал, чтобы одна точка бегала и она тоже размазывается.

#include <FastLED.h>
#include "font12.h"

#define MATRIX_WIDTH 64 //ширина матрицы               
#define MATRIX_HEIGHT 16 //высота матрицы
#define COLOR_ORDER GRB
#define NUM_LEDS MATRIX_WIDTH * MATRIX_HEIGHT
#define FASTLED_INTERRUPT_RETRY_COUNT 0
#define FASTLED_ALLOW_INTERRUPTS 0
#define FASTLED_ESP8266_RAW_PIN_ORDER
#define DATA_PIN 4  //пин матрицы

CRGB leds[NUM_LEDS];

int BRIGHTNESS;
int Xs = 0;
unsigned long tt2 = 0;
CHSV black = CHSV(0, 0, 0);
CHSV mcolor = CHSV(150, 255, 255);

void setup() {
  pinMode(DATA_PIN, OUTPUT);
  FastLED.addLeds<WS2812B, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS);
  Serial.begin(115200);
  BRIGHTNESS = 20;
  FastLED.setBrightness(BRIGHTNESS);
}

void loop() {
  if (millis() - tt2 > 10){
    printText(Xs);
    Xs++;
    if (Xs >= MATRIX_WIDTH) {Xs = 0;}
    tt2 = millis();
  }
}

void printText(int p) {
  FastLED.clear();
  //int Xs = 0;
  int Ys = 0;
  setPixel(p, Ys, mcolor);
  FastLED.show();
}

void setPixel(int X, int Y, CHSV color){
   int curLed;
   if (X%2 == 0){
      curLed = MATRIX_HEIGHT*X+Y;
   }
   else {
      curLed = (MATRIX_HEIGHT*(X+1)-1)-Y; 
   }
   leds[curLed] = color;
}

Вопрос - можно это как-то исправит? Может за счет настроек цвета FastLED или еще как? Или невозможно и надо смириться?

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

Может быть стоит очищать матрицу перед выводом каждого кадра? Попробуйте вставить в строку 40

FastLED.show();

Xomyc
Offline
Зарегистрирован: 10.04.2020

Вообще ничего не загорается.

void printText(int p) {
  FastLED.clear();
  int Ys = 0;
  setPixel(p, Ys, mcolor);
  FastLED.show();
  setPixel(p, Ys, black);
  FastLED.show();
  delay(10);
}

Вот так попробовал. Не спасло. Все равно по 2 горят в какой-то момент.

b707
Offline
Зарегистрирован: 26.05.2017

Xomyc пишет:

Все равно по 2 горят в какой-то момент.

тут все очень просто - если вы зажигаете по одному, а горят по два - либо у вас в глазах двоится. либо ищите ошибку в коде

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Поиграть с 30 строкой

  if (millis() - tt2 > ???){

 

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

Xomyc пишет:

Вообще ничего не загорается.

void printText(int p) {
  FastLED.clear();
  int Ys = 0;
  setPixel(p, Ys, mcolor);
  FastLED.show();
  setPixel(p, Ys, black);
  FastLED.show();
  delay(10);
}

Вот так попробовал. Не спасло. Все равно по 2 горят в какой-то момент.

Вот так не работает?

void printText(int p) {
  FastLED.clear();
  FastLED.show();
  setPixel(p, Ys, black);
  FastLED.show();
  delay(10);
}

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

Xomyc
Offline
Зарегистрирован: 10.04.2020

Я повозился, думаю может у моей матрицы слишком долгое время зажигания\гашения светодиода, а  у той, что я в метро видел, оно почти моментальное.

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

Адресные светодиоды загораются строго последовательно по очереди, поэтому новый кадр отрисовывается поверх старого с заметным лагом. Бегущие строки в метро построены на обычных светодиодах и работают совсем по другому принципу

b707
Offline
Зарегистрирован: 26.05.2017

v258 пишет:

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

заметный лаг - это 30 мкс на пиксель? :) Напомню, что у ТС на картинке светится всего ОДНА точка

 

Цитата:
Бегущие строки в метро построены на обычных светодиодах и работают совсем по другому принципу

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

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

b707 пишет:

заметный лаг - это 30 мкс на пиксель? :) Напомню, что у ТС на картинке светится всего ОДНА точка

ну дык и об инерционности зажигания/гашения светодиодов тоже рассуждать неверно ))

b707 пишет:

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

Вот как раз и не заметен, если для его обнаружения нужна камера ))