在本教程中,我们将向您展示如何利用其 LED 矩阵设置树莓派 Sense HAT 数字时钟。
在整个教程中,我们将向您展示如何在树莓派上编写脚本,该脚本可以获取当前系统时间,然后将其解释为可以在 LED 矩阵上显示的内容。
本教程将教您如何利用数组和数值逐行将值打印到树莓派的 Sense HAT LED 矩阵中。
为了使时钟更准确,尤其是如果您不打算建立有效的互联网连接时,请考虑使用实时时钟模块。该模块将确保您的时钟尽可能正确。
您可以在下面找到有关如何将树莓派 Sense HAT 设置为数字时钟的完整教程。
设备
以下是完成此树莓派 Sense HAT 数字时钟教程所需的设备的完整列表。
推荐的
树莓派
Micro SD 卡
Ethernet Cord 或 * WiFi 加密狗 (树莓派 3 已内置 WiFi) )
电源
Sense HAT
可选的
树莓派外壳
USB 键盘
USB 鼠标
Sense HAT 入门
现在,在我们开始使用 SenseHAT 作为数字时钟之前,我们必须首先对其进行正确设置并进行测试以确保一切正常。
1 首先在树莓派上运行以下命令以将操作系统更新为最新版本。
sudo apt-get update
sudo apt-get upgrade
2 现在,我们已经更新了树莓派的操作系统,我们必须安装 sense-hat 软件包。该软件包包括我们与设备交互所需的所有库。
sudo apt-get installSense-hat
sudo reboot
3 通过将 sense-hat 库下载到我们的树莓派中,我们需要编写一个脚本以确保我们可以与该设备实际通信。
我们可以在树莓派上使用以下命令开始编写此脚本。
sudo vim 〜/sensehat_test.py
4 现在,在此脚本中,我们需要编写以下代码行。我们将逐步解释每个代码段的功能。
从 sense _hat导入 SenseHat
该行从 sense \ _hat 库中导入 SenseHat 模块。这使我们可以通过 Python 本身与 Sense HAT 进行交互。
感= SenseHat()
该行实例化 SenseHat 类的副本到我们的 Sense 变量。我们将使用 sense 变量与 SenseHat 类进行交互并调用其函数。
sense.show_message("Hello World")
该行仅将文本消息推送到 SenseHAT 上的 LED 矩阵。此特定呼叫将使文本” Hello World “出现在设备上。
5 现在,按 CTRL + X ,然后按 Y ,最后按 ENTER * 保存文件。
6 现在我们已经保存了文件,请在终端中使用以下命令来运行它。
sudo python 〜/sensehat_test.py
现在,您应该在 Sense Hat 的 LED 矩阵上看到文本” Hello World “滚动。
如果您的 Sense HAT 上没有任何内容,则可能是由于未正确按下 GPIO 引脚上的 Sense HAT。有毛病。
如果仍然无法正常运行,请尝试通过在其上运行以下命令来重新启动树莓派。
sudo reboot
将 Sense HAT 变成数字时钟
接下来,是时候写出 Sense Hat 数字时钟的代码了。此代码的灵感来自 Steve Amor 的工作,该传感器使用 Sense Hat 在树莓派数字时钟上。
在本教程中,我们使用了大量 Python 代码,因此,如果您是该语言的新手,我强烈建议您阅读我们的 Python 入门指南 。
1 现在,我们已经安装了脚本所需的所有内容,并测试了 Sense Hat 是否可以正常工作。我们可以继续编写脚本。
不过,在开始之前,我们先创建一个文件夹以保留新脚本。我们将这个文件夹” 命名为 digitialclock “,并将其保存在 Pi 用户的主目录中。
在终端中运行以下命令以创建此文件夹。
mkdir〜/digitalclock2 现在创建了文件夹,我们将进入目录并通过运行以下两个命令开始编写脚本。
cd〜/digitalclock
vim digitalclock .py
3 现在,将以下代码行写入文件。我们将解释代码的每个部分,以便您对一切工作原理有很好的了解。
#!/usr/bin/env python
从 sense _hat导入 SenseHat
导入时间
感= SenseHat()
第一行告诉操作系统如何解释文件,在本例中,我们使用它来” 告诉操作系统使用 Python “来运行文件。
下一行从 Sense \ _hat 库中导入 SenseHat 模块,这是我们在本教程第一部分中安装的库。
我们利用此脚本中的 SenseHat 模块与 Sense Hat 设备进行对话,并通过打开矩阵上的特定 LED 来显示 8 ×8 LED 矩阵的时间。
在下一行,我们导入另一个库,这一次我们导入时间库。我们利用时间库直接从操作系统本身检索当前时间。
通过获取这些值,我们可以从数组中进行选择,以决定需要打开或关闭哪些像素。
接下来,我们创建 SenseHat 对象的副本,我们将在整个脚本中利用该对象来控制 Sense Hat。我们只需要这样做就可以将数组传递到告诉它需要打开或关闭哪些像素的设备。
在接下来的两节代码中,您将看到我们如何利用这些库。
数字= [
[[0,1,1,1],#零
[0,1,0,1],
[0,1,0,1],
[0,1,1,1]],
[[0,0,1,0],#一
[0,1,1,0],
[0,0,1,0],
[0,1,1,1]],
[[0,1,1,1],#2
[0,0,1,1],
[0,1,1,0],
[0,1,1,1]],
[[0,1,1,1],#3
[0,0,1,1],
[0,0,1,1],
[0,1,1,1]],
[[0,1,0,1],#四
[0,1,1,1],
[0,0,0,1],
[0,0,0,1]],
[[0,1,1,1],#5
[0,1,1,0],
[0,0,1,1],
[0,1,1,1]],
[[0,1,0,0],#六个
[0,1,1,1],
[0,1,0,1],
[0,1,1,1]],
[[0,1,1,1],#七个
[0,0,0,1],
[0,0,1,0],
[0,1,0,0]],
[[0,1,1,1],#8
[0,1,1,1],
[0,1,1,1],
[0,1,1,1]],
[[0,1,1,1],#九
[0,1,0,1],
[0,1,1,1],
[0,0,0,1]]
]
我们将使用这个非常大的数组来获取时钟的数字。时钟的每个数字都分为自己的列表,然后又分为四个单独的部分。
我们将阵列分成这些列表,以使其更容易输出到 LED 矩阵。您很快就会看到我们如何利用数组将这些数字推送到设备。
noNumber = [0,0,0,0]
我们还有一个只有四个零值的小数组。我们将使用此阵列来填充 LED 矩阵中不希望显示任何数字的点。
hourColor = [255,0,0]#红色
minutesColor = [0,255,255]#青色
空= [0,0,0]#黑色/关闭
这三个变量用于” 声明” 小时,分钟和空插槽的 LED 的 RGB 值。
如果要更改小时的颜色,则只需将数组的三个值更改为相关的 RGB 值。
clockImage = []
小时= time.localtime()。 tm _hour
分钟= time.localtime()。 tm _min
在这部分代码中,我们首先” 创建一个空数组””clockImage”。我们需要这个空的,因为我们会将所有数字从大型数组推向它。
接下来,我们检索当前的小时和分钟并将其存储在变量中。我们将利用这些信息来决定需要显示的数字。
对于范围(0,4)中的索引:
如果(小时> = 10):
clockImage.extend(number [int(hour/10)] [index])
其他:
clockImage.extend(noNumber)
clockImage.extend(number [int(hour%10)] [index])
对于范围(0,4)中的索引:
clockImage.extend(number [int(minute(minute/10)] [index])
clockImage.extend(number [int(minute(minute%10)] [index])
这是我们执行大部分魔术的地方。我们运行两个不同的 for 循环, first 循环用于显示小时数, second 循环处理显示在 LED 矩阵底部的分钟。
对于每个循环,我们将 Pythons 。 extend 函数用于列表,使用此函数,我们可以在一次调用中从每个数字中插入一行 4 个元素,这省去了运行两个并发循环的麻烦。
为了从数组中获取正确的数字,我们使用一些简单的数学运算。在两位数的数字中,我们使用除以 10 来获取第一个数字。例如 12 ,我们将除以 10 得到 1 。
要获得第二个数字,请使用模数,它会将除法的余数返回给我们,因此,对于我们先前的数字 (12),我们将得到 2 的返回值。
对于范围为(0,64)的索引:
如果(clockImage [index]):
如果索引<32:
clockImage [index] = hourColor
其他:
clockImage [index] = minutesColor
其他:clockImage [index] =空
现在,我们的” 最终循环” 遍历了整个 clockImage 数组,该循环旨在将每个数字与 RGB 值交换出去。
我们仅通过检查索引中是否存在数字 0 或 1 来实现此目的。如果为 0 ,则将空变量值输出到该数字。
否则,我们检查是否正在处理前 32 个像素 (LED 矩阵的上半部分),如果在上半部分中,则从 hourColor 变量中获取 RGB 值。否则,我们利用 minuteColor 变量中的 RGB 值。
sense.set_rotation(90)#可选
sense.low_light = True#可选
sense.set_pixels(clockImage)
现在,这是我们的” 最后 3 行代码”。
这些行的” 第一行” 设置 LED 矩阵的旋转,您可以根据希望显示数字时钟的方向更改此旋转。
第二行设置了 Sense HAT 的弱光模式,这基本上使 LED 变暗,因此它们的亮度几乎不一样。如果您将 Sense HAT 放在光线明亮的地方,请注释掉该行或将其删除。
最后,” 最后” 行将我们的”clockImage” 数组输出到 Sense HAT,该行最终显示了我们在 Sense HAT led 矩阵上的时间。
4 下面,我们提供了最终脚本的外观副本。
对所有代码满意后,可以依次按 CTRL + X ,然后按 Y ,最后按 ENTER * 保存文件。
#!/usr/bin/env python
从 sense _hat导入 SenseHat
导入时间
感= SenseHat()
数字= [
[[0,1,1,1],#零
[0,1,0,1],
[0,1,0,1],
[0,1,1,1]],
[[0,0,1,0],#一
[0,1,1,0],
[0,0,1,0],
[0,1,1,1]],
[[0,1,1,1],#2
[0,0,1,1],
[0,1,1,0],
[0,1,1,1]],
[[0,1,1,1],#3
[0,0,1,1],
[0,0,1,1],
[0,1,1,1]],
[[0,1,0,1],#四
[0,1,1,1],
[0,0,0,1],
[0,0,0,1]],
[[0,1,1,1],#5
[0,1,1,0],
[0,0,1,1],
[0,1,1,1]],
[[0,1,0,0],#六个
[0,1,1,1],
[0,1,0,1],
[0,1,1,1]],
[[0,1,1,1],#七个
[0,0,0,1],
[0,0,1,0],
[0,1,0,0]],
[[0,1,1,1],#8
[0,1,1,1],
[0,1,1,1],
[0,1,1,1]],
[[0,1,1,1],#九
[0,1,0,1],
[0,1,1,1],
[0,0,0,1]]
]
noNumber = [0,0,0,0]
hourColor = [255,0,0]#红色
minutesColor = [0,255,255]#青色
空= [0,0,0]#黑色/关闭
clockImage = []
小时= time.localtime()。 tm _hour
分钟= time.localtime()。 tm _min
对于范围(0,4)中的索引:
如果(小时> = 10):
clockImage.extend(number [int(hour/10)] [index])
其他:
clockImage.extend(noNumber)
clockImage.extend(number [int(hour%10)] [index])
对于范围(0,4)中的索引:
clockImage.extend(number [int(minute(minute/10)] [index])
clockImage.extend(number [int(minute(minute%10)] [index])
对于范围为(0,64)的索引:
如果(clockImage [index]):
如果索引<32:
clockImage [index] = hourColor
其他:
clockImage [index] = minutesColor
其他:
clockImage [index] =空
sense.set_rotation(90)#可选
sense.low_light = True#可选
sense.set_pixels(clockImage)
5 现在我们可以继续进行测试运行代码,只需在您的树莓派上运行以下命令即可。
python〜/digitalclock/digitalclock.py
如果一切运行正常,您现在应该看到当前时间出现在设备上。
如果遇到问题,可以在 [从 GitHub 上下载] 代码 (https://github.com/pimylifeup/Raspberry-Pi-Sense-HAT-Digital-Clock/blob/master/digitalclock.py)。
当然,拥有永不更新的时钟是没有用的。在” 自动使您的 HAT HAT 数字时钟” 部分中,我们将向您展示如何使用 crontab 每分钟运行一次脚本。
如果要扩展此脚本,以便可以显示不同时区的时间,则可以按照下一部分详细介绍如何处理树莓派数字时钟的时区。
处理 SenseHAT 数字时钟的时区
在本节中,我们将向您展示如何修改 SenseHat 数字时钟脚本,以便您可以显示来自不同时区的时间,而不仅仅是操作系统定义的时间。
1 在开始更改脚本以处理不同时区之前,必须首先确保将 Python pip 软件包安装到树莓派,然后使用此软件包安装所需的 python 库。
为此,我们首先更新软件包列表,然后使用 apt -get 安装 pip ,运行以下命令来执行此操作。
sudo apt-get update
sudo apt-get install python-pip
2 为了处理不同的时区,我们将使用一个名为 Arrow 的 Python 包。此程序包大大简化了在特定时区中检索时间的过程,并且无需将多个不同的程序包串在一起。
通过运行以下命令,使用 pip 将库安装到树莓派中。
sudo pip安装箭头
3 现在安装了 Arrow Python 软件包,我们将继续进行修改脚本,以便它将利用此软件包而不是时间库。
在下面的命令中键入以开始修改我们的 SenseHAT 数字时钟脚本。
vim 〜/digitalclock/digitalclock.py
4 现在,我们正在修改脚本,首先使用新安装的 Arrow 包的导入替换 time 导入开始。
查找以下内容:
导入时间
用。。。来代替:
导入箭头
5 现在替换了时间包,我们需要继续进行一些实际脚本逻辑的更改,因为现在我们需要使用” 箭头” 包来检索时间。
查找以下代码部分:
小时= time.localtime()。 tm _hour
分钟= time.localtime()。 tm _min
替换为以下内容。
时间= arrow.now('亚洲/东京')
小时= time.hour
分钟=时间。分钟
如果您看一下这段新的代码,我们已将其更改为不使用 Arrow 的” now “功能从 Arrow 检索时间。对于此” now “功能,我们传入了想要获取当前时间的时区,在本例中,我们正在利用” Asia/Tokyo “时区。
Arrow 程序包使用 dateutil 程序包提供的 tz 数据库中的时区。您可以转到 TZ 数据库 Wikipedia 页面找到这些时区的列表。该网页使您可以轻松找到所需的时区。
6 这就是我们要做的所有更改脚本以改为使用 Arrow 包的方法,您 SenseHAT 上显示的时间现在应该出现在 arrow.now (“中定义的时区中) 功能。
对更改满意后,请依次按 CTRL + X ,然后按 Y ,然后按 ENTER * 保存文件。
7 现在对脚本进行了更改,让我们继续运行它以测试我们的更改是否正常工作。
python〜/digitalclock/digitalclock.py
如果一切正常,那么您现在应该在 SenseHAT 上看到您指定的时区的时间。
在下一节中,我们将引导您完成 Sense HAT 数字时钟自动更新的过程。
使 Sense HAT 数字时钟自动化
1 在将脚本添加到 crontab 之前,我们必须做的第一件事就是使其可执行。
我们可以通过在树莓派上使用以下命令来执行此操作。此命令将使用 chmod 向脚本添加执行权限。
chmod + x〜/digitalclock/digitalclock.py
2 现在,我们已经赋予了数字时钟脚本执行特权,我们现在可以继续进行并开始编辑 crontab 。
在树莓派上运行以下命令以编辑 crontab 。
sudo crontab -e
如果询问您要使用哪种编辑器来编辑 crontab 文件,我们建议您选择 Nano 作为其使用最简单的编辑器之一。
3 将以下行添加到文件中。该行基本上会告诉操作系统它需要每分钟运行此文件。
* * * * * /home/pi/digitalclock/digitalclock.py
如果您想调整数字时钟的更新频率,我们建议您使用服务。
4 对该文件进行更改后,您可以通过按 CTRL + X ,然后按 Y ,最后按 ENTER * 保存它。
系统现在将自动加载新的 crontab 并开始处理它。
5 您现在应该每分钟在 Sense HAT 更新上看到时间。
我希望到本教程结束时,您现在已经成功将树莓派的 Sense HAT 设置为数字时钟。
本教程只是可以使用树莓派 Sense Hat 进行操作的众多示例之一。一个值得一试的项目是使用树莓派 Sense HAT 的气象站。
如果您对此树莓派 Sense HAT 数字时钟教程有任何反馈,请随时在我们的论坛上发表评论。