在LCD显示屏上显示Raspberry Pi时钟

时间:2016-08-14 20:10:51

标签: python time raspberry-pi lcd adafruit

我有一个运行LCD显示屏的Raspberry Pi。我发现下面的Python脚本会在显示屏上显示时间,但我注意到Pi的时间和LCD之间有几乎一秒的延迟。

我尝试删除代码的最后一行( sleep(1))并删除了延迟,但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)

2 个答案:

答案 0 :(得分:1)

睡眠(1)指示程序进入"睡眠"持续1秒这实际上非常重要,因为这意味着while循环(始终为true)将每秒只运行一次。当你取走sleep(1)行时,这意味着while循环永远不会休息并继续运行,就像计算机可以无限运行一样快。你可能尝试的一件事就是将睡眠(1)减少到一些较小的值。例如,您可以指定sleep(0.1)

通过减少睡眠时间,这意味着时钟会更频繁地更新。现在睡眠(1)时钟每秒更新一次,这非常有意义。但是,您可以通过使用sleep(0.1)每秒更新10次来提高准确性。如果这一切都有意义,请告诉我。

闪烁可能是因为程序正在清理并重新填充显示器一次这么多次。

编辑:文档建议将十进制值发送到sleep()函数是有效的

编辑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)

从本质上讲,这是如何运作的:

启动程序时,以整数形式创建日期时间(我们的var dti)。通过&#34;整数形式&#34;我的意思是将某个任意开始日期的所有秒数(例如1970-01-01 00:00:00)相加,并将其用作时间参考。例如,今天(2016-08-18 00:00:00)可能是自1970年以来的1471478400秒。一旦我们有了这个值,我们就开始循环。

在循环开始时,我们总是创建一个新的日期时间整数(ndti)来跟踪自上次运行循环以来我们所处的位置。有了这个信息,我们跳进if条件。 if我们的新日期时间整数(ndti)与我们的旧日期时间整数(dti)相比完全改变了一秒钟,这意味着显然已经过了一秒。既然如此,我们现在将引用日期时间整数设置为现在的日期时间(dti = ndti)。然后我们会显示我们的消息(lcd.clear()lcd.message())。之后,我们将使程序睡眠不到1秒(sleep(0.95))。由于某些计算机的睡眠时间可能超过确切的分配时间,因此这使得我们0.05秒的缓冲不准确。如果我们正在运行if条件并且第二个尚未通过,我们将暂停程序一段时间并继续重复直到第二个实际通过(sleep(0.01))。 / p>

如果一切都按照计划完成,那么每一秒我们的程序应该只刷新一次液晶屏幕,并且它应该在大约95%的时间内睡觉,这样我们就不会旋转我们的轮子无缘无故的全部时间。另一个要注意的部分是,由于我们的else子句告诉程序休眠0.01秒,这意味着,在大多数情况下,我们的时钟只能在0.01秒的范围内不准确,这是非常好的。这足够低,人类大多无法察觉。如果这一切都有意义,请告诉我。

我通过命令行测试了这个(用简单的打印语句替换了lcd的东西),它似乎与另一个时间跟踪资源(http://time.is/)完全对齐

尝试一下,看看它是否适合你。

答案 1 :(得分:0)

IT是在LCD上打印日期和时间的最佳方法 首先下载或git clone rplcd库,用于lcd添加在代码的上方 进口RPLCD textDate = strftime(“%d%A%Y”,gmtime()) textTime = strftime(“%H:%M:%S”,gmtime()) lcd_string(textDate,LCD_LINE_1) lcd_string(textTime,LCD_LINE_2)