正如在国际空间站上使用的那样,Sense HAT 是树莓派的一个多功能附加板,配备了传感器和 LED 矩阵显示器。
image.png
树莓派支持一种特殊类型的扩展,称为“扩展硬件”(Hardware Attached on Top 缩写为 HAT)。HAT可以为树莓派添加从麦克风和灯到电子继电器和屏幕的所有东西,但有一个 HAT 很特别:Sense HAT。
Sense HAT 是专门为 Astro Pi 太空任务设计的。作为树莓派基金会、英国航天局和欧洲航天局的联合项目,Astro Pi 看到树莓派板和 Sense HAT 被轨道科学公司的天鹅座货运火箭运往国际空间站。自从安全到达地球上空的轨道后,Sense HAT——宇航员给它们起了个绰号叫 埃德(Ed) 和 伊奇(Izzy),已经被由欧洲各地学童用来运行代码和进行科学实验。

虽然 Ed 和 Izzy 离我们有点远,但在地球上也能找到同样的 Sense HAT 硬件,在所有的树莓派零售商那里都能找到——如果你现在不想买 Sense HAT,你可以在软件中模拟出一个。

真实或模拟

本章最好与连接到树莓派的 GPIO 头的真正的 Sense HAT 一起学习,但任何没有 Sense HAT 硬件的人都可以跳过题为“安装 Sense HAT”的部分,只需在 Sense HAT 模拟器中尝试这些项目,它们一样可以正常工作! 如果你没有 Sense HAT 硬件,需要使用模拟器,点击顶部的树莓派图标,在“编程”栏没有看到“Sense HAT Emulator”,可以在首选项的“Recommended Software”里添加这个程序。 image.png 安装完毕后可以看到 Sense HAT Emulator 这个模拟器程序。 image.png

Sense HAT 介绍

Sense HAT 是树莓派的一个强大的、多功能的插件。除了一个由64个红绿蓝(RGB)可编程 LED 组成的8×8矩阵外,Sense HAT 还包括一个五向操纵杆控制器和六个板载传感器,可以控制它们产生数百万种颜色。
image.png

  • 陀螺仪传感器(Gyroscope sensor):用于感应随时间变化的角度,技术上称为角速度,通过跟踪地球重力场的方向——将物体拉向地心的力量。简单地说,陀螺仪传感器可以知道你何时相对于地球表面旋转 Sense HAT,以及它的旋转速度。
  • 加速度计(Accelerometer):与陀螺仪传感器类似,但它不是监测相对于地球重力的角度,而是测量多个方向的加速度。这两个传感器的读数(数据)结合起来,可以帮助你追踪 Sense HAT 的指向以及它的移动情况。
  • 磁强计(Magnetometer):测量磁场的强度,是另一个可以帮助追踪Sense HAT移动的传感器:通过测量地球的自然磁场,磁力计可以找出磁北的方向。同样的传感器也可以用来检测金属物体,甚至是电场。所有这三个传感器都内置于一个芯片中,在 Sense HAT 的电路板上标有“ACCEL/GYRO/MAG”。
  • 湿度传感器(Humidity sensor):测量空气中的水蒸气量,称为相对湿度。相对湿度的范围从0%(完全没有水)到100%(空气完全饱和)。湿度数据可用于检测什么时候可能要下雨了!
  • 气压传感器(Barometric pressure sensor):也被称为气压计,它测量气压。虽然大多数人都会从天气预报中熟悉气压,但气压计还有一个秘密的第二用途:它可以跟踪你在爬坡或下山时的情况,因为你离地球的海平面越远,空气越稀薄,气压越低。
  • 温度传感器(Temperature sensor):测量周围环境的冷热程度,不过它也会受到 Sense HAT 的冷热程度的影响:如果你给树莓派套了个壳,你可能会发现你的读数比你预期的高。Sense HAT 没有单独的温度传感器;相反,它使用内置在湿度和气压传感器中的温度传感器。一个程序可以使用这些传感器中的一个或两个——这取决于你。

RASPBERRY PI 400 上的 Sense HAT

Sense HAT 与 Raspberry Pi 400 完全兼容,可以直接插入背面的 GPIO 头。然而,这样做意味着 LED 灯将远离你,而且电路板的方向也是颠倒的。 为了解决这个问题,你需要一个 GPIO 扩展线或板子。兼容的延长线包括 Pimoroni 的 Black HAT Hack3r 系列;你可以将 Sense HAT 与 Black HAT Hack3r 板本身一起使用,或者简单地使用附带的40针带状电缆作为延长线。不过,一定要查看制造商的说明,以确保你连接电缆和 Sense HAT 的方式是正确的。

安装 Sense HAT

如果你有一个实体的 Sense HAT,首先要拆开包装,确保你有所有的部件:你应该有 Sense HAT 本身,四个被称为隔离柱的金属或塑料支柱,以及八个螺钉。你可能还有一些黑色塑料条中的金属引脚,就像树莓派上的 GPIO 引脚一样;如果是这样的话,把这个塑料条引脚朝上,穿过 Sense HAT 的底部,直到你听到咔嚓一声。
隔离柱的设计是为了防止 Sense HAT 在你使用操纵杆时发生弯曲和变形。虽然 Sense HAT 在没有安装它们的情况下也能工作,但使用它们将有助于保护你的 Sense HAT、树莓派和 GPIO 接头不被损坏。

警告!

只有在树莓派关闭并断开电源的情况下,才可以将从树莓派上插入或拔出硬件。在安装时,一定要注意保持Sense HAT的平坦,并在按下它之前仔细检查它是否与 GPIO 头的针脚对齐。

IMG_20220210_135054(1).png
Sense HAT 随包装带的垫片。
HAT-无垫片.png
如果不使用垫片,按压摇杆的时候,因为缺少支撑,会导致悬空的 Sense HAT 弯折,损坏另一边的 GPIO 接头。
HAT-有垫片.png
有垫片支撑后,就不用担心了。

安装垫片时,从树莓派的底部将四颗螺丝推上去,穿过每个角落的四个安装孔,然后将垫片拧到螺丝上。将 Sense HAT 推到树莓派的 GPIO 头,确保它与下面的引脚正确对齐,并尽可能保持平整。最后,将最后四颗螺丝穿过 Sense HAT 上的安装孔,拧到你之前安装的垫片上。如果安装正确,Sense HAT 应该是平坦的,当你按下它的操纵杆时,应该不会弯曲或晃动。

把电源插回树莓派,你会看到 Sense HAT 上的 LED 灯以彩虹的形式亮起,如下图所示,然后又熄灭。你的 Sense HAT 现在已经安装好了!
image.png
第一次接通电源时,会出现一个彩虹图案。

