0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Raspberry Piでデスクの温湿度と照度を記録する

0
Last updated at Posted at 2026-10-30

デスク周りの環境を改善しようと思ったとき、体感だけでは温度・湿度・明るさの変化を把握しにくいことがあります。そこで、Raspberry PiにBME280とBH1750を接続し、デスクの温湿度と照度をCSVへ定期的に記録する仕組みを作りました。

結論としては、I2C接続のセンサーを使うと配線が少なく、Pythonから比較的簡単に読み取れます。今回は1分間隔で測定し、Raspberry Piのsystemdサービスとして常時起動できるところまで構成します。

使用した部品と配線

今回使った部品は次の3つです。

  • Raspberry Pi Zero 2 W
  • BME280温湿度・気圧センサー
  • BH1750照度センサー

どちらもI2C接続に対応しているため、同じI2Cバスへ接続できます。Raspberry Piの40ピンヘッダーでは、以下のように配線しました。

Raspberry Pi センサー
3.3V(1番ピン) VCC
GND(6番ピン) GND
GPIO2 / SDA(3番ピン) SDA
GPIO3 / SCL(5番ピン) SCL

センサーへ5Vを入力しないように注意します。今回の構成では、BME280が0x76、BH1750が0x23として認識されました。BME280の基板によってはアドレスが0x77の場合もあります。

まずI2Cを有効化します。

sudo raspi-config

メニューから「Interface Options」→「I2C」→「Enable」を選択し、再起動します。認識状況はi2cdetectで確認できます。

sudo apt update
sudo apt install -y i2c-tools

i2cdetect -y 1

次のように76と23が表示されれば、ひとまず配線とI2C設定は問題ありません。

     0 1 2 3 4 5 6 7 8 9 a b c d e f
00:          -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- 23 -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- 76 77 -- -- -- --

Python実行環境を作る

センサー用ライブラリをシステム全体へインストールせず、仮想環境にまとめます。Raspberry Pi OSの種類によっては、システムPythonへの直接インストールが制限されているため、この方法にしておくと後から管理しやすくなります。

mkdir -p ~/desk-sensor
cd ~/desk-sensor

sudo apt install -y python3-venv python3-pip
python3 -m venv --system-site-packages .venv
source .venv/bin/activate

python -m pip install --upgrade pip
pip install adafruit-blinka \
  adafruit-circuitpython-bme280 \
  adafruit-circuitpython-bh1750

adafruit-blinkaは、CircuitPython向けライブラリをRaspberry PiなどのLinux環境で動かすために使います。

センサー値をCSVへ保存する

センサーの接続確認から定期記録までの流れを図にすると次の通りです。

measure.pyを作成します。測定時刻は、後から別のPCで集計しやすいようISO 8601形式で保存しました。

import csv
import os
import time
from datetime import datetime

import board
import busio
import adafruit_bme280.basic as adafruit_bme280
import adafruit_bh1750


CSV_PATH = "/home/pi/desk-sensor/data/sensor.csv"
INTERVAL_SECONDS = 60


def read_sensors():
    i2c = busio.I2C(board.SCL, board.SDA)

    bme = adafruit_bme280.Adafruit_BME280_I2C(
        i2c,
        address=0x76,
    )
    light = adafruit_bh1750.BH1750(
        i2c,
        address=0x23,
    )

    return bme.temperature, bme.humidity, light.lux


def append_csv(temperature, humidity, lux):
    os.makedirs(os.path.dirname(CSV_PATH), exist_ok=True)
    file_exists = os.path.exists(CSV_PATH)

    with open(CSV_PATH, "a", newline="", encoding="utf-8") as file:
        writer = csv.writer(file)

        if not file_exists:
            writer.writerow([
                "timestamp",
                "temperature_c",
                "humidity_percent",
                "illuminance_lux",
            ])

        writer.writerow([
            datetime.now().astimezone().isoformat(timespec="seconds"),
            f"{temperature:.2f}",
            f"{humidity:.2f}",
            f"{lux:.2f}",
        ])


def main():
    while True:
        try:
            temperature, humidity, lux = read_sensors()

            append_csv(temperature, humidity, lux)

            print(
                f"temperature={temperature:.2f} C, "
                f"humidity={humidity:.2f} %, "
                f"lux={lux:.2f}"
            )
        except Exception as error:
            print(f"measurement failed: {error}", flush=True)

        time.sleep(INTERVAL_SECONDS)


if __name__ == "__main__":
    main()

実行して、値が表示されることを確認します。

cd ~/desk-sensor
source .venv/bin/activate
python measure.py

別のターミナルからCSVの内容も確認できます。

tail -f ~/desk-sensor/data/sensor.csv

私の環境では、Pi本体の電源投入直後に温度が高めに出ることがありました。センサーをPiの基板や電源部品のすぐ近くに置くと、周囲の室温ではなく基板の熱を拾いやすくなります。

systemdで自動起動する

手動実行で動作を確認できたら、systemdサービスとして登録します。

sudo nano /etc/systemd/system/desk-sensor.service

以下の内容を保存します。

[Unit]
Description=Desk temperature humidity and illuminance logger
After=network.target

[Service]
Type=simple
User=pi
WorkingDirectory=/home/pi/desk-sensor
ExecStart=/home/pi/desk-sensor/.venv/bin/python /home/pi/desk-sensor/measure.py
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target

サービスを有効化して起動します。

sudo systemctl daemon-reload
sudo systemctl enable --now desk-sensor.service

状態とログは次のコマンドで確認できます。

systemctl status desk-sensor.service
journalctl -u desk-sensor.service -f

Restart=alwaysを指定しているので、センサーの一時的な読み取りエラーやプロセス終了が起きても、10秒後に再起動します。原因を確認しやすいように、例外内容は標準出力へ出すようにしました。

記録データを確認するときの注意点

照度は、センサーの向きと設置場所で値が大きく変わります。ディスプレイの真横に置くのか、机の中央に置くのかで意味が変わるため、最初に測定位置を決めておくことが重要です。

温湿度については、次の点を意識しました。

  • Raspberry PiのCPUや電源回路から離す
  • エアコンの風が直接当たる場所を避ける
  • ケース内に閉じ込めず、周囲の空気が流れるようにする
  • センサーを手で触った直後の値はすぐに記録へ使わない

CSVは次のような形式になります。

timestamp,temperature_c,humidity_percent,illuminance_lux
2026-09-24T09:00:01+09:00,25.31,52.48,318.00
2026-09-24T09:01:01+09:00,25.28,52.62,321.00

この形式なら、後からPythonや表計算ソフトで時間帯ごとの平均値を計算できます。まずは数日分を記録し、照明を点けた時間、換気した時間、エアコンを使った時間と照らし合わせると、デスク環境の傾向が見えやすくなります。

まとめ

Raspberry PiとI2Cセンサーを使い、デスク周りの温度・湿度・照度をCSVへ記録する仕組みを作りました。

ポイントは次のとおりです。

  • BME280とBH1750は同じI2Cバスへ接続できる
  • i2cdetectでセンサーの認識を先に確認する
  • Pythonの仮想環境へライブラリをインストールする
  • CSVへ時刻付きで保存すると後から分析しやすい
  • systemdへ登録すれば、電源投入後に自動で記録を始められる

記録を始めるだけでも、体感では気づきにくい明るさや湿度の変化を確認できます。次の段階では、CSVをグラフ化したり、湿度や照度が一定値を超えたときに通知したりすると、デスク環境の改善にさらに活用できそうです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?