Raspberry Pi Pico Wを使ってみる | お父にゃんの電子工作

お父にゃんの電子工作

暇なおじさんが、電子工作(主にラジオ製作)をして勝手な感想を書く

以前、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のサンプルプログラムを書いて

 

 

で、回答されたコードで試してみる。

webブラウザでアクセスしたが、「接続がリセットされました」、とエラーになる。
おかしいじゃないか、とChatGPTに文句を言って、いろいろ試したが上手くいかない。
最後には「接続コードやネットワーク設定の再確認も含めて、環境全体を見直してみてください。」と、さじを投げられた。
 
ChatGPTも責任もってコードを書いてもらいたいもんである。まぁタダで使って文句言ってもしょうがないのだが・・・

 

 

1日おいて、頭を冷やして、ChatGPTに質問を変えながら10回くらい質問して、ようやくなんとなく動くものが出来た。最初にHTMLでどう書けばよいかを聞いてから、これをPico Wで実装するにはどうすれば良いかと、順番に聞いていくと良かった。

 

<試したコード>
import network
import socket
import time
import machine
from machine import I2C
from dht20 import DHT20

# Wi-Fi設定
SSID = 'your-SSID' # ここにSSIDを入力 
PASSWORD = 'your-password' # ここにパスワードを入力

# 温度・湿度センサーのセットアップ (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")
 
 
Thonnyから起動すると、Thonnyのシェルに「WiFiに接続して、192.168.10.124のアドレスになったよ」とのこと
 
パソコンのブラウザにPico Wのアドレスを入力すると、以下のように表示↓
iPadだとこんな感じで表示
ちゃんと、1秒ごとに温度、湿度を更新してくれる。
 
ああ、一時はどうなるものかと焦ったが、何とかなって良かった。
 
まぁ、とにかく、おじさんに基礎知識が不足しているのが問題なのである。参考になる記事も多くなくて、おじさんにはハードルが高い。
また修行して出直すことにする。
 
 
「それまでおいらは、寝て待っているニャ」
いや、たまには起きてください