[SOLVED] I2C Coms multiple values

Hi I am trying to send multiple things over I2C (only x and Trims at the moment) when input 3 on the master is high
x will end up being a value between 1 and 101, however just for testing it will be 0, 3, 4 over I2C and then can be set to 10 with the master.
Trims will be a value between 0 and 255 from an analog input 0 on the slave

I can get both of them working by them selves however when I try to do both at once only one will come through.

I have the following code

Master

// Master
#include <Wire.h>

int x=0;
int Trims=0;

void setup()
{
  Serial.begin(9600);  
  Wire.begin();  // Start I2C as Master
}

void loop()
{  
  if(digitalRead(3)==HIGH){
    Wire.requestFrom(5,4);  //Also not sure how many bits I should be requesting
    x = Wire.read(); 
    //Trims = Wire.read();
  }
  
  Serial.print("x = ");
  Serial.println(x);
  //Serial.print("Trims = ");
  //Serial.println(Trims);
  
  if(digitalRead(3)==LOW) x=10;
  
  delay(500);
  
}

Slave

// Slave
#include <Wire.h>

int x=0;
int Trims=0;


void setup()
{
  pinMode(3, INPUT);
  pinMode(4, INPUT);
    
  Wire.begin(5);  // Start I2C as slave with address 5  
  Wire.onRequest(RequestData);
}

void loop()
{
  Trims = analogRead(0);
  map(Trims, 0, 1024, 0, 255);
  constrain(Trims, 0, 255); 
  
  if(digitalRead(3)==HIGH) x=3;
  else if(digitalRead(4)==HIGH) x=4;
  else x=0;
    
  delay(100);
  
}

void RequestData()
{
 Wire.write(x);
 //Wire.write(Trims); 
}

All I have been doing to include or remove x or Trims is add or remove // where needed.

Not sure if I am going about this the right way or not.
Any help with this would be appreciated.

//Also not sure how many bits I should be requesting

a typical int is 2 bytes

So if I am requesting 2 ints it should be 4 bytes?

anyone know how to send to ints at the same time, or one straight after the other?

Could I do this by sending an array of data? Something like

int I2Cdata[]={x, Trims}; then
Wire.write(I2Cdata[]);  // in void RequestData ()

Never mind everyone.
I have managed to figure this out myself.

I used an array to send the data.
Bellow is the code for anyone else wanting to know how to accomplish this.

Master

// Master
#include <Wire.h>

int x=0;
int Trims=0;
int I2Cdata[2];

void setup()
{
  Serial.begin(9600);
  
  Wire.begin();  // Start I2C as Master
}

void loop()
{
  
  if(digitalRead(3)==HIGH){
    Wire.requestFrom(5,4);
    
    I2Cdata[0]=Wire.read();
    I2Cdata[1]=Wire.read();
      
      x = I2Cdata[0];
      Trims = (I2Cdata[1]);
  }
  
  Serial.print("x = ");
  Serial.println(x);
  Serial.print("Trims = ");
  Serial.println(Trims);
  
  if(digitalRead(3)==LOW) x=10;
  
  delay(500);
  
}

Slave

// Slave
#include <Wire.h>

int x=0;
int Trims=0;

unsigned char I2Cdata[2];

void setup()
{
  pinMode(3, INPUT);
  pinMode(4, INPUT);
    
  Wire.begin(5);  // Start I2C as slave with address 5
  
  Wire.onRequest(RequestData);
}

void loop()
{
  Trims = analogRead(0);
  map(Trims, 0, 1024, 0, 255);
  constrain(Trims, 0, 255); 
  
  if(digitalRead(3)==HIGH) x=3;
  else if(digitalRead(4)==HIGH) x=4;
  else x=6;
  
  I2Cdata[0] = x;
  I2Cdata[1] = Trims;
    
  delay(100);  
}

void RequestData()
{
 Wire.write(I2Cdata,2);
}

Cheers
Grant…

Well done,
now you figured out yourself you will never forget :wink: