MicroPythonからI2C接続の2つの温度センサーを動かしてみました。
ボードは NUCLEO-F446RE を使用しています。
2つの温度センサーは秋月電子で購入したADT7410とSHT35です。
- 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))
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の結果です。
ほぼ同じ結果となりました。