23
Raspberry Pi Picoで空気質警告ライトを作る方法
Raspberry Pi Picoで空気質警告ライトを作る
(画像提供:Tom's Hardware)

空気の質は大きな懸念事項です。私たちは当たり前のように吸っている空気を、時に汚染物質で満たしてしまうことがあります。カナダの森林火災やイギリスの山火事などは、火災による大気汚染の最近の例です。では、外出しても安全かどうか、どうすれば確認できるのでしょうか?

このハウツーでは、OpenWeather APIの空気質データを使って、家を出る前に空気の質を知ることができるプロジェクトを構築します。データはRaspberry Pi Pico Wで可視化されます。Raspberry Pi Pico Wは6ドルのマイクロコントローラーで、インターネットに接続してデータを取得し、NeoPixel RGB LEDストリップを使ってデータを表示できます。

回路の構築

完成した回路

(画像提供:Future)

この回路は入力と出力の2つのセクションで構成されています。入力は、GPIO14とPico Wの3V3ピンに接続されたシンプルな押しボタンです。GPIO14は通常、グランド(基本的に0V)にプルダウンされています。ボタンを押すと、3V3ピンがGPIO14に接続され、ピンがハイ(3.3V)にプルダウンされます。この状態変化こそが、私たちのコードが求めているものです。出力は、3V3、GND、GPIO16に接続されたNeoPixelストリップです。GPIO16はNeoPixelにデータを送信し、必要に応じて色を変えるために使用されます。

Raspberry Pi Pico W と NeoPixel スティックの GPIO ピンをはんだ付けする必要がありますが、最高のはんだごてまたははんだ付けステーションを使用すると作業が簡単になります。

このプロジェクトに必要なもの

  • ラズベリーパイ ピコW
  • ネオピクセルスティック
  • ハーフブレッドボード
  • オス-オスジャンパーワイヤー5本
  • プッシュボタン

コードを書く

このプロジェクトのコードは、インターネットに接続して API からデータをダウンロードするために必要なもの、ユーザー入力を待機するコード、そして最後に RGB LED を介してデータを解釈するコードに分かれています。

1. Raspberry Pi Pico W用の最新バージョンのMicroPythonをダウンロードするには、以下の手順に従ってください。最も重要な手順は、UF2ファームウェアイメージのダウンロードとインストール、そしてThonnyのセットアップです。残りはオプションです。

2. Thonny を開き「停止」ボタンをクリックして接続を更新します。これにより、Python シェルが開いて正常に動作していることが確認できます。

Tom's Hardware の最高のニュースと詳細なレビューをあなたの受信箱に直接お届けします。

3.新しいファイルを作成し、このリンクの内容を貼り付けます。ファイルを neopixel.py として Raspberry Pi Pico W のルートに保存します。

4.プロジェクト コード用の新しいファイルを作成します。

5.プロジェクトに不可欠な一連のモジュールをインポートします。NetworkはPico WをWi-Fiに接続するために使用します。time はプロジェクトコードのタイミングを制御するために使用します。urequests はAPIからデータを取得するために使用します。Machine にはGPIOピンのステータスを取得および設定するための「Pin」が含まれています。NeoPixel はNeoPixel RGB LEDストリップを制御するために使用します。

import network
import time
import urequests
from machine import Pin
from neopixel import Neopixel

6.オブジェクト「ボタン」を作成し、GPIO14 への接続を作成し、そのピンの内部抵抗を使用してピンをプルダウン (GND に) します

button = Pin(14, Pin.IN, Pin.PULL_DOWN)

7.コードとGPIO16に接続された8つのNeoPixelを接続するオブジェクト「pixels」を作成します。このモジュールでは、ピクセルはGRB(緑、赤、青)の順序で並んでいます。異なる場合は、RGBに変更してください。

pixels = Neopixel(8, 0, 16, "GRB")

8.オブジェクト「wlan」を作成し、それを使ってWi-Fiアクセスポイントに接続します。SSIDとパスワードをアクセスポイントに合わせて変更します。接続が確立され、安定するまで少し待ちます。

wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect("SSID", "PASSWORD")
time.sleep(5)

9.接続ステータスを Python シェルに出力します。

print(wlan.isconnected())

10.条件文を使用して、接続が成功したことを示すために NeoPixels が緑色に 10 回点滅するように設定します。

if wlan.isconnected() == True: for i in range(10): pixels.fill((0, 64, 0)) pixels.show() time.sleep(0.1) pixels.fill((0, 0, 0)) pixels.show() time.sleep(0.1)

11.失敗した場合は、for ループを使用して NeoPixels を赤く 10 回点滅させます。

else: for i in range(10): pixels.fill((64, 0, 0)) pixels.show() time.sleep(0.1) pixels.fill((0, 0 , 0)) pixels.show() time.sleep(0.1)

12.無限ループを作成し、ボタンの状態を確認します。ボタンが押されていない場合は、コードはここで停止します。ボタンが押された場合は、インデントされた処理が実行されます。

while True: if button.value():

13.オブジェクト「aq」を作成し、最新の大気質データを保存します。ボタンを押すと、無料のAPIキーを使用してOpenWeatherから最新の大気汚染データをダウンロードするコードが実行されます無料アカウントにサインアップしユーザー名をクリックして「My API Keys」を選択してください。「AirPollution」という新しいAPIキーを生成します。このAPIキーをコピーし、以下のURLに置き換えてください。また、緯度(lat)経度(lon)をあなたの所在地に合わせて変更してください。Googleマップで確認できます。ここではニューヨーク市に設定しています。

 aq = urequests.get("http://api.openweathermap.org/data/2.5/air_pollution/forecast?lat=40.714272&lon=-74.005966&appid=YOUR API KEY HERE").json()

14.返されたデータから大気質指数(Air Quality Index)を切り出し、オブジェクト air_quality_index に保存します。返されたデータはJSON形式で、Pythonの辞書型データストレージオブジェクトとほぼ同じです。つまり、特定のキーシーケンスを使って正確なデータを読み取ることができます。これらの詳細はOpenWeather APIリファレンスに記載されています。

 air_quality_index = aq['list'][0]['main']['aqi']

15.空気質指数の値をPythonシェルに文として出力します。これはデバッグ用です。値は1から5までの範囲で指定できます。1 = 良好、2 = 普通、3 = 中程度、4 = 不良、5 = 非常に不良です。

 print("The Air Quality index is: ",str(air_quality_index))

16.空気の質が1の場合(良好)。LEDが0.5秒間隔で緑色に10回点滅するように設定します。

 if air_quality_index == 1: for i in range(10): pixels.fill((0, 64, 0)) pixels.show() time.sleep(0.5) pixels.fill((0, 0, 0)) pixels.show() time.sleep(0.5)

17.空気の質が2(良好)の場合、LEDが0.5秒間隔で青色に10回点滅するように設定します。

 elif air_quality_index == 2: for i in range(10): pixels.fill((51,255,255)) pixels.show() time.sleep(0.5) pixels.fill((0, 0, 0)) pixels.show() time.sleep(0.5)

18.空気の質が3(中程度)の場合、LEDが0.5秒間隔で紫色に10回点滅するように設定します。

 elif air_quality_index == 3: for i in range(10): pixels.fill((153, 51, 255)) pixels.show() time.sleep(0.5) pixels.fill((0, 0, 0)) pixels.show() time.sleep(0.5)

19.空気の質が4(不良)の場合、LEDがオレンジ色に0.5秒間隔で10回点滅するように設定します。

 elif air_quality_index == 4: for i in range(10): pixels.fill((255,153,51)) pixels.show() time.sleep(0.5) pixels.fill((0, 0, 0)) pixels.show() time.sleep(0.5)

20.空気の質が5(非常に悪い)の場合、LEDが0.5秒間隔で赤色に10回点滅するように設定します。

 elif air_quality_index == 5: for i in range(10): pixels.fill((255, 0, 0)) pixels.show() time.sleep(0.5) pixels.fill((0, 0, 0)) pixels.show() time.sleep(0.5)

21.最後に、返される空気質データがない場合にアクティブになる else 条件を pass に設定し、ループが戻ってユーザー入力を待機できるようにします。

 else:
pass

22.コードを main.py として Raspberry Pi Pico W に保存します。MicroPythonでは、Pico が起動するたびに main.py ファイルが実行されます。

23. 「実行」をクリックしてコードを実行します。NeoPixelが緑色に点滅し、Wi-Fi接続を確認します。点滅しない場合は、SSIDとパスワードが正しいことを確認してください。

24.ボタンを押すとPico Wがオンラインになり、最新の大気汚染データをダウンロードします。NeoPixelsはデータを5色で表示し、Pythonシェルは正確な空気質値を表示します。

Raspberry Pi Picoで空気質警告ライトを作る

(画像提供:Tom's Hardware)

完全なコードリスト

import network
import time
import urequests
from machine import Pin
from neopixel import Neopixel button = Pin(14, Pin.IN, Pin.PULL_DOWN)
pixels = Neopixel(8, 0, 16, "GRB") wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect("SSID", "PASSWORD")
time.sleep(5)
print(wlan.isconnected())
if wlan.isconnected() == True: for i in range(10): pixels.fill((0, 64, 0)) pixels.show() time.sleep(0.1) pixels.fill((0, 0, 0)) pixels.show() time.sleep(0.1)
else: for i in range(10): pixels.fill((64, 0, 0)) pixels.show() time.sleep(0.1) pixels.fill((0, 0 , 0)) pixels.show() time.sleep(0.1)
while True: if button.value(): aq = urequests.get("http://api.openweathermap.org/data/2.5/air_pollution/forecast?lat=40.714272&lon=-74.005966&appid=YOUR API KEY HERE").json() air_quality_index = aq['list'][0]['main']['aqi'] print("The Air Quality index is: ",str(air_quality_index)) if air_quality_index == 1: for i in range(10): pixels.fill((0, 64, 0)) pixels.show() time.sleep(0.5) pixels.fill((0, 0, 0)) pixels.show() time.sleep(0.5) elif air_quality_index == 2: for i in range(10): pixels.fill((51,255,255)) pixels.show() time.sleep(0.5) pixels.fill((0, 0, 0)) pixels.show() time.sleep(0.5) elif air_quality_index == 3: for i in range(10): pixels.fill((153, 51, 255)) pixels.show() time.sleep(0.5) pixels.fill((0, 0, 0)) pixels.show() time.sleep(0.5) elif air_quality_index == 4: for i in range(10): pixels.fill((255,153,51)) pixels.show() time.sleep(0.5) pixels.fill((0, 0, 0)) pixels.show() time.sleep(0.5) elif air_quality_index == 5: for i in range(10): pixels.fill((255, 0, 0)) pixels.show() time.sleep(0.5) pixels.fill((0, 0, 0)) pixels.show() time.sleep(0.5) else: pass

Pythonのハウツー

  • Windows 10と11にPythonをインストールする方法
  • PythonでForループを使う方法
  • Pythonで列挙する方法
  • Pythonで実行可能なアプリケーションを作成する方法
  • Pythonで画像から背景を削除する方法
  • Python、HTML、ThonnyでWebアプリを作成する方法
  • Raspberry Pi カメラモジュール 3 を Python コードで使う方法

レス・パウンダーは、トムズ・ハードウェアのアソシエイトエディターです。クリエイティブテクノロジストとして、7年間にわたり、老若男女を問わず、教育と啓発のためのプロジェクトを手がけてきました。Raspberry Pi Foundationと協力し、教師向けトレーニングプログラム「Picademy」の執筆・提供にも携わっています。