温湿度センサモジュール 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