Raspberry Pi如何制作气象站,使用Sense HAT让你的树莓派变成一个小小气象站

通过这篇文章,我将向您展示如何利用Sense HAT来制作一个基本的Raspberry Pi气象站。

Raspberry-Pi-Weather-Station-v1.jpg

如果你希望监测特定房间、室外或任何地方的天气状况,这个气象站是一个完美的小爱好项目。

对于不知道的人来说,Sense HAT是一个神奇的设备,它在一个单一的封装中附带了大量丰富的传感器。它是在不需要做任何额外电路的情况下,为Pi添加大量传感器的最简单方法。

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

我们也会去设置你的树莓皮气象站,让数据存储在Initial States Data分析服务上,这样我们就可以直接将数据流到他们的网页界面,并在漂亮的图表中查看所有数据。

本教程将使用大量的Python代码,但幸运的是,这些代码都是非常基本的,所以你跟着它应该不会有太多问题。

设备清单

你需要一个感应HAT和其他一些装备才能完成本教程。

建议

树莓派2或3

Micro SD卡或SD卡,如果你使用的是老版本的Pi。

电源供应器

Sense HAT

以太网线或USB WiFi(Pi 3内置WiFi)

可选

树莓派外壳

开始使用Sense HAT

在您开始学习本教程之前,请确保您已经将Sense HAT正确地放置在树莓派的GPIO引脚上。这是一个非常简单的安装方法,一旦正确安装,不需要任何额外的操作。

1. 在开始之前,我们需要运行以下命令,以确保Raspberry Pi运行的是最新的软件。

sudo apt-get update
sudo apt-get upgrade

2. 随着Raspberry Pi的更新,我们现在需要安装Sense Hat软件包,这提供了我们与Sense Hat交互所需的所有库。

sudo apt-get install sense-hat
sudo reboot

3. 现在我们已经安装好了软件,我们需要写一个快速的脚本来确保Sense HAT正常工作。

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

sudo nano ~/sensehat_test.py

4. 将以下几行写进这个文件,我们将边写边解释每部分代码的作用。

from sense_hat import SenseHat

这一行从sense_hat库中导入Sense Hat模块。这个库允许我们通过python与Hat本身进行交互。

sense = SenseHat()

这一行创建了一个通往Sense Hat库的链接,并初始化了自己,这样我们就可以开始对它进行调用。

sense.show_message("Hello World")

这一行写了一条信息给Sense Hat,你应该会看到 “Hello World “在RGB灯上滚动。

按Ctrl + X然后按Y然后按回车键保存文件。

5. 保存好文件后,我们可以用以下命令运行它。

sudo python ~/sensehat_test.py

文字 “Hello World “现在应该在Sense HAT顶部的RGB LED上滚动。如果没有,很可能是HAT没有正确地压在GPIO引脚上。

如果还是不行,请尝试通过重新运行以下命令来重新启动Raspberry Pi。

sudo reboot

将您的Sense HAT设置为气象站。

1. 现在我们已经测试过Sense HAT工作正常,现在我们可以开始编写Python气象站脚本了。我们将从一个基本的脚本开始,这个脚本将不断地读取和显示来自Sense HAT传感器的所有数据。

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

sudo nano ~/weather_script.py

2. 现在在脚本中输入以下几行代码,我们将边走边解释每块代码。

#!/usr/bin/python
from sense_hat import SenseHat
import time
import sys

首先,我们需要导入我们计划在脚本中使用的所有库。在我们的例子中,我们将使用以下库。

sense_hat Library 这个导入是我们用来与Sense Hat本身进行交互的库,如果没有这个库,我们就无法读取任何传感器数据或与LED矩阵进行交互。

time Library 这个导入允许我们做大量不同的时间事情,但对于我们的简单脚本,我们将只使用它的睡眠功能。这个功能将使我们能够暂停当前线程一小段时间。

sys 库 这个库为我们提供了对一些由解释器自己管理的变量和函数的访问。在我们的脚本中,如果我们需要终止脚本,我们将使用这个库来终止脚本。

sense = SenseHat()
sense.clear()

第一行创建了一个到Sense Hat库的链接,并初始化了自己,这样我们就可以开始对它进行调用。

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

try:
      while True:

我们设置了我们的第一个try语句,我们需要这样做,这样我们就可以脱离我们的while循环,按Ctrl + C确保你保持while True的缩进。这个需要的间距是因为Python对缩进很敏感。接下来的几行代码将需要三个tab (12个空格)的缩进。

            temp = sense.get_temperature()

