Raspberry Pi Pico WでWebサーバにデータを送信する

スポンサーリンク
Raspberry Pi Pico W

こちら の記事で、「Tonny」という開発環境を使って「Raspberry Pi Pico W」用のPythonプログラムをつくる方法を確認しました。
それでは早速、もう少し実用的なプログラムをつくってみたいと思います。


一定時間毎にランダムな数値をWebサーバに送信(HTTP GETリクエスト)するプログラムをつくります。
「Raspberry Pi Pico W」に何らかのセンサをつなぎ、「ランダムな数値」の部分を「センサから取得したデータ」に置き換えるだけで、そのままIoTデバイスとして使えるはず、という目論見です。
こちら のドキュメントを参考にしてつくっていきます。

ドキュメントによると、Wi-Fiネットワークに接続する部分は以下のとおりです。

import time
import network

ssid = 'XXXXXXXX'
password = 'XXXXXXXX'

wlan = network.WLAN(network.STA_IF)
wlan.active(True)
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:
    raise RuntimeError('network connection failed')
else:
    print('connected')
    status = wlan.ifconfig()
    print('ip = ' + status[0])

Webサーバには、「チップ独自の名前」と「ランダムな数値」を送信します。
「チップ独自の名前」にはMACアドレスを利用します。「RPI」という文字列に、MACアドレスを「65536」で割ったあまりの値をつなげたものを「チップ独自の名前」とすることにします。「RPI12345」というような名前になります。
なお、MACアドレスを取得する際には、事前にワイヤレス設定をアクティブにしておかなければいけないようです。

「ランダムな数値」は、整数部が2桁、小数点以下1桁の数値にします。「12.3」というような数値になります。

wlan = network.WLAN(network.STA_IF)
wlan.active(True)
chipid = int.from_bytes(wlan.config('mac'), 'big') % 65536

import random
value = random.randint(0, 999) / 10

HTTPでデータ送信するために「urequests」というライブラリを使います。

import urequests
url = "http://XXXXXXXX?chipid=RPI" + str(chipid) + "&val0=" + str(value)
r = urequests.get(url)
print(r.content)
r.close()

データ送信する前にLEDをONにします。データ送信が完了したらLEDをOFFにし、60秒停止させます。
まとめると以下のようになります。


import machine
import time
import network
import urequests
import random

led = machine.Pin("LED", machine.Pin.OUT)
led.value(1)

ssid = 'XXXXXXXX'
password = 'XXXXXXXX'

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:
    raise RuntimeError('network connection failed')
else:
    print('connected')
    status = wlan.ifconfig()
    print('ip = ' + status[0])

while True:
    led.value(1)
    value = random.randint(0, 999) / 10
    url = "http://XXXXXXXX?chipid=RPI" + str(chipid) + "&val0=" + str(value)
    r = urequests.get(url)
    print(r.content)
    r.close()
    led.value(0)
    time.sleep(60)

「Raspberry Pi Pico W」「Python」ともに、これまで使ったことはありませんでしたが、とても簡単にプログラムをつくることができました。
こんな感じでデータ送信できています(Wabサーバ側のプログラムは、以前PHPでつくったものです)。