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