DIY Outdoor BLE Thermometer

by enesbcs in Circuits > Sensors

2139 Views, 1 Favorites, 0 Comments

DIY Outdoor BLE Thermometer

20260909_131851.jpg

There is no shortage of thermometers in my home, but for some time I had also wanted an outdoor thermometer. I found a promising Bluetooth outdoor thermometer from Inkbird, but after trying it out, I realized that it could only be actively polled and did not transmit its data passively.

So what is the difference between the two? Power consumption, primarily — but I will get into that in more detail later.

Long story short, after some searching I came across the nRF52840 chip, a 64 MHz Cortex-M4F with 256 KB of RAM and 1 MB of flash memory, which is theoretically capable of Bluetooth, Zigbee and Thread communication as well. I ended up building the thermometer shown in the picture below.

Supplies

  1. nRF52840 SuperMini development board
  2. BME280 I2C temperature sensor
  3. CR123 battery holder + CR123 battery
  4. Stevenson outdoor enclosure
  5. Prototype board, wires, connectors, etc..

The Hardware

nrf.jpg
nrf-wiring.jpg

For the sensor, I chose the BME280, a popular I2C-connected sensor often used in weather stations. Quite simply because, besides temperature and humidity, it also measures atmospheric pressure. It is also capable of operating from a 1.8–3.6 V supply and consumes only a few microamps, depending on the measurement mode.

But even that was more than I wanted, so instead of connecting it directly to the battery, I connected its power supply to one of the nRF chip's GPIOs (P1.00). The GPIOs can handle up to 4 mA with standard drive strength, so this does not cause any problems. In return, the thermometer only consumes power when the nRF chip itself is awake and the software enables that GPIO.

According to the nRF52840 datasheet, the chip consumes roughly 3 microamps in its low-power SYSTEM ON mode, while even the less optimistic third-party sources quote less than 5 microamps. Of course, when the radio starts transmitting, the chip can briefly draw around 15 mA, but I figured it would be enough for my purposes to wake it up only once every three minutes for a short data transmission.

This should already make it clear why I did not want the controller to remain permanently active, waiting for something to connect to it. Instead, it periodically wakes up and broadcasts the data in a short BLE advertisement.

On the Supermini board shown in the picture, disabling GPIO P0.13 also disables the onboard LDO, while I disable the red LED connected to P0.15 during startup. This way, I believe I have successfully eliminated the board's unnecessary extra power consumption.

An average CR123A battery has a nominal capacity of around 1500 mAh, so if I got everything right, I should not have to replace the battery for years.

There is another interesting detail: when the board is powered from USB without a 3.7 V battery connected, a blue LED flashes continuously and cannot be disabled. Fortunately, this does not happen when the board is powered directly through VDD.

And since we're talking about batteries: this board was specifically designed to be powered from a 3.7 V battery. However, I decided to use a direct 3 V power source instead, in order to eliminate the losses caused by voltage conversion (which also produces heat). And since I did not want to replace the battery frequently, I chose the beefier CR123A shown in the picture instead of the usual CR2032.

There is one problem, though: the Supermini board does not have a pin where this can be connected... at least not on the side. If you turn the board over, however, there is a small pad on the bottom that exposes VDD, and a stable 3 V power source can be connected there quite happily.

Just keep in mind that this connection goes directly to the chip, without any kind of protection!

It is also worth mentioning that there is a faulty batch of Supermini boards where disabling P0.13 results in significant leakage current because of a 5.6 kΩ pull-up resistor. When the board is powered with 3.7 V through VDDH, this can put a load of up to 700 µA on the battery. In that case, the resistor should either be removed or replaced with a 10 MΩ resistor.

Since I power my chip directly through VDD, however, this particular issue does not affect my circuit.


The Software

bleha-2026-09-22 11-32-49.jpg

The nRF52 family, made by the Norwegian company Nordic Semiconductor, is not aimed at Wi-Fi but rather at BLE and low-power 2.4 GHz wireless communication. Thanks to its very low power consumption, it is a better choice for battery-powered applications than the Chinese ESP32 solutions.