如果你想再次移除 Sense HAT,只需解开上面的螺丝,将 HAT 抬起来——注意不要弯曲GPIO头的针脚,因为 HAT 抓得很紧(你可能需要用一把小螺丝刀将其撬开),然后将垫片从树莓派上移开。

Hello,Sense HAT!

与所有的编程项目一样,Sense HAT 有一个效果显著的入门示例:在其 LED 显示屏上滚动播放欢迎信息。如果你正在使用 Sense HAT 模拟器,现在就加载它,点击 Raspberry Pi OS 菜单图标,选择编程类别,然后点击 Sense HAT Emulator。

编程经验

image.png 本章假定你有 Scratch 3 或 Python 和 Thonny 集成开发环境(IDE)的经验,这取决于你是通过 Scratch 还是 Python 的代码例子来学习的——或者两者通吃!如果您还没有学过这两种编程,请参阅第四章:使用 Scratch 编程,或第五章:使用 Python 编程,并首先完成该章中的练习项目。

来自 Scratch 的问候

从树莓派操作系统的菜单中加载 Scratch 3。点击 Scratch 窗口左下角的“添加扩展”。点击 Raspberry Pi Sense HAT 扩展,如下图所示。这将加载你需要的程序块集合,以控制 Sense HAT 的各种功能,包括其 LED 显示。当你需要它们时,你会在 Raspberry Pi Sense HAT 类别中找到它们。

image.png
加载Raspberry Pi Sense HAT扩展后,左侧程序块分类栏多了 Raspberry Pi Sense HAT 类别。
image.png
将 Raspberry Pi Sense HAT 扩展添加到 Scratch 3 中。

首先,将一个 微信截图_20220210093511.png块拖到脚本区,然后在其正下方拖出一个显示文本的块 微信截图_20220210093536.png。编辑文本,使该块显示为显示文本:Hello, World!
企业微信截图_20220210083303.png
点击舞台区的绿旗 image.png,观察你的 Sense HAT 或 Sense HAT 模拟器:信息会在 Sense HAT 的 LED 矩阵上缓慢滚动,依次点亮 LED 像素,形成每个字母,如下图所示。祝贺你:你的入门示例程序成功了!
image.png
你编辑的信息在 LED 矩阵上滚动。

现在你可以滚动一条简单的信息了,是时候看看如何控制信息的显示了。除了能够修改要显示的信息,你还可以旋转信息在 Sense HAT上的显示方式。从程序块区域中拖出一个设置旋转为0度的程序块 企业微信截图_20220210094228.png,并将其插入显示文本程序块的上方,点击0旁边的向下箭头,将其改为90。点击绿旗 image.png,你会看到和之前一样的信息,但不是从左到右滚动,而是从下到上滚动如下图所示——你需要转动你的头或者 Sense HAT,来阅读它。
image.png
这一次,信息是垂直滚动的。

现在把旋转度改回0,然后在程序底部,添加设置颜色的程序块 微信截图_20220210094921.png,点击色块调出 Scratch 的颜色选择器,找到一个漂亮的亮黄色,然后点击绿旗 image.png,看看你的程序输出有什么变化,如下图所示。
image.png

改变了文本的颜色。

最后,在设置颜色为黄色和显示文字Hello, World!之间,添加一个设置背景色的程序块 微信截图_20220210095235.png。然后点击该程序块的颜色块,再次调出颜色选择器。这次我们是为 LED 的背景设置颜色。找到一个漂亮的蓝色,然后再次点击绿旗 image.png:这次你的信息将是蓝色背景上的亮黄色。试着改变这些颜色,找到你最喜欢的组合——并不是所有的颜色都能很好地组合在一起。
除了能够滚动整个信息外,你还可以显示单个字母。把你的显示文本块从脚本区拖出来删除,然后在脚本区拖一个显示字符A的程序块 微信截图_20220210095728.png来代替它。点击绿色标志,你会看到不同之处:这个块每次只显示一个字母,而且这个字母会一直停留在 Sense HAT上,直到你告诉它不要滚动或消失。颜色控制块与显示文本块一样适用于该块:尝试将字母的颜色改为红色,如下图所示。
image.png
显示一个字母。

挑战:重复信息

image.png 你能利用你的循环知识让一条滚动的信息重复出现吗?你能做一个用不同颜色和逐个字母拼出一个单词的程序吗?

来自 Python 的问候

通过点击树莓菜单图标,选择编程,然后点击 Thonny,加载 Thonny程序。如果你使用的是 Sense HAT 模拟器,而它被 Thonny 窗口遮住了,请在任何一个窗口的标题栏(在顶部,蓝色的)上点击并按住鼠标键拖动它在桌面上移动,直到你能看到两个窗口。

Python 中 Sense HAT 模拟器和硬件的代码差异

image.png 为物理 Sense HAT 编写的 Python 代码可以在 Sense HAT 模拟器上运行,反之亦然,只需要做一个改变。如果你使用 Python 的 Sense HAT 模拟器,你需要把本章中所有程序中的 sense_hat import SenseHat 改为sense_emu import SenseHat。如果你想在物理硬件的Sense HAT上再次运行这些程序,只需把这一行改回来即可。

要在 Python 程序中使用 Sense HAT 或 Sense HAT 模拟器,你需要导入 Sense HAT 库。在脚本区输入以下内容,如果你使用的是 Sense HAT 模拟器,请记住使用sense_emu 代替 sense_hat

  1. from sense_hat import SenseHat
  2. sense = SenseHat()

Sense HAT 库有一个简单的函数,用于获取一条信息,对其进行格式化,使其能在LED显示屏上显示,并顺利地滚动它。输入以下内容:

  1. sense.show_message("Hello, World!")

将你的程序保存为 Hello Sense HAT,然后点击“Run”图标image.png。你会看到你的信息在 Sense HAT 的 LED 矩阵上慢慢滚动,依次点亮 LED 像素,形成每个字母如下图所示。恭喜你:你的程序已经成功了!
image.png
在LED矩阵上滚动显示一条信息

不过,show_message() 函数还有更多的用法。回到你的程序中,编辑最后一行如下:

  1. sense.show_message("Hello, World!", text_colour=(255, 255, 0), back_colour=(0, 0, 255), scroll_speed=(0.05))

