我用本指南做了一个简单的液晶显示例子。起作用后,我想玩它。我写了一个程序来计算这个屏幕的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液晶显示器上做超过30万fps。
但是在秒数超过32秒(魔法数)之后,fps冻结在值124,185,之后就不会改变。
如果有人知道为什么会这样,请解释一下。我不知道为什么fps (设置为每秒0)会冻结,而秒在不断变化。
我有一段视频显示了发生了什么。视频
然后,正如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;
}更糟的是:视频
发布于 2014-11-03 20:03:27
我用我的arduino uno尝试了你的代码。但我用的是Serial.print而不是lcd.print。它的行为也是一样的。当sec击中32时,串行监视器就会发疯。
然后,我发现您将lastMillis定义为整数。在arduino(atmega)中,整数保持16位值,这意味着它可以将值存储在-32,768到32,767之间。当millis函数达到32,767(32秒)时,arduino将您的lastMillis值设置为-32,768。
因此,您的if块在32秒后总是返回true,因为millis()和lastMillis的差值总是大于1000。这就是为什么你看到的唯一值是1,这也是为什么你的lcd不能在32秒后很好地响应打印请求。
唯一应该做的更改是,将lastMillis类型更改为long。
long lastMillis = 0;发布于 2014-11-03 22:32:41
试着改变
int lastMillis = 0;至
unsigned int lastMillis = 0;让我知道如果你使用一个无符号的int会发生什么,你会溢出回一个,这样你的原始代码就可以工作了。
https://stackoverflow.com/questions/26714416
复制相似问题