ラズパイpico Wはwifiが使える
最近Raspberry Pi Pico Wが日本でも発売されましたね。従来のラズパイpicoと異なり、wifiを搭載しているため、センサーの値をサーバに送ったり、逆にサーバとして動作したりします。ラズパイを買うほどでは無いけど、通信は必要という用途にピッタリです。お値段も1200円程度とお求めやすくなっています。
ラズパイpico W からhttpリクエストを送る
ラズパイpico Wのbootselボタンを押すとhttpリクエストを叩くコードを作りました。これを使えばIoTボタンとしてAPIで操作できるスマートホーム、Iot家電を自由に操作できます。例ではAPIを叩いてスマートLED電球を操作しました。とても便利!
以下ではこの詳細を解説します。といってもpythonの知識がある方なら余裕で作れる難易度です。
実装内容
今回は最低限の機能を実装するため、ラズパイpico Wに標準でついているbootselボタンを押すとhttpリクエストを送るようにします。
簡単な処理の簡単な流れは、以下の通りです。
- wifiに接続
- ループでボタンが押されるのを待つ
- ボタンが押されたら、特定のURLへhttpリクエスト(POST)を送る
各処理の成功可否は内蔵LEDの点滅パターンで識別します。コードは以下のとおりです。
import machine
import time
import network
import urequests
# 内臓LEDを制御するクラス あんまり意味は無い
class LED_Notice():
def __init__(self, led):
self.led = led
def success(self):
self.led.off()
self.led.on()
time.sleep(0.5)
self.led.off()
def fail(self):
self.led.off()
for _ in range(5):
self.led.on()
time.sleep(0.05)
self.led.off()
time.sleep(0.05)
def start(self):
self.led.off()
self.led.on()
time.sleep(0.05)
self.led.off()
def boot(self):
self.led.off()
for _ in range(2):
self.led.on()
time.sleep(0.1)
self.led.off()
time.sleep(0.1)
# wifiへの接続を行う関数
def connect_wifi(ssid, password, led_notice):
led_notice.led.on()
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
chipid = int.from_bytes(wlan.config('mac'), 'big') % 65536
wlan.connect(ssid, password)
max_wait = 10
while max_wait > 0:
if wlan.status() < 0 or wlan.status() >= 3:
break
max_wait -= 1
print('waiting for connection...')
time.sleep(1)
if wlan.status() != 3:
led_notice.fail()
raise RuntimeError('network connection failed')
else:
print('connected')
status = wlan.ifconfig()
print('ip = ' + status[0])
led_notice.led.off()
# メイン処理
def main():
led_notice = LED_Notice(machine.Pin("LED", machine.Pin.OUT))
led_notice.boot()
connect_wifi('YOUR_SSID', 'YOUR_PASSWORD',led_notice)
last_state= rp2.bootsel_button()
while True:
now_state = rp2.bootsel_button()
if now_state != last_state:
if now_state == 1:
led_notice.start()
try:
res = urequests.post('http://192.168.1.100:8080', timeout=10)
except Exception:
led_notice.fail()
continue
if res.status_code == 200:
led_notice.success()
else:
led_notice.fail()
last_state = now_state
time.sleep(0.1)
if __name__ == '__main__':
main()
wifi接続の部分はこちらのサイト(Raspberry Pi Pico WでWebサーバにデータを送信する – MSR合同会社 (msr-r.net))を参考にしました。
pythonには、httpリクエストを行うrequestsライブラリがありますが、ラズパイpico Wでhttpリクエストを送る際にはurequestsライブラリを使うようですね。使い方もほぼ同じです。例ではローカルにあるサーバのAPIを叩いていますが、APIが公開されてるならswitchbotでもhueでもなんでも可能です。
ボタン押下時のコールバック関数を指定したほうが良いと思いますが、実装方法が分からないのでひとまずループとスリープで対処しています。
まとめ: ラズパイpico WはIoTボタンとして簡単に使える
今回はラズパイpico Wを使ってIoTボタンを自作し、ボタンを押したらhttpリクエストを送る装置を作りました。
最近のスマート家電やIoT家電はAPIで制御できるものが多いですが、肝心のAPIを叩く装置はPCやスマホくらいしかありません。今回作ったIoTボタンを使うことで、スマート家電の制御がより便利になりますね。
コメント