这些由逗号分隔的额外指令被称为参数,它们控制着 show_message()函数的各个方面。最简单的是scroll_speed=(),它可以改变信息在屏幕上滚动的速度。这里的数值为0.05时,滚动速度大约是通常速度的两倍。数字越大,速度越低。
text_colour=()back_colour=() 参数——用英式英语拼写,与大多数 Python 指令不同,分别设置了文字和背景的颜色。不过它们不接受单词形式的颜色名称;你必须以三个数字的形式说明你想要的颜色。第一个数字代表颜色中的红色量,从0表示完全没有红色到255表示尽可能多的红色;第二个数字是颜色中的绿色量;第三个数字是蓝色量。这些数字加在一起,被称为 RGB ——代表红、绿、蓝。
点击“运行”图标image.png,观察 Sense HAT:这一次,信息的滚动速度将大大加快,并在蓝色背景上呈现出亮黄色,如下图所示。尝试改变参数,找到适合你的速度和颜色组合。
image.png
改变信息和背景的颜色。

如果你想使用更直观的名称而不是 RGB 值来设置你的颜色,你需要创建变量。在你的 sense.show_message() 行上面,添加以下内容:

  1. yellow = (255, 255, 0)
  2. blue = (0, 0, 255)

回到你的 sense.show_message() 行,并编辑它,使它变成这样:

  1. sense.show_message("Hello, World!", text_colour=(yellow), back_colour=(blue), scroll_speed=(0.05))

再次点击“运行”图标image.png,你会发现没有任何变化:你的信息仍然是蓝色背景上的黄色。不过这一次,你使用了变量名,使你的代码更易读:代码不再是一串数字,而是解释了它所设置的颜色。你可以随心所欲地定义多种颜色:尝试添加一个名为“red”(红色)的变量,其数值为(255, 0, 0);一个名为“white”(白色)的变量,其数值为(255, 255, 255);一个名为“black”(黑色)的变量,其数值为(0, 0,0)。
除了能够滚动完整的消息,你还可以显示单个字母。完全删除你的 sense.show_message() 行,并在其位置上输入以下内容:

  1. sense.show_letter("Z")

点击运行,你会看到字母 “Z “出现在 Sense HAT 的显示屏上。这一次,它将停留在那里:单独的字母,与信息不同,不会自动滚动。你也可以用与 sense.show_message() 相同的颜色参数来控制sense.show_letter():试着把字母的颜色改为红色,如下图所示。
image.png
显示一个字母。

挑战:重复信息

image.png 你能用你的循环知识让一条滚动的信息重复出现吗?你能做一个用不同颜色逐个字母拼出一个单词的程序吗?你能让一条信息滚动得多快?

接下来:用光作画

Sense HAT 的 LED 显示屏并不只是用来显示文本信息的:你也可以显示图片。每个LED都可以被当作你所选择的图像中的一个像素(图片元素的简称),这样你就可以用图片甚至是动画来装饰你的程序了。
不过,要创建图画,你需要能够改变每个 LED。要做到这一点,你需要了解 Sense HAT 的 LED 矩阵是如何布置的,以便编写一个程序,打开或关闭正确的LED。Sense HAT 的 LED 矩阵像素可以用下图所示的坐标来标示。
image.png
LED矩阵坐标系统。

显示器的每一行有八个 LED,每一列有八个,如上图。不过在计算 LED时,像大多数编程语言一样,应该从0开始,以7结束。第一个 LED 在左上角,最后一个在右下角。使用行和列的数字,你可以找到矩阵上任何LED的坐标。图中矩阵中的蓝色 LED 位于坐标(0, 2);红色 LED 位于坐标(7, 4)。 X 轴为矩阵的横轴,Y 轴是向下的纵轴。
当计划在 Sense HAT 上绘制图片时,先在格子纸上手绘可能会有帮助,或者你可以在电子表格中规划一下,比如LibreOffice Calc。

在 Scratch 中画图

在 Scratch 中开始一个新的项目,如果你想保留现有的项目,请保存它。如果你已经完成了本章的项目,Scratch 3 会保持加载 Raspberry Pi Sense HAT 扩展;如果你在上一个项目后关闭并重新打开了 Scratch 3,请使用添加扩展按钮加载该扩展。将一个 微信截图_20220210093511.png程序块拖到脚本区块拖到代码区,然后在它下面拖出设置 Sense HAT 的背景和设置颜色的程序块。编辑这两个程序块,将背景颜色设为黑色,将颜色设为白色(将亮度和饱和度滑块滑到0,就成了黑色;将亮度滑到100,饱和度滑到0,就成了白色)。你需要在每个 Sense HAT 程序的开始都这样做,否则 Scratch 会简单地使用你最后选择的颜色——即使你在不同的程序中选择了它们。最后,把一个显示树莓块拖到程序的底部,程序如下图所示:
微信截图_20220211195318.png

点击绿旗 image.png:你会看到 Sense HAT 的 LED 灯点亮了一个树莓图案,如下图所示。

image.png
当 LED 灯为亮白色时,不要直视它们。

你也不局限于预设的树莓形状。点击树莓旁边的向下箭头可以激活绘图模式:你可以点击图案上的任何一个LED,将其打开或关闭,而底部的两个按钮则将所有的 LED 设置为关闭或打开。现在就试试画你自己的图案,然后点击绿色箭头,在 Sense HAT 上看到它。还可以试着用上面的图块改变颜色和背景颜色。
当你完成后,把这三个图块拖到图块调色板中删除,并在点击时在下面放置一个清除显示的程序块 微信截图_20220211195731.png;点击绿旗 image.png,所有的 LED 就会关闭。

要制作一张图片,你需要能够控制单个像素并赋予它们不同的颜色。你可以通过将编辑好的显示树莓程序块与设置好的颜色块连接起来,或者你可以单独处理每个像素。要创建你自己版本的 LED 矩阵例子,在本节开始时,有两个特别选定的 LED 被点亮为红色和蓝色,把清除显示的程序块 微信截图_20220211195731.png放在你程序的顶部,在它下面拖放一个设置背景的程序块,将设置背景块改为黑色,然后在它下面拖动两个设置像素 x 0 y 0 的程序块。最后,按以下图所示编辑修改这些程序块:
第七章:用 Sense HAT 进行硬件交互 - 图45

点击绿旗 image.png,你会看到你的 LED 灯亮了起来,与本章上面介绍 LED 矩阵时的有红绿灯的插图一致。恭喜你:你可以控制单个的 LED 了。
按以下方法编辑你现有的一组像素块,并把更多的像素块拖到底部,直到你的程序看起来如下图所示:
第七章:用 Sense HAT 进行硬件交互 - 图47
在你点击绿旗之前,看看你是否能根据你所使用的 LED 矩阵坐标猜出会出现什么图片,然后运行你的程序,看看你是否正确!

挑战:新设计

第七章:用 Sense HAT 进行硬件交互 - 图48 你能设计更多的图片吗?试着找一些图形或网格纸,先用它来手工规划出你的图片。你能画出一幅图,并让颜色发生变化吗?

