ラズパイpico W のボタンを押してhttpリクエストを送る【Iotボタン】

技術

ラズパイ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リクエストを送るようにします。

簡単な処理の簡単な流れは、以下の通りです。

  1. wifiに接続
  2. ループでボタンが押されるのを待つ
    1. ボタンが押されたら、特定の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ボタンを使うことで、スマート家電の制御がより便利になりますね。

コメント