Getting Started

Getting Started with the ProtoCentral MAX30205 Wearable Body Thermometer (Qwiic)

Last updated May 7, 2026

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:

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 header-pin breakout to Arduino Uno wiring diagram

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):

MAX30205 Qwiic wearable to Arduino Uno R4 wiring

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:

MAX30205 Qwiic wearable to Arduino Uno with Qwiic 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.

MAX30205 body temperature sensor placement guide

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)

  1. Open the Arduino IDE
  2. Go to Sketch → Include Library → Manage Libraries…
  3. Search for “Protocentral MAX30205”
  4. Find “ProtoCentral MAX30205 Body Temperature Sensor Library” and click Install

Option 2: Manual Install from GitHub

  1. Go to github.com/Protocentral/Protocentral_MAX30205
  2. Click Code → Download ZIP
  3. In the Arduino IDE, go to Sketch → Include Library → Add .ZIP Library…
  4. 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

  1. Includes the librariesWire.h for I2C and Protocentral_MAX30205.h for the temperature sensor
  2. Scans for the sensorscanAvailableSensors() finds the MAX30205 on the I2C bus regardless of the configured address
  3. Initialises the chipbegin() enables continuous conversion mode
  4. Reads temperaturegetTemperature() returns the latest sample as a float in °C
  5. Prints once per second — open the Serial Monitor at 9600 baud to see live readings

Using the Serial Monitor

  1. Upload the sketch to your Arduino
  2. Place the sensor in the axilla (or against another skin site)
  3. Open Tools → Serial Monitor at 9600 baud
  4. 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_scanner example) 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

Licenses

  • Hardware: CERN Open Hardware Licence v2 — Permissive (CERN-OHL-P v2)
  • Software: MIT License