Рассчитать длину буфера для светодиодной матрицы 16x8 - PullRequest
0 голосов
/ 02 ноября 2018

Я работаю над проектом с Adafruit 8x16 LED Matrix FeatherWing , который я хочу использовать для отображения прокручиваемого текста. Глядя на пример кода, предоставляемого через библиотеку Arduino , мне удалось найти следующее:

void updateDisplay()
{
    for (int8_t x = 16; x >= -36; x--)
    {
        matrix.clear();
        matrix.setCursor(x, 0);
        matrix.print("World");
        // matrix.print(displayText);
        matrix.writeDisplay();
        delay(100);
    }
}

Ничего особенного отличается от примера кода, за исключением того, что я установил x на 16, поэтому сообщение начинается с дисплея слева.

Если я правильно понимаю, значение -36 - это количество пикселей, необходимое для прокрутки текста с другой стороны экрана. То есть буфер для "World" имеет ширину 36 пикселей. Если это так, как я могу определить размер буфера для произвольной строки?

Я предполагаю, что есть метод, который я могу написать (или существует), который может рассчитать его, или, возможно, библиотека уже знает эту информацию, и в этом случае мне нужен способ доступа к ней.

Вы можете видеть, что у меня есть переменная displayText, которую я собираюсь обновлять с продолжительностью, от 0 секунд до 365 дней (и далее), поэтому мне нужно вычислить эта ширина каждый раз при обновлении значения displayText - разве есть более простой способ решить эту проблему?

Я приветствую ваш совет, спасибо.

Ответы [ 2 ]

0 голосов
/ 06 ноября 2018

Большое спасибо Адаму Бахману за помощь в поиске ответа на этот вопрос.

Ниже приведен его код, демонстрирующий использование метода getTextBounds() для расчета размера буфера (и странного способа, которым он может вам возвращать несколько параметров):

#include <Adafruit_GFX.h>
#include <Adafruit_LEDBackpack.h>

/************************ LED Matrix *******************************/
Adafruit_8x16minimatrix matrix = Adafruit_8x16minimatrix();

void setup() {
Serial.begin(115200);
while(! Serial);
}

void loop() {
// void Adafruit_GFX::getTextBounds(const char *str, int16_t x, int16_t y,
//     int16_t *x1, int16_t *y1, uint16_t *w, uint16_t *h) {
int16_t x1, y1;
uint16_t w, h;

matrix.getTextBounds((const char*)"my string is here", 0, 0, &x1, &y1, &w, &h);

Serial.print("x1="); Serial.print(x1);
Serial.print(", y1="); Serial.print(y1);
Serial.print(", w="); Serial.print(w);
Serial.print(", h="); Serial.print(h);
Serial.println(" ");
delay(1000);
}

Вывод которого выглядит так:

x1=0, y1=0, w=6, h=136
x1=0, y1=0, w=6, h=136
x1=0, y1=0, w=6, h=136
x1=0, y1=0, w=6, h=136
x1=0, y1=0, w=6, h=136
x1=0, y1=0, w=6, h=136

В данном случае, поскольку он использует вращение по умолчанию, нам нужно значение h, но в моем случае, поскольку я установил matrix.setRotation(1);, вместо него я бы использовал w.

0 голосов
/ 02 ноября 2018

Вы можете найти длину строки, используя = StringA.length длина Я ();

https://www.arduino.cc/en/Tutorial/StringLength

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

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

Я бы предположил, что пробелы между символами включены в шрифт, если нет, вам нужно будет их добавить.

Тревор

...