デスク周りの環境を改善しようと思ったとき、体感だけでは温度・湿度・明るさの変化を把握しにくいことがあります。そこで、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をグラフ化したり、湿度や照度が一定値を超えたときに通知したりすると、デスク環境の改善にさらに活用できそうです。