Arduino Mega Slave / ESP8266 Master I2C leer información de un sensor hc-sr04

Hola, tengo un inconveniente al leer un calculo (numero de tipo int) que realizo desde un Arduino Mega y pasarlo por I2C a un Nodemcu ESP8266 V2, el calculo lo realizo en base una lectura que me da un sensor de ultrasonido hc-sr04, con lo cual obtengo la cantidad en mililitros de un recipiente y se la paso por I2C al Nodemcu, el tema esta en que no me llega bien la información

Código Nodemcu Maestro I2C

#include <Arduino.h>
#include <WiFiClient.h>
#include <ArduinoJson.h>
#include <Wire.h>

static const uint8_t D1   = 5;
static const uint8_t D2   = 4;



void setup() {
  
  Serial.begin(115200);  // start serial for output
  
  Wire.begin(5,4);      // join i2c bus (address optional for master)
  
}


void loop() {

  int mililitros = 0; // Cantidad en mililitros del recipiente

  Wire.beginTransmission(8);

   Wire.requestFrom(8,2);
  
   if(Wire.available() == 2)
    {
      mililitros = Wire.read() << 8 | Wire.read();     
    }

    Serial.println(mililitros);

  delay(1000);

}

Código Arduino Mega esclavo I2C

#include <SoftwareSerial.h>
#include <ArduinoJson.h>
#include <Wire.h>

// Configuramos los pines del sensor Trigger y Echo
const int PinTrig = 7;
const int PinEcho = 6;

// Configuramos las medidas del recipiente
const  int _long = 33;
const  int _width = 17;
float _height = 0;

// Constante velocidad sonido en cm/s
const float VelSon = 34000.0;

// distancia entre el sensor y el agua
float distancia = 0;

// variable de referencia calibrada
// para la altura del recipiente de agua

const  float altura = 7.9;



void setup() {

  Wire.begin(8);                // join i2c bus with address #8

  Wire.onRequest(requestEvent); // register event

  Serial.begin(115200);  // start serial for output

  pinMode(PinTrig, OUTPUT);    // Ponemos el pin Trig en modo salida

  pinMode(PinEcho, INPUT);    // Ponemos el pin Echo en modo entrada

}

void loop() {
  delay(500);
}

void requestEvent() {

  int finalRead = 0;

  // Ponemos el Triiger en estado bajo y esperamos 2 ms
  digitalWrite(PinTrig, LOW);
  delayMicroseconds(2);

  // Ponemos el pin Trigger a estado alto y esperamos 10 ms
  digitalWrite(PinTrig, HIGH);
  delayMicroseconds(10);

  // Comenzamos poniendo el pin Trigger en estado bajo
  digitalWrite(PinTrig, LOW);

  // La función pulseIn obtiene el tiempo que tarda en cambiar entre estados, en este caso a HIGH
  unsigned long tiempo = pulseIn(PinEcho, HIGH);

  // Obtenemos la distancia en cm, hay que convertir el tiempo en segudos ya que está en microsegundos
  // por eso se multiplica por 0.000001
  distancia = tiempo * 0.000001 * VelSon / 2.0;
  //Serial.print(" Distancia ");


  if ( (float) distancia  < altura) {
    _height = altura - (float) distancia;
  } else {
    _height = 0;
  }

  finalRead = (int) (_long * _width * _height);

  Wire.write(0x00FF & finalRead >> 8);          // Byte alto
  Wire.write(0x00FF & finalRead);            // Byte bajo



}

No veo los códigos y al ser ambos menores que 9k incluso sumados debes postearlos debidamente usando etiquetas.
Lee las normas y edita tu post.

Amigo gracias por la recomendación ya edite el post. tal vez puedan darme una orientación de que puede estar pasando, me he dado cuenta que al recibir la información en el maestro Nodemcu me llega un dato diferente al que en realidad debería llegar, pero esto solo ocurre cuando se lee desde algún sensor, si el envió desde el esclavo Arduino se hace por ejemplo con una variable (int= 1400) y comento la función

pulseIn(PinEcho, HIGH);

del Arduino para que no se ejecute, el código funciona correctamente. De todas formas necesito saber la lectura del sensor.

Empecemos por lo mas simple. Como has conectado MEGA y nodemcu? ya se que por I2C pero usaste adaptadores de nivel porque el nodemcu es 3.3V y el MEGA 5V.

Todo lo que va del nodemcu al mega es bien recibido pero al revés puede dañar al nodemcu. No digo que sea mal leído.
En este foro hemos debatido muchas veces sobre como adapatar niveles, solo búscalo y encontrarás las opciones.

