投稿日:2025年8月18日

前回の記事 Picoシリーズはデータベースに接続するためのPyMySQLが使えないと書きました。

MicroPython環境では外部ライブラリが制限されており、PyMySQLを使えないのが制約です。
そこで Pico WHTTPPHPMySQL の構成で、Web系開発者になじみのある仕組みでデータベース連携に挑戦しました。

動作は以下になります。

MicroPythonで書いたプログラムを実行、ブラウザーに表示します。
update flgボタンクリックでflg2に更新するプログラムになります。

▲実行後アラート表示します。

flgが更新されました。

以下が各ソースコードになります。

MicroPython

import time
import network
import socket

# Wi-Fi 接続情報
ssid = 'Wireless Network'
password = 'The Password''

# Wi-Fi 接続
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(ssid, password)

# HTML
html = """<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <script
      src="https://code.jquery.com/jquery-3.7.1.min.js"
      integrity="sha256-/JqT3SQfawRcv/BIHPThkBvs0OEvtFFmqPF/lYI/Cxo="
      crossorigin="anonymous"></script>
    <style>
      h1 {
        text-align: center;
        margin: 0;
      }
      #updateFlgBtn {
        background-color: red;
        padding: 0.25rem 1rem;
        margin: 0 auto;
        text-align: center;
        color: #fff;
        width: fit-content;
        border-radius: 5px;
        cursor: pointer;
        transition: 0.3s;
      }
      #updateFlgBtn:hover {
        opacity: 0.7;
      }
    </style>
  </head>
  <body>
    <h1>Pico WでMySQL変更</h1>
    <p id="updateFlgBtn">update flg</p>
    <script>
      $("#updateFlgBtn").click(function () {
        // ▼ PCのphpに接続。※Localhostではないので注意。
        $.get("http://192.168.10.10:8888/update.php?flg=2");
        alert("flgを2に更新しました。");
      });
    </script>
  </body>
</html>
"""

# Wi-Fi 接続待ち
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])

# ソケットオープン
addr = socket.getaddrinfo('0.0.0.0', 80)[0][-1]
s = socket.socket()
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind(addr)
s.listen(1)
print('listening on', addr)

# クライアント接続待機
while True:
    try:
        cl, addr = s.accept()
        print('client connected from', addr)
        request = cl.recv(1024)
        print("request:", request)

        # HTMLレスポンス作成
        full_response = 'HTTP/1.0 200 OK\r\nContent-type: text/html\r\n\r\n' + html
        cl.send(full_response)
        cl.close()

    except OSError as e:
        cl.close()
        print('connection closed')

▲15〜58行目が表示するhtmlになります。
特筆すべきは52行目、

$.get("http://192.168.10.10:8888/update.php?flg=2");

LocalhostのアドレスではなくPCのアドレスになります。
ファイルupdate.phpに、更新内容をflg=2パラメータとして付与します。
▼Macでは、システム設定 > ネットワーク > Wi-Fi とたどり、Wi-Fi詳細のIPアドレスに記載されているものになります。

update.php

<?php
// GETパラメータを受け取る
$flg = isset($_GET['flg']) ? intval($_GET['flg']) : 0;

try {
    // DB接続 (MAMP の場合)
    $pdo = new PDO("mysql:host=127.0.0.1;port=8889;dbname=testdb;charset=utf8", "root", "root");
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    // UPDATE実行
    $stmt = $pdo->prepare("UPDATE test_table SET flg = ? WHERE id = 1");
    $stmt->execute([$flg]);

    echo "OK: flg updated to $flg";
} catch (PDOException $e) {
    echo "DB Error: " . $e->getMessage();
}

▲3行目でパラメータを受け取ります。
7行目、PDOでデータベースに接続します。
11行目、SQL文。今回はidが1のものを更新しますが、任意のidを指定して変更するのが本来の使い方になります。

データベース

phpMyAdminにデータベースを用意します。
testdbというデータベースに、test_tableというテーブルを作り、idflgフォールドを作りました。
今回のプログラムはid 1のflgを2に変更します。

まとめ

Pico Wとデータベースの連携、半ば諦めかけてましたが何とかできました。
以降はPico Wに入力デバイスを接続してテキスト入力など検証してみます。

最終的にはQRコードリーダーを接続し、開発しているLaravelでのQRコード受け付けシステムに取り入れたいと思います。

考えてみましたが、ブラウザ閲覧に向いてないZero 2 Wですが、この方法だと同じようにできるのではないかと思いました。
Zero 2 WではPyMySQLも使えるので重宝するのではないかと思います。

引き続き検証したいと思います。

最後まで読んでいただき、ありがとうございました。

Raspberry Pi関連記事
Pocket