获取温度非常简单,这要归功于Sense HAT库。我们所要做的就是对该库进行调用,让它从传感器中获取温度。这将给我们的输出将以摄氏度为单位,它还提供了一个较大的十进制数,但我们将在下一行代码中处理这个问题。

我们将解释如何将温度转换为华氏温度,如果你愿意处理,而不是摄氏度。

摄氏度

            temp = round(temp, 1)

Fahrenheit

            temp = 1.8 * round(temp, 1)  + 32 

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

华氏代码基本相同,唯一不同的是我们将摄氏度的数值转换为华氏度。

摄氏度

            print("Temperature C",temp)

Fahrenheit

            print("Temperature F",temp)

这段代码极其基本,只是将温度打印到终端。

            humidity = sense.get_humidity()  
            humidity = round(humidity, 1)  
            print("Humidity :",humidity)  

            pressure = sense.get_pressure()
            pressure = round(pressure, 1)
            print("Pressure:",pressure)

湿度和压力传感器都可以像温度传感器一样被读取。幸运的是,Sense HAT库让这一切变得非常简单。它们的数值也是以大十进制数的形式回来的,所以我们将再次对它们进行四舍五入,然后将数值显示在终端上。

关于这两个代码块,没有太多的多余的话可说,因为它们的操作和温度代码一样。

            time.sleep(1)

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

你可以通过减少这个数字或删除这一行来加快读取速度。你也可以通过增加这个数字来进一步减慢它的速度。这个数字应该是您希望它在读取之间等待的秒数。

except KeyboardInterrupt:
      pass

这段代码让 try 寻找一个 KeyboardInterrupt 异常,当它被触发时,我们忽略这个异常,这样我们就可以让脚本干净利落地离开 while 循环。当它被触发时,我们忽略这个异常,这样我们就可以让脚本干净利落地离开while循环。我们通过调用pass.

3. 将所有代码输入到我们的Python文件中,你应该最终得到如下所示的东西,当然,如果你使用了华氏度转换代码,而不是直接使用摄氏度转换代码,这将有所不同。

#!/usr/bin/python
from sense_hat import SenseHat
import time
import sys

sense = SenseHat()
sense.clear()

try:
      while True:
           temp = sense.get_temperature()
           temp = round(temp, 1)
           print("Temperature C",temp) 

           humidity = sense.get_humidity()  
           humidity = round(humidity, 1)  
           print("Humidity :",humidity)  

           pressure = sense.get_pressure()
           pressure = round(pressure, 1)
           print("Pressure:",pressure)

           time.sleep(1)
except KeyboardInterrupt:
      pass

一旦你的代码看起来像上面显示的那样,并且你确定你已经正确地缩进了你的代码,你可以退出并保存,按Ctrl+X,然后按Y,然后按回车。

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

sudo python ~/weather_script.py

5. 如果一切正常的话,你现在应该开始看到类似下面的文字出现在你的终端上。

('Temperature C', 30.0)
('Humidity :', 39.8)
('Pressure:', 1025.7)

一旦你对显示的数据感到满意,你可以按Ctrl + C停止脚本,这将终止脚本的运行。当然,你可能不希望必须看着你的Raspberry Pi的终端才能从它那里获得当前的数据。

相反,我们要向大家展示另外两种显示数据的方法,其中第一种是将数据显示到LED矩阵上。

另一种方法是利用一个叫Initial State的软件,可以让我们绘制数据图表,如果你决定为这个软件付费,还可以存储一段时间的数据。

改进您的气象站–利用LED矩阵

1. 改变我们的天气Python脚本,开始将其数据显示到LED矩阵上是比较容易的。这将涉及到我们将所有的打印数据连成一个字符串,然后向Sense Hat库发出show_message命令。

在我们开始之前,让我们通过运行以下命令开始编辑我们的天气脚本。

sudo nano ~/weather_script.py

2. 现在我们已经进入了我们的天气脚本,我们可以开始做一些改变,在time.sleep行上面我们需要添加一行额外的代码。它基本上用一行简单的代码就能处理所有的事情。

以上

           time.sleep(1)

添加

           sense.show_message("Temperature C" + str(temp) + "Humidity:" + str(humidity) + "Pressure:" + str(pressure), scroll_speed=(0.08), back_colour= [0,0,200])

确保你已经将这行代码全部输入到一行。这个变化将使温度、湿度和压力在Sense HAT LED矩阵上滚动。

我们将在这里解释一下我们正在做的事情。我们首先将温度连接到 “Temperature C “的末尾,但是由于temp变量是一个数字,我们需要用str()将其转换为字符串。

由于Python解释向字符串添加数字的方式,不转换字符串会引起问题。我们对湿度和压力进行同样的处理。

