にゃみかんてっくろぐ

猫か百合を見守る壁になりたい

CRCチェックつきでAM2320の温湿度を読み取る (Raspberry Pi + Python 3)

温湿度センサモジュール AM2320の温湿度を取得するサンプルコードは数あれど、CRCチェックまでやっているコードが見当たりません。

ということで、データシートを見つつ書きました。

import smbus
import time

i2c = smbus.SMBus(1)
address = 0x5c

# Step one: Wake Sensor
try:
    i2c.write_i2c_block_data(address, 0x00, [])
except:
    pass
time.sleep(0.003)

# Step two: Send the read command
i2c.write_i2c_block_data(address, 0x03, [0x00, 0x04])

# Step three: To return the data read
time.sleep(0.015)
block = i2c.read_i2c_block_data(address, 0, 8)

# Check CRC
crc = 0xFFFF
for i in range(6):
  crc ^= block[i]
  for j in range(8):
    if (crc & 0x0001 == 1):
      crc >>= 1
      crc ^= 0xA001
    else:
      crc >>= 1

if block[7] << 8 | block[6] != crc:
  raise RuntimeError("CRC error")

# Print values
humidity = float(block[2] << 8 | block[3]) / 10
temperature = float(block[4] << 8 | block[5]) / 10

print(humidity, "%")
print(temperature, "°C")
$ python3 read_am2320.py
33.9 %
21.3 °C

参考