2. @CheerLightsに参加する¶
これはロマンチックなプロジェクトで、 @CheerLights - Twitter LEDのカラーチェンジングコミュニティに参加するものです。このコミュニティでは、世界中のLEDが同時に色を変えることができます。
オフィスの隅に置いて、「自分は一人ではない」と感じるためのリマインダーとしても使用できます。
@cheerlightsにツイートを送り、そのツイート内に色の名前を含めると、世界中のLEDが指定した色に変わります。
必要な部品
このプロジェクトで必要な部品は以下の通りです。
一式をまとめて購入するのが便利ですが、その場合のリンクはこちらです。
名前 |
このキットの内容 |
リンク |
---|---|---|
ケプラーキット |
450以上 |
下記のリンクから個々に購入することも可能です。
SN |
部品 |
数量 |
リンク |
---|---|---|---|
1 |
1 |
||
2 |
マイクロUSBケーブル |
1 |
|
3 |
1 |
||
4 |
数本 |
||
5 |
1 |
||
6 |
1 |
||
7 |
18650バッテリー |
1 |
|
8 |
バッテリーホルダー |
1 |
手順
回路を組み立てます。
以前に コードパッケージ をダウンロードしたフォルダにパスを切り替え、「kepler-kit-main/iot」のパスの下で
2_cheer_light.py
ファイルを開きます。スクリプトを実行するには、 Run current script(現在のスクリプトを実行) ボタンをクリックするか、F5キーを押します。その後、Shellに接続プロンプト、IP、色(0xff0000は赤)が表示されます。
注釈
コードを実行する前に、Pico Wに
do_connect.py
とsecrets.py
のスクリプトがあることを確認してください。もし無ければ、 1. ネットワークへのアクセス を参照してそれらを作成してください。スクリプトが実行された後、WS2812 RGBストリップは色を表示しますが、時抗その色は変わります。
起動時にこのスクリプトを実行する場合、以下の手順に従ってRaspberry Pi Pico Wに
main.py
として保存する必要があります。スクリプトの実行を停止し、 File(ファイル) -> Save as(名前を付けて保存) をクリックします。
ポップアップウィンドウで Raspberry Pi Pico を選択します。
ファイル名を
main.py
に設定します。同じファイルがすでにPico Wに存在する場合は、プロンプトが表示されます。USBケーブルを抜いて、Li-po Charger ModuleでRaspberry Pi Pico Wに電力を供給することができます。角に置いておけば、自動的に動作します。
仕組み
Raspberry Pi Pico Wは、 1. ネットワークへのアクセス で説明されているように、インターネットに接続する必要があります。このプロジェクトでは、そのまま使用します。
from do_connect import *
do_connect()
WS2812 RGBストリップの設定については、 3.3 RGB LED ストリップ を参照してください。
import machine
from ws2812 import WS2812
ws = WS2812(machine.Pin(18), 8)
次に、@CheerLightsの色を取得する方法が必要です。Twitterから色の変更を受け取るバックエンドシステムがあり、その情報をJSON形式で URL http://api.thingspeak.com/channels/1417/field/2/last.json に投稿します。
このURLをブラウザで直接開くと、以下のようなものが表示されます。必要なのは field2
データで、16進数でエンコードされた色情報です。
{"created_at":"2022-08-16T06:12:44Z","entry_id":870488,"field2":"#ff00ff"}
このデータを取得するために urequests
モジュールを使用し、 json
モジュールを使用してこの文字をPythonの辞書に変換します。
次のコードは、URLから最新の@CheerLightsの色を取得し、WS2812で使用できる色値を返します。
def get_colour():
url = "http://api.thingspeak.com/channels/1417/field/2/last.json"
try:
r = urequests.get(url)
if r.status_code > 199 and r.status_code < 300:
cheerlights = json.loads(r.content.decode('utf-8'))
print(cheerlights['field2'])
colour = int('0x'+cheerlights['field2'][1:7])#Convert from String to Integer
r.close()
return colour
else:
return None
except Exception as e:
print(e)
return None
最後に、1分ごとにws2812が動作するようにループを使用します。
while True:
colour = get_colour()
if colour is not None:
ws.write_all(colour)
time.sleep(60)