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.