user76518: Have a set of Arduinos that need to swap data--for a model rocket launch controller!
How to send 24 bits of info (launch commands) from a "master" Arduino, 12 bits each to two "slave" Arduinos that are 15' to 150' away from the "master.
Each "slave" needs to send 12 bits of info (continuity statii) to the "master."
"Master" <--- 15' to 115' ---> "Slave 1" <--- 10' to 35' --> "Slave 2"
Seems too long for I2C?

user7859: The best solution would be to use an RS485 adapter connected to each Arduino via serial port. This is a tried and true solution that is perfect for a setup like this and only costs a few bucks of extra hardware per node.
If you can't use additional hardware, you can also create a poor-man's current loop system like RS485 using normal Arduino pins since they are capable of sourcing and sinking 20mA.
With either of these solutions, you can send however much data as you want as long as you have some kind of minimal protocol to serialize it into a sequence of bits on the wire. To send 12 bits, you might just define a start condition as an idle "0" on the wire for a certain period of time, followed by a "1" start bit, followed by you 12 data bits, followed  maybe a parity bit or a checksum, and completed by a "1" stop bit.
Check out how, say RS232 or RS485 serialize bits to get an idea of how this works. If you end up using hardware that only supports sending data in 8 bit chunks, then you could, say, send two bytes per data "packet" where each byte has 6 bits of your data, plus one bit that indicates if ths byte is the first group of 6 bits or the second group, and then one bit of parity for error checking.

user61086: I've got I2C to work reliability between Arduinos with different byte sizes. I have copied the test code below. Note that there is separate code for sending and receiving. It may need to be tweaked but contains the basic idea.
One (or more) Arduinos sends to main I2C controller:
Sender Code:
//sender test

#include <Wire.h>


#include <Wire.h>
#define NUMDATA 4 

byte byteData[2 * NUMDATA]; //= {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};

//test

void setup()
{
  Wire.begin(3);                // join i2c bus with address #3
  Wire.onRequest(requestEvent); // register event
}

void loop()
{
int aData;  
  for(int i = 0; i < NUMDATA; i++){
    aData = analogRead(i);
    
    byteData[i*2 + 1] = ((aData >> 8)  & 0xFF);
    byteData[i*2] = (aData & 0xFF);
    
   // memcpy((void *)byteData[i*2], (void *) analogRead(i), sizeof(int));
  }
  
}

void requestEvent()
{
  Wire.write(byteData, 2 * NUMDATA);
}

Receiving Code:
#include <Wire.h>

void setup()
{
  Wire.begin();        // join i2c bus (address optional for main controller)
  Serial.begin(9600);  // start Serial for output
}

void loop()
{


  getSenderData();
  
  Serial.println("Hello");
  delay(500);
}

void getSenderData() {
//Gets sensor data for one grid

    //Byte Array to get raw bytes
    byte ICdataAsBytes[8];
    int i = 0;
  
    Wire.requestFrom(3,8);    // request 6 bytes from sending device #2
    
    while(Wire.available())    // sender may send less than requested
        ICdataAsBytes[i++] = Wire.read();

    int *tempData =(int*)&ICdataAsBytes;
    
    for( i = 0; i < 4; i++)
        Serial.println(tempData[i]);
    
}



76518: <p>Have a set of Arduinos that need to swap data--for a model rocket launch controller!</p>
<p>How to send 24 bits of info (launch commands) from a &quot;master&quot; Arduino, 12 bits each to two &quot;slave&quot; Arduinos that are 15' to 150' away from the &quot;master.</p>
<p>Each &quot;slave&quot; needs to send 12 bits of info (continuity statii) to the &quot;master.&quot;</p>
<p>&quot;Master&quot; &lt;--- 15' to 115' ---&gt; &quot;Slave 1&quot; &lt;--- 10' to 35' --&gt; &quot;Slave 2&quot;</p>
<p>Seems too long for I2C?</p>
 7859: <p>The best solution would be to use an RS485 adapter connected to each Arduino via serial port. This is a tried and true solution that is perfect for a setup like this and only costs a <a href="https://amzn.to/3nAAou3" rel="nofollow noreferrer">few bucks of extra hardware</a> per node.</p>
<p>If you can't use additional hardware, you can also create a poor-man's current loop system like RS485 using normal Arduino pins since they are capable of sourcing and sinking 20mA.</p>
<p>With either of these solutions, you can send however much data as you want as long as you have some kind of minimal protocol to serialize it into a sequence of bits on the wire. To send 12 bits, you might just define a start condition as an idle &quot;0&quot; on the wire for a certain period of time, followed by a &quot;1&quot; start bit, followed by you 12 data bits, followed  maybe a parity bit or a checksum, and completed by a &quot;1&quot; stop bit.</p>
<p>Check out how, say RS232 or RS485 serialize bits to get an idea of how this works. If you end up using hardware that only supports sending data in 8 bit chunks, then you could, say, send two bytes per data &quot;packet&quot; where each byte has 6 bits of your data, plus one bit that indicates if ths byte is the first group of 6 bits or the second group, and then one bit of parity for error checking.</p>
 61086: <p>I've got I2C to work reliability between Arduinos with different byte sizes. I have copied the test code below. Note that there is separate code for sending and receiving. It may need to be tweaked but contains the basic idea.</p>
<p>One (or more) Arduinos sends to main I2C controller:</p>
<p><strong>Sender Code:</strong></p>
<pre><code>//sender test

#include &lt;Wire.h&gt;


#include &lt;Wire.h&gt;
#define NUMDATA 4 

byte byteData[2 * NUMDATA]; //= {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};

//test

void setup()
{
  Wire.begin(3);                // join i2c bus with address #3
  Wire.onRequest(requestEvent); // register event
}

void loop()
{
int aData;  
  for(int i = 0; i &lt; NUMDATA; i++){
    aData = analogRead(i);
    
    byteData[i*2 + 1] = ((aData &gt;&gt; 8)  &amp; 0xFF);
    byteData[i*2] = (aData &amp; 0xFF);
    
   // memcpy((void *)byteData[i*2], (void *) analogRead(i), sizeof(int));
  }
  
}

void requestEvent()
{
  Wire.write(byteData, 2 * NUMDATA);
}
</code></pre>
<p><strong>Receiving Code:</strong></p>
<pre><code>#include &lt;Wire.h&gt;

void setup()
{
  Wire.begin();        // join i2c bus (address optional for main controller)
  Serial.begin(9600);  // start Serial for output
}

void loop()
{


  getSenderData();
  
  Serial.println(&quot;Hello&quot;);
  delay(500);
}

void getSenderData() {
//Gets sensor data for one grid

    //Byte Array to get raw bytes
    byte ICdataAsBytes[8];
    int i = 0;
  
    Wire.requestFrom(3,8);    // request 6 bytes from sending device #2
    
    while(Wire.available())    // sender may send less than requested
        ICdataAsBytes[i++] = Wire.read();

    int *tempData =(int*)&amp;ICdataAsBytes;
    
    for( i = 0; i &lt; 4; i++)
        Serial.println(tempData[i]);
    
}

</code></pre>