esa funcion pulseIn(PinEcho, HIGH);

puede demorar mucho tiempo mas aún cuando no tiene indicado el timeout máximo. Mira como se usa pulseIn.

Asegúrate de hacer las comunicaciones y luego consultar el sensor ultrasónico y no interactuar entre ellas.

Tome en cuenta tus recomendaciones y adquirí un modulo convertidor de nivel lógico bidireccional de 5 a 3.3 V, comparto el diagrama de conexión también

El código lo mejore utilizando la librería NewPing.h, pero sigo con el mismo problema no me llega correctamente el dato, si me llega información pero no la que debería, por ejemplo, deberia llegar que hay 245 ML pero me llega 15

Código Nodemcu Maestro I2C

// Nodemcu Maestro I2C 
#include <Arduino.h>
#include <WiFiClient.h>
#include <ArduinoJson.h>
#include <Wire.h>

static const uint8_t D1   = 5;
static const uint8_t D2   = 4;



void setup() {
  
  Serial.begin(115200);  // start serial for output
  
  Wire.begin(5,4);      // join i2c bus (address optional for master)
  
}


void loop() {

  int mililitros = 0; // Cantidad en mililitros del recipiente

  Wire.beginTransmission(8);

   Wire.requestFrom(8,2);
  
   if(Wire.available() == 2)
    {
      mililitros = Wire.read() << 8 | Wire.read();     
    }

    Serial.println(mililitros);

  delay(1000);

}

Código Arduino Mega esclavo I2C

// Arduino Mega esclavo I2C
#include <SoftwareSerial.h>
#include <ArduinoJson.h>
#include <Wire.h>
#include <NewPing.h>

// Configuramos los pines del sensor Trigger y Echo
#define PinTrig  7
#define PinEcho  6
#define MAX_DISTANCE 8

NewPing sonar(PinTrig, PinEcho, MAX_DISTANCE);

// Configuramos las medidas del recipiente
const  int _long = 33;
const  int _width = 17;
float _height = 0;

// Constante velocidad sonido en cm/s
const float VelSon = 34000.0;

// distancia entre el sensor y el agua
float distancia = 0;

// variable de referencia calibrada
// para la altura del recipiente de agua

const  float altura = 7.9;



void setup() {

  Wire.begin(8);                // join i2c bus with address #8

  Wire.onRequest(requestEvent); // register event

  Serial.begin(115200);  // start serial for output

}

void loop() {
  delay(500);
}

void requestEvent() {

  int finalRead = 0;

  // La función ping() envia un ping, devuelve el tiempo de eco en microsegundos o 0 (cero) si no hay eco de ping dentro del límite de distancia establecido
  unsigned long tiempo = sonar.ping();

  // Obtenemos la distancia en cm, hay que convertir el tiempo en segudos ya que está en microsegundos
  // por eso se multiplica por 0.000001
  distancia = tiempo * 0.000001 * VelSon / 2.0;
  //Serial.print(" Distancia ");  
  //Serial.println(distancia);

  if ( (float) distancia  < altura) {
    _height = altura - (float) distancia;
  } else {
    _height = 0;
  }

  finalRead = (int) (_long * _width * _height);

  Wire.write(0x00FF & finalRead >> 8);          // Byte alto
  Wire.write(0x00FF & finalRead);            // Byte bajo



}

Ultimamente hay una ola de nuevas librerías que estan tomando mas auge y se llaman Non-blocking, no hace falta traducir algo que resulta obvio no?
Estas rutinas en general hacen las cosas de modo que procesos que demoran tiempo como el caso de un sensor ultrasónica al esperar su eco, pues ahora se siguen haciendo como en background de tal modo que no bloquea el programa, como el caso de pulseIn(PinEcho, HIGH); que no recuerdo pero cuando no se le pone el parámetro timout como opcional usa su valor por defecto de 1 segundo.

Ya que usas newping, intenta con este nuevo enfoque a ver si te da resultado y elimina el problema que bloquea tu comunicación I2C.

Gracias surbyte por la recomendación, lo solucione implementando la librería non blocking que comparten en este sitio, https://www.instructables.com/id/Non-blocking-Ultrasonic-Sensor-for-Arduino/

tengo una ultima consulta, si yo alimento el Arduino y el Nodemcu cada uno con un cargador de celular con una salida de 5V a 2A por el mismo cable USB que utilizo para programarlos estaría bien?, habría algún problema o lo puedo hacer permanente?, ya se que funciona porque los conecte, pero solo por unos minutos sin embargo lo pregunto porque nose si los pueda dañar así conectándolos permanentemente.

Si esta bien. No vas a tener problemas.