スキップしてメイン コンテンツに移動

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

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

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

1. 配線

両方とも I²C を使うので、SDASCL の 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.I2C, bme280, ssd1306, utime をインポート

  • 🔌 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 秒待機 → ① に戻る



コメント

このブログの人気の投稿

Raspberry Pi Pico Wを使ってみよう

   Raspberry Pi Pico W(ラズベリーパイ ピコ ダブリュー) は、英国 Raspberry Pi 財団が 2022 年に発売した Wi-Fi 搭載マイコンボードです。従来の「Raspberry Pi」と聞くと Linux が動くシングルボードコンピュータ(SBC)を思い浮かべがちですが、Pico W は マイクロコントローラ (MCU)に分類され、いわゆる “組み込み開発” を手軽に始められるデバイスです。搭載 MCU はデュアルコア Arm Cortex-M0+(133 MHz 動作)の RP2040 。ここに Infineon 製 CYW43439 チップが追加され、 2.4 GHz IEEE 802.11 b/g/n Wi-Fi(BLE 対応 FW も提供中) が使えるのが最大の特徴です。  開発言語は MicroPython や CircuitPython が真っ先に紹介されることが多いのですが、 公式 Pico SDK を使えば C/C++ でも本格的に開発 できます。SDK は CMake ベースで Windows/macOS/Linux いずれでも利用可能。さらに、Arduino Core RP2040 が整備されたことで Arduino IDE 2.x からも “スケッチ感覚” で書き込みが可能 になりました。したがって、 「まずは Python でサッと試す」 「より高速化や省メモリ化が必要になったら C/C++ へ移行」 といった二段構えの学習ルートが取れるのが魅力です。 メニュー(基礎編) 01. Raspberry Pi Pico Wの開発環境を整える。 02. スイッチで 発光ダイオード(LED) を点灯・消灯させる 03. タイマーで発光ダイオード(LED)を1秒ごとに点滅させる 04. シリアル通信(オウム返し ) 05. シリアル通信(発光ダイオードの点灯・消灯) 06. サーボモーターを動かしてみよう(SG90制御入門) 07. DCモータを動かす(PWM) 08. IRリモートでRGBLED点灯 09. アナログ電圧を測定する(ADCの基本) 10. GPIO割り込み処理 11. リレーを駆動してLEDを制御する 12. DFPlayer で MP3 再生 13. 7 セグ 4 ...

スイッチで発光ダイオード(LED)を点灯・消灯させる

 スイッチを使って発光ダイオード(LED)を制御してみましょう。今回は、スイッチをオンにすると LED が点灯し、オフにすると消灯するように動作させます。もちろん、スイッチと LED を直接接続するのではなく、適切な回路を介して制御します。 1.回路 GPIO16 はデジタル入力として使用し、内部プルアップを有効にします。GPIO15 は出力として設定します。なお、接続には 1kΩ(1キロオーム)の抵抗を使用します。 【ソースコード】 # スイッチで LED を ON / OFF する簡単な例 #   GPIO15 : LED(出力)— LOW で消灯、HIGH で点灯 #   GPIO16 : スイッチ(入力)— 内部プルアップ抵抗を使用 # # ※ 配線例 #   LED のアノード → 1 kΩ 抵抗 → GPIO15 #   LED のカソード → GND #   スイッチ片側   → GPIO16 #   スイッチ反対側 → GND # # ★ 動作 #   スイッチを押す(GPIO16 が LOW)   → LED 点灯 #   スイッチを離す(GPIO16 が HIGH) → LED 消灯 from machine import Pin    # GPIO 制御ライブラリ import utime               # 時間関連(今回は使用しないが拡張用に読み込み) led = Pin ( 15 , Pin.OUT)                 # GPIO15 を出力モードに設定(LED 用) sw   = Pin ( 16 , Pin.IN, Pin.PULL_UP)     # GPIO16 を入力モード+内部プルアップ有効 while True:     if sw. value () == 1 :      # プルアップなので押していないときは 1   ...

シリアル通信(オウム返し)

 Raspberry Pi Pico Wは単体で使うのも便利ですが、パソコンや他のマイコンなど、さまざまな機器と通信できるとさらに活用の幅が広がります。 そこで今回は「シリアル通信」について紹介します。 まずは、パソコンから送られてきたデータをPico Wが受け取り、同じデータをそのままパソコンに送り返す、いわゆる「オウム返し(エコー)」を実装してみましょう。 シリアル通信とは? シリアル通信は、マイコンとパソコンや他の機器がデータを1ビットずつ順番に送受信する通信方式です。Raspberry Pi Pico WではUART(Universal Asynchronous Receiver/Transmitter)というハードウェアを使って実現します。 接続回路  id      TX       RX        baudrate     parity    stopbit  0  GPIO0 GPIO1   9600  なし  1  1  GPIO4 GPIO5   9600  なし  1 今回はUART1(GPIO4:TX、GPIO5:RX)を使用します。 ソースコード例 from machine import UART, Pin # UART1ポートを9600bpsで初期化(ボーレートを指定) sirial = UART ( 1 , 9600 ) # UARTの詳細設定: 9600bps 、データビット8、パリティ無し、ストップビット1で初期化 sirial. init ( 9600 , bits = 8 , parity = None, stop = 1 ) # UARTで文字列を送信する(※MicroPythonではバイト列で送るのが正しいため b '' にしたほうが安全) sirial. write (b 'Hello World \n\r ' )  # 起動時に「Hello World」を送信 # メインループ while True:     # 受信バッファにデータが存在するかチェック     if sirial. any () > 0 : ...