LSI Jiu-Jitsu

電子工作とブラジリアン柔術

MicroPythonで遊ぶ (3) - ADT7410 & SHT35

MicroPythonからI2C接続の2つの温度センサーを動かしてみました。
ボードは NUCLEO-F446RE を使用しています。

2つの温度センサーは秋月電子で購入したADT7410SHT35です。

  • ADT7410(600円)
    • 16Bit、One-Shot Modeで動作させています。

from machine import I2C
import utime

i2c = I2C(1, freq=100000)  # Ch.1 SCL=PB8, SDA=PB9
dev_addr = i2c.scan()
addr = dev_addr[0]
print("Addr:" + hex(addr))

wd = bytearray([0x03, 0b10100000])  # Configuration Register: 16bit one-shot

while True:
  i2c.writeto(addr, wd)
  utime.sleep_ms(1000)

  rd = i2c.readfrom_mem(addr, 0x00, 2)

  tmp = (rd[0] << 8) | rd[1]

  if (tmp & 0x8000)==0x8000:
    tmp = (tmp - 65536) / 128
  else:
    tmp = tmp / 128

  print("{:.3f}".format(tmp))


  • SHT35(1,380円)
    • リード方法は秋月電子の商品ページのサンプルスケッチを参考にしました。
    • 温度と湿度を表示しています。
    • CRC結果が不一致の際はエラーメッセージを表示します。

from machine import I2C
import utime

def crc8(data):
  init = 0x31
  crc  = 0xff
  for i in range(2):
    crc ^= data[i]
    for j in range(8):
      if(crc & 0x80):
        crc = (crc << 1) ^ init
      else:
        crc = (crc << 1)
      crc &= 0xff
  return crc

i2c = I2C(1, freq=100000)  # Ch.1 SCL=PB8, SDA=PB9
dev_addr = i2c.scan()
addr = dev_addr[0]
print("Addr:" + hex(addr))

wd = bytearray([0x2C, 0x06])

while True:
  i2c.writeto(addr, wd)
  utime.sleep_ms(300)

  rd = i2c.readfrom(addr, 6)

  tmp = -45 + 175 * (((rd[0] << 8) | rd[1]) / 65535)
  hum = 100 * ((rd[3] << 8) | rd[4]) / 65535

  crc_tmp = crc8([rd[0], rd[1]])
  crc_hum = crc8([rd[3], rd[4]])

  if crc_tmp==rd[2] and crc_hum==rd[5]:
    cc = ''
  else:
    cc = '[CRC Fail]'

  print("{:.3f} {:.3f} {:s}".format(tmp, hum, cc))
  utime.sleep_ms(1000)




2つ同時に測定してみました。

from machine import I2C
import utime

def get_adt7410():
  addr = 0x48
  wd = bytearray([0x03, 0b10100000])
  i2c.writeto(addr, wd)
  utime.sleep_ms(1000)
  rd = i2c.readfrom_mem(addr, 0x00, 2)
  tmp = (rd[0] << 8) | rd[1]
  if (tmp & 0x8000)==0x8000:
    tmp = (tmp - 65536) / 128
  else:
    tmp = tmp / 128
  return(tmp)

def get_sht35():
  addr = 0x45
  wd = bytearray([0x2C, 0x06])
  i2c.writeto(addr, wd)
  utime.sleep_ms(300)
  rd = i2c.readfrom(addr, 6)
  tmp = -45 + 175 * (((rd[0] << 8) | rd[1]) / 65535)
  return(tmp)

i2c  = I2C(1, freq=100000)  # Ch.1 SCL=PB8, SDA=PB9

while True:
  tmp_adt7410 = get_adt7410()
  tmp_sht35   = get_sht35()
  print("{:.3f} {:.3f}".format(tmp_adt7410, tmp_sht35))
  utime.sleep_ms(1000)


左がADT7410、右がSHT35の結果です。
ほぼ同じ結果となりました。