2014-11-03 1 views
0

간단한 LCD 디스플레이 예제를 this guide에서 만들었습니다. 작동 후 나는 그걸 가지고 놀고 싶습니다. 이 화면의 fps를 계산하는 프로그램을 작성했습니다. 가장 큰 문제는 Arduino가 얼마나 느린 지입니다.Arduino lcd fps 이상한 동작

프로그램 코드는 여기에 있습니다 :

// 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 LCD 디스플레이에서 300,000fps 이상을 처리 할 수 ​​있다는 것을 기뻤습니다.

그러나 초 수가 지나면 32 초 (매직 넘버) fps는 값 124,185에서 멈추고 이후에는 변경되지 않습니다.

왜 그런지 알면 누군가에게 설명해주십시오. 나는 fps (초당 0으로 설정 됨)가 멈추고 초가 계속 변하는 이유를 알지 못합니다.

나는 어떤 일이 발생했는지 보여주는 비디오가 있습니다.

// 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; 
} 

을 그리고 그것은 더 악화 : ahaltindis이 제안 Video

그런 다음,이에 코드를 변경 video

+0

동영상은 https://www.youtube.com/watch?v=HacKep-U_CY –

+0

입니다. 디스플레이 fps 전에 lcd.clear()로 lcd를 청소하십시오. 수정 될 수 있습니다. – ahaltindis

+0

나는 그것을했다. 그러나 도움이되지 않았다. 비디오 : [link] (https://www.youtube.com/watch?v=J9KwaYnJEus) –

답변

2

내가 내 아두 이노 우노와 코드를 시도했다. 하지만 lcd.print 대신 Serial.print을 사용했습니다. 그것은 같은 방식으로 행동했습니다. 초가 32를 치면 직렬 모니터가 열중합니다.

그런 다음 lastMillis을 정수로 정의한 것을 발견했습니다. arduino (atmega) 정수는 16 비트 값을 유지하므로 -32,768 ~ 32,767 범위의 값을 저장할 수 있습니다. millis 함수가 32,767 (32 초)에 도달하면 arduino는 lastMillis의 값을 -32,768로 설정합니다.

millis()lastMillis의 차이가 항상 1000보다 커지기 때문에 if 블록은 항상 true를 반환합니다. 따라서 표시되는 값이 1이고 그 이유는 lcd가 32 초.

변경해야 할 일은 lastMillis 유형을 long으로 변경하는 것입니다.

long lastMillis = 0; 
+0

고맙습니다. 당신이 그것을 설명하고 난 후에 나는 그것에 대해 생각하지 않았다는 것을 믿을 수 없다. –

0

한번에 변경

int lastMillis = 0; 

unsigned int lastMillis = 0; 

에 나를 당신이 원래 코드가

를 작동 할 수 있도록 하나 다시 오버플로하는 int 부호를 사용하는 경우 을 어떻게되는지 알려