打造自己的树莓派气象站

在本教程中,我们将向您展示如何通过 Sense HAT 设置基本的树莓派气象站。

对于希望开始监视特定房间,室外或任何地方的天气状况的任何人,此气象站都是一个完美的小爱好项目。

对于任何不知道的人来说,Sense HAT 都是一件很棒的设备,它在一个包装中就带有大量传感器。这是在 Pi 上添加大量传感器的最简单方法,而无需执行任何额外的电路。

该气象站教程将向您展示如何设置 Sense HAT 软件本身,以及如何从其三个主要传感器 (即温度,湿度和压力传感器) 中检索数据。我们还将简要介绍如何将文本写入 LED 矩阵,因为我们将以此为显示传感器数据的方式。

我们还将着手设置您的树莓派气象站,以便将数据存储在” 初始状态数据” 分析服务中,这将使我们能够将数据直接流式传输到其 Web 界面,并以漂亮的图形查看所有数据。

本教程将使用大量的 Python 代码,但是幸运的是,它们都是非常基本的,因此您在使用它时不会有太多问题。

设备

您将需要使用 HAT 和其他一些设备才能完成本教程。

推荐的

  • 树莓派 2 或 3

  • Micro SD 卡或 * SD 卡 Pi 的旧版本。

  • 电源

  • Sense HAT

  • 以太网电缆或 * WiFi 加密狗 (Pi 3 内置了 WiFi)

可选的

  • 树莓派外壳

Sense HAT 入门

在开始本教程之前,请确保已将 Sense HAT 正确放置在树莓派上的 GPIO 引脚上。安装非常简单,正确安装后不需要任何额外的摆弄。

1 在开始之前,我们需要运行以下命令以确保树莓派正在运行最新的软件。

sudo apt-get update
sudo apt-get upgrade

2 随着树莓派的更新,我们现在需要安装 Sense Hat 软件包,这提供了我们需要的所有库与 Sense Hat 互动。

sudo apt-get installSense-hat
sudo reboot

3 现在,我们已经安装了软件,我们需要编写一个快速脚本来确保 Sense HAT 正常运行。

我们可以通过输入以下命令开始编写此脚本。

sudo vim 〜/sensehat_test.py

4 将以下行写入此文件,我们将逐步解释每个代码段的功能。

从 sense _hat导入 SenseHat 

该行从 sense \ _hat ** 库导入 Sense Hat 模块。该库允许我们通过 python 与 Hat 本身进行交互。

感= SenseHat()

该行创建到 Sense Hat 库的链接并初始化自身,以便我们可以开始对其进行调用。

sense.show_message("Hello World")

该行将一条消息写入 Sense Hat,您应该看到”Hello World” 在 RGB 灯之间滚动。

按 ** Ctrl + X ,然后按 Y **,然后按 ENTER 键保存文件。

5 现在保存了文件,我们可以使用以下命令运行它:

sudo python 〜/sensehat_test.py

现在,文本”Hello World” 应该在 Sense HAT 顶部的 RGB LED 上滚动。如果不是,则可能是由于未正确按下 GPIO 引脚顶部的 HAT 。

如果仍然无法正常运行,请尝试通过重新运行以下命令来重新启动树莓派。

sudo reboot

将 Sense HAT 设置为气象站

1 现在我们已经测试了 Sense HAT 是否正常运行,现在我们可以编写 Python 气象站脚本了。我们将从一个基本脚本开始,该脚本不断读取并显示 Sense HAT 传感器的所有数据。

要开始编写新的 Python 脚本,请在终端中运行以下命令。

sudo vim 〜/weather_script.py

2 现在,在脚本中输入以下代码行,我们将逐步解释每个代码块。

#!/usr/bin/python
从 sense _hat导入 SenseHat 
导入时间
导入系统首先,我们需要导入所有计划在脚本中使用的库。在我们的情况下,我们将使用以下库。

** sense \ _hat 库 **
此导入是我们用来与 Sense Hat 本身进行交互的库,如果没有此库,我们将无法读取任何传感器数据或与 LED 矩阵进行交互。

时间图书馆
此导入使我们可以执行各种不同的时间操作,但是对于我们的简单脚本,我们将仅使用其睡眠功能。此功能将使我们能够暂停当前线程一小段时间。

** sys 库 **
该库使我们可以访问由解释器本身管理的一些变量和函数。就我们的脚本而言,如果需要,我们将使用它来终止脚本。

