Guest post – Building a custom Raspberry Pi Pico-powered WiFi temperature sensor using MQTT and CircuitPython

David Booth is here with another guest post. This time a custom temperature sensor using a Raspberry Pi Pico and a self-designed PCB.

Overview

A custom, low power temperature sensor powered by a Raspberry Pi Pico with an LCD display and WiFi connectivity for integration into an MQTT home automation hub.

Specifications

For a number of years now, I’ve been wanting to monitor room temperatures across my house to assess the effect of multiple heating sources and insulation efficiency. Best practice would dictate that I have multiple sensors running in parallel to get data points that are relative to one another. For multiple sensors to be running constantly, I’d prefer it to be low powered and low cost to maximise the number of units I can have in the setup. For ease of setup, it would be preferable for each unit to be wireless to allow temperature data collection to be performed in a single location and for each unit to only require a power connection.

Prototyping

1. In the early days

Since the Pico came about, it became the obvious choice over a Pi Zero due to its low power consumption and the fact that it didn’t matter if the device lost power at any time. Stage one was to learn how to integrate the Pico with a screen and a temperature sensor. The Pico Omnibus from Pimoroni with dual expansion board pins meant I could start by adding a dedicated Pico Display and still have easy access to the GPIO pins for connecting other boards. At the time of launch, there were no Pico add-on boards with temperature sensors that I could find so I chose a BMP280 temperature/humidity I2C sensor due to its low cost and small size.

The first working prototype stored the average temperature over an hour and displayed this as a graph for a 24 hour period.

2. Temporal progress

To further the project, the next stage was to make the Pico able to wirelessly transmit the data to some sort of hub. I already have an MQTT broker for my custom Raspberry Pi-powered network doorbell and automated LED porch lights so it made sense to link the two systems together.

When designing, the Pico was new so there were no dedicated WiFi systems with documentation on how to connect them together. That was until Les Pounder from Tom’s Hardware did a great writeup on how to use the AirLift WiFi Featherwing with the Pico. Coincidentally, I had already bought an AirLift with the intention to “mesh” it with the Pico. This, however, came with the caveat that I would need to swap from the default Raspberry Pi MicroPython firmware to CircuitPython firmware. Thinking this was going to be a nightmare, I was happy to find out it was painless and actually made development much easier. With CircuitPython, the Pico was now accessible as a USB storage device so I could edit the files directly on the Pico using a standard text editor of my choice (not forced into using something like Thonny). It also had the added benefit that the Pico auto-reloaded my code when the source code files were modified. I just had to remember to copy over the Adafruit CircuitPython packages necessary to interact with the ESP32 SPI WiFi module and BMP280 temperature sensor.

The only downside I found was that the Adafruit CircuitPython packages for the Pico Display worked differently to the Pimoroni MicroPython packages and were less helpful when it came to example code. I should be clear: it did have a few examples, but they were for static display of information, not changeable, constantly-updated data like I’d need. It therefore took a bit of “experimenting” to port my code over to the new style.

3. Moving away from the “breadboard”

The prototype was now operational but was a mess of wires connecting the WiFi and temperature sensor to the Pico as neither module fitted onto the Pimoroni Pico Omnibus board and I had to use jumper wires to get to this stage.

Wanting to make a custom PCB to neaten everything up, I started with a piece of stripboard and soldered the header pins necessary to house the four boards how I wanted them, but after soldering ninety three header pins and still having to then solder twenty seven additional wires (in a specific order) on the back to connect everything up, I realised it was just as easy (and probably quicker) to draw up a PCB in KiCad and get it fabricated.

Having used KiCad previously to design Raspberry Pi HATs for my Pi Wars entry over the last few years, I found this fairly easy. The board design would be basic: some header pins and traces to link them together based on my rats nest of wires. I had this designed in an hour or two. Knowing that the PCB fabricator wouldn’t care what shape the board was, I decided that it would not be a simple rectangle. Hence why I chose to add mount holes on “wings” which jut out to give it a distinctive look.

Another consideration for board design was that it would be using WiFi. I knew that adding a ground plane would potentially reduce the wireless signal (it creates a basic Faraday Cage) so I skipped that step.

4. Fabrication and the results

Following the JLCPCB, it was a simple case of exporting the gerber files and sending them to JLCPCB for fabrication. The cost of fabrication was a touch over £15 for five boards which they fabricated and delivered in a little under two weeks.

The first thing I did was to solder on header pins and then I plugged in the four boards.

Surprisingly, my design worked first time (there’s normally something I forget to link together or add).

Mounting to the wall was easy with the four pre-drilled mounting holes in the design. I found that orientation is the key as the temperature sensor reads a degree or so higher if it is oriented directly above the Pico and the screen. Simply rotating the whole thing so the temp sensor is on the bottom resolves this and the screen can be rotated in-code so it reads the right way up.

Overall, I am very happy with the design and will start assembling multiple boards ready for deployment. All that remains is to add a process in the MQTT hub to collect the temperature readings and display them on an internal web page.

Code and PCB files

For anyone interested in replicating the project, here is a link to my Github repository which contains the source code and KiCad PCB files.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.