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.
Community draft — report a mistake
What you see
Initializing...
MAX30105 was not found. Please check wiring/power.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
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
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
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
Start the sensor correctly
particleSensor.begin(Wire, I2C_SPEED_FAST)— if long wires cause trouble, useI2C_SPEED_STANDARD.
Diagnostic sketch
// 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);
}// 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.
Did this fix it?
Thanks — that helps us keep this page right.