以前、Raspberry Pi PicoやRP2040ZEROを使ってDSPラジオを組んでみた。
Raspberry Pi Picoは MicroPythonやArduino環境でプログラミングが出来るので、いろいろ組みやすいと思う。
今回はWiFi、Bluetooth付きバージョンのRaspberry Pi Pico Wを使ってみたい。
特に目的があるわけではなく、単純に興味本位なのである。
上手く使いこなせれば、いろいろと遊べるかもしれない。
問題は、おじさんには その技量が無い事なのであるが・・・
注文していたものが届いたので、さっそく開封して中身を確認
袋の中に、ケースに入った基板と技適シールが入っていた
基板(表)
基板(裏) 技適シールは裏側に貼っておいた
まずは、Pico WでMicroPythonを使えるようにする。
以前、Raspberry Pi Picoを使った時↓と同じ手順でMicroPython環境をセットアップする
最初にUSBケーブルをパソコンに接続すると,はBOOTSELモードで起動する。そうすると、PC上に[RPI-RP2]という名前のフォルダが現れるので、その中のINDEX.HTMをクリック。
Webブラウザが立ち上がってRaspberry Piのページが開く。その中のMicro pythonのアイコンをクリックするとMicro Pythonのページにジャンプ。
その中からRaspberry Pi Pico Wに対応したほうのMicroPython UF2ファイルをダウンロード。
ダウンロードしたファイルをRPI-RP2フォルダにコピーすれば、Raspberry Pi Pico WにMicro pythonの実行環境がインストールされる。
Thonnyを立ち上げてPico Wを認識すればOK
とりあえず、動きそうなので、今回は、温湿度をスマホから見られるようにしてみたい。
手始めに手持ちの温湿度センサーDHT20↓を接続して動かしてみる。
回路図
ブレッドボードでこんな感じ
準備作業として、まず
こちらのページを参考に、まずはセンサーのライブラリ(dht20.py)をダウンロードしてPico Wにコピー
Thonnyから以下のプログラムを走らせてみる。
from machine import I2C
from dht20 import DHT20
import utime
i2c = I2C(0, scl=5, sda=4)
dht20 = DHT20(i2c)
while True:
temper = dht20.dht20_temperature()
humidity = dht20.dht20_humidity()
print("temper : " + str(temper))
print("humidity : " + str(humidity))
utime.sleep(1)
おお、ちゃんと動く
次にこれをWiFi経由でスマホから見れるようにしたい。
しかも、常に最新データをブラウザで表示し続けるようにしたい。
何か製作例が有るだろうと探したが意外と無い。
こちら↓が近いのだが、いちいちボタンを押さないと最新データが取れない。
だからと言って、おじさんにはやり方が分からない。
困ったときはChatGPTに聞いてみる
<お願い>
Raspberry Pi Pico Wで、1秒ごとに更新される2つの変数’TEMP’と'Humidity’の値をpico Wのwebサーバーを使ってスマホから閲覧したい。MicroPythonのサンプルプログラムを書いて
で、回答されたコードで試してみる。
1日おいて、頭を冷やして、ChatGPTに質問を変えながら10回くらい質問して、ようやくなんとなく動くものが出来た。最初にHTMLでどう書けばよいかを聞いてから、これをPico Wで実装するにはどうすれば良いかと、順番に聞いていくと良かった。
<試したコード>
import socket
import time
import machine
from machine import I2C
from dht20 import DHT20
# Wi-Fi設定
SSID = 'your-SSID' # ここにSSIDを入力
# 温度・湿度センサーのセットアップ (DHT11をGPIO 15に接続)
# 温湿度センサーの初期化
i2c = I2C(0, scl=5, sda=4)
sensor = DHT20(i2c)
# Wi-Fi接続
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(SSID, PASSWORD)
# Wi-Fi接続が確立されるまで待機
print("Connecting to Wi-Fi...")
while not wlan.isconnected():
time.sleep(1)
print("Connected to Wi-Fi:", wlan.ifconfig())
# HTMLページの作成
html = """<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>温度と湿度表示</title>
<script>
// TEMPとHumidityデータを1秒ごとに更新する関数
function fetchData() {
fetch('/data').then(response => response.json()).then(data => {
document.getElementById("tempDisplay").innerText = data.temp + " °C";
document.getElementById("humidityDisplay").innerText = data.humidity + " %";
});
}
setInterval(fetchData, 1000); // 1秒ごとに更新
</script>
</head>
<body>
<h1>現在の温度と湿度:</h1>
<div>温度: <span id="tempDisplay">-- °C</span></div>
<div>湿度: <span id="humidityDisplay">-- %</span></div>
</body>
</html>
"""
# ソケットのセットアップ
addr = socket.getaddrinfo('0.0.0.0', 80)[0][-1]
s = socket.socket()
s.bind(addr)
s.listen(1)
print("Listening on", addr)
def serve_client(client):
request = client.recv(1024)
request_str = request.decode("utf-8")
print("Request:", request_str)
# `/data`エンドポイントにリクエストがあった場合、センサーから温度と湿度を取得
if "/data" in request_str:
try:
TEMP = round(sensor.dht20_temperature(),1) # 温度(℃)
Humidity = round(sensor.dht20_humidity(),1) # 湿度(%)
# JSON形式で温度と湿度のデータを返す
response = '{"temp": ' + str(TEMP) + ', "humidity": ' + str(Humidity) + '}'
client.send('HTTP/1.1 200 OK\r\nContent-Type: application/json\r\n\r\n' + response)
except Exception as e:
print("Error reading sensor:", e)
response = '{"temp": "Error", "humidity": "Error"}'
client.send('HTTP/1.1 200 OK\r\nContent-Type: application/json\r\n\r\n' + response)
else:
# 初回のHTMLを返す
client.send('HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n' + html)
client.close()
# クライアントからの接続を待機して応答
try:
while True:
cl, addr = s.accept()
print("Client connected from", addr)
serve_client(cl)
except KeyboardInterrupt:
s.close()
wlan.disconnect()
print("Server stopped")