感= SenseHat()
sense.clear()

第一行创建到 Sense Hat 库的链接并初始化自身,以便我们可以开始对其进行调用。

第二行告诉库清除 LED 矩阵,默认情况下,这意味着关闭所有 LED 。在处理 Sense HAT 时始终这样做是一个好主意,因为它可以确保没有任何显示。

尝试:
      而 True :

我们设置了第一个 ** try 语句,我们需要这样做,以便我们可以通过按 Ctrl + C ** 来退出 while 循环,确保您将缩进保留为 True 。所需的间距是因为 Python 对缩进敏感。接下来的几行代码需要缩进三个制表符 (12 个空格)。

            temp = sense.get_temperature()

借助 Sense HAT 库,获取温度非常简单。我们要做的就是调用该库以使其从传感器中检索温度。这将为我们提供的输出为摄氏温度,它还提供了一个较大的十进制数字,但是我们将在下一行代码中处理该数字。

如果您希望处理温度而不是摄氏温度,我们将说明如何将温度转换为华氏温度。

摄氏温度

            temp = round(温度,1)

华氏度

            温度= 1.8 *圆(温度,1)+ 32

在这里,我们为这行代码提供了两种选择,摄氏代码利用从传感器获得的值并将其四舍五入到最接近的小数位。

华氏代码基本相同,唯一的区别是我们将值从摄氏温度转换为华氏温度。

摄氏温度

            打印("温度 C ",温度)

华氏度

            打印("温度 F ",温度)

这部分代码非常基础,仅将温度打印到终端上。

            湿度= sense.get_humidity()
            湿度=圆形(湿度 1 )
            打印("湿度:",湿度)

            压力= sense.get_pressure()
            压力=圆形(压力 1 )
            打印("压力:",压力)

湿度和压力传感器都可以像温度传感器一样读取。对我们来说幸运的是,Sense HAT 库使这一过程变得非常简单。它们的值也以一个大的十进制数返回,因此我们将再次对其进行四舍五入,然后将这些值显示给终端。

这两个代码块的工作方式与温度代码一样,因此无需多说。

            time.sleep(1)

这行代码是对时间库的简单调用,它使脚本进入睡眠状态大约一秒钟。主要是为了降低读取和输出数据的速率。

您可以通过减少此数字或删除行来加快读取速度。您也可以通过增加数量进一步降低速度。该数字应该大约是您希望两次读取之间等待的秒数。

除了 KeyboardInterrupt :
      通过

此代码使尝试查找 ** KeyboardInterrupt 异常。当它被触发时,我们将忽略该异常,因此我们可以使脚本清晰地退出 while 循环。我们通过调用 pass ** 来实现。

3 在将所有代码输入到我们的 Python 文件中之后,您应该最终得到如下所示的内容,当然,如果您使用的是华氏转换代码,而不仅仅是直接的摄氏温度,那么情况将有所不同。

#!/usr/bin/python
从 sense _hat导入 SenseHat 
导入时间
导入系统

感= SenseHat()
sense.clear()

尝试:
      而 True :
           temp = sense.get_temperature()
           temp = round(温度,1)
           打印("温度 C ",温度)

           湿度= sense.get_humidity()
           湿度=圆形(湿度 1 )
           打印("湿度:",湿度)

           压力= sense.get_pressure()
           压力=圆形(压力 1 )
           打印("压力:",压力)

           time.sleep(1)
除了 KeyboardInterrupt :
      通过一旦您的代码看起来像上面显示的代码,并且确定您已正确缩进代码即可退出并保存,请按** Ctrl + X **,然后按** Y **,然后按**输入** 。

4 现在,我们可以通过在终端中运行以下命令来运行新的 Python 脚本。

sudo python 〜/weather_script.py

5 如果一切正常,您现在应该开始在终端中看到类似于以下内容的文本。

("温度 C ",30.0)
("湿度:",39.8)
("压力:",1025.7)

对显示的数据感到满意后,您可以按 ** Ctrl + C ** 来停止脚本。这将终止脚本的运行。当然,您可能不需要查看树莓派的终端就可以从中获取当前数据。

相反,我们将向您展示另外两种显示数据的方法,第一种是将数据显示到 LED 矩阵。

另一种方法是利用一个名为” 初始状态” 的软件,该软件将使我们能够绘制数据图,并且,如果您决定付费购买该软件,则还可以在一段时间内存储数据。

改善气象站–利用 LED 矩阵

