Raspberry Pi 3 + 公式7インチタッチスクリーンで照度センサー対応フォトフレームを自作する【BH1750FVI + I2C + Python】
Image credit: Tomokatsu Yukishita以前 Raspberry Pi 4 でクラウド対応フォトフレームを作りましたが、今回は余っていた Raspberry Pi 3 と公式7インチタッチスクリーンで別バージョンを構築しました。さらに照度センサーを追加して、部屋の明るさに応じてディスプレイ輝度が自動調整される機能を実装しています。
用意するもの
Raspberry Pi 3

Raspberry Pi 公式7インチタッチスクリーン
800×480px・24ビットRGBカラー・60fps対応。最大10点のマルチタッチに対応しています。

公式タッチスクリーン用ケース
Raspberry Pi 3 Model B と7インチディスプレイを一体で収納できるケースです。

ディスプレイの接続
Raspberry Pi Touch Display 公式ドキュメント を参考にリボンケーブルと電源を接続します。
公式ディスプレイの画面回転設定
デフォルト状態では表示が180度回転しているため、設定ファイルで反転します。
以下の lcd_rotate=2 は Raspberry Pi OS Bullseye 以前(レガシー/FKMSモード)向けの設定です。Bookworm(2023年以降)では lcd_rotate は公式には非推奨で、画面回転には「Screen Configuration」GUIツールの使用が案内されています。
また、config.txt のパスも OS バージョンによって異なります。
- Bullseye 以前:
/boot/config.txt - Bookworm 以降:
/boot/firmware/config.txt
Bullseye 以前(レガシー/FKMSモード)の場合:
sudo vi /boot/config.txt
以下を追記します。
lcd_rotate=2
スライドショー用プログラム
スライドショー制御には、別記事で紹介している自作Pythonスクリプト(photoView4)を流用しています。
ディスプレイの輝度調整
フォトフレームとして常時表示していると、夜間など暗い環境では画面が眩しく感じます。公式7インチディスプレイは、以下のコマンドでバックライト輝度を変更できます。
echo "100" | sudo tee /sys/class/backlight/rpi_backlight/brightness
/sys/class/backlight/rpi_backlight/brightness に0〜255の値を書き込むことで輝度を制御できます。
照度センサー(BH1750FVI)の追加
輝度を手動設定するだけでなく、部屋の明るさに応じて自動で輝度を変えたいと考え、照度センサーを追加しました。
使用パーツ


Raspberry Pi と I2C 接続
BH1750FVI は I2C プロトコルで通信します。Raspberry Pi GPIO ピン配置 を参照して接続します。

接続対応表
| Raspberry Pi | GPIOピン番号 | BH1750FVI |
|---|---|---|
| GPIO2 (SDA) | 3 | SDA |
| GPIO3 (SCL) | 5 | SCL |
| 5V Power | 2 | VCC |
| Ground | 14 | ADO |
| Ground | 20 | GND |

照度センサーの動作確認(Python)
接続後、Python で照度データを取得できるか確認します。参考コード(GitHub) を参考に実装しました。
#!/usr/bin/python3
import smbus
Bus = smbus.SMBus(1)
Addr = 0x23
LxRead = Bus.read_i2c_block_data(Addr, 0x11)
print("照度: " + str(LxRead[1] * 10) + " ルクス")
LxRead2 = Bus.read_i2c_block_data(Addr, 0x10)
print("輝度: " + str((LxRead2[0] * 256 + LxRead2[1]) / 1.2))
実行すると照度が取得できます。
root@raspi3-photo:~# python br.py
照度: 1650 ルクス
輝度: 990.8333333333334
輝度自動調整プログラムの実装
取得した照度に応じてバックライト輝度を滑らかに変化させるため、10ms周期で動作するPythonプログラムを作成しました。
仕組みは以下のとおりです:
- 照度レベルごとにターゲット輝度を定義
- 取得した照度に応じてディスプレイ輝度を1ステップずつインクリメント/デクリメント
- SMBus(I2C)通信は取得間隔を300ms以上空けないと正常な値が取れないため、300ms周期でポーリング
照度センサーの設置
センサーは前面から光が当たる背面の出っぱった部分に設置しました。

ソースコード
作成したプログラムはGitHubで公開しています。
GitHub - yukishita/lcdBrightness2:BH1750FVI 照度センサーで Raspberry Pi 公式ディスプレイ輝度を自動調整するプログラム
デモ動画
照度に応じてディスプレイ輝度が滑らかに変化する様子です。
まとめ
| 構成要素 | 役割 |
|---|---|
| Raspberry Pi 3 | メインコンピューター |
| 公式7インチタッチスクリーン | フォトフレーム表示(800×480px) |
| GY-30 BH1750FVI | I2C接続の照度センサー |
| Python(smbus) | I2C通信・輝度自動調整制御 |
照度センサーを追加することで、昼は明るく・夜は暗くと自動で輝度が変わり、実用的なフォトフレームになりました。Raspberry Pi Zero 2 W でも同様の構成で動作すると思われます。