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

Displaying Raspberry Pi clock on LCD display

我有一个 Raspberry Pi 运行 LCD 显示屏。我在下面找到了 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)

sleep(1) 指示程序 "sleep" 1 秒。这实际上非常重要,因为这意味着 while 循环(始终为真)然后每秒只会 运行 一次。当您删除 sleep(1) 行时,这意味着 while 循环永远不会中断并继续 运行ning 以计算机可以无限运行的速度运行。您可能会尝试的一件事是将 sleep(1) 减少到某个较小的值。例如,您可以指定 sleep(0.1)

通过减少睡眠时间,这意味着时钟将更频繁地更新。现在使用 sleep(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)。 "integer form" 我的意思是将某个任意开始日期(例如 1970-01-01 00:00:00)的所有秒数相加,并将其用作时间参考。例如,今天 (2016-08-18 00:00:00) 可能是自 1970 年以来的 1471478400 秒。一旦我们有了这个值,我们就开始循环。

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

如果一切都按计划进行,那么我们的程序每一秒都应该只刷新液晶屏幕一次,而且那一秒的大约 95% 的时间它都应该休眠,这样我们就不会空转一直没有理由。另一部分需要注意的是,由于我们的 else 子句告诉程序休眠 0.01 秒,这意味着在大多数情况下,我们的时钟只能有 0.01 秒的误差,这是非常好的。这足够低,几乎无法被人类检测到。让我知道这一切是否有意义。

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

试试看是否适合你。

IT 是在 lcd 上打印日期和时间的最佳方式 首先下载或 git clone rplcd library for lcd add in the upper side of code 进口RPLC textDate = strftime("%d %A %Y", gmtime()) textTime = strftime("%H:%M:%S", gmtime()) lcd_string(文本日期,LCD_LINE_1) lcd_string(textTime,LCD_LINE_2)