1 更改天气 Python 脚本以开始将其数据显示到 LED 矩阵相对容易。这将涉及到我们将所有打印品连接在一起成为一个字符串,然后向 Sense Hat 库发出 ** show \ _message ** 命令。

在开始之前,我们先运行以下命令来开始编辑天气脚本。

sudo vim 〜/weather_script.py

2 现在我们已经在天气脚本中,可以开始进行一些更改了,在 ** time.sleep ** 行上方,我们需要添加一行额外的代码。它基本上在一条简单的线中处理所有事情。

以上

           time.sleep(1)

           sense.show_message("温度 C "+ str(温度)+"湿度:"+ str(湿度)+"压力:"+ str(压力),scroll_speed =(0.08),back_colour = [0,0,200])

确保已将这一行代码全部键入到一行中。这种变化将使温度,湿度和压力在 Sense HAT LED 矩阵上滚动。

我们将在这里解释一下我们在做什么。我们首先将温度连接到”Temperature C” 的末尾,但是由于 temp 变量是一个数字,因此我们需要将其包装在 str () 中以将其转换为字符串。

由于 Python 解释为字符串添加数字的方式,因此不转换字符串将导致问题。我们对湿度和压力执行相同的过程。

我们也将滚动速度降低到 0 .08,我们通过以下代码 code scroll_speed =(0.08) 来做到这一点,您可以增加或减少此数字来加快或降低文本滚动的速度。

这行代码的最后一位是 back_colour = [0,0,200],这部分代码将文本的背景色设置为蓝色。

您还可以更改文本本身的颜色。我们可以通过在下面的示例中将文本的颜色设置为粉红色的示例来做到这一点:在 back _color [0,0,200] 之后添加,text_color = [200,0,200]

3 添加这一行后,我们要添加的最后一件事是调用 sense.clear()

在异常处理和传递之后,在脚本的底部,添加以下代码行。

sense.clear()

如果我们出于任何原因终止脚本,此代码将确保 LED 矩阵被完全清除。这也消除了必须处理部分打开的 LED 矩阵的烦恼,并具有节省少量电源的额外好处,但是当您不使用它时,没有必要打开一些东西。

确保停止运行脚本时清理所有内容也是一种良好的编码习惯。它有助于防止发生诸如内存泄漏之类的事情。

4 做出这些更改后,您的代码应类似于下面显示的内容。请记住,** sense.show \ _message ** 代码应包含在一行中。

#!/usr/bin/python
从 sense _hat导入 SenseHat 
导入时间
导入系统

感= SenseHat()
sense.clear()

尝试:
      而 True :
           temp = sense.get_temperature()
           temp = round(温度,1)
           打印("温度 C ",温度)

            湿度= sense.get_humidity()
            湿度=圆形(湿度 1 )
            打印("湿度:",湿度)

            压力= sense.get_pressure()
            压力=圆形(压力 1 )
            打印("压力:",压力)

            sense.show_message("温度 C "+ str(温度)+"湿度:"+ str(湿度)+"压力:"+ str(压力),scroll_speed =(0.08),back_colour = [0,0,200])

           time.sleep(1)
除了 KeyboardInterrupt :
      通过

sense.clear()一旦您的代码看起来像上面显示的代码,并且确定您已正确缩进代码即可退出并保存,请按** Ctrl + X **,然后按** Y **,然后按**输入** 。

5 现在,我们可以测试修改后的脚本,以确保其正常运行。在终端中运行以下命令以运行脚本。

sudo python 〜/weather_script.py

现在,文字应开始在 Sense Hat 的 LED 矩阵上滚动。当然,您很快就会注意到,这不是查看所有传感器数据的最简单方法。

显示器的可视性主要是由于 LED 矩阵的小性质,使得文本更难以阅读,并且一次只能显示一个字母。当然,如果您有一个实际的 LED 屏幕而不是一个光矩阵,那将是在 Pi 上显示数据的更好选择。

显示数据的一种更好的方法是利用诸如” 初始状态” 之类的软件。我们将进入设置初始状态并在下一页获取脚本以向其发送数据。

使用初始状态改善树莓派气象站

1 对于那些不知道的人,Initial State 是一个网站,旨在充当物联网设备] 的一种数据存储和数据分析网站 (/categories/projects/iot/),例如树莓派。我们在本教程中使用的是 Initial state,因为 [树莓派的 Cayenne IOT 构建器当前不支持 HAT ,如果它们最终添加它,我将更新本教程以反映这一点。

在开始为树莓派气象站实施所有功能之前,我们首先必须在 [他们的网站上] 注册一个免费帐户。(https://www.initialstate.com/)

进入网站后,转到屏幕右上角的” 登录”。

2 现在,在登录屏幕上,我们需要单击注册新帐户

3 最后,注册您的新用户,确保您设置了一个容易记住的强密码,因为您需要此密码才能获取 API 密钥并查看数据。

4 现在,与您的新用户一起,返回登录页面并登录到新的初始状态用户中,在开始使用脚本之前,我们需要从此处获取 API 密钥。

5 现在,您应该会受到一个空白的仪表板屏幕的欢迎,如下所示,要进入可以生成 API 密钥的屏幕,您需要单击右上角的电子邮件地址角。

6 现在我们在帐户屏幕上,我们需要一直滚动到底部并寻找 ** Streaming Access Keys ,在这里您应该看到一个 Create a New Key ** 按钮, 按下。生成密钥后,请将其记录在安全的地方,因为您的脚本需要此密钥。

7 现在,我们可以继续安装 Initial State python streamer,为此,我们将直接从其网站获取其安装脚本。尽管通过 CURL 运行脚本通常并不安全,但” 初始状态” 是一个受信任的站点。但是,如果您想自己检查脚本,则可以通过以下 URL 进行查看:https://get.initialstate.com/python

如果可以运行该脚本,请在终端中输入此命令。

curl -ssl https://get.initialstate.com/python -o-| sudo bash 

8 最终,您会收到以下提示,按 ** N ** 跳过下载示例代码的过程,本教程将不需要它。

9 现在,我们已经安装了流光,并且可以开始编辑以前的天气脚本了。运行以下命令以开始编辑文件。

sudo vim 〜/weather_script.py

10 现在,我们将首先对该文件添加几个代码。将以下行添加到文件中。

下面

导入系统

从 ISStreamer .Streamer导入 Streamer 

该行导入了初始状态流程序包,这将使我们能够连接到他们的网站并将数据流式传输到该网站。

下面

感= SenseHat()

logger = Streamer(bucket_name ="传感帽传感器数据",access_key ="YOUR_KEY_HERE")

此行将创建 Streamer 并初始化与 Initial Senses 服务器的连接,请确保将 ** YOUR \ _KEY \ _HERE ** 替换为在步骤 6 中获得的密钥。

更换

打印(

logger.log(在此步骤中,您需要将所有出现的** print(替换为 logger .log(**),这将使脚本将所有传感器数据记录到 Initial State的网站。幸运的是,Streamer对象的 log 方法遵循相同的记录方法参数作为 print 。因此,我们可以轻松地换出函数。

您的代码现在看起来应该类似于下面显示的内容。

#!/usr/bin/python
从 sense _hat导入 SenseHat 
导入时间
导入系统
从 ISStreamer .Streamer导入 Streamer 

感= SenseHat()
logger = Streamer(bucket_name ="传感帽传感器数据",access_key ="YOUR_KEY_HERE")
sense.clear()

尝试:
      而 True :
           temp = sense.get_temperature()
           temp = round(温度,1)
           logger.log("温度 C ",temp)

            湿度= sense.get_humidity()
            湿度=圆形(湿度 1 )
            logger.log("湿度:",湿度)

            压力= sense.get_pressure()
            压力=圆形(压力 1 )
            logger.log("压力:",压力)

           time.sleep(1)
除了 KeyboardInterrupt :
      通过

一旦您的代码看起来像上面显示的代码,并且确定您已正确缩进代码即可退出并保存,请按 ** Ctrl + X ,然后按 Y ,然后按输入 ** 。

11 现在,我们进行了这些更改,最终可以通过运行以下命令来运行更新后的脚本。

sudo python 〜/weather_script.py

该脚本将立即开始将您的数据发送到网站。

12 现在回到” 初始状态” 仪表板,您现在应该在左侧看到新数据集,单击它。

13 选中数据集后,我们现在可以选择查看数据的方式,在本教程中,我们将选择 [标题],因为这是最通用的选项。

14 现在,您应该会看到类似下面的显示,并且会随着从树莓派发送的新值不断更新自身。

如果要更改为任何值显示的图形,可以右键单击它们,然后单击” 配置图块”。

改善气象站–启动时启动脚本

1 在开始设置脚本之前,我们首先需要安装一个我们可能不得不依靠的附加软件包。这个软件包是”dos2unix”,它将 DOS 风格的行尾转换为 Unix 友好的东西。

运行以下在终端中的 Linux 命令安装该软件包。

sudo apt-get install dos2unix

2 要将 Python 脚本设置为服务,以便在启动时启动,我们需要编写一个简短的脚本。该脚本的优点是我们可以停止它并轻松强制重新启动。

首先,通过运行以下命令开始编写新脚本。

sudo vim /etc/init.d/weatherstation

现在将以下内容写入文件,这是很多代码。您可以在本教程的 GitHub 页面上找到我们在本教程中使用的所有代码。

#!/bin/bash
###开始初始化信息
#提供:气象站
#必选-开始:
#必需-停止:
#默认开始:2 3 4 5
#默认停止:0 1 6
#简短描述:启动/停止气象站
#说明:启动/停止气象站
###结束初始化信息

DIR =/home/pi
DAEMON = $ DIR/weather_script.py
DAEMON_NAME =气象站

DAEMON_USER =根

PIDFILE =/var/run/$ DAEMON_NAME.pid

。/lib/lsb/init-functions

do_start(){
    log_daemon_msg"正在启动系统$ DAEMON_NAME守护程序"
    start-stop-daemon --start --background --pidfile $ PIDFILE --make-pidfile --user $ DAEMON_USER --chuid $ DAEMON_USER --startas $ DAEMON
    log_end_msg $?
}
do_stop(){
    log_daemon_msg"正在停止系统$ DAEMON_NAME守护程序"
    start-stop-daemon --stop --pidfile $ PIDFILE --retry 10
    log_end_msg $?
}

案例"$ 1"在
    开始|停止)
        do _ $ {1}
        ;;

    重新启动|重新加载|强制重新加载)
        do_stop
        do_start
        ;;

    状态)
        status_of_proc"$ DAEMON_NAME""$ DAEMON"&&退出 0  ||退出$?
        ;;
    *)

        echo "用法:/etc/init.d/$DAEMON_NAME {开始|停止|重新启动|状态}"
        1号出口
        ;;
埃萨克
出口 0 

3 现在,我们已将所有代码写入文件中,现在可以通过按 Ctrl + X ,然后按 Y ,然后按 Enter 来保存并退出。4** 现在,我们已经保存了文件,我们需要做一些事情以确保其正确运行。首先,我们将在新创建的文件上运行 dos2unix 。该程序将确保行尾正确。
sudo dos2unix /etc/init.d/weatherstation

5 完成后,我们现在需要更改 python 脚本的权限。否则,我们的 ** init.d ** bash 脚本将无法工作。在终端中输入以下内容以更改其权限。

sudo chmod 755 /home/pi/weather_script.py

6 我们还需要修改 weatherstation bash 脚本的权限,并需要赋予其执行权限。我们通过输入以下命令来做到这一点。

sudo chmod + x /etc/init.d/weatherstation

7 现在,最后,我们需要在 bash 脚本和 ** rc.d ** 文件夹之间创建一个符号链接。我们可以通过在终端中运行以下命令来做到这一点。

sudo update-rc.d weatherstation默认值

8 现在应已完成所有设置,并且我们现在可以像其他任何服务一样与新的 bash 文件进行交互了。

要启动我们的 Python 脚本,我们只需运行以下命令。

sudo 服务气象站启动

9 现在应该正确设置所有内容,并且气象站服务现在应该在启动时自动启动。我们也可以像大多数服务一样停止脚本,重新加载它,并检查脚本的状态。

以下是可以调用以与气象站服务进行交互的命令列表。

此命令将启动服务,以跟踪您的 ** weather \ _script.py ** 文件。

sudo 服务气象站启动

以下命令将停止气象站服务,并终止运行我们的 ** weather \ _script.py ** 的进程。

sudo 服务气象站停止

该命令通过终止进程并重新加载来重新加载气象站服务。

sudo 服务气象站重新加载

下面显示的最后一个命令将检索气象站服务的状态以及我们的 ** weather \ _script.py ** 脚本。

sudo service气象站状态

希望本教程向您展示了如何设置一个使用 Sense HAT 的基本树莓派气象站,并且您不会遇到任何问题。对于任何想要建立廉价气象站的人来说,这无疑是一个伟大的项目。如果您有任何反馈,技巧或想分享的任何问题,请随时在我们的论坛上发表评论。

分享到