Passing Serial data over I2C to another Arduino

Your code seems to be confused: if you just want to send data from the Master to the Slave, look at the Wire.h example:

Master:

#include <Wire.h>

void setup()
{
  Wire.begin(); // join i2c bus (address optional for master)
}

byte x = 0;

void loop()
{
  Wire.beginTransmission(8); // transmit to device #8
  Wire.write("x is ");        // sends five bytes
  Wire.write(x);              // sends one byte
  Wire.endTransmission();    // stop transmitting

  x++;
  delay(500);
}

Slave:

#include <Wire.h>

void setup()
{
  Wire.begin(8);                // join i2c bus with address #8
  Wire.onReceive(receiveEvent); // register event
  Serial.begin(9600);           // start serial for output
}

void loop()
{
  delay(100);
}

// function that executes whenever data is received from master
// this function is registered as an event, see setup()
void receiveEvent(int howMany)
{
  while (1 < Wire.available()) // loop through all but the last
  {
    char c = Wire.read(); // receive byte as a character
    Serial.print(c);         // print the character
  }
  int x = Wire.read();    // receive byte as an integer
  Serial.println(x);         // print the integer
}

If you want to send and receive String:

Master

#include <Wire.h>
#define I2CAddress 9

String text;

void getText(){
  if(Serial.available()) // check if we send a message
  {
    while(Serial.available())
    {
      char c = Serial.read(); // read the next character.
      text += c;
      delay(10);
    }  
  }
}

void sendText() {
  Wire.beginTransmission(I2CAddress); // transmit to device #9
  for(int i=0; i<(text.length()); i++){
    Wire.write(text[i]);
  }              
  Wire.endTransmission();    // stop transmitting
}

void setup() {
  Serial.begin(9600);
  Serial.println("Master here");
  
  // Start the I2C Bus as Master
  Wire.begin(); 
}

void loop() {
  text = "";
  while(text.length() == 0) { // Until we send text in the serial monitor
    getText();
    }
  if(text.length() > 0) {
     Serial.print("Send: " + text);
     sendText();
  }
  delay(500);
}

Slave:

#include <Wire.h>

#define I2CAddress 9
#define ledPin 13

void receiveString(int bytes) {
  String text = "";
  while (Wire.available()) { 
    char c = Wire.read(); // receive a byte as character
    text += c;
  }
  Serial.print("Printing: ");
  Serial.println(text);

  manageLed(text);
}

void manageLed(String cmd) {
  if(cmd == "ON")
    digitalWrite(ledPin,HIGH);
  else if(cmd == "OFF")
    digitalWrite(ledPin,LOW);
  else
    Serial.println("Unknown command: " + cmd);
}

void setup() {
  Serial.begin(9600);
  Serial.println("Slave here");
  
  // Start the I2C Bus as Slave on address 9
  Wire.begin(I2CAddress); 

   // Attach a function to trigger when something is received.
  Wire.onReceive(receiveString);

  // LED
  pinMode(ledPin,OUTPUT);
  digitalWrite(ledPin,LOW);
}

void loop() {
  delay(10);
}

PS: I didn't try the code on 2 arduinos

1 Like