在 Python 中的画图

在 Thonny 中启动一个新程序,并将其保存为“Sense HAT 画图”,然后输入以下内容——如果你使用模拟器,记得使用 sense_emu(代替 sense_hat)。

  1. from sense_hat import SenseHat
  2. sense = SenseHat()

记住,为了使用 Sense HAT,你的程序需要这两行。接下来输入:

  1. sense.clear(255, 255, 255)

在不直视 Sense HAT 的 LED 时,点击“Run”图标image.png:你应该看到它们都变成了明亮的白色,如下图所示——这就是为什么你在运行程序时不应该直视它们的原因。
image.png
所有的 LED 都点亮为白色的时候,强光会刺激眼睛,所以要避免近距离直视 LED。
sense.clear() 是用来清除之前对 LED 的任何编程的,但是接受 RGB 颜色参数——这意味着你可以把显示变成你喜欢的任何颜色。试着把这一行编辑成。

  1. sense.clear(0, 255, 0)

点击“Run”图标image.png,Sense HAT 就会变成亮绿色,如下图所示。实验一下不同的颜色,或者添加你为 Hello World 程序创建的颜色名称变量,使程序更便于阅读。
image.png
亮起的 LED 矩阵呈亮绿色。

要清除LED,你需要使用黑色的RGB值:0红、0蓝和0绿。不过,有一个更简单的方法。编辑你的程序的行数为:

  1. sense.clear()

Sense HAT 会变黑;对于 sense.clear() 函数来说,括号中没有任何东西,就相当于告诉它把所有的 LED 变成黑色——也就是说,把它们全关掉,如下图所示。当你需要在你的程序中完全清除 LED 时,这就是要使用的函数。
image.png
使用 sense.clear 函数来关闭所有的 LED。
要创建你自己版本的本章前面的 LED 矩阵,用两个特别选定的 LED 点亮红色和蓝色,在 sense.clear() 之后向你的程序添加以下2行即可:

  1. sense.set_pixel(0, 2, (0, 0, 255))
  2. sense.set_pixel(7, 4, (255, 0, 0))

每行外层括号内的前两个数字是像素在矩阵上的位置:X(横)轴,然后是Y(纵)轴,内层括号里的3个数字是像素颜色的 RGB 值。点击“Run”图标image.png,你会看到效果:Sense HAT 上的两个 LED 会一红一蓝地亮起来。
删除这两行,然后键入以下内容:

  1. sense.set_pixel(2, 2, (0, 0, 255))
  2. sense.set_pixel(4, 2, (0, 0, 255))
  3. sense.set_pixel(3, 4, (100, 0, 0))
  4. sense.set_pixel(1, 5, (255, 0, 0))
  5. sense.set_pixel(2, 6, (255, 0, 0))
  6. sense.set_pixel(3, 6, (255, 0, 0))
  7. sense.set_pixel(4, 6, (255, 0, 0))
  8. sense.set_pixel(5, 5, (255, 0, 0))

在你点击“Run”之前,看看坐标并将它们与矩阵进行比较:你能猜到这些指令要画什么图吗?点击“Run”图标image.png就可以知道你是否正确了!使用单独的 set_pixel() 函数绘制一幅详细的图片是很慢的。
为了加快速度,你可以同时改变多个像素。删除你所有的 set_pixel() 行,然后输入以下内容。

  1. g = (0, 255, 0)
  2. b = (0, 0, 0)
  3. creeper_pixels = [
  4. g, g, g, g, g, g, g, g,
  5. g, g, g, g, g, g, g, g,
  6. g, b, b, g, g, b, b, g,
  7. g, b, b, g, g, b, b, g,
  8. g, g, g, b, b, g, g, g,
  9. g, g, b, b, b, b, g, g,
  10. g, g, b, b, b, b, g, g,
  11. g, g, b, g, g, b, g, g
  12. ]
  13. sense.set_pixels(creeper_pixels)

那里设置的信息量很大就,为了使绘图的代码更容易书写和阅读,这些变量都是单字母:“g”代表绿色,“b ”代表黑色。
中间那一坨代码块创建了一个变量,用来保存 LED 矩阵上所有 64 个像素的颜色值,用逗号隔开,用方括号括起来。不过,它使用的不是数字,而是你之前创建的颜色变量:仔细观察,记住“g”代表绿色,“b”代表黑色,你已经可以看到将出现的画面,如下图所示。
最后,sense.set_pixels(creeper_pixels) 采取该变量并使用 sense.set_pixels() 函数在整个矩阵上一次性绘制。这比逐个像素地绘制要容易得多!
image.png
在矩阵上显示一个图像。

你也可以旋转和翻转图像,当你的 Sense HAT 转过来时,可以作为一种显示图像的方式,或者作为一种从单个不对称的图像中创建简单动画的方式。
首先,编辑你的 creeper_pixels 变量,将他的左眼关闭,将四个“b”像素,从第三行的前两个开始,然后是第四行的前两个,替换为“g”。

  1. creeper_pixels = [
  2. g, g, g, g, g, g, g, g,
  3. g, g, g, g, g, g, g, g,
  4. g, g, g, g, g, b, b, g,
  5. g, g, g, g, g, b, b, g,
  6. g, g, g, b, b, g, g, g,
  7. g, g, b, b, b, b, g, g,
  8. g, g, b, b, b, b, g, g,
  9. g, g, b, g, g, b, g, g
  10. ]

点击“Run”图标image.png,你会看到爬山虎的左眼闭合,如下图所示。要制作动画,请到程序的顶部添加这一行。

  1. from time import sleep

然后转到底部,输入:

  1. while True:
  2. sleep(1)
  3. sense.flip_h()

点击“Run”图标image.png,看着爬山虎一次次地闭上和睁开眼睛。
image.png
显示一个简单的两帧动画。

flip_h() 函数可以在横轴上翻转一个图像,如果你想在纵轴上翻转一个图像,用 sense.flip_v() 代替 sense.flip_h()。你也可以用 sense.set_rotation(90) 将图像旋转 0、90、180 或 270 度,根据你想将图像旋转多少度来改变数字。试着用这个方法让爬山虎旋转,而不是眨眼!

挑战:新设计

image.png 你能设计更多的图片和动画吗?试着找一些图形或网格纸,先用它来手绘出你的图片,这样写矩阵变量就更容易些。你能不能画一幅画,然后让颜色发生变化?提示:你可以在已经使用过一次变量后再改变它们。

感知你周围的世界

Sense HAT 的真正力量在于它的各种传感器。这些传感器允许你读取从温度到加速度的所有数据,并在你认为合适的程序中使用它们。

传感器仿真

