2016-08-14 2 views
2

나는 LCD 디스플레이를 운영하는 라즈베리 파이를 가지고 있습니다. 아래의 Python 스크립트가 디스플레이에 시간을 표시한다는 것을 알았지 만 Pi의 시간과 LCD 사이에 거의 1 초의 지연이 있음을 알았습니다.LCD 디스플레이에 라즈베리 파이 시계 표시

코드의 마지막 줄 (sleep (1))을 제거하려고 시도했지만 지연이 제거되었지만 LCD가 많이 깜박입니다.

누구나 마지막 줄의 기능을 설명하고 지연없이 LCD에 시간을 표시 할 수있는 방법이 있습니까?

감사합니다.

#!/usr/bin/python 

import RPi.GPIO as GPIO 
from Adafruit_CharLCD import Adafruit_CharLCD 
from subprocess import * 
from time import sleep, strftime 
from datetime import datetime 

lcd = Adafruit_CharLCD() 

lcd.begin(16,1) 

GPIO.setup(18, 0) 
GPIO.output(18, 1) 

while 1: 
      lcd.clear() 
      lcd.message(datetime.now().strftime('%b %d %H:%M:%S\n')) 
      sleep(1) 

답변

1

sleep (1)은 프로그램이 1 초 동안 "절전"하도록 지시합니다. 이것은 사실 매우 중요합니다. 왜냐하면 while 루프 (항상 true)가 매초마다 한 번만 실행되기 때문입니다. sleep (1) 라인을 없애면 while 루프가 절대로 휴식을 취하지 않고 컴퓨터가 무한정 빨리 진행될 수 있음을 의미합니다. 시도 할 수있는 한 가지 방법은 수면 (1)을 약간 더 작은 값으로 줄이는 것입니다. 예를 들어 sleep (0.1)을 지정할 수 있습니다.

잠자기 시간을 줄이면 시계가 더 자주 업데이트됩니다. 지금 잠을 잘 때마다 (1) 시계가 1 초에 한 번씩 업데이트되어 완벽한 의미를 갖습니다. 그러나 수면 (0.1)으로 초마다 10 번 시계를 업데이트하여 정확도를 높일 수 있습니다. 이 모든 것이 의미가있는 경우 알려주십시오.

깜박임은 프로그램이 여러 번 디스플레이를 지우고 다시 채우는 것이 원인 일 수 있습니다.

편집 : 문서() 함수가 유효 수면에 진수 값을 보내는 것을 제안

편집 2 : 전용 화면을 새로하는 방법에 대한 여분의 비트 경우 두 번째

from datetime import datetime 
from time import sleep, mktime 

dti = mktime(datetime.now().timetuple()) 
while 1: 
    ndti = mktime(datetime.now().timetuple()) 
    if dti < ndti: 
     dti = ndti 
     lcd.clear() 
     lcd.message(datetime.now().strftime('%b %d %H:%M:%S\n')) 
     sleep(0.95) 
    else: 
     sleep(0.01) 
의 차례에서 바로

본질적으로 작동 원리는 다음과 같습니다.

프로그램을 시작할 때 정수 형식 (Google dti)으로 날짜 시간을 만듭니다. "정수 형식"이란 임의의 시작 날짜 (예 : 1970-01-01 00:00:00)에서 모든 초를 더하고 시간의 참조로 사용하는 것을 의미합니다. 예를 들어 오늘 (2016-08-18 00:00:00)은 1970 년 이후 1471478400 초와 비슷할 수 있습니다. 그 가치가 생기면 루프가 시작됩니다.

루프의 시작 부분에서 루프를 마지막으로 실행 한 이후로 현재 위치를 추적하기 위해 항상 새로운 datetime 정수 (ndti)를 만듭니다. 이 정보를 편리하게 사용하여 if 조건부로 넘어갑니다. if 새로운 날짜/시간 정수 (ndti)가 이전의 datetime 정수 (dti)와 비교하여 1 초 완전히 변경되었다는 것은 분명히 1 초가 지난 것입니다. 그 이후로 이제 datetime에 참조 시간 문자열 정수를 설정합니다 (dti = ndti). 그런 다음 메시지 (lcd.clear()lcd.message())를 표시합니다. 그 후 우리는 1 초 미만의 시간 동안 프로그램을 잠자 게됩니다 (sleep(0.95)). 어떤 컴퓨터는 정확히 할당 된 시간보다 더 잠을 잘 수 있기 때문에 쿠폰의 정확도가 0.05 초가됩니다. if 조건부로 실행 중이며 아직 2 초가 지나지 않은 경우 잠시 후 잠자기 후 잠시 기다려야합니다 (sleep(0.01)).

모든 것이 정확하게 계획대로 진행된다면 매 초마다 프로그램이 LCD 화면을 한 번만 새로 고쳐야하며 그 중 약 95 %가 잠자기 상태 여야하므로 우리 바퀴가 돌지 않습니다. 그럴 이유가 없어. 또 다른 부분은 우리의 else 절이 프로그램에 0.01 초 동안 잠자기 상태를 알려주기 때문에 대부분의 경우 시계가 0.01 초의 오차로 정확하지 않을 수 있다는 것을 의미합니다. 이것은 인간이 거의 탐지 할 수 없을만큼 충분히 낮습니다. 이 모든 것이 의미가있는 경우 알려주십시오.

나는 (단순 인쇄 문을 가진 LCD 물건을 대체) 명령 줄을 통해 이것을 테스트는 ( http://time.is/)

그것을 밖으로 시도하고 당신을 위해 작동하는지 다른 시간 추적 자원과 정확히 줄 듯 .

+0

아, 고맙습니다, 지금 무슨 일이 벌어지고 있는지 봅니다. 수면을 줄이는 것이 도움이되었지만 지연을 근절하지 못했고 '깜박임'도 증가했습니다. 거기에 시간을 '인쇄'하고 다음 새로 고침에 의존하지 않고 시계를 표시하는 방법이 있습니까? – David

+0

디스플레이의 재생 빈도로 시간 업데이트를 편안하게 정렬 할 수있는 방법이 있는지 하드웨어를 살펴 보는 것이 좋습니다. @David –

+0

1 초 틱을 조절하는 방법은 여기에서 확인하십시오. http://stackoverflow.com/questions/38874597/how-to-make-proper-server-tick-with-python/38874657#38874657 –