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

时间:2018-11-02 08:24:55

标签: arduino adafruit

我正在一个带有Adafruit 8x16 LED Matrix FeatherWing的项目上,我想用它来显示滚动文本。查看通过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值是将文本滚动到显示屏另一侧所需的像素数。也就是说,“世界”的缓冲区为36像素宽。在这种情况下,如何计算任意字符串的缓冲区大小?

我猜想有一种我可以编写(或存在)的方法可以计算它,或者图书馆已经知道此信息,在这种情况下,我需要一种访问它的方法。

您会看到我有一个displayText变量,该变量将以一定的持续时间进行更新,持续时间从“ 0秒”到“ 365天”(甚至更长),所以我需要在每次displayText值更新时计算该宽度-除非有更简单的方法来解决此问题?

我欢迎您的建议,谢谢。

2 个答案:

答案 0 :(得分:1)

您可以使用以下命令找到字符串的长度 LengthA = StringA.length();

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

我假设字体是固定宽度,所以将字体宽度乘以字符串长度,并添加一个值来说明字符串前后是否需要空格。

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

我想字体中包含字符之间的空格,如果没有,则需要添加它们。

特雷弗

答案 1 :(得分:0)

非常感谢Adam Bachman帮助我找到了答案。

以下是他的代码,并演示了如何使用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);,所以我将使用{{1 }}。