计算 16x8 LED 矩阵的缓冲区长度

Calculate length of buffer for 16x8 LED matrix

我正在做一个 Adafruit 8x16 LED Matrix FeatherWing, which I want to use to display scrolling text. Looking at the example code provided via the Arduino library 的项目,我设法想出了以下内容:

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 值时都需要计算此宽度 - 除非有更简单的方法来解决此问题?

欢迎您的指教,谢谢。

您可以使用以下方法找到字符串的长度 长度A=StringA.length();

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

我假设字体是固定宽度的,所以将字体宽度乘以字符串长度并添加一个值以考虑字符串前后的任何空格(如果需要)。

如果您没有或没有在字符串之间发送清除命令,您通常会添加足够的空格以清除下一个字符串开头的显示。

我想字符之间的空格包含在字体中,否则您需要添加它们。

特雷弗

非常感谢 Adam Bachman 帮助我找到了这个问题的答案。

以下是他的代码,演示了如何使用 getTextBounds() 方法计算缓冲区的大小(以及它能够 return 向您提供多个参数的奇怪方式):

#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 代替。