Medición de Frecuencia con H11AA1 y LCD Touch 320x240 qvt comunicación I2C

Hola comunidad de arduino en español, estoy trabajando en un proyecto para medir voltaje y frecuencia, tengo 2 arduinos conectados por I2C entre si, con uno controlo la pantalla y con el otro mido frecuencia, por el momento solo he logrado medir frecuencia usando un detector de cruce por cero "H11AA1", y lo muestro por el monitor serial del ide de arduino, la cuestión es que ese valor de frecuencia lo quiero emplear para mostrarlo en una pantalla LCD Touch 320x240qvt, la cuál estoy controlando con otro arduino MEGA que es el maestro del sistema, y envío los datos del arduino ESCLAVO (Con el que estoy midiendo frecuencia) al maestro, pero no logro poder imprimir el valor correcto en la pantalla, sino que se imprimen valores entre 0 y 255, he estado investigando en cómo enviar datos enteros por protocolo I2C entre arduino, pero no logro hacer que funcione y aparezcan los datos tal y como los veo por el monitor serie, de antemano muchas gracias por leerme y si alguién puede ayudarme estaría muy agradecido con esa persona.

adjunto la imagen en la cuál el código de la izquierda es el mestro y el de la derecha es el esclavo:

https://1drv.ms/u/s!AoWVYNNzZXkmtDsu3jJPqm3TvNj7

Código del arduino maestro:

#include <UTFT.h>  //Librería UTFT para dibujar la pantalla
#include <URTouch.h> //Librería par el Touch
#include <Wire.h>  //Librería para Comunicación I2C

extern uint8_t BigFont[];

UTFT myGLCD (ILI9341_16,38,39,40,41); //Declaramos el controlador de nuestra pantalla

int frecuencia = 0 ;

void setup() {
myGLCD.InitLCD();
myGLCD.clrScr();
myGLCD.setFont(BigFont);
myGLCD.fillScr(VGA_WHITE);
Wire.begin(1);
}

void loop() {
  Wire.requestFrom(1,2);
  while(Wire.available()){
    frecuencia = int(Wire.read()); //Transformamos el tipo byte a int
    myGLCD.setColor(VGA_BLACK);
    myGLCD.setBackColor(VGA_WHITE);
    myGLCD.print("FRECUENCIA:", 10, 140, 0);
    myGLCD.setColor(VGA_RED);
    myGLCD.printNumF(frecuencia, 1, 190, 140);
    myGLCD.print("Hz", 270, 140, 0);
  }
}

Código del arduino esclavo el que mide frecuencia:

#include <Wire.h>
int contador = 0;


void setup(){
  Wire.begin(1);
  Serial.begin(9600); //iniciamos comunicacion serial
  pinMode(2, INPUT);
  attachInterrupt(0, periodo, RISING);
  Wire.onRequest(requestEvent);
}

void loop(){ 
 delay(480);
 Serial.println(contador);
 contador = 0;
}

void requestEvent(){
  Wire.write(contador);
  }

void periodo(){
  contador++;
  }

link del video de como aparecen los datos en la pantalla Touch:

https://1drv.ms/v/s!AoWVYNNzZXkmtDzDD5raXg6nEY1n

 frecuencia = int(Wire.read()); //Transformamos el tipo byte a int

Creo que debería ser:

 frecuencia = int(Wire.read() << 8 | Wire.read()); //Transformamos el tipo byte a int

Siendo el Mega quizá sean 32 bits:

 frecuencia = int(Wire.read() << 24 | Wire.read() << 16 | Wire.read() << 8 | Wire.read()); //Transformamos el tipo byte a int

Logago de memoria asi que quizá el orden sea al revés, empezar sin nada y acabar el último read con el << 24.

Como bien dice Naguissa, hay que cambiar la forma de recibir el int. Pero también hay que cambiar la forma de enviar el int. Tanto en el Arduino UNO como en el Arduino MEGA 2560 el tamaño del int es de dos bytes y la operaciones de lectura y escritura de la librería Wire trabaja de byte en byte. Por lo tanto hay que escribir dos bytes y se han leer dos byte. Como todo esto lo estoy diciendo también "de memoria", para estar seguros que el byte más significativo y el menos significativo se transmiten en el mismo orden que se lee, sugiero este cambio para la recepción:

