独自のラズベリーパイ気象台を構築する

Build Your Own Raspberry Pi Weather Station



Raspberry Pi Sense Hatは、RaspberryPiシングルボードコンピューターで使用できるアドオンボードです。 Raspberry Pi Sense Hatには、8×8のLEDディスプレイと5ボタンのジョイスティックがあり、次のセンサーが装備されています。

  1. ジャイロスコープ
  2. 加速度計
  3. 磁力計
  4. 温度
  5. 大気圧
  6. 湿度

この記事では、PythonAPIベースの気象観測所Webアプリケーションを使用して作成する方法を紹介します。 温度気圧 、 と 湿度 Raspberry Pi SenseHatのセンサー。この記事を続けるには、次のものが必要です。







  1. ネットワーク接続を備えたRaspberryPi3またはRaspberryPi4。
  2. Raspberry Pi SenseHatモジュール。
  3. micro-USB(Raspberry Pi 3)またはUSB Type-C(Raspberry Pi 4)電源アダプター。
  4. Raspberry PiOSを搭載した16GBまたは32GBのmicroSDカード。
  5. RaspberryPiへのVNCリモートデスクトップアクセスまたはSSHアクセス用のラップトップまたはデスクトップコンピューター。

ノート: この記事では、Raspberry Piのヘッドレスセットアップを使用して、VNCまたはSSH経由でRaspberryPiにリモートで接続します。 SSHまたはVNCを介してRaspberryPiにリモートでアクセスしたくない場合は、モニター、キーボード、およびマウスをRaspberryPiに接続する必要があります。



Raspberry Pi OSイメージをmicroSDカードにフラッシュする方法については、Raspberry PiImagerをインストールして使用する方法を参照してください。 RaspberryPiにRaspberryPi OSをインストールする際にサポートが必要な場合は、以下をお読みください。 Raspberry Pi4にRaspberryPiOSをインストールする方法 。 Raspberry Piのヘッドレスセットアップについてサポートが必要な場合は、外部モニターなしでRaspberry Pi4にRaspberryPiOSをインストールして構成する方法を確認してください。



Raspberry Pi SenseHatをRaspberryPiに接続する

Raspberry Pi Sense Hatキットには、Raspberry Pi Sense Hatアドオンボード、40ピンのオス-メスヘッダー、およびいくつかのネジとスペーサーが付属しています。





SenseHatボードをRaspberryPiに接続する前に、40ピンヘッダーをSenseHatに接続する必要があります。下の画像に示すように、40ピンのオス-メスヘッダーのオスピンをセンスハットに接続します。



Raspberry Piシングルボードコンピューターには、アドオンボードまたはケースを取り付けるために使用できる4つの穴があります。アドオンボードを取り付けるには、下の画像に示すように、RaspberryPiの背面からネジを挿入します。

次に、スペーサーをネジに接続します。

4つのネジとスペーサーをすべて追加すると、RaspberryPiは次の画像のようになります。

次の画像に示すように、Raspberry Pi SenseHatをRaspberryPiの40ピンGPIOオスヘッダーに接続します。

ノート: Raspberry Pi SenseHatをRaspberryPi 40ピンGPIOヘッダーから外すときは、Raspberry PiGPIOのピンが曲がらないように注意してください。

下の画像に示すように、残りの4本のネジでRaspberry Pi SenseHatを固定します。

ラズベリーパイの電源を入れる

Raspberry Pi SenseHatがRaspberryPiに接続されたので、Raspberry PiOSを搭載したmicroSDカードをRaspberryPiのmicroSDカードスロットに挿入し、電源ケーブルをRaspberryPiに接続して電源を入れます。

Raspberry Pi Sense HatPythonライブラリのインストール

RaspberryPiでRaspberryPi Sense Hatを使用するには、 センスハット PythonライブラリはRaspberryPiOSにインストールする必要があります。 NS センスハット ライブラリは、Raspberry PiOSの公式パッケージリポジトリで入手できます。

RaspberryPiをインストールするには センスハット Raspberry Pi OSのPythonライブラリでは、最初に次のコマンドを使用してAPTパッケージリポジトリキャッシュを更新します。

$ sudo apt update

次に、次のコマンドを実行します。

$ sudo apt installsense-ハット-y

Flask Micro Web FrameworkPythonライブラリのインストール

