BLE Vaccine Box Logger
A Bluetooth temperature logger built into PT Muara Sakti Utama's Baliem Vaccine Carrier. The design had to log vaccine storage temperature accurately across multi-day shipments on a single charge. VDR Labs designed the electronics, firmware and enclosure, and delivered 500 units, each individually verified.
Introduction
PT Muara Sakti Utama (MSU) makes the Baliem Vaccine Carrier, a portable cold box built for Indonesia's geography. A vaccine shipment can spend days moving between islands before it reaches a clinic, and vaccines have to stay between 2 and 8 °C the whole way. MSU wanted each carrier to keep its own temperature record, so a health worker could check on a phone that the shipment stayed within range.
The original specification, from August 2024, asked for a Bluetooth link to a phone app, a screen showing the current temperature, a built-in rechargeable battery lasting at least one week, and accuracy within ±1% over 0 to 10 °C. A record is only useful if it can be trusted, so accuracy had to hold on every unit in a run of hundreds, and each unit would be tested on its own before shipping.
MSU manufactures and sells the bare cooler box. VDR Labs designed the logger that goes with it: the electronics, the firmware, the enclosure and a proof-of-concept mobile app.
What we built
The logger is a small sealed unit built into the carrier, with a probe cable that reaches into the cold compartment. It measures two temperatures, shows the current reading on its own screen, and keeps a log that a phone collects over Bluetooth.
Electronics
At its heart is a Nordic nRF54 Series microcontroller with Bluetooth 5.4 built in. This one chip handles both the logging and the wireless link.
Temperature comes from two NTC thermistors, small sensors whose resistance changes with temperature. One sits on the surface of the enclosure and measures the air around the carrier. The other sits at the end of the probe cable, inside the cold compartment, and measures what the vaccines themselves experience.
Both thermistors are read by a two-channel 12-bit analog-to-digital converter (ADC), the part that turns a sensor's voltage into a number the firmware can use. The firmware takes many readings and averages them, a technique called oversampling, which raises the effective resolution to 16 bits: steps sixteen times finer than a single reading allows.
On the front, a 1.3 inch monochrome OLED screen and a five-way joystick give the user the current reading and simple controls. A 1000 mAh battery is wired directly to the board.
Firmware
The firmware's main job is to keep logging for months on one charge. To save power, the screen goes to sleep when nobody is using the device while logging continues in the background. A blinking LED still shows the state of the box at a glance: green from 2 to 8 °C, red above 8 °C and blue below 2 °C.
When a phone connects, the log is sent over Bluetooth Low Energy with a negotiated MTU (maximum transmission unit), which lets each packet carry more data. A log covering several days then travels in fewer, larger packets and arrives noticeably faster than it would at the default packet size.
VDR Labs also built a proof-of-concept mobile app to show the whole path working, from sensor to phone. MSU's own team developed it into the production app used in the field.
Enclosure
The enclosure is 3D printed in SLS nylon, a laser-sintered plastic well suited to rough environments. It comes in two pieces held by four plastic screws, each sealed with its own rubber O-ring. A second O-ring seals the back door, and the probe cable entry is sealed with glue.
The assembly is rated IP67, meaning it is dust-tight and can be submerged. That rating was verified by holding a unit one meter under water with no water getting in.
Turning resistance into temperature
Everything above exists to produce one number a health worker can rely on: the temperature inside the box. That number does not come straight out of the sensor. It has to be calculated, and how well it is calculated sets the accuracy of the whole product.
A thermistor's resistance and its temperature are related by a curve, not a straight line, so the firmware needs a formula that follows that curve closely. We use the industry-standard formula for this: a four-term inverse Steinhart-Hart equation:
R is the resistance the logger measures and T is the temperature in kelvin. R25 is the thermistor's rated resistance at 25 °C, 10,000 Ω for both parts used here. A, B, C and D are coefficients that shape the curve to one particular thermistor.
We solved those coefficients separately for each of the two thermistors. Both are rated with the same nominal B value of 3950 K, but they are made from different ceramic formulations and their curves differ slightly. A shared set would introduce a bias of 0.1 to 0.3 °C at the ends of the range, so each part got its own.
To find them, we fitted the formula to each manufacturer's published table of resistance against temperature, 51 points per part, using a weighted least-squares fit: a standard method for finding the curve that sits closest to all the points at once. Substituting y for 1/T and x for ln(R/R25) turns the equation into a cubic polynomial, so the fit is an ordinary linear regression.
The weighting is where the vaccine use case comes in. Points between 2 and 8 °C count three times as much as the rest, so the curve is most accurate in the band that decides whether a vaccine can still be used.
The fitted curves match the manufacturers' data to within 0.0003 °C for the box probe and 0.106 °C for the ambient sensor, both far inside the ±0.5 °C specification. The calculation is no longer what sets the accuracy. What remains comes from the thermistors themselves, which are made to ±1% of their rated resistance, about ±0.25 °C at 25 °C. That is why every unit is tested individually, which is the next step.
Testing and production
A careful design sets what the product can achieve. Testing confirms that each unit achieves it. Every one of the 500 units went through three checks before shipping:
- Resistance substitution, about 60 seconds per unit. Precision resistors stand in for the thermistor at five points across the temperature range. The logger cannot tell a resistor from a thermistor, so a known resistance should produce a known temperature, which checks the electronics, the converter and the firmware end to end.
- Room-temperature cross-check, about 30 seconds per unit. The thermistors are reconnected and, after two minutes to settle, both channels are compared with a calibrated reference thermometer. This checks the sensors themselves, the probe cable and the assembly.
- Ice-bath check at 0 °C. Each unit's probe goes into a stirred bath of ice water beside the reference thermometer. Ice water sits at 0 °C by physics, which makes it a dependable reference point right next to the vaccine range. Several probes share one bath, so the settling time is shared across a batch while every unit still gets its own reading and its own pass or fail.
The reference is a PT100-based thermometer accurate to ±0.05 °C, about ten times tighter than the ±0.5 °C spec of the device, in line with standard measurement practice.
On the bench validation unit, the largest error at any test point was 0.27 °C on the box probe and 0.31 °C on the ambient channel, inside the ±0.5 °C specification. In production, active test time is about 90 seconds per unit, plus the batched ice-bath check.
Result
MSU's IoT carriers now ship with a logger that runs for three months on one charge, against a one-week minimum in the original specification. Its readings are specified to ±0.5 °C from -10 to +40 °C, and each unit is verified against that before it leaves. The production run was 500 units, deployed across Southeast Asia, each able to show a health worker the temperature history of the shipment it traveled with.
“Thank you to VDR Labs on helping us develop the product. Your work was professional and exceeded expectation.”