Software support has also made its way into ESPHome through ZephyrOS, but as far as I can tell, it currently only supports the Zigbee stack and just a few simple sensor types.

That was not going to stop me, though. I wrote a simple custom program to implement the operation described above. It is a FreeRTOS-based project that can be compiled with PlatformIO:

https://github.com/enesbcs/iotdiysensor/tree/main/n52btemp

No special programmer is required to flash the program. When the board is connected to a computer via USB, simply press the button connected between RESET and GND twice in quick succession. A drive named NICENANO will then appear, and all you have to do is copy the firmware.uf2 file onto it. (The process is similar to what is commonly used with the Raspberry Pi Pico.)

The program itself is very simple. I did not implement OTA support because I left out everything I could in order to maximize battery life.

There are therefore no Bluetooth services available to connect to or scan, since the board spends most of its time asleep, just like its radio. Every three minutes it wakes up, broadcasts short BLE advertising packets of no more than 31 bytes, and then goes back to sleep.

I built the structure of these packets according to the BTHome v2 standard (which is also used by Shelly devices). Home Assistant supports it either through its own BTHome integration or through the Passive BLE Monitor component.

The Enclosure

20260910_074427.jpg
stevenson2.jpg
stevenson1.jpg

Now that I have covered both the hardware and the software, it is time to admit that I actually bought the appropriate outdoor enclosure first, and then designed the hardware around it.

After doing some research, I decided on a Stevenson screen. For example, on allegro.pl it can be found under the name "Stevenson outdoor temperature sensor enclosure", and it is 3D-printed from UV-resistant ASA plastic.

Anyone with a 3D printer and some ASA filament could print something similar themselves. I bought mine for 9 EURO, specifically the smallest four-level version.

The basic idea is that air can freely circulate between the slats. The bottom is almost completely open, while the white color reflects most of the solar radiation.

Placement is also important: it should be installed in a shaded, well-ventilated location protected from direct sunlight, preferably not directly against a wall.

The usable internal height of this particular enclosure is only 5 cm, so I cut the 5 × 7 cm prototype board down to 5 × 5 cm, allowing it to fit inside without any problems.

I positioned the thermometer at the very bottom, since warm air rises, meaning that any heat generated by the chip or battery should have little effect on the temperature measurement.

As you can see, a 67 mm-long 18650 battery would not fit inside. This was partly why I started looking for a different power solution.

If you want to use an 18650 battery, I recommend the larger seven-level version of this enclosure, which is already 9 cm tall.

The four-level version was actually designed and sized to protect finished indoor thermometers when used outdoors, such as these:

Aqara LYWSD03MMC, WSDCGQ11LM, Sonoff SNZB-02, SNZB-02WD, SNZB-02P

This raises the question: although the enclosure protects my simple prototype board from rain and UV radiation, will that really be enough?

The nRF52840 and BME280 both have an operating temperature range of -40 to +85 °C, while an average CR123A lithium battery is rated for -40 to +60 °C.

I coated the solder joints with a corrosion-resistant protective lacquer rated for temperatures between -40 and +60 °C. There is not much more I can do about it.

Of course, this is still not an IP67-rated industrial thermometer. It is a DIY solution optimized for outdoor use, so only time will tell how reliable it will be in the long term.

Possible future improvements: a larger Stevenson screen with an 18650 battery, UV and light sensors alongside the thermometer, and a 12 V solar panel connected to the USB input through a 5 V step-down converter.

Actual Power Consumption

blebattery–2026-09-22 11-10-25.jpg

On the first day after installation, the battery voltage dropped from 3.22 V to 3.05 V. By the third day, it had settled around 3 V.

After ten days of operation, the voltage is still fluctuating around 3 V without any significant further decrease, as shown in the graph below. This suggests that the deep-sleep power consumption is indeed as low as expected, and that the battery should provide a very long operating time.