Flask Pythonフレームワークを使用して、天気予報アプリケーションを作成します。次のコマンドを使用して、Raspberry PiOSの公式パッケージリポジトリからFlaskをインストールできます。

$ sudo apt install python3-flask -y

プロジェクトディレクトリの作成

プロジェクトファイルを整理するためのプロジェクトディレクトリを作成することをお勧めします。プロジェクトディレクトリを作成するには 〜/ work 、次のコマンドを使用します。

$ mkdir〜 / work

プロジェクトディレクトリが作成されたら、次のようにプロジェクトディレクトリに移動します。

$ cd〜 / work

Raspberry Pi SenseHatのテスト

Raspberry Pi Sense Hatが機能しているかどうかをテストするために、簡単なテストPythonスクリプトを作成できます。と呼ばれる新しいPythonスクリプトを作成できます test.py とともに ナノ 次のようなテキストエディタ:

$ nano test.py

次のコードをに入力します test.py ファイル。 1行目はインポートします SenseHat から sense_hat モジュール、3行目は SenseHat オブジェクトと参照をに格納します 検出 変数であり、5〜6行目はすべての8×8LEDの色を赤に設定します。完了したら、を押します + NS に続く

あなたは実行することができます test.py 次のコマンドを使用したPythonスクリプト:

$ python3 test.py

下の画像に示すように、8×8のLEDマトリックスは赤色に光るはずです。

センスハットのLEDをオフにするには、 クリア() に色の値がないメソッド test.py 以下のスクリーンショットに示すように、Pythonスクリプトを実行し、 test.py 再びPythonスクリプト。

次の画像に示すように、SenseHatのLEDがオフになっているはずです。

Sense Hatが正常に機能している場合は、次のセクションに進みます。

SenseHatから気象データを取得する

Sense Hatを使用すると、センサーデータを非常に簡単に取得できます。 センスハット Pythonライブラリ。 Sense Hatからセンサーデータを取得するには、新しいPythonスクリプトを作成します read_sensor_data.py 次のように:

$ nano read_sensor_data.py

次のコードをに入力します read_sensor_data.py Pythonファイル。

