Node.jsとRaspberry Pi、LCDディスプレイで天気をモニタリングする方法【DIY完全ガイド】
スマートホームデバイスの市場は急拡大しています。2015年には30万台未満だった導入台数が、2020年には約12億台に達し、さらに15億台へと成長すると予測されていました。
2021年までに1世帯あたり平均8.7台のスマートデバイスが普及するとされる中、あなたのご家庭にもすでに何らかのスマートデバイスがあるかもしれません。
そして開発者である私たちには、この分野で大きなアドバンテージがあります。自分の手でスマートホームデバイスを作れるからです。
急速な進化を遂げているのはデバイスだけではありません。それらを支える開発ボードも、ますます手頃な価格で入手しやすいものになってきています。
この記事では、Raspberry Pi・LCDディスプレイ・ほんの数行のコードを組み合わせて、屋外や特定の場所の天気をモニタリングする装置を作る方法を解説します。

これはDIYプロジェクトなので、まず必要なものを揃えるところから始めましょう。
必要なもの(前提条件)
- Raspberry Pi 3(またはそれ以降のモデル)
- LCDディスプレイ(キャラクタ液晶)
- ジャンパーワイヤ(接続ケーブル)
- ポテンショメータ(可変抵抗器)※推奨
- ブレッドボード ※任意
作り方
必要なものが揃ったら、ステップごとに進めていきましょう。
ステップ1:基本設定
最初のステップは、基本的なセットアップと全コンポーネントの動作確認です。
このデモでは、気象データプロバイダとしてClimaCell Weather API(現在はTomorrow.ioに名称変更)を使用します。大気質指標をはじめ、非常に多くの気象指標を利用できるのが魅力です。
APIを利用するには、公式サイトで無料アカウントを作成し、リクエスト認証用のAPIキーを取得します。

アカウントは無料で開設でき、無料プランでは毎時100回のAPI呼び出し制限が付きます。今回のプロジェクトには十分すぎるほどの枠です。
APIキーを入手したら、次はハードウェアの接続です。配線作業の際は必ずRaspberry Piの電源を切っておきましょう。
Raspberry Pi 3のピン配置は以下の画像を参考にしてください。

LCDと開発ボードの配線は次のようになります。

このままの接続では、LCDは最大輝度・最大コントラストで動作します。輝度は問題ありませんが、コントラストが最大のままだと画面上の文字がまったく読めなくなるので注意が必要です。
そこで、コントラストを調整するためにポテンショメータ(可変抵抗器)を少なくとも1つ追加しましょう。

ここまで完了したらRaspberry Piの電源を入れます。LCDが点灯し、可変抵抗を回すことでコントラストを調整できれば成功です。
ステップ2:プロジェクトのセットアップ
プログラミング言語にはNode.jsを使用します。Raspberry PiにNode.jsがまだインストールされていない場合は、公式の手順に沿ってインストールしておいてください。
新しいフォルダを作成し、まず npm init -y コマンドでnpmパッケージを初期化します。続けて、以下のコマンドで必要な2つの依存パッケージをインストールしてください。
npm install lcd node-fetchlcd:LCDディスプレイとの通信を担当node-fetch:ClimaCell APIへのHTTPリクエストを担当
気象データプロバイダとの通信にはAPIキーが必要です。秘密鍵となるAPIキーは、メインコードに直接書き込むこともできますが、config.json ファイルにまとめておく方が安全で管理もしやすくなります。
config.json
{ "cc_key": "<your_ClimaCell_API_key>"}最後に、プロジェクトのメインファイルを作成し、これまでの要素を読み込みます。
// * Dependencies
const Lcd = require("lcd");
const fs = require("fs");
const fetch = require("node-fetch");
// * Globals
const { cc_key } = JSON.parse(fs.readFileSync("./config.json"));ステップ3:LCDの制御
lcd モジュールを使えば、画面への文字表示はとても簡単です。このライブラリはデバイス通信の抽象化レイヤーとして機能するため、低レベルのコマンドを個別に扱う必要がありません。
LCDに関するコード全体は以下の通りです。

まず新しい lcd オブジェクトを作成し、使用したピンの番号を引数として渡します。
cols と rows のキーは、それぞれLCDの列数・行数を表します。この例では一般的な 16x2 のディスプレイを使用しました。8列1行のLCDをお使いの場合は、16と2をご自身の環境の値に置き換えてください。
画面に文字を表示するには、次の2つのメソッドを順に呼び出します。
lcd.setCursor():書き込み開始位置を指定lcd.print():文字列を出力
また、これら2つの関数をPromiseでラップすることで、async/await 構文を活用できるようにしています。
この時点で関数を試してみましょう。writeToLcd(0,0,'Hello World') を実行すると、1行目の先頭列から「Hello World」と表示されるはずです。
ステップ4:気象データの取得
次は、天気データを取得してディスプレイに表示する段階です。
ClimaCellは気象データだけでなく、大気質・花粉・火災など多彩な情報を提供しています。ただし、LCDは16列×2行=32文字しか表示できないことを忘れないでください。
より多くの種類のデータを表示したい場合は、スクロール表示の仕組みを取り入れるとよいでしょう。

このデモではシンプルに、以下の3つのデータを表示します。
- 現在時刻(時・分・秒)
- 気温
- 降水強度

