I2C (Inter Integrated Circuit)

En muchas tarjetas de conexión, la línea SDA también puede etiquetarse como SDI y la línea SCL como SCK

Código Maestro (Conectar dos ESP32)

///////////////////////////// CÓDIGO MAESTRO  //////////////////////////////////////////////////

#include <Wire.h>                                         //Librería para I2C

byte envia_I2C_m = 0;                                     // Datos a enviar
byte recibe_I2C_m = 0;

uint8_t slaveAddress = 0x58;                             // Dirección del dispositivo esclavo

uint8_t bytesToRead = 1;                                 // Cantidad de bytes a leer

char boton = 0; 

void leer_recibir_I2C(){
  //BLOQUE ENVIAR
  Wire.beginTransmission(slaveAddress);                // Iniciar transmisión al dispositivo
  Wire.write(envia_I2C_m);                             // Enviar datos
  Wire.endTransmission();                              // Finalizar transmisión

  //BLOQUE LEER
  Wire.requestFrom(slaveAddress, bytesToRead);         // Solicitar datos al dispositivo
  if (Wire.available()) {
    recibe_I2C_m = Wire.read();                        // Leer datos recibidos
  }
}

void setup() {
  Serial.begin(115200);                                //Monitor Serial
  Serial.setDebugOutput(true);                         //Config para puerto serial *
  Wire.begin();
}

void loop()
{
  envia_I2C_m = random(10,70);                        //El valor del sensor equivalente a I2C

  boton = Serial.read();                              //Lee el valor del botón
  
  leer_recibir_I2C();

  if(boton == '1'){
    delay(1000);
    Serial.println(recibe_I2C_m);                    //Imprime el valor enviado por el esclavo
  }

  }

Código Esclavo (Conectar dos ESP32)

///////////////////////////// CÓDIGO ESCLAVO  //////////////////////////////////////////////////
#include "Wire.h"                                      //Librería para I2C

#define I2C_DEV_ADDR 0x58                              //Dirección del Slave

byte envia_I2C_s = 0x41;
byte recibe_I2C_s = 0;

char boton = 0; 

void envia_I2C_slave(){                                //FUNCIÓN: Llama los datos enviados al maestros
  Wire.write(envia_I2C_s);
}

void recibe_I2C_salve(int len){                        //FUNCIÓN: Llama los datos recibidos del maestro
  while(Wire.available()){
    recibe_I2C_s = Wire.read();
  }
}

void setup() {
  Serial.begin(115200);                                  //Monitor Serial
  Serial.setDebugOutput(true);                           //Config para puerto serial *
  Wire.begin((uint8_t)I2C_DEV_ADDR);                     //Dirección Slave 
  Wire.onReceive(recibe_I2C_salve);                      //Función para recibir 
  Wire.onRequest(envia_I2C_slave);                       //Función para enviar
}

void loop() {
  envia_I2C_s = random(1,10);                             //El valor del sensor equivalente a I2C
  
  boton = Serial.read();                              //Lee el valor del botón
  
  if(boton == '1'){
    delay(1000);
    Serial.println(recibe_I2C_s);                    //Imprime el valor enviado por el esclavo
  }
  
  }

Sensores con I2C

Pantalla LCD con dispositivo I2C

MPU 6050

OLED