image.png 如果你使用的是 Sense HAT 模拟器,你需要启用 inertial (惯性)和 environmental sensor (环境传感器)模拟:在模拟器中,点击“Edit”,然后是 “Perferences…”,然后将 Simulate 对应的两项打勾。在同一菜单中,在“Orientation Scale”(方向刻度)下选择“80°… 360° | 0°… 180°”,以确保模拟器中的数字与 Scratch 和 Python 报告的数字一致,如下图所示。然后点击关闭按钮。 image.png

环境感应

气压传感器、湿度传感器和温度传感器都是环境传感器;它们从 Sense HAT 周围的环境中进行测量。

在 Scratch 中进行环境感应

在 Scratch 中启动一个新的程序,如果你愿意的话,可以保存你的旧程序,如果 Raspberry Pi Sense HAT 扩展还没有加载的话,请添加它。在你的代码区添加一个 微信截图_20220210093511.png程序块,然后在下面拖动一个清除显示的程序块 微信截图_20220211195731.png,再在下面拖动一个将背景设为黑色的程序块。接下来,添加一个设置颜色为白色的程序块——使用亮度和饱和度滑块来选择正确的颜色。在你的程序开始时做这个是个好主意,因为它可以确保 Sense HAT 没有显示任何旧程序的内容,同时保证你使用的颜色。
拖动一个 微信截图_20220211204432.png的程序块,直接放在你现有的程序块下面。为了获取压力传感器的读数,在Raspberry Pi Sense HAT 类别中找到压力块,并把它拖到你的微信截图_20220211204432.png块中的“Hello!”字样上。

微信截图_20220211204902.png
当“绿旗”被点击时
清除屏幕
将背景设置为“黑色”
将颜色设置为“白色”
说“气压值”2秒

点击绿色旗帜image.png,Scratch 猫会告诉你气压传感器的当前读数,单位是毫巴(mbar)。两秒钟后,信息就会消失;试着吹一下 Sense HAT(或在仿真器中把压力滑块往上移),然后点击绿色旗帜image.png,再次运行程序;这次你应该看到一个更高的读数如下图所示。
image.png
展示压力值读数。

改变数值

第七章:用 Sense HAT 进行硬件交互 - 图71 如果你使用的是Sense HAT模拟器,你可以使用其滑块和按钮来改变每个仿真传感器报告的数值。试着把压力传感器的设置向下方滑动,然后再点击绿色旗帜。

要切换到湿度传感器,请删除image.png块(压力报告块),用image.png(湿度报告块)替换它。再次运行你的程序,你会看到你房间当前的相对湿度。同样,你可以试着再运行一次,同时对着 Sense HAT吹气(或将模拟器的湿度滑块向上移动)来改变读数(见下图)——你的呼吸是出乎意料的湿润。

image.png
显示湿度传感器的读数。

对于温度传感器,这很简单,只要删除湿度块并将其替换为温度,然后再次运行你的程序。你会看到一个摄氏度的温度(见下图)。不过,这可能不是你房间的确切温度。树莓派在运行过程中会产生热量,这也会使 Sense HAT 及其传感器变暖。
image.png
显示温度传感器的读数。

挑战:滚动和循环

第七章:用 Sense HAT 进行硬件交互 - 图76 你能不能改变你的程序,依次从每个传感器上获取读数,然后在LED矩阵上滚动,而不是把它们打印到舞台区?你能使你的程序循环,以便不断地打印出当前的环境条件吗?

Python 中进行环境感应

要开始从传感器获取读数,在 Thonny 中创建一个新程序,并将其保存为“Sense HAT 感应器”。在脚本区输入以下内容,就像你在使用 Sense HAT 时应该做的那样(如果你在使用模拟器,记得使用 sense_emu)。

  1. from sense_hat import SenseHat
  2. sense = SenseHat()
  3. sense.clear()

在你的程序开始时加入sense.clear() 总是一个好主意,以防 Sense HAT 的显示屏仍在显示它运行的最后一个程序的内容。

要从压力传感器获取读数,请输入:

  1. pressure = sense.get_pressure()
  2. print(pressure)

点击“Run”图标image.png,你会看到一个数字被打印到 Thonny 窗口底部的 Python 外壳上。这是由气压传感器检测到的气压读数,单位是毫巴(mbar,见下图)。试着吹一下 Sense HAT(或在仿真器中向上移动压力滑块),同时再次点击“Run”图标image.png;这次的数字应该更高。
image.png
打印从 Sense HAT 读取的压力值。

改变数值

第七章:用 Sense HAT 进行硬件交互 - 图80

如果你使用的是Sense HAT模拟器,你可以使用其滑块和按钮来改变每个模拟传感器的报告值。试着将压力传感器的设置向底部滑动,然后再点击运行。

要切换到湿度传感器,请删除最后两行代码并替换为:

  1. humidity = sense.get_humidity()
  2. print(humidity)

点击“Run”图标image.png,你会看到另一个数字被打印到 Python shell 区内:这一次,它是你房间当前相对湿度的百分比。同样,你可以在 Sense HAT 上吹气(或者将模拟器的湿度滑块向上移动),当你再次运行你的程序时,你会看到数值上升了(见下图)——你的呼吸出乎意料地湿润了。
image.png
显示湿度传感器的读数。
对于温度传感器,去掉你程序中的最后两行,用以下内容代替。

  1. temp = sense.get_temperature()
  2. print(temp)

再次点击“Run”图标image.png,你会看到一个以摄氏度(℃)为单位的温度(见下图)。不过,这可能不是你房间的确切温度。树莓派在运行的过程中会产生热量,这也会使 Sense HAT 及其传感器变暖。
image.png
显示当前的温度读数。

通常情况下,Sense HAT 会根据内置在湿度传感器中的温度传感器的读数来报告温度;如果你想用压力传感器的读数来代替,你应该使用 sense.get_temperature_from_pressure()。也可以将两个读数结合起来得到一个平均值,这可能比单独使用任何一个传感器都更准确。删除你程序的最后两行,然后输入:

  1. htemp = sense.get_temperature()
  2. ptemp = sense.get_temperature_from_pressure()
  3. temp = (htemp + ptemp) / 2
  4. print(temp)

点击“Run”图标image.png,你会看到一个打印到 Python shell 区的数字(见下图)。这一次,它是基于两个传感器的读数,你把它们加在一起,然后除以 2(读数的数量),得到两者的平均值。如果你使用模拟器,所有三种方法-(湿度、压力和平均值)将显示相同的数字。
image.png
基于两个传感器的读数的温度。

挑战:滚动和循环

