我正在一个带有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
值更新时计算该宽度-除非有更简单的方法来解决此问题?
我欢迎您的建议,谢谢。
答案 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 }}。