Hey, guys. Could someone help me with something please ? I would like to use both I2C buses with waveshare rp2040. I have two vl53IoX laser distance sensors and one sh1106 display. The sensors are on the I2C0 bus on pins 8 and 5 and the display on I2C1 on pins 14 and 15. Scanner finds them on the right buses but this code of mine doesn't work. For any advice I will be glad. Thanks ![]()
#include <Wire.h>
#include <Adafruit_VL53L0X.h>
#include <U8g2lib.h>
// I2C0 (VL53L0X sensors) -> GPIO8 (SDA0), GPIO5 (SCL0)
#define SDA0_PIN 8
#define SCL0_PIN 5
// I2C1 (OLED display) -> GPIO14 (SDA1), GPIO15 (SCL1)
#define SDA1_PIN 14
#define SCL1_PIN 15
// Shutdown pins for VL53L0X sensors
#define SHT_LOX1 7
#define SHT_LOX2 6
// I2C addresses for VL53L0X sensors
#define LOX1_ADDRESS 0x37
#define LOX2_ADDRESS 0x38
Adafruit_VL53L0X lox1 = Adafruit_VL53L0X();
Adafruit_VL53L0X lox2 = Adafruit_VL53L0X();
// Use software I2C for OLED (so it can use Wire1)
U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, SCL1_PIN, SDA1_PIN, U8X8_PIN_NONE);
int distanceL = 0;
int distanceR = 0;
VL53L0X_RangingMeasurementData_t measure1, measure2;
void setID() {
// Reset both sensors
digitalWrite(SHT_LOX1, LOW);
digitalWrite(SHT_LOX2, LOW);
delay(10);
// Activate LOX1 first
digitalWrite(SHT_LOX1, HIGH);
delay(10);
// Initialize LOX1 on I2C0
if (!lox1.begin(LOX1_ADDRESS, &Wire)) {
Serial.println(F("Nepodarilo sa inicializovaĹĄ senzor LOX1!"));
while (1);
}
// Activate LOX2
digitalWrite(SHT_LOX2, HIGH);
delay(10);
// Initialize LOX2 on I2C0
if (!lox2.begin(LOX2_ADDRESS, &Wire)) {
Serial.println(F("Nepodarilo sa inicializovaĹĄ senzor LOX2!"));
while (1);
}
}
void read_dual_sensors() {
lox1.rangingTest(&measure1, false);
lox2.rangingTest(&measure2, false);
Serial.print(F("Senzor 1: "));
if (measure1.RangeStatus != 4) {
distanceL = measure1.RangeMilliMeter;
Serial.print(vzdialenostL);
} else {
distanceL = -1;
Serial.print(F("Mimo rozsahu"));
}
Serial.print(F(" mm, Senzor 2: "));
if (measure2.RangeStatus != 4) {
distanceR = measure2.RangeMilliMeter;
Serial.print(vzdialenostP);
} else {
distanceR = -1;
Serial.print(F("Mimo rozsahu"));
}
Serial.println(F(" mm"));
}
void displayReadings() {
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_6x10_tr);
u8g2.setCursor(0, 12);
u8g2.print("Senzor 1: ");
if (distanceL != -1) {
u8g2.print(distanceL);
u8g2.print(" mm");
} else {
u8g2.print("Mimo rozsahu");
}
u8g2.setCursor(0, 28);
u8g2.print("Senzor 2: ");
if (distanceR != -1) {
u8g2.print(distanceR);
u8g2.print(" mm");
} else {
u8g2.print("Mimo rozsahu");
}
u8g2.sendBuffer();
}
void setup() {
Serial.begin(115200);
pinMode(SHT_LOX1, OUTPUT);
pinMode(SHT_LOX2, OUTPUT);
// Reset sensors
digitalWrite(SHT_LOX1, LOW);
digitalWrite(SHT_LOX2, LOW);
delay(10);
// Initialize I2C0 (VL53L0X sensors)
Wire.setSDA(SDA0_PIN);
Wire.setSCL(SCL0_PIN);
Wire.begin(); // Start I2C0
// Initialize I2C1 (OLED display)
Wire1.setSDA(SDA1_PIN);
Wire1.setSCL(SCL1_PIN);
Wire1.begin(); // Start I2C1
// Initialize OLED using software I2C
u8g2.begin();
Serial.println(F("Inicializácia..."));
setID();
}
void loop() {
read_dual_sensors();
displayReadings();
delay(500);
}


