Multiple I2c Buses ESP8266

I have two i2C devices to connect to an ESP8266, a MAX30102 and an SSD1306. I need to know how I can connect the two with the NodeMCU. I have read the others, but it appears the i2c speed is too high for the display. My current code is here:

/*
  Optical Heart Rate Detection (PBA Algorithm) using the MAX30105 Breakout
  By: Nathan Seidle @ SparkFun Electronics
  Date: October 2nd, 2016
  https://github.com/sparkfun/MAX30105_Breakout

  This is a demo to show the reading of heart rate or beats per minute (BPM) using
  a Penpheral Beat Amplitude (PBA) algorithm.

  It is best to attach the sensor to your finger using a rubber band or other tightening
  device. Humans are generally bad at applying constant pressure to a thing. When you
  press your finger against the sensor it varies enough to cause the blood in your
  finger to flow differently which causes the sensor readings to go wonky.

  Hardware Connections (Breakoutboard to Arduino):
  -5V = 5V (3.3V is allowed)
  -GND = GND
  -SDA = A4 (or SDA)
  -SCL = A5 (or SCL)
  -INT = Not connected

  The MAX30105 Breakout can handle 5V or 3.3V I2C logic. We recommend powering the board with 5V
  but it will also run at 3.3V.
*/

#include <Wire.h>
#include "MAX30105.h"
#include "Adafruit_GFX.h"
#include "OakOLED.h"
#include "heartRate.h"
OakOLED oled;
#define SDA_1 4
#define SCL_1 5

#define SDA_2 15
#define SCL_2 13

TwoWire I2Cone = TwoWire(0);
TwoWire I2Ctwo = TwoWire(1);

MAX30105 particleSensor;

const byte RATE_SIZE = 4; //Increase this for more averaging. 4 is good.
byte rates[RATE_SIZE]; //Array of heart rates
byte rateSpot = 0;
long lastBeat = 0; //Time at which the last beat occurred

float beatsPerMinute;
int beatAvg;

void setup()
{
  Serial.begin(115200);
  Serial.println("Initializing...");
  I2Cone.begin(SDA_1, SCL_1, 100000); 
  I2Ctwo.begin(SDA_2, SCL_2, 100000);
  oled.begin();

  // Initialize sensor
  if (!particleSensor.begin(&I2Ctwo, I2C_SPEED_FAST)) //Use default I2C port, 400kHz speed
  {
    Serial.println("MAX30105 was not found. Please check wiring/power. ");
    while (1);
  }
  Serial.println("Place your index finger on the sensor with steady pressure.");

  particleSensor.setup(); //Configure sensor with default settings
  particleSensor.setPulseAmplitudeRed(0x0A); //Turn Red LED to low to indicate sensor is running
  particleSensor.setPulseAmplitudeGreen(0); //Turn off Green LED
  oled.setTextSize(1);
  oled.setTextColor(1);
  oled.setCursor(0, 0);
  oled.setTextSize(2);
  oled.display();

}

void loop()
{
   oled.setTextSize(3);
  oled.setTextColor(1);
  oled.setCursor(0, 0);
  long irValue = particleSensor.getIR();

  if (checkForBeat(irValue) == true)
  {
    //We sensed a beat!
    long delta = millis() - lastBeat;
    lastBeat = millis();

    beatsPerMinute = 60 / (delta / 1000.0);

    if (beatsPerMinute < 255 && beatsPerMinute > 20)
    {
      rates[rateSpot++] = (byte)beatsPerMinute; //Store this reading in the array
      rateSpot %= RATE_SIZE; //Wrap variable

      //Take average of readings
      beatAvg = 0;
      for (byte x = 0 ; x < RATE_SIZE ; x++)
        beatAvg += rates[x];
      beatAvg /= RATE_SIZE;
    }
  }

  Serial.print("IR=");
  Serial.print(irValue);
  Serial.print(", BPM=");
  Serial.print(beatsPerMinute);
  Serial.print(", Avg BPM=");
  Serial.print(beatAvg);
    oled.display();

oled.println(beatsPerMinute);
  if (irValue < 50000)
    Serial.print(" No finger?");

  Serial.println();  
  oled.clearDisplay();

}


Please feel free to ask me for further info. I have tried different libraries, but the same result is imminent.

Ths code was modded from the sample code of the sparkfun MAX3010x library.

ESP32 I2C Bus-Multiple Devices LCD, BME280, MPU-6050

Do the examples from the sparkfun library work correctly ?

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.