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

标签 python time raspberry-pi lcd adafruit

我有一个运行 LCD 显示器的 Raspberry Pi。我在下面找到了在显示屏上显示时间的 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) 指示程序“休眠”1 秒。这实际上非常重要,因为这意味着 while 循环(始终为真)将每秒仅运行一次。当您去掉 sleep(1) 行时,这意味着 while 循环永远不会中断并继续以计算机可以无限运行的速度运行。您可能会尝试的一件事是将 sleep(1) 减少到某个较小的值。例如,您可以指定 sleep(0.1)

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

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

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

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

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

关于python - 在 LCD 显示屏上显示 Raspberry Pi 时钟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38946173/

相关文章:

python warnings.filterwarnings 不会忽略来自 'import sklearn.ensemble' 的 DeprecationWarning

python - 在python中生成随机时间戳列表

python - Jsch - 通过 SSH 连接发送命令

python - 我如何在 Numpy 中向量化这个双 for 循环?

Python:Cookies 不会在请求之间持续存在

java - 使用 Android 日历获取当前时间

python - Raspberry Pi 中的硬币计数器 (RPi-GPIO)

linux - 无法生成 buildroot(正在检查目标文件的后缀...配置 : error)

python - 为python3.3安装pip

objective-c - 在 Obj-c 中将秒转换为天、分钟和小时