Arduino液晶屏奇怪的行为

我从本指南中制作了一个简单的液晶显示器示例。 它工作后,我想玩它。 我写了一个程序来计算这个屏幕的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)可能会冻结,而秒数则会不断变化。

我收到一个视频,显示发生了什么。 视频

然后,如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;
}

它变得更糟:视频


我用我的arduino uno尝试了你的代码。 但是我使用Serial.print而不是lcd.print 。 它以相同的方式行事。 当sec碰到32时,串口监视器变得疯狂。

然后我发现你把lastMillis定义为一个整数。 在arduino(atmega)整数保持16位值,这意味着它可以存储值范围-32,768至32,767。 当millis函数达到32,767(32秒)时,arduino lastMillis您的lastMillis的值设置为-32,768。

所以你的if块在32秒后总是返回true,因为millis()lastMillis将总是大于1000.这就是为什么你看到的唯一值是1,这也是为什么你的LCD在32秒后不能很好地响应打印请求。

你应该做的唯一改变是,改变你的lastMillis类型。

long lastMillis = 0;

尝试改变

int lastMillis = 0;

unsigned int lastMillis = 0;

让我知道会发生什么如果使用unsigned int,则会溢出回到原来的代码

链接地址: http://www.djcxy.com/p/78601.html

上一篇: Arduino lcd fps strange behavior

下一篇: Strange Arduino Behavior with jumpers