第七章:用 Sense HAT 进行硬件交互 - 图87 你能不能改变你的程序,依次从每个传感器中获取读数,然后在 LED 矩阵上滚动,而不是将它们打印到 shell上?你能不能使你的程序循环,以便不断地打印出当前的环境条件?

惯性传感

陀螺仪、加速计和磁力计结合起来,形成了所谓的惯性测量单元(IMU)。虽然从技术上讲,这些传感器就像环境传感器一样从周围环境中获取测量数据。例如,磁力计测量磁场强度,但它们通常用于获取有关 Sense HAT 本身运动的数据。IMU 是多个传感器的总和;一些编程语言允许你独立地从每个传感器中获取读数,而另一些则只给你一个综合读数。
不过,在你能理解 IMU 之前,你需要了解事物的运动方式。Sense HAT 和它所连接的树莓派可以沿着三个空间轴移动:X 轴上的侧向移动;Y 轴上的向前和向后移动;Z 轴上的向上和向下移动(见下图)。它也可以沿着这三个相同的轴线旋转,但它们的名称有所改变:在 X 轴上的旋转称为滚动(Roll),在 Y 轴上的旋转称为俯仰(Pitch),而在 Z 轴上的旋转称为偏航(Yaw)。当你沿短轴旋转 Sense HAT 时,你在调整它的俯仰;沿长轴旋转,这就是滚动;在保持它平放在桌面上的情况下旋转它,你在调整它的偏航。把它们想象成一架飞机:当它起飞时,它增加俯仰度来爬升;当它做胜利翻滚时,这就是它沿其滚轴旋转;当它像汽车一样使用方向舵转弯,而不滚动时,这就是偏航。

滚俯偏-20.jpg
Sense HAT 的 IMU 的空间轴

在 Scratch 中进行惯性感应

在 Scratch 中启动一个新的程序,并加载 Raspberry Pi Sense HAT 扩展,如果它还没有加载的话。用和以前一样的方法开始你的程序:拖动一个image.png块到你的代码区,然后在它下面拖动一个image.png显示块,接着拖动并编辑一个image.pngimage.png块。
接下来,拖动一个image.png块到你现有块的底部,然后用image.png块来填充它。为了显示 IMU 的三个轴,俯仰、滚动和偏航的读数,你需要添加image.png块和相应的 Sense HAT 块。记住要包括逗号,这样输出就容易阅读了。
SCRATCH 51.png
点击绿色旗帜image.png来运行你的程序,并尝试移动 Sense HAT 和树莓派,小心不要弄乱任何导线 当你通过三个轴倾斜 Sense HAT 时,你会看到俯仰、滚动和偏航的数值发生相应的变化(见下图)。
image.png

Python 中的惯性感应

在 Thonny 中启动一个新程序,并将其保存为“Sense HAT 运动”。填入通常的起始行,如果你使用 Sense HAT模拟器,记得使用sense_emu

  1. from sense_hat import SenseHat
  2. sense = SenseHat()
  3. sense.clear()

要使用来自 IMU 的信息来计算 Sense HAT 在其三轴上的当前方向,请输入以下内容。

  1. orientation = sense.get_orientation()
  2. pitch = orientation["pitch"]
  3. roll = orientation["roll"]
  4. yaw = orientation["yaw"]
  5. print("pitch {0} roll {1} yaw {2}".format(pitch, roll, yaw))

点击“Run”图标image.png,你会看到 Sense HAT 的方向在三个轴上的读数(见下图)。试着旋转 Sense HAT 并再次点击“Run”图标image.png;你应该看到数字的变化,以反映它的新方向。
第七章:用 Sense HAT 进行硬件交互 - 图101
显示 Sense HAT 的俯仰、滚动和偏航值

不过,IMU 能做的不仅仅是测量方向:它还能检测运动。为了获得准确的运动读数,IMU 需要在一个循环中频繁地被读取:与方向测量不同,在检测运动时,单一的读数不会给你带来任何有用的信息。删除sense.clear()之后的所有内容,然后输入以下代码。

  1. while True:
  2. acceleration = sense.get_accelerometer_raw()
  3. x = acceleration["x"]
  4. y = acceleration["y"]
  5. z = acceleration["z"]

你现在有了包含三个空间轴的当前加速度计读数的变量。X,或左和右;Y,或向前和向后;以及Z,或向上或向下。来自加速度传感器的数字可能很难读懂,所以键入以下内容,通过将它们四舍五入到最接近的整数,使它们更容易理解。

  1. x = round(x)
  2. y = round(y)
  3. z = round(z)

最后,通过输入以下一行来打印这三个值。

  1. print("x={0}, y={1}, z={2}".format(x, y, z))

点击“Run”图标image.png,你会看到加速度计的值被打印到 Python shell 区域(见下图)。与你之前的程序不同,这些将连续打印;要停止打印,点击红色的停止按钮来停止程序。

第七章:用 Sense HAT 进行硬件交互 - 图103
加速计的读数被四舍五入到最接近的整数

如果你的树莓派平放在桌子上,你可能已经注意到,加速计告诉你Z轴的值——加速度值为 1.0 重力(1g)。但Sense HAT并没有移动。这是因为它正在检测地球的引力,这个力将 Sense HAT 拉向地球中心,这也是为什么如果你把东西从桌子上撞下来,它会掉到地上的原因。

在你的程序运行时,试着小心地把 Sense HAT 和树莓派拿起来,并把它们旋转起来,但要确保不要弄乱它的任何电缆 当树莓派的网络和USB端口指向地面时,你会看到数值发生变化,Z轴读数为 0g,X轴现在读数为 1g;再次转动它,使 HDMI 和电源端口指向地面,现在是 Y 轴读数为 1g。如果你反其道而行之,让 HDMI 端口指向天花板,你会在Y轴上看到 -1g。
利用地球重力大致在 1g 左右的知识,以及你对空间轴的了解,你可以使用加速度计的读数来计算出哪条路是向下的,同样地,哪条路是向上的。你也可以用它来检测运动:试着小心翼翼地摇晃 Sense HAT 和树莓派,并观察你的数字:你摇晃得越厉害,加速度就越大。
当你使用sense.get_accelerometer_raw()时,你是在告诉 Sense HAT 关闭 IMU 中的其他两个传感器:陀螺仪传感器和磁力计,只从加速度计中返回数据。当然,你也可以对其他传感器做同样的事情。

找到acceleration = sense.get_accelerometer_raw()这一行,并将其改为:

  1. orientation = sense.get_gyroscope_raw()

