Arduino lcd fps奇怪的行为

时间:2014-11-03 12:31:23

标签: arduino lcd

我从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

2 个答案:

答案 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,你将溢出回一个,以便你的原始代码可以工作