内蔵温度センサーの値を取得してみた。(RP2040チップADC内蔵センサ)(Raspberry Pi Pico)

つぶやき

Raspberry Pi Pico 搭載の温度センサーの値を読み取ってRP2040チップの温度を測定してみます。

この記事は、Raspberry Pi Pico に搭載されている RP2040チップ内蔵温度センサー(ADCチャンネル4) の値を MicroPython で読み取り、シリアル出力する方法、I2C接続のOLEDに表示する方法をコード例付きで解説しています。
温度計算には公式仕様(27°C時 0.706V、1°Cあたり1.721mV変化)を使っています。

はじめに

内蔵温度センサーの用途と制限(ADC4は温度専用)
実際には周囲温度ではなくチップ温度を計測しています。

必要なもの

Raspberry Pi Pico または Pico W
MicroPython 開発環境(Thonny推奨)
OLEDディスプレイ(SSD1306, I2C接続, 解像度 128×64)
ジャンパーワイヤーRaspberry Pi Pico / Pico W

内蔵温度センサーの読み取り(シリアル出力)

コード例を次に示します。
電圧変換式と温度計算式は次の関係式を使っています。
27°C時 0.706V、1°Cあたり1.721mV変化

import machine
import utime

# 内蔵温度センサー(ADCチャンネル4)を設定
sensor_temp = machine.ADC(4)

# 16ビットADCの変換係数(3.3Vスケール)
conversion_factor = 3.3 / (65535)

while True:
    # ADCの読み取り値(0〜65535)を電圧(0〜3.3V)に変換
    reading = sensor_temp.read_u16() * conversion_factor

    # 温度換算:27°C時に0.706V、以降1°Cあたり1.721mVずつ変化
    temperature = 27 - (reading - 0.706)/0.001721

    print(f"{temperature:.1f}°C")
    utime.sleep(2)

なお、ADC(4) は内蔵温度センサー専用のため、「温度を測る」以外の用途には使えません。

OLEDに温度を表示する方法

配線(Pico → OLED SSD1306, I2C接続)
GND → GND
GP17 → SCL
GP16 → SDA
3V3 → VCC

コード例:

from machine import I2C, Pin, ADC
from ssd1306 import SSD1306_I2C
from utime import sleep

# I2C通信の初期化(SCL: GP17, SDA: GP16)
i2c = I2C(0, scl=Pin(17), sda=Pin(16))

# OLEDディスプレイの初期化(解像度 128x64)
oled = SSD1306_I2C(128, 64, i2c)

# 内蔵温度センサー(ADCチャンネル4)を設定
t = ADC(4)

# ADC値を電圧に変換するための係数(3.3V / 65535)
f = 3.3 / 65535

while True:
    # 温度センサーからADC値を取得して電圧に変換
    v = t.read_u16() * f

    # 電圧から摂氏温度を計算(公式に基づく)
    temp = 27 - (v - 0.706) / 0.001721

    # OLED画面をクリアして、温度を表示
    oled.fill(0)
    oled.text("Temp:", 0, 0)
    oled.text(f"{temp:.1f} C", 0, 16)
    oled.show()

    # 2秒待って次の更新へ
    sleep(2)

精度向上のための工夫

  1. Wi-Fi利用時の補正(Pico W)
    無線通信はチップ温度を上げるため、外気温より数℃高くなります。
  2. 外部センサーとの併用
    実環境温度を正確に計測したい場合は、外部センサーを使うのが良いようです。

コメント