CircuitPython 10行プログラミング Step8 (4) I2Cで温度センサTMP117

 マイコン・ボードSeeed XIAO BLE SenseのI2Cバスに、温度センサTMP117を接続します。

(2022/06/30) Macでマウントされなくなることがたびたび起こります。その時は、Windows10にもっていくと、正常にマウントできることがあります。

温度センサ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)、スレーブ・アドレス0x48(デフォルト)
  • データ長 2の補数形式の16ビット
  • 平均化出力が可能
  • 温度設定のアラートあり

動作環境

  • MacBook Pro (Retina,13inch,late2013)
  • macOS Big Sur 11.6.7
  • Mu 1.1.1

配線

 AdafruitのSTEMMA QTボードを利用しています。I2Cバスの4ピン・コネクタで、いろいろなボードをつないでいく仕様です。

 当初、SCLは緑、SDAは白色でしたが、現在SCLは黄色、SDAは青色に変更されたようです。違う色も最近見たので、色で判断してはいけないようです。端が黒色でGND,その次の赤色が5もしくは3.3Vは変わっていません。

I2Cバス・スキャン・プログラム

 4番(A4 D4)端子と5番(A5 D5)端子はI2Cバスとして機能します。


from board import *
from busio import I2C
import busio
import digitalio
import board
from adafruit_lsm6ds.lsm6ds3trc import LSM6DS3TRC
import time

imupwr = digitalio.DigitalInOut(board.IMU_PWR)
imupwr.direction = digitalio.Direction.OUTPUT
imupwr.value = True
time.sleep(0.1)
#i2c = busio.I2C(board.IMU_SCL, board.IMU_SDA)
i2c = I2C(board.SCL,board.SDA)

while not i2c.try_lock():
    pass

print([hex(i) for i in i2c.scan()])
i2c.deinit()

 i2c = I2C(board.SCL,board.SDA)を有効にすると、外部につながったI2Cデバイスを探してきます。

 i2c = busio.I2C(board.IMU_SCL, board.IMU_SDA)を有効にすると、内部のIMUを見つけてきます。

温度を読み出すプログラム

 読み出した2バイトのデータは2の補数形式なので、rteturnのところで符号の処理をしています。


from board import *
from busio import I2C
import time

i2c = I2C(SCL, SDA)

def readTemperature():
    tmp117_addr = 0x48
    while not i2c.try_lock():
        pass
    resultT = bytearray(2)
    i2c.readfrom_into(tmp117_addr, resultT)
    temp = (resultT[0] << 8 | resultT[1])
    i2c.unlock()
    return (-(temp & 0b1000000000000000) | (temp & 0b0111111111111111))

while 1:
    temperature = readTemperature() * 0.0078125
    print(temperature)
    time.sleep(3)

BLEで送る

 読み出した温度をBLEで送ります。


# SPDX-FileCopyrightText: Copyright (c) 2020 Bryan Siepert for Adafruit Industries
from adafruit_ble import BLERadio
from adafruit_ble.advertising.standard import ProvideServicesAdvertisement
from adafruit_ble.services.nordic import UARTService
from board import *
from busio import I2C
import time

ble = BLERadio()
uart = UARTService()
advertisement = ProvideServicesAdvertisement(uart)

i2c = I2C(SCL, SDA)

def readTemperature():
    tmp117_addr = 0x48
    while not i2c.try_lock():
        pass
    resultT = bytearray(2)
    i2c.readfrom_into(tmp117_addr, resultT)
    temp = (resultT[0] << 8 | resultT[1])
    i2c.unlock()
    return (-(temp & 0b1000000000000000) | (temp & 0b0111111111111111))

print('start')
ble.name = 'XIAO TMP117'

while 1:
    ble.start_advertising(advertisement)
    while not ble.connected:
        pass
    ble.stop_advertising()
    print('connected ')

    while ble.connected:
        temperature = readTemperature() * 0.0078125
        uart.write('{:.2f}'.format(temperature))
        print(temperature)
        time.sleep(1)

 BLEセントラルとして利用しているのは、onsemiのRSL10 Bluetooth Low Energy Explorerです。Notificationをチェックすると、キャラクタリスティックUUIDの6E400003-B5A3-F393-E0A9-E50E24DCCA9Eに、テキストで温度のデータが1秒ごとに送られてきています。