2016-08-14 5 views
2

私はラズベリーパイに液晶ディスプレイを搭載しています。私はディスプレイ上に時間を表示するPythonスクリプトを見つけましたが、私はPiの時間とLCDの間にほぼ1秒の遅れがあることに気付きました。液晶ディスプレイにラズベリーパイクロックを表示

コードの最後の行(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)が1秒に1回だけ実行されることを意味するためです。 sleep(1)行を削除すると、whileループは決して休憩を取らず、コンピュータが無限に行くことができるように速く実行されます。あなたが試みるかもしれない1つの事は、ちょうどより小さな値に睡眠(1)を減らすことです。たとえば、スリープ(0.1)を指定することができます。

スリープ時間を短縮すると、時計が頻繁に更新されることを意味します。今すぐスリープ状態で(1)クロックが1秒に1回更新され、完璧な意味があります。ただし、クロックを毎秒10回スリープ(0.1)で更新すると、精度が向上する可能性があります。これがすべて意味があるかどうか私に教えてください。

ちらつきは、プログラムが表示を1秒間に何回もクリアして再投入していることが原因と考えられます。

編集:ドキュメント()関数が有効であるスリープ状態に小数点以下の値を送信することを示唆している

編集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新しい日時の整数(ndti)は、以前の日時の整数(dti)と比べて1秒だけ完全に変更されています。つまり、明らかに1秒が経過しています。それが当てはまるので、ここで参照日時の整数をdatetimeに設定します(dti = ndti)。メッセージ(lcd.clear()lcd.message())を表示します。その後、1秒未満でプログラムを眠ります(sleep(0.95))。コンピュータによっては、正確に割り当てられた時間以上に眠る可能性があるので、これは0.05秒のクッションを不正確にします。 ifを実行していて2番目がまだ経過していない場合は、短時間スリープ状態になり、1秒が実際に経過するまで繰り返します(sleep(0.01))。

すべてが計画どおりに進んでいれば、1秒ごとに液晶画面を1回だけリフレッシュする必要があります。また、その秒の約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 –

関連する問題