首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Arduino lcd fps奇怪的行为

Arduino lcd fps奇怪的行为
EN

Stack Overflow用户
提问于 2014-11-03 12:31:22
回答 2查看 824关注 0票数 0

我用本指南做了一个简单的液晶显示例子。起作用后,我想玩它。我写了一个程序来计算这个屏幕的fps。最大的问题是Arduino的速度有多慢。

程序代码在这里:

代码语言:javascript
复制
// 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所建议的,我将代码更改为:

代码语言:javascript
复制
// 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;
}

更糟的是:视频

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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。

代码语言:javascript
复制
long lastMillis = 0;
票数 2
EN

Stack Overflow用户

发布于 2014-11-03 22:32:41

试着改变

代码语言:javascript
复制
int lastMillis = 0;

代码语言:javascript
复制
unsigned int lastMillis = 0;

让我知道如果你使用一个无符号的int会发生什么,你会溢出回一个,这样你的原始代码就可以工作了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26714416

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档