Getting Started with the ProtoCentral MAX30205 Body Temperature Sensor
Introduction
The ProtoCentral MAX30205 Body Temperature Sensor is a high-accuracy, digital body-temperature breakout based on the Maxim/Analog Devices MAX30205. It’s designed specifically for human body-temperature measurement: the IC is factory-calibrated to be accurate to ±0.1 °C across the clinical 37 – 39 °C window, which is the range where small differences actually matter (fever screening, perioperative monitoring, wearable thermometry). The 16-bit ADC inside the chip resolves changes as small as 0.0039 °C, and the I2C 2-wire interface keeps host wiring simple.
This guide covers both ProtoCentral MAX30205 SKUs:
- MAX30205 Body Temperature Sensor Breakout Board — standard rectangular breakout with a 4-pin header, ideal for prototyping on a breadboard.
- MAX30205 Wearable Body Thermometer Breakout — QWIIC compatible — round, wearable-form-factor board with an aluminium PCB for thermal conduction, waterproof epoxy top side, and a medical-grade biocompatible flexible cable terminating in a Qwiic 4-pin JST connector. Designed for direct skin contact.
Both variants use the same chip, same library and same example sketches — they differ only in form factor and connector.
Note: This board is intended for research and development purposes only. It is not FDA, CE, or FCC approved for consumer or medical use.
Key Features
- Maxim MAX30205 medical-grade temperature sensor — factory-calibrated to ±0.1 °C in the 37 – 39 °C range
- 16-bit resolution — 0.00390625 °C per LSB
- Digital I2C interface — no ADC required on the host MCU
- Configurable I2C address — solder jumpers on the breakout for multi-sensor setups (default 0x49)
- 5 V tolerant — works directly with Arduino Uno and 3.3 V hosts
- Two form factors — header-pin breakout (8793) for prototyping, or round wearable Qwiic version (8978) for direct skin contact
- Wearable variant adds: aluminium PCB for thermal conduction, waterproof epoxy top, biocompatible flexible cable
What’s in the Box
Breakout Board (8793):
- 1× ProtoCentral MAX30205 breakout board
- Header pins (unsoldered)
Wearable Qwiic Variant (8978):
- 1× ProtoCentral MAX30205 wearable thermometer breakout (round, aluminium PCB)
- Pre-attached flexible biocompatible cable terminating in a Qwiic 4-pin JST SH connector
You will also need an Arduino Uno (or compatible board) and, for the Qwiic variant, a Qwiic-compatible board / shield (e.g. SparkFun Qwiic Shield, ESP32 with Qwiic, RP2040 boards).
Specifications
| Parameter | Value |
|---|---|
| Sensor IC | Maxim MAX30205 |
| Accuracy | ±0.1 °C (37 – 39 °C); ±0.27 °C (typ.) over full operating range |
| Resolution | 16-bit (0.00390625 °C per LSB) |
| Operating Range | 0 – 50 °C |
| Interface | I2C (2-wire), 100 / 400 kHz |
| Default I2C Address | 0x49 |
| Supply Voltage | 2.7 – 3.3 V (Qwiic) · 5 V tolerant logic |
| Connector | 4-pin header (8793) · Qwiic JST SH (8978) |
| PCB | FR4 (8793) · Aluminium with epoxy encapsulation (8978) |
| Cable | None (8793) · Medical-grade biocompatible flexible (8978) |
Pin Connections
Wiring Diagram — Header-Pin Breakout (8793)
| MAX30205 Pin | Arduino Uno Pin | Function |
|---|---|---|
| SDA | A4 (or dedicated SDA) | I2C data |
| SCL | A5 (or dedicated SCL) | I2C clock |
| VCC | 5 V | Power |
| GND | GND | Ground |
Wiring — Qwiic Wearable Variant (8978)
The Qwiic variant ships with the cable already attached. There are two common ways to connect it to an Arduino host:
Option A — Arduino Uno R4 (or any board with a built-in Qwiic / STEMMA QT socket):
The Arduino Uno R4 Minima and R4 WiFi both have a Qwiic socket on the board. Plug the sensor’s cable straight into that socket — no shield, no jumper wires, no adapter. The same approach works for any other Qwiic / STEMMA QT-equipped board (ESP32 dev boards with Qwiic, RP2040 boards with STEMMA QT, Adafruit Feather boards, etc.).
Option B — Arduino Uno (classic) + Qwiic adapter shield:
For an older Arduino Uno (R3 and earlier) that doesn’t have a Qwiic socket, add a SparkFun Qwiic Shield (or any Qwiic / STEMMA QT adapter that breaks out to A4/A5). The shield maps the Qwiic socket internally to the Uno’s standard I2C pins.
Either way, no jumper wires or soldering are needed. You can daisy-chain other Qwiic sensors on the same I2C bus if you wish.
MAX30205 to ESP32 (header-pin variant)
| MAX30205 Pin | ESP32 Pin | Function |
|---|---|---|
| SDA | GPIO 21 (default I2C0 SDA) | I2C data |
| SCL | GPIO 22 (default I2C0 SCL) | I2C clock |
| VCC | 3.3 V | Power |
| GND | GND | Ground |
Tip: If you need multiple MAX30205 sensors on the same I2C bus, change the address on each board using the solder jumpers (the chip supports up to 32 distinct addresses).
Sensor Placement on the Body
The MAX30205 measures the temperature at the sensor’s metal back-pad — not a true core body temperature. Where you place the sensor determines what reading you get and how stable it is.
Recommended: Axilla (armpit)
Press the sensor’s metal pad firmly into the axilla (armpit), then hold the arm against the body for ~3 minutes. This is the closest non-invasive proxy for core body temperature and gives the most stable reading. Expected range: 36.5 – 37.2 °C for a healthy adult at rest.
Alternate: Forehead
Adhere the sensor to the centre of the forehead, just above the brow. Convenient and quick, but skin temperature here typically reads 0.3 – 0.5 °C lower than core. Useful for fever screening with a calibration offset.
Alternate: Inner Wrist
Place the sensor against the inner wrist, ideally over the radial pulse area. Best suited to wearable use with a strap or medical adhesive. Wrist skin temperature is more sensitive to ambient air and circulation: 33 – 36 °C is typical, and the absolute number is less meaningful than the trend.
Tip for the wearable variant (8978): The aluminium back of the round PCB is the temperature-sensing surface. Make sure that side is in direct contact with skin — the epoxy-encapsulated top side is for protection against sweat and moisture, not for sensing.
Installing the Arduino Library
Option 1: Arduino Library Manager (Recommended)
- Open the Arduino IDE
- Go to Sketch → Include Library → Manage Libraries…
- Search for “Protocentral MAX30205”
- Find “ProtoCentral MAX30205 Body Temperature Sensor Library” and click Install
Option 2: Manual Install from GitHub
- Go to github.com/Protocentral/Protocentral_MAX30205
- Click Code → Download ZIP
- In the Arduino IDE, go to Sketch → Include Library → Add .ZIP Library…
- Select the downloaded ZIP file
Your First Temperature Reading
Open the example sketch: File → Examples → ProtoCentral MAX30205 → basic_temperature
Or create a new sketch with the following code, which prints the body temperature once per second:
#include
#include "Protocentral_MAX30205.h"
MAX30205 tempSensor;
void setup() {
Serial.begin(9600);
Wire.begin();
while (!tempSensor.scanAvailableSensors()) {
Serial.println("MAX30205 not found — check wiring");
delay(1000);
}
tempSensor.begin(); // start continuous conversion
}
void loop() {
float temperature = tempSensor.getTemperature(); // °C
Serial.print("Temperature: ");
Serial.print(temperature, 2);
Serial.println(" °C");
delay(1000);
}
What This Code Does
- Includes the libraries —
Wire.hfor I2C andProtocentral_MAX30205.hfor the temperature sensor - Scans for the sensor —
scanAvailableSensors()finds the MAX30205 on the I2C bus regardless of the configured address - Initialises the chip —
begin()enables continuous conversion mode - Reads temperature —
getTemperature()returns the latest sample as a float in °C - Prints once per second — open the Serial Monitor at 9600 baud to see live readings
Using the Serial Monitor
- Upload the sketch to your Arduino
- Place the sensor in the axilla (or against another skin site)
- Open Tools → Serial Monitor at 9600 baud
- After ~10 seconds the reading should stabilise within ±0.05 °C between samples
Logging Multiple Sensors
If you have multiple MAX30205 boards on the same I2C bus (with different addresses set via solder jumpers), declare a MAX30205 object per address and call getTemperature() on each:
MAX30205 sensorAxilla(0x49);
MAX30205 sensorWrist(0x4A);
float t1 = sensorAxilla.getTemperature();
float t2 = sensorWrist.getTemperature();
Troubleshooting
Sensor not found / scanAvailableSensors() returns false
- Check SDA/SCL wiring — on Arduino Uno, SDA is on A4 and SCL is on A5 (or use the dedicated I2C pins next to AREF)
- Verify the breakout has 5 V on VCC and a solid GND connection
- For the Qwiic variant, make sure the JST SH cable is fully seated in both sockets
- Run an I2C scanner sketch (e.g. the standard
i2c_scannerexample) to confirm the sensor is responding at 0x49
Temperature reads ambient room temperature, not body
- The sensor measures the temperature of the IC and the metal pad — it needs direct skin contact to read body temperature
- Allow ~30 – 60 seconds of contact for the metal pad to equilibrate with skin
- For the wearable variant, ensure the aluminium back is against the skin (the epoxy-encapsulated top is the protective side)
Reading drifts continuously / never stabilises
- Body movement and ambient air changes the sensor’s environment — hold the sensor still in the axilla and keep the arm clamped
- Cold or sweaty skin causes a slow rise as the sensor warms up; wait ~3 minutes for axilla measurements
I2C bus errors / multiple devices conflict
- Default address is 0x49 — change it via the solder jumpers if another I2C device on the bus uses 0x49
- Enable internal Wire pull-ups (
Wire.begin()on Uno does this) — for long cables or noisy environments, add external 4.7 kΩ pull-ups on SDA and SCL
Resources
- Arduino Library: github.com/Protocentral/Protocentral_MAX30205
- Hardware Design Files: GitHub repository — schematic, layout and KiCad source under
/hardware/ - MAX30205 Datasheet: Maxim/Analog Devices MAX30205 Datasheet (PDF)
Licenses
- Hardware: CERN Open Hardware Licence v2 — Permissive (CERN-OHL-P v2)
- Software: MIT License




