Problema con comandi i2c e aggiornamento dati sensore

Ciao a tutti son tornato con nuovi e vecchi problemi, ho 2 schede arduino versione UNO e MEGA2560 collegati tra di loro con il sistema I2C, alla scheda arduino uno ho collegato il sensore di umidità del terreno simile a quella qui linkata, Irrigazione arduino sensore terreno - seconda parte - Mauro Alfieri i suoi valori vengono poi inviati alla scheda arduino MEGA che al momento mi deve mostrare i dati su un LCD 16x2. I dati li richiamo tramite un pulsante di un telecomando con il sistema IR mostro il codice del master:

#include <IRremote.h>
#include <IRremoteInt.h>
#include <LiquidCrystal.h>
#include <Wire.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
//unsigned long time;

byte umidita[8] = //icona per umidità
 {
     B00100,
     B00100,
     B01010,
     B01010,
     B10001,
     B10001,
     B10001,
     B01110,
 };

//variabili sistema IR 
int RECV_PIN = 6;  //IR receiver connected on pin 6
 
//Change these values to match data sent by your remote control
 
/*-----COMMANDS------*/
const long start = 0x83228877;

/*-----END COMMANDS------*/
 
IRrecv irrecv(RECV_PIN);  //initialize IR library on RECV_PIN
decode_results results;   //received data will be stored here
 
void setup() {
//controllo seriale valori sonda suolo  
  //Serial.begin(9600);
  
  
  
  Wire.begin();
  
  lcd.begin(16, 2);
  
 lcd.createChar(5, umidita);

   
 irrecv.enableIRIn();  // Start the receiver 
}
 
void loop() {

  if (irrecv.decode(&results)) {
    switch(results.value){  //fetch received data
     
  
     
     case start:    
      lcd.clear();
        digitalWrite(7, HIGH); 
          lcd.print("Sonda terreno"); 
            Sonda();    
           delay(500);
      break;  
     
  }   
   
   irrecv.resume(); // Receive the next value
 }
}



void Sonda() {
    Wire.requestFrom(2, 3);
      while (Wire.available()) {
      lcd.setCursor(4, 1);
        lcd.print((char) 5);
         lcd.print(Wire.read());
         lcd.print("%");
      delay(500);
  }
 

   
 }

mentre per lo slave ho scritto questo:

#include <Wire.h>


int sondaPin = A0;
int sondaValue = 0;

void setup()
{
  pinMode (sondaPin, INPUT);
  Wire.begin(2);                // join i2c bus with address #2
  Wire.onRequest(requestEvent); // register event
  
}

void loop()
{
  delay(100);
}

// function that executes whenever data is requested by master
// this function is registered as an event, see setup()
void requestEvent() {
  int sondaValue = analogRead (sondaPin);
  Wire.write(sondaValue);
      delay(500);      
  
}

sullo schermo del master dovrei leggere un valore che va da 0 a 1023 in base alla resistenza che metto ai capi del sensore dal momento che nn c'è niente dovrei leggere il massimo che è 1023, invece ho un valore di 255 e poi volevo sapere c'è un modo per poter vedere la variazione di resistenza senza dover ripremere il pulsante sul telecomando creare un ciclo continuo fuori dal void del loop oppure se scrivo il programma requestEvent all'interno del loop mi manda i dati aggiornati direttamente al master?

Ho provato a controllare i valori anche con la seriale ma compaiono 2 voci la prima viene scritto 255 e nella seconda riga -1

Il bus I2C al massimo può essere lungo 1m, quindi non è adatto a comunicazioni su distanze più lunghe.

Inoltre il protocollo di comunicazione non è semplicissimo da gestire.

Ti conviene usare la comunicazione seriale usando un collegamento RS485 che consente distanze notevoli (anche 1km) ed esenti da disturbi.

al momento nn ho niente con cui fare delle prove, correggimi se sbaglio, però pensavo di capire come funzionasse questo tipo di comunicazione, così quando riesco e decido di cambiare e posizionare il mio progetto avevo già una base e nn mi complicavo troppo la vita modificando il tutto

EDIT: stavo leggendo qualcosa, ho visto che nn vengono neanche tanto le schedine pre-cablate, in settimana quasi quasi faccio un acquisto online, però secondo te riesco a risolvere i miei problemi?

Se vuoi mantenere la comunicazione I2C puoi usare degli I2C extender. Però di consiglio di passare alla RS485 con i transrecevier.
Per il collegamento e passaggio dati puoi usare la libreria EasyTranser. (GitHub - madsci1016/Arduino-EasyTransfer: An Easy way to Transfer data between Arduinos)