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秒ごとに送られてきています。