Solutions to Exercise 4: The I2C Bus and the SHT30 Temperature and Humidity Sensor
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 be 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.
--
Uli Raich - 2020-05-18
Comments