Problema con I2C, Servo y delay()

Hola
Tengo un problema al usar estos tres elementos

He reducido el código al mínimo para identificar el problema
Un Arduino Pro-Mini esta configurado como esclavo, compilado con el IDE v1.8.12
Una función "MoveServo" desplaza un servo entre dos angulos
El desplazamiento se hace según un valor que se lee de mediante Wire.read()
Todo funciona correctamente, excepto el bucle de movimiento del servo, la función delay(30) para tener un desplazamiento lento no actua, el movimiento es rápido

Al inicio ha una definición CON_WIRE para compilar una función loop() u otra()
Cuando no se define en la función loop(), se ejecuta un movimiento (sweet) del servo, y funciona correctamente.

Es decir, cuando se leen datos desde I2C, el delay del bucle for() no actue

Agradecería ayuda, pues ya no sé que hacer

Saludos y gracias por anticipado

//#define CON_WIRE    // comentar esta linea para test

#define NumEsclavo 3
#include <Servo.h>
#include <Wire.h>

Servo myservo;
 
void setup(){
    Serial.begin(9600);
    Serial.println("----------------");
    Wire.begin(NumEsclavo);  // Unimos este dispositivo al bus I2C con dirección definida en NumEsclavo  
    Wire.onReceive(receiveEvent);  // Registramos el evento al recibir datos  
    myservo.attach(9); // asignamos pin
    Serial.println("END SETUP -------------------------");
}

#if defined CON_WIRE
  void loop(){
  // Esta es la función loop a usar si recibimos mediante wire
}

#else

void loop(){
  //Esta es la función de prueva sin leer mediante wire
  MoveServo(60, 120);  
  delay(500);
  MoveServo(120, 60);  
  delay(500);
}
#endif



void MoveServo(byte FROM, byte TO){ // Mover servo de FROM a TO
  //myservo.attach(PinServo[Dest]); // asignamos pin 
  if(FROM < TO){
    for(int pos = FROM; pos <= TO; pos += 1){
      myservo.write(pos); 
      delay(30);
    }
  }
  else{
    for(int pos = FROM; pos >= TO; pos -= 1){
      myservo.write(pos); 
      delay(30); 
    }   
  }
  //  myservo.detach();
}


void receiveEvent() { 
  int Mandato=Wire.read();
  int Destino=Wire.read();   // no se usa está aquí para conservar la misma estructura que en el sketch original

  #if defined DEBUG
    Serial.print("LEYENDO Mandato "); Serial.print(Mandato);Serial.print("  Destino "); Serial.println(Destino);     
  #endif
  switch (Mandato) {
      case 0:
        break;
      case 1:
        MoveServo(60, 120);  
        break;
      case 2:
        MoveServo(120, 60);
        break;
  }
}

Hola
Nadie me puede orientar sobre lo que estoy haciendo mal?

No me resigno a pensar que la función delay() no funciona si se usa la librería "wire" para recibir datos

Saludos

Tu error es delay() sin ninguna duda.

Usa millis() de este modo y si quieres mas información ve a

// estas variables van como globales antes del setup 

byte estado = 0; // variable para la máquina de estados
unsinged long start; // variable para comparar con millis()


// falta setup

void loop(){
  //Esta es la función de prueba sin leer mediante wire
  switch(estado) {
      case 0: MoveServo(60, 120); 
                  estado = 1;
                  start = millis();
                  break;
      case 1: if (milllis() - start > 500UL) {
                     MoveServo(120, 60); 
                     start = millis();
                     estado  = 2;
                  }
                  break;
      case 2: if (milllis() - start > 500UL) {
                     estado = 0;  // vuelve a empezar
                  }
                  break;
  }

}

Prueba a ver como se comporta. Veo que en la lectura del I2C tienes algo similar.