2016-08-14 252 views
2

我有一個運行液晶顯示器的樹莓派。我發現下面的Python腳本會在顯示器上顯示時間,但我注意到Pi的時間和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

睡眠(1)指示程序「睡眠」1秒鐘。這實際上非常重要,因爲這意味着while循環(總是爲真)只能每秒運行一次。當你拿走睡眠線(1)時,這意味着while循環從不休息並繼續運行,就像電腦可以無限移動一樣快。你可能會嘗試的一件事就是將睡眠(1)降低到一些較小的值。例如,您可以指定睡眠(0.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) 
之交

實質上,它是如何工作的:

當啓動程序時,以整數形式創建日期時間(我們的變量dti)。 「整數形式」的意思是把某些任意開始日期(例如1970-01-01 00:00:00)的所有秒加起來,並用它作爲時間的參考。例如,今天(2016-08-18 00:00:00)可能是1970年以來的1471478400秒。一旦我們有了這個價值,我們就開始循環。

在循環開始時,我們總是創建一個新的日期時間整數(ndti)來跟蹤自上次運行循環以來我們的位置。有了這個信息,我們跳入if條件。 if與我們的舊日期時間整數(dti)相比,我們的新日期時間整數(ndti)已經完全改變了一秒,那麼這意味着顯然已經過去了一秒。既然如此,我們現在將我們的引用datetime整數設置爲datetime(dti = ndti)。然後我們顯示我們的信息(lcd.clear()lcd.message())。之後,我們將睡眠該程序僅僅不到1秒(sleep(0.95))。由於有些電腦可能睡眠的時間超過了確切的時間,這使得我們0.05秒的坐墊不準確。如果我們正在通過if條件運行,而另一個尚未通過,我們將暫時休眠該程序並繼續重複,直到第二個實際通過(sleep(0.01))。

如果一切都按照計劃進行,那麼對於每一秒我們的程序應該只刷新一次液晶屏幕,它也應該睡眠大約95秒的時間,這樣我們就不會旋轉輪子整個時間沒有理由。另一部分要注意的是,由於我們的else子句告訴程序睡眠0.01秒,這意味着在大多數情況下,我們的時鐘只能以0.01秒的餘量不準確,這非常好。這足夠低,幾乎不可能被人類檢測到。讓我知道這一切是否合理。

我通過命令行測試了這一點(替換用簡單的print語句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 –

相關問題