我从this guide制作了一个简单的lcd显示示例。 工作之后,我想玩它。我写了一个程序来计算这个屏幕的fps。最大的问题是Arduino有多慢。
程序代码在这里:
// include the library code:
#include <LiquidCrystal.h>
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);
int lastMillis = 0;
long fps = 0;
void setup() {
lcd.begin(16, 2);
lcd.print("seconds ");
lcd.setCursor(0, 1);
lcd.print("fps ");
}
void loop() {
if ((millis() - lastMillis) > 1000) {
lcd.setCursor(8, 0);
lcd.print(millis()/1000);
lcd.setCursor(4, 1);
lcd.print(fps);
fps = 0;
lastMillis = millis();
}
fps = fps + 1;
}
它有效。我很高兴知道Arduino可以在小型16x2液晶显示器上运行超过300,000 fps。
但是在秒数超过32秒(幻数)后,fps会冻结在值124,185,并且在此之后永远不会改变。
如果有人知道为什么会这样,请解释一下。我不知道为什么fps(每秒设置为0)可能会冻结,而秒数会不断变化。
我收到了一段视频,展示了会发生什么。 Video
然后,正如ahaltindis建议的那样,我将代码更改为:
// include the library code:
#include <LiquidCrystal.h>
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);
int lastMillis = 0;
long fps = 0;
void setup() {
lcd.begin(16, 2);
}
void loop() {
if ((millis() - lastMillis) > 1000) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("seconds ");
lcd.setCursor(0, 1);
lcd.print("fps ");
lcd.setCursor(8, 0);
lcd.print(millis()/1000);
lcd.setCursor(4, 1);
lcd.print(fps);
fps = 0;
lastMillis = millis();
}
fps = fps + 1;
}
情况变得更糟:video
答案 0 :(得分:2)
我用我的arduino uno尝试了你的代码。但我使用的是Serial.print
而不是lcd.print
。它以同样的方式行事。当秒击中32时,串口监视器变得疯狂。
然后我发现你将lastMillis
定义为整数。在arduino(atmega)中,整数保持16位值,这意味着它可以存储-32,768到32,767范围内的值。当millis函数达到32,767(32秒)时,arduino将lastMillis
的值设置为-32,768。
所以你的if块在32秒后总是返回true,因为millis()
和lastMillis
的差异总是大于1000.这就是为什么你看到的唯一值是1,这也是你的原因在32秒后,lcd无法很好地响应打印请求。
您应该做的唯一更改是将lastMillis
类型更改为长。
long lastMillis = 0;
答案 1 :(得分:0)
尝试更改
int lastMillis = 0;
要
unsigned int lastMillis = 0;
让我知道会发生什么 如果你使用unsigned int,你将溢出回一个,以便你的原始代码可以工作