Solutions to Exercise 4: The I2C Bus and the SHT30 Temperature and Humidity Sensor
Exercise 1:
After initializing of the I2C bus with
from machine import Pin,I2C
i2c = (id=-1,scl=Pin(22),sda=Pin(21))
where the id parameter defines the I2C bus:
- 1 in case of the hardware interface for bus 1
- -1 in case you use a software interface with bit banging (you may skip this parameter as it is -1 by default)
you can scan the I2C bus with
devices = i2c.scan()
This will return a Python list with the addresses of all connected devices. The rest of the program is a question of print formatting.
Exercise 2:
This is an extremely relevant exercise because it shows typical work that must be done during an IoT project. Often code from other authors can be found on the Internet (e.g. github) but often you find problems with this. Maybe it is
- outdated and must be adapted to a newer system version
- there are still bugs in the code
- it was written for hardware slightly different from the one you want to use
Still, starting from something that has worked before or worked on a different hardware is often (not always!) easier than starting from scratch. And reading code written by experienced programmers may help you to improve your own coding skills.
A quick try
After having uploaded mysht30.py I simply copy the first example to a Python script and modify the import statement:
and this is what I see when running it:
Debugging the STH30 driver
Well, this does not look good! So, let's have a look if the SHT30 is found on the I2Cbus. This is the code found in the sht30 README.md:
and here is the result:
This looks good but ... When I take the SHT30 off the triple base, I still get the same result which is much less good! Looking into the mysht30.py code I see that by default pin 5 is used for SCL and pin 4 for SDA, which is not correct for our board! Now we have 2 options:
- modify the defaults
- add the scl and sda parameters when creating the sht30 object.
Since We will use the driver only with the ESP32 WeMos D1 mini card, I decided for the first option. I also add the bus number (1) to make MicroPython use the ESP32 hardware interface to the I2C bus. SHT30 class initialization now looks like this:
With this change I see the
Is connected: True if the SHT30 is connected and
Is connected: False if I remove it.
Let's try the measurement script again:
Different, but not much better!
Let's try to send a reset command with a little script, not using the sht30 driver:
with this result:
This tells me that start() and stop() are not supported by the I2C driver on the ESP32. Looks like the I2C start and stop conditions have been integrated into the writeto() and readfrom() methods! Let's just remove those two calls:
As you can see, the reset now works without errors. And since we are at it, let's try to make a measurement without passing through the SHT30 class:
with this result:
Now that we know how to read and write the SHT30 using the ESP32 I2C driver, we can make the necessary corrections in the SHT30 class. After the change all the code snippets in the README.md file should work.
Improving the SHT30 class
First I made a table with all functions the SHT30 offers and their command codes. I also checked which functions are implemented in the above SHT30 driver. See
SHT30NopI2CTemperatureAndHumiditySensor for details about the development of the driver.
--
Uli Raich - 2020-05-18
Comments