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)
精度向上のための工夫
- Wi-Fi利用時の補正(Pico W)
無線通信はチップ温度を上げるため、外気温より数℃高くなります。 - 外部センサーとの併用
実環境温度を正確に計測したい場合は、外部センサーを使うのが良いようです。
コメント