Kazuki's Blog

ITは活用する道具である!

🌡️ Raspberry Pi Pico Wからの温湿度データを受け取る(DB準備)

はじめに

これまで、我が家の環境モニタリングは主にSwitchBot温湿度計のデータを収集する仕組みをベースに行ってきました。 今回は、Wi-Fi接続が可能なマイコンボード、Raspberry Pi Pico Wを活用し、これに接続したセンサーからのデータを既存のデータベース(sensor_db)に取り込む新たな仕組みを構築します。

この連載記事では、Pico WからHTTP POSTでデータを送信し、それをデータベースに格納するまでの一連の流れを解説していきます。 第一回となる今回は、データを受け取るためのデータベーステーブルの設計と準備を行います。

1.新しいデータ収集のゴール設定

新たな仕組みでは、Pico W側で取得した温度湿度のデータを、Webサーバーを経由してデータベースに送信・記録することを目標とします。 従来の仕組みと新たな仕組みの比較を下表にまとめました。

カテゴリ 従来のデータ収集 新たなデータ収集
データソース SwitchBot温湿度計(Bluetooth Raspberry Pi Pico W + 接続センサー
データ取得方法 Raspberry PiBluetoothスキャン&データ解析 Pico WからHTTP POST
目的 広範囲の環境監視 特定箇所・高頻度での詳細な環境監視

2.データ格納用テーブルの準備

Pico Wから送信されるセンサーデータを格納するために、データベース(sensor_db)に新しいテーブルを作成します。テーブル名はpico_sensor_dataとします。

CREATE TABLE 文

以下のSQL文を実行してテーブルを作成します。

CREATE TABLE pico_sensor_data (
    id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    temperature DECIMAL(5, 2) NOT NULL COMMENT '温度データ',
    humidity DECIMAL(5, 2) NOT NULL COMMENT '湿度データ',
    recorded_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '記録日時'
);

各カラムの解説

カラム名 データ型 NULL可否 説明
id INT UNSIGNED NOT NULL 主キー。レコードを一意に識別するための**自動増分(AUTO_INCREMENT)ID。
temperature DECIMAL(5, 2) NOT NULL 温度データ。小数点以下2桁、全体で5桁の数値を許容する固定小数点型**。精度が求められるセンサーデータに適しています。
humidity DECIMAL(5, 2) NOT NULL 湿度データ。温度と同様に、精度の高いDECIMAL型を採用しています。
recorded_at TIMESTAMP NOT NULL 記録日時。DEFAULT CURRENT_TIMESTAMPを設定しているため、INSERT時に値を省略した場合、自動的に現在の時刻が挿入されます。

特にDECIMAL(5, 2)は、FLOATDOUBLEのような浮動小数点型と異なり、誤差が発生しない固定小数点型であるため、正確な数値記録が必要なセンサーデータとの相性が良いデータ型です。

3.データを挿入するためのSQL

実際にPico W側からPOSTされたデータを受け取り、サーバーサイドのプログラム(例: Python, PHPなど)でデータベースに接続し、データを挿入する際のSQL文のイメージです。

Pythonのデータベースライブラリ(例: mysql.connector)を使用し、**プレースホルダ%s)**を用いて安全にデータを挿入します。

# temperature と humidity は Pico W から POST で受け取った値
temperature = 25.50
humidity = 60.35

# 挿入用のSQL文
sql = "INSERT INTO pico_sensor_data (temperature, humidity, recorded_at) VALUES (%s, %s, NOW())"

# SQLを実行(%sの部分に(temperature, humidity)のタプルがバインドされる)
cursor.execute(sql, (temperature, humidity))
# 最後に cursor.connection.commit() でDBに反映
  • recorded_atにはNOW()関数を使用していますが、前述の通りカラム定義でDEFAULT CURRENT_TIMESTAMPを設定しているため、SQL文からrecorded_atを省略し、**INSERT INTO pico_sensor_data (temperature, humidity) VALUES (%s, %s)**としても、DB側で自動的に記録時刻が挿入されます。

おわりに

今回は、Raspberry Pi Pico Wからのセンサーデータを受け入れるためのデータベース環境の整備、すなわち専用テーブルの作成とカラム設計を行いました。 DECIMAL(5, 2) を採用することで、精度の高い温湿度データを確実に記録できる基盤が整いました。

次回以降は、このテーブルをターゲットとして、

  1. Pico WのMicroPythonスクリプトで温湿度データを取得し、HTTP POSTで送信する部分
  2. Webサーバー側でPOSTデータを受け取り、データベースに挿入するAPI(エンドポイント)の構築

といった具体的なステップに進んでいきます。