2025年8月12日火曜日

BME280センサーの値をOLEDディスプレイにリアルタイム表示

 Raspberry Pi Pico W に BME280(温度・湿度・気圧センサー)と OLED(SSD1306) を I²C でつなぎ、センサーで測った値をLCDに表示します。

測定したデータはリアルタイムに画面に表示され、室内の環境の変化がすぐにわかるようになります。

1. 配線

両方とも I²C を使うので、SDA と SCL の 2 本を共通でつなぎます。

機能Pico WBME280OLED(SSD1306)
SDA  GP16SDASDA
SCL  GP17SCLSCL
3V33V3(OUT)VCCVCC
GND  GNDGNDGND

ポイント

  • Pico W の I²C0(GP16/17)を使う例です。ほかのピンでも OK。

  • 配線ミスがあると画面がつかないので、色付きジャンパー線で整理すると安心です。


2. ライブラリのインストール(Thonny)

  1. Pico W を PC に接続し、Thonny を開きます。

  2. メニュー [ツール] → [パッケージを管理..] をクリック。

OLED 用ライブラリ

  • 検索窓に ssd1306 と入力 → micropython-ssd1306 を選び Install
    (詳しい手順や日本語解説は、前回の記事を参考にしてください)

BME280 用ライブラリ

  • 検索窓に bme280 と入力 → micropython-bme280 を選び Install
    (詳しい手順や日本語解説は、前回の記事を参考にしてください)

インストールできたか確認する方法
Thonny の REPL で import ssd1306, bme280 と打ってエラーが出なければ OK。

3.ソースコード

# ────────────────────────────────────────────────────────────────
# Raspberry Pi Pico W で BME280(温度・気圧・湿度)を読み取り
# SSD1306 128×64 OLED に表示するサンプル
#
# ・I2C0   : SDA = GP16, SCL = GP17, 400 kHz
# ・更新周期: 5
# ・同じ値のときは書き換えないことで、描画回数を最小化
# ────────────────────────────────────────────────────────────────
from machine import I2C, Pin
import bme280          # MicroPython 用 BME280 ドライバ
import ssd1306         # MicroPython 用 SSD1306 ドライバ
import utime

# ── I2C バス初期化 ──────────────────────────────────────────────
i2c = I2C(
    0,                 # I2C バス番号 (I2C0)
    sda=Pin(16),       # SDA = GP16
    scl=Pin(17),       # SCL = GP17
    freq=400_000       # 400 kHz
)

# ── デバイス初期化 ──────────────────────────────────────────────
bme  = bme280.BME280(i2c=i2c)          # BME280 インスタンス
oled = ssd1306.SSD1306_I2C(128, 64, i2c)  # 128×64 OLED インスタンス

# ── 固定ヘッダ描画 ─────────────────────────────────────────────
oled.text("BME280 TPH meter", 0, 0)    # タイトル
oled.text("T :      C",        8, 16)  # 温度欄 (°C)
oled.text("P :      hPa",       8, 32) # 気圧欄 (hPa)
oled.text("H :      %",         8, 47) # 湿度欄 (%RH)
oled.show()

# ── 直前に表示した値を保存する変数 ───────────────────────────
old_ti = 0   # 直前の温度 (整数値)
old_pi = 0   # 直前の気圧 (整数値)
old_hi = 0   # 直前の湿度 (整数値)

# ── 値が変わったときだけ更新する関数 ─────────────────────────
def TPH_disp():
    """
    変数 ti・pi・hi(最新値)と old_*(前回値)を比較し、
    変化があった項目のみ OLED を書き換える
    """
    global ti, pi, hi
    global old_ti, old_pi, old_hi

    # 温度表示更新
    if ti != old_ti:
        oled.fill_rect(48, 16, 24, 8, 0)   # 旧数値を黒で塗り潰し
        oled.text(str(ti), 48, 16)         # 新数値を描画
        oled.show()
        old_ti = ti                        # 前回値を更新

    # 気圧表示更新
    if pi != old_pi:
        oled.fill_rect(40, 32, 32, 8, 0)
        oled.text(str(pi), 40, 32)
        oled.show()
        old_pi = pi

    # 湿度表示更新
    if hi != old_hi:
        oled.fill_rect(48, 48, 24, 8, 0)
        oled.text(str(hi), 48, 48)
        oled.show()
        old_hi = hi

# ── メインループ ───────────────────────────────────────────────
while True:
    # BME280 から補正済みデータを取得 (t:0.01°C, p:1/256Pa, h:1/1024%RH)
    t_raw, p_raw, h_raw = bme.read_compensated_data()

    # 温度 (整数 °C) ※+0.5 で四捨五入
    ti = int(t_raw / 100 + 0.5)

    # 気圧 (整数 hPa)
    p_hpa = p_raw // 256          # Pa 単位に変換
    pi = int(p_hpa / 100 + 0.5)   # hPa → 百分の一で四捨五入

    # 湿度 (整数 %RH)
    hi = int(h_raw / 1024 + 0.5)

    # 画面に反映
    TPH_disp()

    # 5 秒待機
    utime.sleep(5)


処理の流れ

  • 🛠 ライブラリ読み込み
    machine.I2Cbme280ssd1306utime をインポート

  • 🔌 I²C バス初期化
    I²C0 を SDA=GP16, SCL=GP17, 400 kHz で開始

  • 📟 デバイス生成

    • bme = BME280(i2c) … BME280 センサー

    • oled = SSD1306_I2C(128, 64, i2c) … 128×64 OLED

  • 🖼 固定ヘッダ描画
    タイトルと “T / P / H” のラベルをあらかじめ表示 → oled.show()

  • 🧮 前回値の初期化
    old_ti, old_pi, old_hi を 0 にセット

メインループ(while True:

  1. 🌡 センサー読み取り
    t_raw, p_raw, h_raw = bme.read_compensated_data()

  2. 🔢 単位変換 & 四捨五入

    • 温度 ti = int(t_raw / 100 + 0.5)  (°C)

    • 気圧 pi = int((p_raw // 256) / 100 + 0.5) (hPa)

    • 湿度 hi = int(h_raw / 1024 + 0.5) (%RH)

  3. 👁 TPH_disp() で差分更新

    • ✏️ 温度が変われば数値部を再描画

    • 🌀 気圧が変われば数値部を再描画

    • 💧 湿度が変われば数値部を再描画
      いずれも oled.fill_rect() で旧値を消してから新値を描画

  4. ⏸ ウェイト
    utime.sleep(5) で 5 秒待機 → ① に戻る


0 件のコメント:

コメントを投稿

Google Spread Sheetの利用

  以前に ESP32 で作っていたものを、Raspberry Pi Pico W + MicroPythonで再現してみました。 1.Googleスプレッドシートの設定 1.Google Drive → 右クリック → Google スプレッドシート 2.作成して共有をクリック