把下面三行的 acceleration 这个词改成 orientation 。点击“Run”图标image.png,你会看到 Sense HAT 所有三个轴的方向,四舍五入到最接近的整数。不过,与上次检查方向不同的是,这次的数据完全来自陀螺仪,没有使用加速计或磁力计。如果你想知道机器人背上移动的 Sense HAT 的方向,这就很有用了,比如说,在没有运动的情况下,或者你在强磁场附近使用 Sense HAT。

点击“Stop”停止图标image.png,停止你的程序。要使用磁力计,请删除程序中除前四行以外的所有内容,然后在 while True 行下面输入以下内容。

  1. north = sense.get_compass()
  2. print(north)

运行你的程序,你会看到磁北的方向反复打印到 Python shell 区。小心翼翼地旋转 Sense HAT,你会看到随着Sense HAT 相对于北方的方向的改变,航向也随之改变:你已经建立了一个罗盘 如果你有一块磁铁(冰箱磁铁也行)试着在 Sense HAT 周围移动它,看看这对磁力计的读数有什么影响。

挑战:自动旋转

第七章:用 Sense HAT 进行硬件交互 - 图106 利用你所学到的关于 LED 矩阵和惯性测量单元传感器的知识,你能编写一个程序,根据 Sense HAT 的位置来旋转图像吗?

操纵杆控制

Sense HAT 的操纵杆位于右下角,可能很小,但它的功能却出奇的强大:除了能够识别上、下、左、右四个方向的输入外,它还有第五个输入,可以像按钮开关一样从上面推下去。

警告!

第七章:用 Sense HAT 进行硬件交互 - 图107 Sense HAT 操纵杆只能在你安装了本章开头所述的垫片后才能使用。如果没有垫片,向下推操纵杆会使 Sense HAT 板弯曲,并损坏 Sense HAT 和树莓派的 GPIO 头。

在 Scratch 中控制操纵杆

在 Scratch 中启动一个新程序,加载 Raspberry Pi Sense HAT 扩展。像以前一样,把一个第七章:用 Sense HAT 进行硬件交互 - 图108事件块拖到你的脚本区,然后在它下面拖一个微信截图_20220211195731.png显示块,接着拖并编辑一个设置背景为黑色和设置颜色为白色的块。

在 Scratch 中,Sense HAT 的操纵杆与键盘上的光标键相对应:将操纵杆向上推相当于按向上的方向键,向下推相当于按向下的方向键,向左推相当于向左的方向键,向右推相当于向右的方向键;同时,将操纵杆向内推相当于按回车键,就像一个按钮开关。

警告!

第七章:用 Sense HAT 进行硬件交互 - 图110 操纵杆控制只适用于实体的 Sense HAT。当使用 Sense HAT 模拟器时,请使用键盘上的相应按键来模拟操纵杆的按压。

拖动一个当操纵杆向上推的块到你的代码区。然后,为了让它有事可做,在它下面拖一个说微信截图_20220211204432.png块。
SCRATCH 52.png

把操纵杆往上推,你会看到猫说了一句愉快的 “你好!” 接下来,将说 微信截图_20220211204432.png块编辑成说 “操纵杆向上!”2秒的区块,并继续添加事件和外观区块,直到你拥有操纵杆的五种按压方式中的任何一种。
SCRATCH 53.png

试着在不同的方向上按下操纵杆,看看你的信息是否出现了!

最后的挑战

第七章:用 Sense HAT 进行硬件交互 - 图115 你能用 Sense HAT 的操纵杆来控制舞台区的 Scratch 精灵吗?你能不能让它在这个精灵收集到另一个精灵(代表一个物体)时,Sense HAT 的 LED 显示一个欢快的信息?

Python中的操纵杆控制

在 Thonny 中启动一个新程序,并将其保存为“Sense HAT 操纵杆”。从通常的三行开始,设置 Sense HAT并清除LED 矩阵。

  1. from sense_hat import SenseHat
  2. sense = SenseHat()
  3. sense.clear()

接下来,设置一个无限循环:

  1. while True:

然后告诉 Python 听从 Sense HAT 操纵杆的输入,下面这一行 Thonny 会自动为你缩进。

  1. for event in sense.stick.get_events():

最后,添加以下一行(Thonny也会为你缩进)当检测到操纵杆被按下时,实际做一些事情:

  1. print(event.direction, event.action)

点击“Run”图标image.png,并尝试在不同的方向上按下操纵杆。你会看到你选择的方向被打印到 Python Shelll 区域:上、下、左、右和中间,当你把操纵杆像按钮开关一样按下去时。
你还会看到,每次你推一次操纵杆都会得到两个事件:一个事件:按下,用于你第一次推一个方向;另一个事件:释放,用于操纵杆返回中心。你可以在你的程序中使用这一点:想想游戏中的一个角色,当操纵杆被按下一个方向时,它可以开始移动,然后在释放时立即停止。
你也可以使用操纵杆来触发函数,而不是仅限于使用 for 循环。删除 sense.clear() 下面的所有内容,然后输入以下内容:

  1. def red():
  2. sense.clear(255, 0, 0)
  3. def blue():
  4. sense.clear(0, 0, 255)
  5. def green():
  6. sense.clear(0, 255, 0)
  7. def yellow():
  8. sense.clear(255, 255, 0)

这些函数将整个 Sense HAT 的 LED 矩阵改变为单一的颜色:红色、蓝色、绿色或黄色——这将使你的程序工作变得非常简单。要实际触发它们,你需要告诉 Python 哪个函数与哪个操纵杆输入相配合。输入以下几行:

  1. sense.stick.direction_up = red
  2. sense.stick.direction_down = blue
  3. sense.stick.direction_left = green
  4. sense.stick.direction_right = yellow
  5. sense.stick.direction_middle = sense.clear

最后,程序需要一个无限循环(被称为主循环),以便持续运行,从而持续观察操纵杆的输入,而不是仅仅运行一遍你写的代码就退出了。输入以下两行:

  1. while True:
  2. pass

点击“Run”图标image.png,并尝试移动操纵杆:你会看到LED灯亮起鲜艳的颜色。要关闭LED,像推按钮一样推操纵杆:中间的方向设置为使用 sense.clear() 函数将它们全部关闭。恭喜你:你可以捕捉到来自操纵杆的输入了!

最后的挑战

第七章:用 Sense HAT 进行硬件交互 - 图118 你能用你所学到的知识在屏幕上画一个图像,然后让它按操纵杆的任何方向旋转吗?你能使中间的输入在多张图片之间切换吗?

Scratch 项目:Sense HAT 火花器

