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

Posted

技术标签:

【中文标题】在 LCD 显示屏上显示 Raspberry Pi 时钟【英文标题】:Displaying Raspberry Pi clock on LCD display 【发布时间】:2016-12-21 03:11:30 【问题描述】:

我有一个运行 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)

【问题讨论】:

【参考方案1】:

IT 是在液晶显示器上打印日期和时间的最佳方式 首先下载或 git clone 用于 lcd 的 rplcd 库添加到代码的上部 进口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)

【讨论】:

【参考方案2】:

sleep(1) 指示程序“休眠”1 秒。这实际上非常重要,因为这意味着 while 循环(始终为真)将每秒只运行一次。当您取消 sleep(1) 行时,这意味着 while 循环永远不会中断并继续以计算机可以无限运行的速度运行。您可能会尝试的一件事是将 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)。 “整数形式”是指将某个任意开始日期(例如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))。

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

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

试试看它是否适合你。

【讨论】:

啊,谢谢,我知道现在发生了什么 :) 减少睡眠量有所帮助,但它并没有消除延迟,它还增加了“闪烁”(我认为这是由于显示刷新)。有没有办法在不依赖“打印”时间然后刷新的情况下显示时钟? 不妨看看硬件,看看是否有一种方法可以让您轻松地将时间更新与显示器的刷新率对齐。 @大卫 在此处查看如何进行调节的 1 秒滴答:***.com/questions/38874597/… @MichaelFourre 这是一个有趣的想法,我会看看能不能找到什么。或者有没有办法告诉显示器只在确切的那一秒刷新? @David 我在答案中添加了一个 sn-p 来解释代码的实际作用。给它一个阅读,让我知道它是否对你有用。

以上是关于在 LCD 显示屏上显示 Raspberry Pi 时钟的主要内容,如果未能解决你的问题,请参考以下文章

如何在连接到 Raspberry Pi 的显示器上显示 GUI?

使用python3在Raspberry Pi上打开和关闭Tkinter GUI

在 Raspberry Pi 2 上运行简单的 QtWebEngine 应用程序,页面未显示

通过移动应用程序在 Raspberry Pi 上显示 OSMC 的电视之间切换

OpenCV Raspberry Pi printf()不显示

Raspberry Pi 和带单声道的帧缓冲输入