Бегущая строка, можно ли убрать инерцию.
- Войдите на сайт для отправки комментариев
Чт, 18/03/2021 - 19:10
Не знаю в ту ли ветку задаю вопрос, но попробую. Есть у меня часы с бегущей строкой на адресных светодиодных матрицах 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 или еще как? Или невозможно и надо смириться?
Может быть стоит очищать матрицу перед выводом каждого кадра? Попробуйте вставить в строку 40
FastLED.show();
Вообще ничего не загорается.
Вот так попробовал. Не спасло. Все равно по 2 горят в какой-то момент.
Все равно по 2 горят в какой-то момент.
тут все очень просто - если вы зажигаете по одному, а горят по два - либо у вас в глазах двоится. либо ищите ошибку в коде
Поиграть с 30 строкой
Вообще ничего не загорается.
Вот так попробовал. Не спасло. Все равно по 2 горят в какой-то момент.
Вот так не работает?
Проблема, видимо, в том, что у вас в какой-то момент накладываются старый и новый кадры. Соответственно, перед выводом каждого следующего кадра нужно очистить матрицу
Я повозился, думаю может у моей матрицы слишком долгое время зажигания\гашения светодиода, а у той, что я в метро видел, оно почти моментальное.
Адресные светодиоды загораются строго последовательно по очереди, поэтому новый кадр отрисовывается поверх старого с заметным лагом. Бегущие строки в метро построены на обычных светодиодах и работают совсем по другому принципу
Адресные светодиоды загораются строго последовательно по очереди, поэтому новый кадр отрисовывается поверх старого с заметным лагом.
заметный лаг - это 30 мкс на пиксель? :) Напомню, что у ТС на картинке светится всего ОДНА точка
ага, и вот именно в тех матрицах лаг очень заметен - достаточно навести видеокамеру из мобильника, чтобы увидеть, как текст идет волнами - там используется некий тип динамической индексации.
заметный лаг - это 30 мкс на пиксель? :) Напомню, что у ТС на картинке светится всего ОДНА точка
ну дык и об инерционности зажигания/гашения светодиодов тоже рассуждать неверно ))
ага, и вот именно в тех матрицах лаг очень заметен - достаточно навести видеокамеру из мобильника, чтобы увидеть, как текст идет волнами - там используется некий тип динамической индексации.
Вот как раз и не заметен, если для его обнаружения нужна камера ))