I’ve been working on getting a small bus converted to a camper for over a year now (see here for details) and in between working in it, I work on the tech I’m going to put in it.
One of those things is a temperature and humidity monitor which I wanted to have on display 24/7.
For that to work I had to look into tech that draws next to nothing in power and was programmable. Thankfully the lovely Lada Ada over at Adafruit Industries had made the Raspberry Pi Pico with the very useful RP2040 chip into a even smaller form factor with the QtPy RP2040. And with it you could daisy chain other sensors, monitors and more via the STEMMA QT connection onboard.
So, for this project I chose the QtPy RP2040, the SHT40 temperature and humidity sensor and finally the SH1107 OLED monitor to display the data. As well as a couple of STEMMA QT 100mm cables to connect all things together.
After connecting all the parts together I plug the QtPy to the computer and use Mu Editor to contact the board. You could use whatever client to edit the files you want, but it comes highly recommended to use the Mu Editor for CircuitPython.
The following is the code I put together to get the whole thing running.
import time import board import adafruit_sht4x import busio import displayio import terminalio from adafruit_display_text import bitmap_label as label from adafruit_displayio_sh1107 import SH1107, DISPLAY_OFFSET_ADAFRUIT_128x128_OLED_5297 displayio.release_displays() i2c = busio.I2C(board.SCL1, board.SDA1) sht = adafruit_sht4x.SHT4x(i2c) sht.mode = adafruit_sht4x.Mode.NOHEAT_HIGHPRECISION display_bus = displayio.I2CDisplay(i2c, device_address=0x3D) WIDTH = 128 HEIGHT = 128 ROTATION = 0 BORDER = 2 display = SH1107( display_bus, width=WIDTH, height=HEIGHT, display_offset=DISPLAY_OFFSET_ADAFRUIT_128x128_OLED_5297, rotation=ROTATION, ) while True: temperature, relative_humidity = sht.measurements # Make the display context splash = displayio.Group() display.show(splash) # Draw some label text size_text = "%0.fc" % temperature; size_text_area = label.Label( terminalio.FONT, text=size_text, scale=3, color=0xFFFFFF, x=38, y=42 ) splash.append(size_text_area) oled_text = "%0.f%%" % relative_humidity; oled_text_area = label.Label( terminalio.FONT, text=oled_text, scale=3, color=0xFFFFFF, x=58, y=74 ) splash.append(oled_text_area) time.sleep(60)
Then I added the necessary libraries into the lib directory of the RP2040.
As it is with these small controllers, when you save it reloads the code.py file and runs it. So, if you have any issues they should be displayed in the serial part of Mu Editor.
I’ve also drawn a 3D model of a small case for the project, here you can see the bottom half. There you can see how both the QtPy and the SHT40 sensor can be slotted in and the power for the QtPy comes in through that black box you see there on the left. I’ve even put drill holes for the screws to place this on the wall inside the bus. The 3D model is still a work in progress, but I think I’m getting closer to the end of the trial and error with the fit.
When it’s ready I will post it on my page on Thingiverse.
Here is at least a photo of everything working on my desk.
The only “problem” of sorts to mention is that because the OLED screen is connected via STEMMA QT, the refresh rate is slow.. deadly slow.
I notice that when the screen updates it blanks first and then loads the new values. So, I’m going to see if I can fix that somehow or if that is just a limitation I will have to live with.