からsense_hat輸入SenseHat
から 時間 輸入寝る
検出=SenseHat(()。
検出。クリア(()。
その間 NS
tempC=検出。get_temperature(()。
tempF=tempC *((9/5)。+32
プレッシャー=検出。get_pressure(()。
湿度=検出。get_humidity(()。

印刷(('温度:%。2f°C /%。2f°FNS'((tempCtempF)。)。
印刷(('圧力:%。2f mbNS'((プレッシャー)。)。
印刷(('湿度:%。2f %%NSNS'((湿度)。)。
寝る((5)。

完了したら、を押します + NS に続く

上記のコードでは、1行目と2行目で必要なすべてのライブラリがインポートされ、4行目で SenseHat オブジェクト、および行5は、を使用してSenseHatのすべてのLEDをオフにします。 クリア() 方法。 7行目のwhileループは、8〜16行目のコードを永久に実行する無限ループです。

8行目では、 get_temperature() メソッドは、センスハットの湿度センサーから温度データ(摂氏)を読み取るために使用されます。 9行目では、温度データが摂氏から華氏に変換されています。 10行目では、 get_pressure() メソッドは、センスハットの圧力センサーから気圧データ(ミリバール単位)を読み取るために使用されます。 11行目では、 get_humidity() メソッドは、Sense Hatの湿度センサーから湿度データ(%)を読み取るために使用されます。

13〜15行目は、センサーデータをコンソールに出力するために使用され、16行目は、センサーデータを再度読み取る前に5秒間待機するために使用されます。

あなたは実行することができます read_sensor_data.py 次のようなPythonスクリプト:

$ python3 read_sensor_data.py

スクリプトが実行されると、センサーデータがコンソールに出力されます。

Sense Hatからセンサーデータを読み取ることができるようになったので、を押します。 + NS プログラムを停止します。

Weather StationWebアプリの作成

このセクションでは、Python FlaskWebフレームワークを使用して天気APIと天気アプリケーションを作成する方法を示します。気象アプリケーションは気象データAPIにアクセスし、気象データをリアルタイムで表示します。このセクションで説明するすべてのコードは、GitHubの次の場所で入手できます。 shovon8 / raspberry-pi-sense-hat-weather-app

まず、を作成します server.py 次のようにプロジェクトディレクトリのPythonスクリプト:

$ nano server.py

次のコードをに入力します server.py Pythonファイル。

からフラスコ輸入フラスコ
からフラスコ輸入jsonify
からフラスコ輸入render_template
からフラスコ輸入url_for
からsense_hat輸入SenseHat
アプリ=フラスコ((__名前__)。
アプリ。設定['SEND_FILE_MAX_AGE_DEFAULT'] = 0
検出=SenseHat(()。
検出。クリア(()。
アプリ。test_request_context(()。
url_for(('静的'ファイル名='style.css')。
url_for(('静的'ファイル名='app.js')。
@アプリ。ルート(('/火')。
def(()。
tempC=検出。get_temperature(()。
tempF=tempC *((9/5)。+32
プレッシャー=検出。get_pressure(()。
圧力Psi=プレッシャー *0.0145038
圧力P=プレッシャー *100
湿度=検出。get_humidity(()。

戻るjsonify(({{
'温度'{{ 'NS':tempC 'NS':tempF}
'プレッシャー'{{ 'mb': プレッシャー 「hPa」: プレッシャー
「psi」:pressurePsi 'NS':pressureP}
「湿度」:湿度
})。
@アプリ。ルート(('/')。
def(()。
戻るrender_template(('./home.html')。

次に、を押します + NS に続く 保存するには server.py Pythonスクリプト。

上記のコードでは、1〜5行目で必要なすべてのライブラリをインポートし、7行目でFlaskアプリを作成し、11行目でSenseHatオブジェクトを作成し、12行目でSenseHatのすべてのLEDをオフにします。 8行目では、Flaskアプリのウェブキャッシュを無効にしています。このアプリは軽量であるため、キャッシュする必要はありません。アプリを変更する場合は、ウェブキャッシュを無効にすると、テストがはるかに簡単になります。

18〜31行目は、Sense Hatからセンサーデータを読み取り、HTTPGETリクエストでAPIデータをJSON形式で返します。 /火 Webサーバーのエンドポイント。 37〜39行目は、天気ウェブアプリのホームページを返します。 / Webサーバーのエンドポイント。ホームページはからレンダリングされます home.html ファイル、これは テンプレート/ プロジェクトディレクトリのディレクトリ。

14〜16行目は、 style.cssapp.js 静的ファイル。これらのファイルは、 静的/ プロジェクトディレクトリのディレクトリ。 NS style.css ファイルはスタイルを設定するために使用されます home.html ホームページ、および app.js ファイルは、からAPIデータを要求するために使用されます /火 エンドポイントとの気象データを更新します home.html 5秒ごとにページを作成します。

を作成します 静的/テンプレート/ 次のようにプロジェクトディレクトリ内のディレクトリ:

$ mkdir -v {static、templates}

を作成します home.html のファイル テンプレート/ 次のようなディレクトリ:

$ nano templates / home.html

次のコードをに入力します home.html ファイル。


< html >>
< >>
< メタ 名前=「ビューポート」 コンテンツ='width = device-width、initial-scale = 1.0'>>
< 題名 >>ラズベリーパイ気象台</ 題名 >>
< リンク rel=「スタイルシート」 タイプ='text / css'
href='{{url_for(' static '、filename =' style.css ')}}'/>>
</ >>
< >>
< div id='コンテンツ'>>
< h1 >>ラズベリーパイ気象台</ h1 >>

< div クラス=「データコンテンツ」>>
< h2 >>温度</ h2 >>
< div クラス=「データ行」>>
< div クラス=「データセル」 id='tempC'>>
..。
</ div >>
< div クラス=「データセル」 id='tempF'>>
..。
</ div >>
</ div >>
</ div >>

< div クラス=「データコンテンツ」>>
< h2 >>プレッシャー</ h2 >>
< div クラス=「データ行」>>
< div クラス=「データセル」 id='pressureMb'>>
..。
</ div >>
< div クラス=「データセル」 id=「pressurePsi」>>
..。
</ div >>
</ div >>
< div クラス=「データ行」>>
< div クラス=「データセル」 id=「pressureHpa」>>
..。
</ div >>
< div クラス=「データセル」 id='pressureP'>>
..。
</ div >>
</ div >>
</ div >>

< div クラス=「データコンテンツ」>>
< h2 >>湿度</ h2 >>
< div クラス=「データ行」>>
< div クラス=「データセル」 id=「湿度」>>
..。
</ div >>
</ div >>
</ div >>
</ div >>

< 脚本 タイプ='text / javascript' src='{{url_for(' static '、filename =' app.js ')}}'>></ 脚本 >>
</ >>
</ html >>

次に、を押します + NS に続く 保存するには home.html ファイル。

を作成します style.css のファイル 静的/ 次のようなディレクトリ:

$ nano static / style.css

次のコードをに入力します style.css ファイル。

@輸入 URL(('https://fonts.googleapis.com/css2?family=Roboto&display=swap')。;
* {{
パディング 0;
マージン 0;
フォントファミリー 'ロボット' サンセリフ;
}
{{
バックグラウンド #737373;
}
h1{{
画面 ブロック;
#79DC7B;
text-align 中心;
フォントの太さ 400;
バックグラウンド #000;
パディング 0.5em 0;
}
h2{{
画面 ブロック;
バックグラウンド #000;
#fff;
text-align 中心;
フォントの太さ 400;
フォントサイズ 1em;
}
.data-content {{
マージン 10px;
国境 2px 個体 ;
ボーダー半径 5px;
背景色 #79DC7B;
}
.data-row {{
画面フレックス;
フレックス方向;
}
.data-cell {{
100%;
身長 80px;
画面フレックス;
アイテムを揃える 中心;
正当化-コンテンツ 中心;
フォントの太さ 大胆な;
フォントサイズ 1.5em;
#006902;
}
.data-cellホバー {{
バックグラウンド #FFE891;
#AA8600;
カーソル ポインタ;
}

次に、を押します + NS に続く 保存するには style.css ファイル。

を作成します app.js のファイル 静的/ 次のようなディレクトリ:

$ nano static / app.js

次のコードをに入力します app.js ファイル。

窓。addEventListener(('ロード'主要)。;
関数主要(()。 {{
関数getAPIData(()。 {{
どこhttp= 新着XMLHttpRequest(()。;

http。onreadystatechange = 関数(()。 {{
もしも((これreadyState === 4 && これ状態 === 200)。 {{
アップデート((JSON。解析する((これresponseText)。)。;
}
}

http。開いた(('得る' '/火' NS)。;
http。送信(()。;
}


関数アップデート((apiData)。 {{
どこtempC=資料。getElementById(('tempC')。;
どこtempF=資料。getElementById(('tempF')。;
どこ圧力Mb=資料。getElementById(('pressureMb')。;
どこ圧力Psi=資料。getElementById((「pressurePsi」)。;
どこ圧力Hpa=資料。getElementById((「pressureHpa」)。;
どこ圧力P=資料。getElementById(('pressureP')。;
どこ湿度=資料。getElementById((「湿度」)。;

tempC。innerHTML =parseFloat((apiData。温度NS)。toFixed((2)。 + '°C';
tempF。innerHTML =parseFloat((apiData。温度NS)。toFixed((2)。 + '°F';

圧力Mb。innerHTML =parseFloat((apiData。プレッシャーmb)。toFixed((2)。 + 'mb';
圧力Psi。innerHTML =parseFloat((apiData。プレッシャーpsi)。toFixed((2)。 + 'psi';
圧力Hpa。innerHTML =parseFloat((apiData。プレッシャーhPa)。toFixed((2)。 + 'hPa';
圧力P。innerHTML =parseFloat((apiData。プレッシャーNS)。toFixed((2)。 + ' NS';

湿度。innerHTML =parseFloat((apiData。湿度)。toFixed((2)。 + '%';
}


関数アプリ(()。 {{
窓。setInterval((関数(()。 {{
getAPIData(()。;
} 5000)。;
}

アプリ(()。;
}

次に、を押します + NS に続く 保存するには app.js ファイル。

ここで、1行目は 主要() Webページの読み込みが完了すると機能します。の中に 主要() 機能、 getAPIData() 関数はAJAXを使用して天気APIデータをフェッチし、 アップデート() データが正常にフェッチされたら、関数(10行目)。 NS アップデート() 関数は、APIデータを使用してWebページ要素を更新します。

20行目では、 document.getElementById() メソッドは、IDを持つWebページ要素の参照を取得するために使用されます tempC 。 28行目は、IDを持つWebページ要素のコンテンツを置き換えるために使用されます tempC APIからの温度(摂氏)で。同様に、すべてのWeb要素(21〜26行目)のコンテンツは、それぞれのAPIデータに置き換えられます。

の中に アプリ() 機能、 getAPIData() 天気アプリで天気データを最新の状態に保つために、5秒(5000ミリ秒)ごとに呼び出されます。最後に、46行目で アプリ() 関数が実行されます。

Webアプリをテストするには、次のコマンドを入力します。

$ FLASK_APP = server.pyフラスコ実行--host = 0.0.0.0

天気アプリはポート5000(デフォルト)で実行する必要があります。

Weather APIが機能しているかどうかをテストするには、次のコマンドを実行します。

$ curl -s http:// localhost:5000 / api | json_pp

ご覧のとおり、WeatherAPIデータがコンソールに出力されます。したがって、APIは機能しています。

Weatherアプリをテストするには、次のWebサイトにアクセスしてください。 http:// localhost:5000 ChromiumWebブラウザから。 WeatherアプリはWebブラウザーにロードする必要がありますが、最初は気象データを表示しないでください。

数秒後、天気アプリはAPIからの天気データの取得を終了して表示する必要があります。

いつでも押すことができます + NS Webサーバーを停止します。

WeatherWebアプリのSystemdサービスの作成

このセクションでは、天気予報アプリのsystemdサービスファイルを作成して、起動時に自動的に起動するようにする方法を説明します。

まず、を作成します weather-station.service 次のようにプロジェクトディレクトリにファイルします。

$ nano Weather-station.service

次のコード行を weather-station.service ファイル。

[単位]
Description = Raspberry Pi SenseHatを使用したRaspberryPi Weather StationWebアプリ
After = network.target

[サービス]
WorkingDirectory = / home / pi / work
環境= FLASK_APP = server.py
環境= FLASK_ENV =本番
ExecStart = / usr / bin / flask run --host = 0.0.0.0
StandardOutput = inherit
StandardError = inherit
再起動=常に
User = pi

[インストール]
WantedBy = multi-user.target

次に、を押します + NS に続く 保存するには weather-station.service ファイル。

をコピーします weather-station.service ファイルに / etc / systemd / system / 次のコマンドを使用してディレクトリを作成します。

$ sudo cp -v weather-station.service / etc / systemd / system /

次のように変更を有効にするために、systemdデーモンをリロードします。

$ sudosystemctlデーモン-リロード

NS 気象台 以下のスクリーンショットに示すように、systemdサービスは現時点では非アクティブになっているはずです。

$ sudo systemctl status weather-station.service

を開始します 気象台 次のコマンドでサービスを実行します。

$ sudo systemctl startweather-station.service

ご覧のとおり、 気象台 サービスが実行されています。

$ sudo systemctl status weather-station.service

今では 気象台 サービスが機能している場合は、次のコマンドを使用してRaspberry PiOSのシステムスタートアップに追加できます。

$ sudo systemctl enable weather-station.service

次のコマンドを使用して、RaspberryPiを再起動します。

$ sudo再起動

Raspberry Piが起動したら、 気象台 以下のスクリーンショットに示すように、サービスが実行されている必要があります。

$ sudo systemctl status weather-station.service

他のデバイスから天気アプリにアクセスする

ホームネットワーク内の他のデバイスから天気アプリにアクセスするには、RaspberryPiのIPアドレスを知っている必要があります。 Raspberry Pi 4のIPアドレスは、ホームルーターのWeb管理インターフェイスから見つけることができます。この場合、IPアドレスは192.168.0.103ですが、このアドレスはユーザーによって異なるため、以降のすべての手順で、必ずこのアドレスを自分のアドレスに置き換えてください。

Raspberry Piコンソールにアクセスできる場合は、次のコマンドを実行してIPアドレスを見つけることもできます。

$ホスト名-I

Raspberry PiのIPアドレスがわかれば、ホームネットワーク内の任意のデバイスからアクセスできます。下のスクリーンショットに示すように、Androidスマートフォンから天気アプリにアクセスしました。

結論

この記事では、Raspberry Pi SenseHatを使用してRaspberryPiウェザーステーションを構築する方法を紹介しました。使用しました センスハット Raspberry Pi SenseHatから気象データを抽出するPythonライブラリ。次に、Flask PythonマイクロWebフレームワークを使用して、天気APIとWebアプリケーションを作成しました。 Webアプリは5秒ごとにweatherAPIから気象データを取得して、Webアプリを最新の気象データで最新の状態に保ちます。