I2C requestEvent handle failing

Hi, the code is pretty good, but there is a problem with the array and the interrupt and how Arduino code is used.

An array of three elements is "int myArray[3]", that is myArray[0], myArray[1], myArray[2]. No more, just that.

A float on the Arduino Uno is 4 bytes. If you want to have a union with that, you need an array of 4 bytes: int myArray[4].

There is no need to make a union. You can transmit a 'float'. You have to take care to transmit and receive them in the same order. As far as I remember, the 'float' on a Arduino Uno is stored with the LSByte at the lowest address.
Some like the I2C_Anything: Gammon Forum : Electronics : Microprocessors : I2C - Two-Wire Peripheral Interface - for Arduino.

I often use a struct to transfer data, because I want to transmit all kind of variables. Sometimes I use an array.

You already compose the data with 5 bytes. I prefer to put that in a struct.
Perhaps the easiest way is a struct with an identifier byte and a float. Transmit it at once with Wire.write( (uint8_t *) &myStruct, sizeof( myStruct)) and read it with Wire.readBytes( (uint8_t *) &mStruct, sizeof( myStruct).

The requestEvent() handler is called from an interrupt and is therefor a interrupt routine. You should keep it as short and as fast as possible. Don't use delay(), don't use other busses like another I2C bus action or 1-Wire bus action, don't even use Serial functions.

Do you know what happens when you call "requestTemperatures()" and "getTempCByIndex()"?

Even in ASYNC mode, that is far too much to be called from an interrupt.

You already test after the Wire.requestFrom() if the same number of bytes was received that was requested. That is very good. When using a onReceive() handler, also check if the parameter 'howMany' has the correct number of bytes.
You can stress test the I2C communication by increasing the request rate, maybe up to 100 times per second. The OneWire library turns off interrupts for the 1-Wire timed protocol and that will have major consequences for the I2C bus.

That's not all, there is more:
When using a variable both in a interrupt and outside the interrupt, it should be made "volatile".
The Arduino Uno uses a 8-bit microcontroller. That means when a 'float' of 4 bytes is written or read in a interrupt, that could happen while the 4 bytes of that variable is being written or read in the loop(). That means the interrupt routine can read and write the volatile variable, but in the loop() you have to turn off the interrupts to be sure that all 4 bytes belong to each other.