From 7cbb44f634ebd7a6dd7f420237ce302c6088245e Mon Sep 17 00:00:00 2001 From: foamyguy Date: Wed, 6 Nov 2024 09:16:28 -0600 Subject: [PATCH 1/3] wait longer after wakeup --- adafruit_am2320.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adafruit_am2320.py b/adafruit_am2320.py index 02a4b2f..c1d647c 100644 --- a/adafruit_am2320.py +++ b/adafruit_am2320.py @@ -115,7 +115,7 @@ def _read_register(self, register: int, length: int) -> bytearray: i2c.write(bytes([0x00])) except OSError: pass - time.sleep(0.01) # wait 10 ms + time.sleep(0.1) # wait 100 ms # Send command to read register cmd = [AM2320_CMD_READREG, register & 0xFF, length] From 5eb2f024e0fa6c9e303535563ce0c18dff82e604 Mon Sep 17 00:00:00 2001 From: foamyguy Date: Wed, 6 Nov 2024 09:53:39 -0600 Subject: [PATCH 2/3] catch write failure and retry --- adafruit_am2320.py | 31 +++++++++++++++++++++++++------ 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/adafruit_am2320.py b/adafruit_am2320.py index c1d647c..2f8e479 100644 --- a/adafruit_am2320.py +++ b/adafruit_am2320.py @@ -110,17 +110,36 @@ def __init__(self, i2c_bus: I2C, address: int = AM2320_DEFAULT_ADDR): def _read_register(self, register: int, length: int) -> bytearray: with self._i2c as i2c: + write_success = False # wake up sensor - try: - i2c.write(bytes([0x00])) - except OSError: - pass - time.sleep(0.1) # wait 100 ms + for _ in range(3): + try: + i2c.write(bytes([0x00])) + write_success = True + time.sleep(0.1) # wait 100ms + break + except OSError: + write_success = False + if not write_success: + raise RuntimeError("Failed to wakeup I2C device") + + time.sleep(0.01) # wait 10 ms # Send command to read register cmd = [AM2320_CMD_READREG, register & 0xFF, length] # print("cmd: %s" % [hex(i) for i in cmd]) - i2c.write(bytes(cmd)) + write_success = False + for _ in range(3): + try: + i2c.write(bytes(cmd)) + write_success = True + time.sleep(0.005) + break + except OSError: + write_success = False + if not write_success: + raise RuntimeError("Failed to read from I2C device") + time.sleep(0.002) # wait 2 ms for reply result = bytearray(length + 4) # 2 bytes pre, 2 bytes crc i2c.readinto(result) From b052c6645b7e135b88f3aad41a2fc949d35b07b7 Mon Sep 17 00:00:00 2001 From: foamyguy Date: Wed, 6 Nov 2024 11:45:44 -0600 Subject: [PATCH 3/3] pass instead of set boolean --- adafruit_am2320.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/adafruit_am2320.py b/adafruit_am2320.py index 2f8e479..8f1134b 100644 --- a/adafruit_am2320.py +++ b/adafruit_am2320.py @@ -119,7 +119,7 @@ def _read_register(self, register: int, length: int) -> bytearray: time.sleep(0.1) # wait 100ms break except OSError: - write_success = False + pass if not write_success: raise RuntimeError("Failed to wakeup I2C device") @@ -136,7 +136,7 @@ def _read_register(self, register: int, length: int) -> bytearray: time.sleep(0.005) break except OSError: - write_success = False + pass if not write_success: raise RuntimeError("Failed to read from I2C device")