I2C Arduino Master/ Slave Projekt mit LCD

Man kann den Slave so implementieren, wie man es von einem IC kennt. Dann kannst Du die Informationen häppchenweise anfordern.

LCD gilt für mein Display, mußt Du für Dich anpassen.

Master:

// Quelle: http://forum.arduino.cc/index.php?topic=296483.msg2071945#msg2071945
// LCD funktioniert mit Bibliothek http://www.instructables.com/id/How-to-connect-a-serial-LCD-to-an-Arduino-UNO/step2/The-Sketch/   Beschreibung
// https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads   Download 
#include <LCD.h>                //NewliquidCrystal
#include <LiquidCrystal_I2C.h>  //NewliquidCrystal
#include <Wire.h> 

#define I2C_ADDR    0x27
#define BACKLIGHT_PIN  3
#define En_pin  2
#define Rw_pin  1
#define Rs_pin  0
#define D4_pin  4
#define D5_pin  5
#define D6_pin  6
#define D7_pin  7

LiquidCrystal_I2C  lcd(I2C_ADDR, En_pin, Rw_pin, Rs_pin, D4_pin, D5_pin, D6_pin, D7_pin, BACKLIGHT_PIN, POSITIVE); 

const int SLAVE_ADR = 2;

void setup()
{
  lcd.begin(16, 2);                     // initialize the lcd
  Wire.begin();
}

void loop()
{
  setIndex(SLAVE_ADR, 0);
  lcd.setCursor (0, 0);
  for(byte i=0; i<6;i++){
  lcd.print((char)readByte(SLAVE_ADR));
  }
  lcd.setCursor(0, 1);
  for(byte i=0; i<6;i++){
  lcd.print((char)readByte(SLAVE_ADR));
  }
  delay(5000);
}

//ein Byte anfordern und lesen
int readByte(int adr)
{
  Wire.requestFrom(adr, 1);
  return Wire.read();
}

//Index an Slave senden
void setIndex(int adr, byte index)
{
  Wire.beginTransmission(adr);
  Wire.write(index);
  Wire.endTransmission();
}

Slave:

// Quelle: http://forum.arduino.cc/index.php?topic=296483.msg2071945#msg2071945
#include <Wire.h>

const int SLAVE_ADR = 2;
const int NUMBER_OF_REGISTERS = 21;

byte registers[NUMBER_OF_REGISTERS]={"Zeile1Zeile2"}; //Array für Daten
int index;

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

}

void loop()
{
}

void requestEvent()
{
  Wire.write(registers[index]); //aktuellen Index auf Bus schreiben
  index = (index + 1) % NUMBER_OF_REGISTERS;    //Index inkrementieren
}

void receiveEvent(int numBytes)
{
  int index = numBytes;  // verhindert eine Compilerwarnung
  index = Wire.read();   //Index lesen
  if (index < NUMBER_OF_REGISTERS) //setzen wenn im Array
    ::index = index;
  else
    ::index = 0; //wenn außerhalb auf 0 setzen
}

EDIT: Im Slave-Sketch Müll entfernt.