TOPに戻る

ラズパイ5 pythonの仮想環境 ② 温度センサTMP117をつなぐ

 前回、pythonの仮想環境の作り方を解説しました。ここでは、具体的にプログラムを作ります。

 利用するのは温度センサTMP117で、I2Cバス経由で接続しています。

  <参考>TMP117の利用;センサ・シリーズ 温度①確度±0.1℃ TMP117 その1 温度の読み出し

環境

  • ハードウェア Raspberry Pi 5(4GBモデル)
  • OS Raspberry Pi OS (64ビット)、リリース日December 5th 2023
  • Windows10 22H2にて、ssh(OpenSSH_9.2p1 Debian-2+deb12u2, OpenSSL 3.0.11 19 Sep 2023)および、VNC Viewerを動作させている

温度センサTMP117のおもなスペック

  • 動作電圧 1.8~5.5V
  • 分解能 16ビット、LSBは0.007812℃
  • 動作温度範囲  -55~150℃
  • 確度
    • -20~+50℃ の範囲で±0.1℃ (最大値)
    • -40~+100℃ の範囲で±0.2℃ (最大値)
    • -55~+150℃ の範囲で±0.3℃ (最大値)
  • 消費電流 1Hzの変換サイクルで3.5uA
  • インターフェース I2C(1~400kHz)
  • データ長 2の補数形式の16ビット
  • 平均化出力が可能
  • 温度設定のアラートあり

Adafruitのブレークアウト・ボード

 温度センサのボードには、STEMMA QT(JST SH 4ピン)コネクタは2か所に装着されていて、どちらにつないでもかまいません。

  TMP117 Precision Temperature Sensor

 SDA/SCL信号には10kΩのプルアップ抵抗が入っています。I2Cのスレーブ・アドレスがデフォルトが0x48で、裏面のADDRの部分をショートすると0x49になるようです。

 コネクタは、表と裏のどちらも差し込めそうですが、ピンが内部の上部に並んでいるので、差し込める方向は一意です。ロック機構はないですが、すぐに抜けるということはありません。

接続

 i2cdetectで接続を確認します。0x48に見つけました。

プログラム

 仮想環境に入ります。

yoshi@ras05:~ $ source env/bin/activate

 プログラムです。

import smbus2

bus = smbus2.SMBus(1)
tmp117_addr = 0x48
TemperatureRegister   = 0x00

data = bus.read_i2c_block_data(tmp117_addr , TemperatureRegister, 2)
temp = data[0] <<8 | data[1]
temperature = temp * 0.0078125
print("Temp is %.5f `C" % temperature)

 実行すると、smbus2がないと言われます。

(env) yoshi@ras05:~ $ python tmp117-1.py
Traceback (most recent call last):
  File "/home/yoshi/tmp117-1.py", line 1, in <module>
    import smbus2
ModuleNotFoundError: No module named 'smbus2'

 pipを使ってsmbus2をインストールします。

(env) yoshi@ras05:~ $ pip install smbus2
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Collecting smbus2
  Downloading https://www.piwheels.org/simple/smbus2/smbus2-0.4.3-py2.py3-none-any.whl (11 kB)
Installing collected packages: smbus2
Successfully installed smbus2-0.4.3
(env) yoshi@ras05:~ $ pip list
Package    Version
---------- -------
pip        23.0.1
setuptools 66.1.1
smbus2     0.4.3

 実行します。

(env) yoshi@ras05:~ $ python tmp117-1.py
Temp is 18.85938 `C

関数化

 温度の読み出し部分を関数にします。

import smbus2

bus = smbus2.SMBus(1)
tmp117_addr = 0x48
TemperatureRegister   = 0x00

def readTMP117temperature():
    data = bus.read_i2c_block_data(tmp117_addr , TemperatureRegister, 2)
    temp = data[0] <<8 | data[1]
    return temp * 0.0078125

temperature = readTMP117temperature()
print("Temp is %.1f `C" % temperature)

 実行します。

(env) yoshi@ras05:~ $ python tmp117-2.py
Temp is 18.6 `C

-