Бегущая строка, можно ли убрать инерцию.
- Войдите на сайт для отправки комментариев
Чт, 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();
Вообще ничего не загорается.
void printText(int p) { FastLED.clear(); int Ys = 0; setPixel(p, Ys, mcolor); FastLED.show(); setPixel(p, Ys, black); FastLED.show(); delay(10); }Вот так попробовал. Не спасло. Все равно по 2 горят в какой-то момент.
Все равно по 2 горят в какой-то момент.
тут все очень просто - если вы зажигаете по одному, а горят по два - либо у вас в глазах двоится. либо ищите ошибку в коде
Поиграть с 30 строкой
if (millis() - tt2 > ???){Вообще ничего не загорается.
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); }Проблема, видимо, в том, что у вас в какой-то момент накладываются старый и новый кадры. Соответственно, перед выводом каждого следующего кадра нужно очистить матрицу
Я повозился, думаю может у моей матрицы слишком долгое время зажигания\гашения светодиода, а у той, что я в метро видел, оно почти моментальное.
Адресные светодиоды загораются строго последовательно по очереди, поэтому новый кадр отрисовывается поверх старого с заметным лагом. Бегущие строки в метро построены на обычных светодиодах и работают совсем по другому принципу
Адресные светодиоды загораются строго последовательно по очереди, поэтому новый кадр отрисовывается поверх старого с заметным лагом.
заметный лаг - это 30 мкс на пиксель? :) Напомню, что у ТС на картинке светится всего ОДНА точка
ага, и вот именно в тех матрицах лаг очень заметен - достаточно навести видеокамеру из мобильника, чтобы увидеть, как текст идет волнами - там используется некий тип динамической индексации.
заметный лаг - это 30 мкс на пиксель? :) Напомню, что у ТС на картинке светится всего ОДНА точка
ну дык и об инерционности зажигания/гашения светодиодов тоже рассуждать неверно ))
ага, и вот именно в тех матрицах лаг очень заметен - достаточно навести видеокамеру из мобильника, чтобы увидеть, как текст идет волнами - там используется некий тип динамической индексации.
Вот как раз и не заметен, если для его обнаружения нужна камера ))