Go Down

Topic: [SOLVED] I2C Coms multiple values (Read 381 times) previous topic - next topic

grantastley

Jul 31, 2013, 02:36 pm Last Edit: Aug 01, 2013, 11:22 am by grantastley Reason: 1
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
Code: [Select]

// 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
Code: [Select]
// 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.

robtillaart

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


a typical int is 2 bytes
Rob Tillaart

Nederlandse sectie - http://arduino.cc/forum/index.php/board,77.0.html -
(Please do not PM for private consultancy)

grantastley

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?

grantastley

Could I do this by sending an array of data? Something like
Code: [Select]

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

grantastley

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
Code: [Select]
// 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
Code: [Select]
// 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....

robtillaart

Well done,
now you figured out yourself  you will never forget ;)
Rob Tillaart

Nederlandse sectie - http://arduino.cc/forum/index.php/board,77.0.html -
(Please do not PM for private consultancy)

Go Up