我们还将滚动速度降低到0.08,我们通过下面的代码 scroll_speed=(0.08)部分来实现,你可以增加或减少这个数字来加快或降低文本滚动的速度。

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

你也可以改变文字本身的颜色。我们可以通过在back_color[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
from sense_hat import SenseHat
import time
import sys

sense = SenseHat()
sense.clear()

try:
      while True:
           temp = sense.get_temperature()
           temp = round(temp, 1)
           print("Temperature C",temp) 

            humidity = sense.get_humidity()  
            humidity = round(humidity, 1)  
            print("Humidity :",humidity)  

            pressure = sense.get_pressure()
            pressure = round(pressure, 1)
            print("Pressure:",pressure)

            sense.show_message("Temperature C" + str(temp) + "Humidity:" + str(humidity) + "Pressure:" + str(pressure), scroll_speed=(0.08), back_colour= [0,0,200])

           time.sleep(1)
except KeyboardInterrupt:
      pass

sense.clear()

一旦你的代码看起来像上面显示的东西,你确定你已经正确地缩进你的代码,你可以退出并保存,按Ctrl+X,然后按Y,然后按回车。

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

sudo python ~/weather_script.py

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

显示的可看性主要是由于LED矩阵的小,使得文字比较难看,而且一次只能显示一个字母。当然,如果你有一个真正的LED屏幕而不是光矩阵,它将是一个更好的选择,在你的Pi上显示你的数据。

一个更好的显示数据的方法是利用一个软件,比如Initial State。我们将在下一页介绍如何设置Initial state并让我们的脚本将数据发送到它。

用初始状态改善你的Raspberry Pi气象站。

1. 对于不知道的人来说,Initial State是一个网站,旨在作为树莓Pi等物联网设备的一种数据存储和数据分析网站。我们在本教程中使用Initial state,因为Raspberry Pi的Cayenne物联网构建器目前还不支持感HAT,如果他们最终添加了它,我会更新本教程来反映。

在我们开始实施树莓派气象站的一切之前,我们首先要在他们的网站上注册一个免费账户。

进入网站后,进入屏幕右上角的SIGN IN。

1-Initial-state-e1492166231357.png

2-Initial-state-login-e1492166393440.png

3. 最后,注册你的新用户,请确保你设置一个强大的密码,你可以记住,因为你需要这个来获取你的API密钥和查看你的数据。

3-Account-registration-e1492166447709.png

4. 现在有了新的用户,回到登录页面,登录到新的初始状态用户,在开始使用我们的脚本之前,我们需要从这里抓取API密钥。

3A-Initial-state-login-LOGIN-e1492166508192.png

5. 你现在应该会看到一个空的仪表板屏幕,就像下面一样,要进入生成API密钥的屏幕,你需要点击右上角的电子邮件地址。

4-Initial-state-initial-screen-e1492166657124.png

6. 现在我们在我们的账户屏幕上,我们需要一路滚动到底部,并寻找流媒体访问密钥,在这里你应该看到一个创建一个新的密钥按钮,按下它。一旦密钥生成,请将其写在安全的地方,因为你将需要这个脚本。

5-Initial-state-api-key-e1492166716936.png

7. 现在我们可以开始安装Initial State的python流媒体,为此我们将直接从他们的网站上抓取安装脚本。虽然通常通过CURL运行脚本是不安全的,但Initial State是一个值得信赖的网站。然而,如果你想自己检查脚本,你可以通过以下网址查看它:https://get.initialstate.com/python。

如果你对运行脚本没有意见,那么在终端输入这个命令。

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

6-Installing-initial-state-e1492166795311.png

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

sudo nano ~/weather_script.py

10. 现在我们首先要在这个文件中添加一些代码。在该文件中添加以下几行:

下面

import sys

添加

from ISStreamer.Streamer import Streamer

这一行导入Initial State流媒体包,这样我们就可以与他们的网站建立连接,并将我们的数据流传到网站上。

下面

sense = SenseHat()

添加

logger = Streamer(bucket_name="Sense Hat Sensor Data", access_key="YOUR_KEY_HERE")

这一行创建了Streamer,并初始化了与Initial Senses服务器的连接,确保你用步骤6中得到的密钥替换YOUR_KEY_HERE。

替换

print(

随着

logger.log(

在这一步,你需要用logger.log( 替换print( 的所有出现,这将使脚本把你所有的传感器数据记录到Initial State的网站上。幸运的是,Streamer对象的log方法与print的参数相同。所以,我们可以很容易地将这两个函数互换一下。

你的代码现在应该看起来像下面显示的那样。

#!/usr/bin/python
from sense_hat import SenseHat
import time
import sys
from ISStreamer.Streamer import Streamer  

sense = SenseHat()
logger = Streamer(bucket_name="Sense Hat Sensor Data", access_key="YOUR_KEY_HERE")  
sense.clear()

try:
      while True:
           temp = sense.get_temperature()
           temp = round(temp, 1)
           logger.log("Temperature C",temp) 

            humidity = sense.get_humidity()  
            humidity = round(humidity, 1)  
            logger.log("Humidity :",humidity)  

            pressure = sense.get_pressure()
            pressure = round(pressure, 1)
            logger.log("Pressure:",pressure)

           time.sleep(1)
except KeyboardInterrupt:
      pass

一旦你的代码看起来像上面显示的那样,并且你确定你已经正确地缩进了你的代码,你可以退出并保存,按Ctrl+X,然后按Y,然后按回车。

11. 现在我们已经做了这些修改,我们终于可以通过运行以下命令来运行我们更新的脚本。

sudo python ~/weather_script.py

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

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

7-SEnse-hat-sensor-data-e1492166843106.png

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

8-Select-display-type-e1492166891887.png

14. 现在,您应该看到一个类似下面的显示屏,当新的数值从您的Raspberry Pi发送过来时,它将会不断更新。

如果你想改变正在显示的任何一个值的图形,你可以右击它们,然后点击配置磁贴。

9-Tile-Display-e1492166110674.png

改进您的气象站 – 在启动时启动脚本。

1. 在我们开始设置我们的脚本之前,我们首先需要安装一个我们可能需要依赖的额外的包。这个包是dos2unix,它可以将DOS风格的行结尾转换成Unix友好的东西。

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

sudo apt-get install dos2unix

2. 为了将我们的Python脚本设置为服务,使其在启动时启动,我们需要编写一个简短的脚本。这个脚本的好处是,我们将能够轻松地停止它并强制重启。

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

sudo nano /etc/init.d/weatherstation

现在把下面的内容写进文件,这是相当多的代码。你可以在本教程的GitHub页面上找到我们在本教程中使用的所有代码。

#!/bin/bash
### BEGIN INIT INFO
# Provides:          weatherstation
# Required-Start:    
# Required-Stop:     
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start/stops the weatherstation
# Description:       Start/stops the weatherstation
### END INIT INFO

DIR=/home/pi
DAEMON=$DIR/weather_script.py
DAEMON_NAME=weatherstation

DAEMON_USER=root

PIDFILE=/var/run/$DAEMON_NAME.pid

. /lib/lsb/init-functions

do_start () {
    log_daemon_msg "Starting system $DAEMON_NAME daemon"
    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 "Stopping system $DAEMON_NAME daemon"
    start-stop-daemon --stop --pidfile $PIDFILE --retry 10
    log_end_msg $?
}

case "$1" in
    start|stop)
        do_${1}
        ;;

    restart|reload|force-reload)
        do_stop
        do_start
        ;;

    status)
        status_of_proc "$DAEMON_NAME" "$DAEMON" && exit 0 || exit $?
        ;;
    *)

        echo "Usage: /etc/init.d/$DAEMON_NAME {start|stop|restart|status}"
        exit 1
        ;;
esac
exit 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 defaults

8. 现在一切都应该设置好了,我们现在可以像其他服务一样与我们的新bash文件进行交互。

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

sudo service weatherstation start

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

以下是您可以调用与气象站服务互动的命令列表。

这条命令可以启动跟踪你的 weather_script.py 文件的服务。

sudo service weatherstation start

下面的命令是停止weatherstation服务,并杀死正在运行weather_script.py的进程。

sudo service weatherstation stop

该命令通过杀死进程并重新加载气象站服务。

sudo service weatherstation reload

下面显示的最后一条命令可以检索气象站服务的状态和我们的 weather_script.py 脚本。

sudo service weatherstation status

我希望本教程已经向你展示了如何建立一个利用Sense HAT的基本Raspberry Pi气象站,并且你没有遇到任何问题。对于任何希望建立一个廉价气象站的人来说,这肯定是一个伟大的项目。如果你有一些反馈、技巧或遇到任何问题想要分享,那么请不要犹豫,在我们的论坛上留言。

平均: 0 / 5. votes: 0

到目前为止还没有投票!成为第一位评论此文章。

欢迎转载,请留下出处链接:Labno3 » Raspberry Pi如何制作气象站,使用Sense HAT让你的树莓派变成一个小小气象站

赞 (3)

评论

4+9=