Page 1 of 1

working with the esp32 and sps30 on micropython

Posted: Mon May 08, 2023 12:26 am
by senruuu
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!

Re: working with the esp32 and sps30 on micropython

Posted: Mon May 08, 2023 8:24 am
by bidrohini
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:

Code: Select all

  SPS_ADDR = 0x69   
Alternatively, you can convert the bytes object to an integer using the int.from_bytes() method:

Code: Select all

 SPS_ADDR = int.from_bytes(b'\x69', byteorder='big') 
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:

Code: Select all

  for i in range(len(read)):
    result.append(read[i]) 
Similarly, you should use len() to get the length of result list:

Code: Select all

    for i in range (2, len(result), 3):  
Once you make these changes, your code should work correctly.