通过这篇文章,我将向您展示如何利用Sense HAT来制作一个基本的Raspberry Pi气象站。
如果你希望监测特定房间、室外或任何地方的天气状况,这个气象站是一个完美的小爱好项目。
对于不知道的人来说,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。
3. 最后,注册你的新用户,请确保你设置一个强大的密码,你可以记住,因为你需要这个来获取你的API密钥和查看你的数据。
4. 现在有了新的用户,回到登录页面,登录到新的初始状态用户,在开始使用我们的脚本之前,我们需要从这里抓取API密钥。
5. 你现在应该会看到一个空的仪表板屏幕,就像下面一样,要进入生成API密钥的屏幕,你需要点击右上角的电子邮件地址。
6. 现在我们在我们的账户屏幕上,我们需要一路滚动到底部,并寻找流媒体访问密钥,在这里你应该看到一个创建一个新的密钥按钮,按下它。一旦密钥生成,请将其写在安全的地方,因为你将需要这个脚本。
7. 现在我们可以开始安装Initial State的python流媒体,为此我们将直接从他们的网站上抓取安装脚本。虽然通常通过CURL运行脚本是不安全的,但Initial State是一个值得信赖的网站。然而,如果你想自己检查脚本,你可以通过以下网址查看它:https://get.initialstate.com/python。
如果你对运行脚本没有意见,那么在终端输入这个命令。
curl -ssl https://get.initialstate.com/python -o - | sudo bash
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. 现在回到您的初始状态仪表板,您现在应该在左侧看到您的新数据集,点击它。
13. 选定数据集后,我们现在可以选择查看数据的方式,在本教程中,我们将选择瓷砖,因为这是最通用的选项。
14. 现在,您应该看到一个类似下面的显示屏,当新的数值从您的Raspberry Pi发送过来时,它将会不断更新。
如果你想改变正在显示的任何一个值的图形,你可以右击它们,然后点击配置磁贴。
改进您的气象站 – 在启动时启动脚本。
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气象站,并且你没有遇到任何问题。对于任何希望建立一个廉价气象站的人来说,这肯定是一个伟大的项目。如果你有一些反馈、技巧或遇到任何问题想要分享,那么请不要犹豫,在我们的论坛上留言。
欢迎转载,请留下出处链接:Labno3 » Raspberry Pi如何制作气象站,使用Sense HAT让你的树莓派变成一个小小气象站