Preview build — page text is a draft awaiting human review. Code badges come from real compiles. The flasher is real but not yet hardware-tested; the Playground is still a preview.
Sensor · MAX30102

Fix MAX30102 “MAX30105 was not found. Please check wiring/power.”

The SparkFun library got no reply at 0x57. Check SDA/SCL and 3.3 V, then the module’s I2C pull-ups — many purple MAX30102 boards pull them to 1.8 V.

ESP32Arduino UnoArduino NanoUpdated 3 Nov 2026

Community draft — report a mistake

What you see

OutputOutput
Initializing...
MAX30105 was not found. Please check wiring/power.

The SparkFun library checks the part ID over I2C at 0x57 in begin(). This message means nothing valid came back. With MAX30102 modules, the usual suspects after loose wiring are the board’s own I2C pull-ups.

#include <Wire.h>
#include "MAX30105.h"
MAX30105 particleSensor;

void setup() {
  Serial.begin(115200);
  Wire.begin(21, 22);
  if (!particleSensor.begin(Wire, I2C_SPEED_STANDARD)) {
    Serial.println("MAX30105 was not found. Please check wiring/power.");
    while (true) delay(1000);
  }
  particleSensor.setup();
}

Quick fix — try in order

  1. 1

    Scan for 0x57

    The MAX30102 answers at 0x57. Run the scanner below. Nothing found → wiring or pull-ups. Found → the problem is the begin() call.

  2. 2

    Wire it for your board

    ESP32: SDA 21, SCL 22, VIN 3V3, GND. Uno: SDA A4, SCL A5, VIN 5 V (the module regulates it). Leave INT unconnected for the basic examples.

  3. 3

    Fix the 1.8 V pull-ups

    On many purple/black MAX30102 boards the SDA/SCL pull-up resistors go to the on-board 1.8 V rail. That is too low a HIGH for an Uno and marginal for an ESP32. Move the pull-up jumper to 3.3 V if the board has one, or add 4.7 kΩ from SDA and SCL to 3.3 V.

  4. 4

    Start the sensor correctly

    particleSensor.begin(Wire, I2C_SPEED_FAST) — if long wires cause trouble, use I2C_SPEED_STANDARD.

Diagnostic sketch

Verified — core esp32 3.3.12, 3 Nov 2026Compile-only
i2c-scanner.inoArduino C++Open in PlaygroundOpen in PlaygroundFlash
// I2C scanner — lists every device address that answers on the bus.
// ESP32 DevKit V1: SDA = GPIO21, SCL = GPIO22. Uno/Nano: SDA = A4, SCL = A5.
#include <Wire.h>

void setup() {
  Serial.begin(115200);
  while (!Serial) {}
#if defined(ARDUINO_ARCH_ESP32)
  Wire.begin(21, 22);  // SDA, SCL
#else
  Wire.begin();
#endif
  Serial.print("I2C scanner on SDA=");
  Serial.print(SDA);
  Serial.print(" SCL=");
  Serial.println(SCL);
}

void loop() {
  Serial.println("Scanning...");
  uint8_t found = 0;
  // 0x08..0x77 are the usable 7-bit addresses; the rest are reserved.
  for (uint8_t addr = 0x08; addr <= 0x77; addr++) {
    Wire.beginTransmission(addr);
    uint8_t err = Wire.endTransmission();
    if (err == 0) {
      Serial.print("Found device at 0x");
      if (addr < 0x10) Serial.print('0');
      Serial.println(addr, HEX);
      found++;
    } else if (err == 4) {
      Serial.print("Unknown error at 0x");
      Serial.println(addr, HEX);
    }
  }
  if (found == 0) {
    Serial.println("No I2C devices found");
    Serial.println("Check: SDA/SCL swapped? Module powered? Pull-ups present?");
  } else {
    Serial.print(found);
    Serial.println(" device(s) found");
  }
  Serial.println();
  delay(5000);
}

Why it happens

Why does it say MAX30105?

The SparkFun MAX3010x library covers the MAX30105 and MAX30102 — they share the same register map and address. The message is the same for both.

Found, but readings stay near zero

The sensor works; your finger needs steady, light pressure and no ambient light. The red LED should glow faintly.

Not a medical device

Hobby modules give rough heart-rate and SpO2 estimates. Don’t use them for health decisions.

Board-specific notes

ESP32: 3.3 V logic matches the module; only the 1.8 V pull-up issue can still bite. Project: Heart-rate oximeter.

Arduino Uno: 5 V-logic I2C with 1.8 V pull-ups rarely works — use a level shifter or 3.3 V pull-ups.

Parts: MAX30102 — module variants and pinout.

↑↓ to move · Enter to open