Thursday, June 23, 2022

tinkercad I2C communication between controllers

//Master

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd1(0x21,16,2);
byte board_address = 1;

byte Right[8] = {
  0b00000,
0b00100,
0b00110,
  0b11111,
  0b00110,
  0b00100,
  0b00000,
  0b00000,
};

byte x;

void setup()
{
  lcd1.init();
  lcd1.clear(); 
  lcd1.backlight(); 
  lcd1.createChar(0, Right);
  
  Wire.begin(1); 
  
}

void loop()
  //transmit to slave 2 and 3, then wait for slave response
  for(int i=2; i<4; i++){
    x=random(0, 255);
    
  Wire.beginTransmission(i); // transmit to device #2
  Wire.write(x);              // sends x 
  Wire.endTransmission();    // stop transmitting
 
  lcd1.setCursor(0,0);
  lcd1.clear(); 
  lcd1.print("M ");
  lcd1.write(0);
    lcd1.write(0);
  lcd1.print(" S");
  lcd1.print(i);
  lcd1.print("  ");
  lcd1.print(x);
 
  Wire.requestFrom(i, 2); //request 2 bytes from device 2 
  lcd1.setCursor(0,1);
 
  while(Wire.available()) {
    byte data = Wire.read(); 
    
  lcd1.print("S");
    lcd1.print(data); //1st byte is slave address
  lcd1.print(" ");
      lcd1.write(0);
      lcd1.write(0);
  lcd1.print(" M");
  lcd1.print("  ");
    
    data = Wire.read(); 
  lcd1.print(data); //2nd byte is echo data
  }
 
  delay(500);
  }
}

---------------------------
//Slave

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

byte board_address = 2;
byte data;

void setup()
{
  Wire.begin(board_address);               
  Wire.onReceive(receiveEvent);
  Wire.onRequest(requestEvent);
}

void loop()
{
  
}

void receiveEvent(int n) {
  
  
  while(Wire.available()) {
    data = Wire.read(); 
  }
}

void requestEvent() {
  Wire.write(board_address);
  Wire.write(data);
}

reference:

I2C lcd

No comments:

Post a Comment