Hello!
I am trying to make the sps30 work with the esp32 but with micropython. I found a library online but it tested using raspberri pi: [sps30/sps30.py at master · feyzikesim/sps30 · GitHub](https://github.com/feyzikesim/sps30/blo ... 0/sps30.py) so I tried converting it to a usable code for esp32.
I am having problems writing on the i2c bus For example, on the original code:
```
SPS_ADDR = 0x69
…
R_ARTICLE_CD = [0xD0, 0x25]
…
def read_article_code(self):
result =[]
article_code =[]
write = i2c_msg.write(self.SPS_ADDR, self.R_ARTICLE_CD)
self.bus.i2c_rdwr(write)
read = i2c_msg.read(self.SPS_ADDR, 48)
self.bus.i2c_rdwr(read)
for i in range(read.len):
result.append(bytes_to_int(read.buf))
if checkCRC(result):
for i in range (2, len(result), 3):
article_code.append(chr(result[i-2]))
article_code.append(chr(result[i-1]))
return str("".join(article_code))
else:
return self.ARTICLE_CODE_ERROR
```
**The code I was able to do was:**
```
SPS_ADDR = b’\x69’
…
R_ARTICLE_CD = bytearray([0xD0, 0x25])
…
def read_article_code(self):
result = []
article_code = []
write = bytearray(self.R_ARTICLE_CD)
self.i2c.writeto(self.SPS_ADDR, write)
time.sleep(0.1)
read = bytearray(48)
self.i2c.readfrom_into(self.SPS_ADDR, read)
for i in range(read.len):
result.append(bytes_to_int(read.buf))
if checkCRC(result):
for i in range (2, len(result), 3):
article_code.append(chr(result[i-2]))
article_code.append(chr(result[i-1]))
return str("".join(article_code))
else:
return self.ARTICLE_CODE_ERROR
```
The terminal outputs **TypeError: can’t convert bytes to int** on the self.i2c.writeto(self.SPS_ADDR, write) line. I’m guessing this would happen on the read part also.
I am hoping that maybe someone here could help me? Thanks!
working with the esp32 and sps30 on micropython
Re: working with the esp32 and sps30 on micropython
The issue with your code is that you are passing a bytes object (b'\x69') instead of an integer value (0x69) as the address parameter to the writeto() method of the I2C bus. The writeto() method expects an integer value representing the I2C device address.
You can fix this by changing the line where you define SPS_ADDR to:
Alternatively, you can convert the bytes object to an integer using the int.from_bytes() method:
This should resolve the TypeError issue you are facing.
Additionally, I noticed that in the original code, the read.len property is used to get the length of the received data. However, in your code, you are trying to access read.len, which is not a valid attribute. Instead, you should use the len() function to get the length of the received data:
Similarly, you should use len() to get the length of result list:
Once you make these changes, your code should work correctly.
You can fix this by changing the line where you define SPS_ADDR to:
Code: Select all
SPS_ADDR = 0x69
Code: Select all
SPS_ADDR = int.from_bytes(b'\x69', byteorder='big')
Additionally, I noticed that in the original code, the read.len property is used to get the length of the received data. However, in your code, you are trying to access read.len, which is not a valid attribute. Instead, you should use the len() function to get the length of the received data:
Code: Select all
for i in range(len(read)):
result.append(read[i])
Code: Select all
for i in range (2, len(result), 3):
Who is online
Users browsing this forum: No registered users and 118 guests