现在你对 Sense HAT 有了一定的了解,是时候把你所学到的东西放在一起,建立一个对热敏感的火花器了。 这是一个在寒冷时最快乐的设备,它会随着温度的升高而逐渐变慢。
开始一个新的 Scratch 项目,并添加 Raspberry Pi Sense HAT 扩展,如果尚未加载的话。像往常一样,从四个区块开始:
image.png
记住你必须将颜色从其默认设置中改变。
从创建一个简单但有艺术性的火花开始:把一个第七章:用 Sense HAT 进行硬件交互 - 图120块拖到代码区,然后用image.png颜色块。与其使用设定的数字,不如在该块的 x、y 和颜色部分各填入一个image.png运算符块。
1 到 10 的值在这里不是很有用,所以你需要做一些编辑。设置像素块中的前两个数字是 LED 矩阵上像素的 X 和 Y 坐标,这意味着它们应该是 0 到 7 之间的数字,所以把前两个块改为随机抽取 0 到 7 。下一个部分是像素应该被设置成的颜色。当你使用颜色选择器时,你选择的颜色会直接显示在脚本区;不过在内部,颜色是由一个数字表示的,你可以直接使用这个数字。编辑最后一个第七章:用 Sense HAT 进行硬件交互 - 图123块,将其改为 pick random 0 到 16777215
SCRATCH 54.png
点击绿色旗帜image.png,你会看到 Sense HAT 上的 LED 开始以随机颜色亮起(见下图)。祝贺你:你已经做了一个电子烟花!

第七章:用 Sense HAT 进行硬件交互 - 图126
以随机颜色点亮像素。

这个烟花的互动性不强。要改变这一点,首先要拖动一个image.png的块,使它处于设定的像素块之下,但在第七章:用 Sense HAT 进行硬件交互 - 图128块之内。在“1”上拖动一个image.png运算符块,然后在其第二个空格中输入“10”。最后,在image.png运算符块的第一个空格上拖动一个image.png块。
SCRATCH 55.png
点击绿色旗帜image.png,你会注意到:除非你住在一个非常寒冷的地方,火花闪烁比以前慢了很多。这是因为你创建了一个与温度有关的延迟:现在程序在每个循环之前都要等待当前温度除以10的秒数。如果你房间里的温度是20℃,程序将在循环前等待 2 秒;如果温度是 10℃,它将等待 1 秒;如果温度低于 10℃,它将等待不到 1 秒。

如果你的 Sense HAT 读取的是一个负的温度(低于0°C),即水的冰点,它将试图等待少于0秒,你将看到与它等待0秒相同的效果(等待少于0秒是不可能的,因为没有时间旅行没有被发明)。恭喜你:你现在可以考虑将 Sense HAT 的各种功能整合到你自己的程序中去了!

Python 项目:Sense HAT 三录仪

现在你对 Sense HAT 已经了如指掌,是时候把你所学到的所有东西放在一起,建立一个三录仪了。对于某科幻小说系列的粉丝来说,这个设备能够对内置的各种传感器进行读取。
在 Thonny 中启动一个新项目,并将其保存为“三录仪”,然后从你需要的传统线条开始,制作一个 Sense HAT程序。

  1. from sense_hat import SenseHat
  2. sense = SenseHat()
  3. sense.clear()

接下来,你需要开始为 Sense HAT 的各个传感器定义函数。从惯性测量单元开始,键入。

  1. def orientation():
  2. orientation = sense.get_orientation()
  3. pitch = orientation["pitch"]
  4. roll = orientation["roll"]
  5. yaw = orientation["yaw"]

因为你将会在 LED 上滚动来自传感器的结果,所以将它们四舍五入是有意义的,这样你就不会等待几十位小数了。不过,与其说是整数,不如说是把它们四舍五入到小数点后一位,输入以下内容。

  1. pitch = round(pitch, 1)
  2. roll= round(roll, 1)
  3. yaw = round(yaw, 1)

最后,你需要告诉 Python 将结果滚动到 LED 上,这样三录仪就可以作为一个手持设备使用,而不需要连接到显示器或电视上。

  1. sense.show_message("Pitch {0}, Roll {1}, Yaw {2}".
  2. format(pitch, roll, yaw))

现在你有一个完整的函数来读取和显示来自 IMU 的方向,你需要为其他每个传感器创建类似的函数。从温度传感器开始:

  1. def temperature():
  2. temp = sense.get_temperature()
  3. temp = round(temp, 1)
  4. sense.show_message("Temperature: %s degrees Celsius" % temp)

仔细看一下将结果打印到 LEDs 的那一行:“%”被称为占位符,并被替换为变量 temp 的内容。利用这一点,你可以用标签 “Temperature:”和测量单位 “degrees Celsius, ”很好地格式化输出,这使你的程序更加友好。
接下来,为湿度传感器定义一个函数:

  1. def humidity():
  2. humidity = sense.get_humidity()
  3. humidity = round(humidity, 1)
  4. sense.show_message("Humidity: %s percent" % humidity)

然后是压力传感器:

  1. def pressure():
  2. pressure = sense.get_pressure()
  3. pressure = round(pressure, 1)
  4. sense.show_message("Pressure: %s millibars" % pressure)

最后是来自磁力计的罗盘读数:

  1. def compass():
  2. for i in range(0, 10):
  3. north = sense.get_compass()
  4. north = round(north, 1)
  5. sense.show_message("North: %s degrees" % north)

这个函数中的较短的 for 循环从磁力计中获取 10 个读数,以确保它有足够的数据来给你一个准确的结果。如果你发现报告的数值一直在变化,可以尝试把它扩展到 20、30、甚至 100 个循环,以进一步提高准确性。
你的程序现在有五个功能,每个功能都从 Sense HAT 的一个传感器中获取一个读数,并在 LED 上滚动显示。不过,它需要一种方法来选择你想使用的传感器,而操纵杆就非常适合。
输入以下内容:

  1. sense.stick.direction_up = orientation
  2. sense.stick.direction_right = temperature
  3. sense.stick.direction_down = compass
  4. sense.stick.direction_left = humidity
  5. sense.stick.direction_middle = pressure

这些线为操纵杆上五个可能的方向各分配了一个传感器:向上读取方向传感器;向下读取磁力计;向左读取湿度传感器;向右读取温度传感器;在中间按压杆读取压力传感器。
最后,你需要一个主循环,这样程序就会一直监听操纵杆的按下,而不是立即退出。在你程序的最底部,输入以下内容。

  1. while True:
  2. pass

点击运行,并尝试移动操纵杆,从其中一个传感器中获取读数(见下图)。当它完成滚动结果后,按不同的方向。祝贺你:你已经建立了一个能让行星联盟感到自豪的手持式三录仪
第七章:用 Sense HAT 进行硬件交互 - 图134
每个读数都会在显示屏上滚动。

更多关于 Sense HAT 项目的信息,请参考《附录 D 进阶阅读》 中的链接。