2016-08-14 325 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 –