void loop() {
  Wire.requestFrom(1,2);
  if (Wire.available()) { // <-- Si hay datos disponibles, asumimos que son los dos bytes del 'int'
    frecuencia = Wire.read() << 8; // <-- Leemos la "parte alta" del 'int'
    frecuencia |= Wire.read();     // <-- "Añadimos" la "parte baja" del 'int'. Cuidado con la asignación, no es un = es un |=
    myGLCD.setColor(VGA_BLACK);
    myGLCD.setBackColor(VGA_WHITE);
    myGLCD.print("FRECUENCIA:", 10, 140, 0);
    myGLCD.setColor(VGA_RED);
    myGLCD.printNumF(frecuencia, 1, 190, 140);
    myGLCD.print("Hz", 270, 140, 0);
  }
}

He cambiado el while por un if, asumiendo que siempre que se tengan datos disponibles nos van a llegar los dos bytes que forman el int.

Y para el emisor:

void requestEvent() {
  Wire.write(contador >> 8);    // Escribimos la "parte alta" del 'int'
  Wire.write(contador);         // Escribimos la "parte baja" del 'int'
}

Ambos cambios están hechos para transmitir primero el byte más significativo (parte alta) y después el menos significativo (parte baja).

No lo he probado, pero creo que debería de funcionar.

MODERADOR: editado. Reply innecesario

Probé tus sugerencias y este es mi resultado:

https://1drv.ms/v/s!AoWVYNNzZXkmtEALIv0FJnL1OgIc

La frecuencia que estoy midiendo con el esclavo si la puedo mostrar por el monitor serial, pero no puedo mostrarla por la pantalla del maestro, la pantalla se queda en blanco, estos son los códigos:

Maestro:

#include <UTFT.h>  //Librería UTFT para dibujar la pantalla
#include <URTouch.h> //Librería par el Touch
#include <Wire.h>  //Librería para Comunicación I2C

extern uint8_t BigFont[];

UTFT myGLCD (ILI9341_16,38,39,40,41); //Declaramos el controlador de nuestra pantalla

int frecuencia ;

void setup() {
myGLCD.InitLCD();
myGLCD.clrScr();
myGLCD.setFont(BigFont);
myGLCD.fillScr(VGA_WHITE);
Wire.begin();
}

void loop() {
  Wire.requestFrom(1,2);
  if (Wire.available()) { // <-- Si hay datos disponibles, asumimos que son los dos bytes del 'int'
    frecuencia = Wire.read() << 8; // <-- Leemos la "parte alta" del 'int'
    frecuencia |= Wire.read();     // <-- "Añadimos" la "parte baja" del 'int'. Cuidado con la asignación, no es un = es un |=
    myGLCD.setColor(VGA_BLACK);
    myGLCD.setBackColor(VGA_WHITE);
    myGLCD.print("FRECUENCIA:", 10, 140, 0);
    myGLCD.setColor(VGA_RED);
    myGLCD.printNumF(frecuencia, 1, 190, 140);
    myGLCD.print("Hz", 270, 140, 0);
  }
}

Esclavo:

#include <Wire.h>
int contador = 0;

void setup(){
  Wire.begin(9);
  Serial.begin(9600); //iniciamos comunicacion serial
  pinMode(2, INPUT);
  attachInterrupt(0, periodo, FALLING);
  Wire.onRequest(requestEvent);
}

void loop(){ 
 delay(480);
 Serial.println(contador);
 contador = 0;
}

void requestEvent() {
  Wire.write(contador >> 8);    // Escribimos la "parte alta" del 'int'
  Wire.write(contador);         // Escribimos la "parte baja" del 'int'
}

void periodo(){
  contador++;
  }

En el esclavo tienes:

  Wire.begin(9);

Mientras en el maestro tienes:

  Wire.requestFrom(1,2);

En el esclavo está trabajando con la dirección 9 y el maestro con la dirección 1. Has de poner en los dos la misma dirección.

Si es con la dirección 1, pon en el esclavo:

  Wire.begin(1);

Y en el maestro:

  Wire.requestFrom(1,2);

Si es con la dirección 9, pon en el esclavo:

  Wire.begin(9);

Y en el maestro:

  Wire.requestFrom(9,2);