特定の場所のデータをClimaCellから取得するには、その地点の緯度・経度という地理座標をリクエストに含める必要があります。
お住まいの都市の座標は、latlong.netなどの無料ツールで調べられます。取得した座標はAPIキーと一緒に config.json に保存するか、コード内に直接記述してください。
API呼び出しのレスポンスは、次のような形式で返されます。
{
lat: 45.658,
lon: 25.6012,
temp: { value: 17.56, units: 'C' },
precipitation: { value: 0.3478, units: 'mm/hr' },
observation_time: { value: '2020-06-22T16:30:22.941Z' }
}このオブジェクトを分割代入で展開し、気温と降水強度の値を取り出して、それぞれ1行目・2行目に表示すればOKです。
ステップ5:全体をまとめる
残りの作業は、スクリプトのロジックを書き、新しいデータが届いたタイミングでLCDを更新する仕組みを作ることです。

気象データ自体は5分ごとに更新されますが、ClimaCellの上限が毎時100回なので、1分ごとにデータを更新する余裕もあります。
現在時刻の表示については、2つの選択肢があります。
observation_timeプロパティを使い、データを受信した日時を表示する- 実際の時計として、現在時刻を表示する
今回は後者の「リアルタイム時計」方式を採用しましたが、お好みで選んで問題ありません。
時刻を画面の右上に表示するには、テキストがぴったり収まるように開始列を計算する必要があります。計算式はシンプルで、「総列数 − 表示テキストの文字数」です。
時刻は8文字、列数は16なので、8列目から表示を開始すれば右端にきれいに収まります。
LCDの初期化は非同期処理のため、ライブラリが提供する lcd.on() メソッドを使って、「LCDの準備が完了したタイミング」を検知してから処理を開始しましょう。
組み込みシステム開発におけるもう一つのベストプラクティスは、使用したリソースを適切に解放することです。そこで、プログラム終了時に SIGINT イベントを捕捉してLCDを安全に閉じるようにします。併せて押さえておきたいイベントは以下の通りです。
SIGUSR1/SIGUSR2:nodemonの再起動など「kill pid」系のシグナルを捕捉uncaughtException:捕捉されなかった例外を捕捉
ステップ6:常時実行の設定
スクリプトは完成しました。ここで一度プログラムを実行できますが、仕上げにもう1つだけ重要な作業があります。
現状、Raspberry PiにはSSH経由、あるいはHDMIケーブルとモニター経由で接続しているはずです。どちらの方法でも、ターミナルを閉じるとプログラムは停止してしまいます。
また、デバイスの電源を切って再投入しても、スクリプトは自動的に起動せず、手動で実行し直す必要があります。
この課題を解決するのが、pm2 のようなプロセスマネージャーです。
手順は以下の4ステップです。
sudo npm install pm2 -g:pm2をグローバルインストールsudo pm2 startup:pm2の起動スクリプトを作成pm2 start index.js:アプリケーションを起動pm2 save:サーバー再起動後もプロセスリストを復元できるよう保存
これでボードを再起動しても、デバイスの準備が整い次第、スクリプトが自動的に立ち上がるようになります。
まとめ
ここから先は、あなたのアイデア次第で自由にカスタマイズできます。この天気データ(ClimaCellが提供する大気汚染・花粉・火災指数・道路リスクなどの情報も同様です)が日常的に役立つと感じたら、Raspberry PiとLCDディスプレイを収める専用ケースを3Dプリンタなどで作り、バッテリーを搭載すれば、部屋のどこにでも置ける立派なウェザーステーションになります。
Raspberry Piは小型ながら本格的なパソコンのようなものなので、Arduinoのようなマイクロコントローラよりもはるかに幅広いことができます。この柔軟性を活かせば、家にある他のスマートデバイスとの連携も簡単に実現できるでしょう。
-
Windows 8/10でWindows Updateトラブルシューティングツールを使ってアップデートエラーを解決する方法
MicrosoftはWindows 7の登場とともに、Windows OS向けのOTA(Over The Air)アップデート機能を導入しました。これにより、システムの問題が発生した際にも、アップデートを配信することで迅速に対応できるようになりました。しかし、Windowsユーザーであれば、最新ビルドへアップデートする際にさまざまなエラーに遭遇することがあるかもしれません。こうした問題に対処するため、Microsoftは「Windows Updateトラブルシューティングツール(Fixit)」という便利なツールを提供しています。このツールは、Windows内部のサービス設定を自動的にリセットす
-
Mac版タスクマネージャーはこれ!「アクティビティモニター」の使い方を徹底解説
「Macのタスクマネージャーはどこにある?」——WindowsからMacに乗り換えたばかりの方なら、一度は疑問に感じたことがあるはずです。実は、macOSにはWindowsのタスクマネージャーと完全に同じものは存在しません。その代わりとなるのが、標準搭載されている「アクティビティモニター」というアプリです。名前こそ違いますが、ほぼ同じ役割を果たしてくれる頼れるツールです。 この記事では、アクティビティモニターとは何か、どうやって起動するのか、そして各機能をどう使いこなせばいいのかを、初心者にもわかりやすく解説していきます。 アクティビティモニターとは? OS(オペレーティングシステム)の重要