So, hier jetzt das versprochene Beispiel (alles ungetest!!!):
//Für Arduino/Master:
#include <wire.h>
void setup () {
wire.begin();
}
void loop (){
byte Puffer [10];
byte i = 0;
Wire.beginTransmission (Slaveadesse); //Sensordaten vom Slave anfordern
Wire.write (Daten); //irgendein Wert den der Slave so versteht das er den Sensor auslesen soll
Wire.endTransmission
delay(5); //dem Slave Zeit geben um die Anfrage zu bearbeiten
Wire.requestFrom(Slaveadresse,2); //High und Low Byte vom Slave anfordern
while (Wire.available){
Puffer [i] = Wire.read(); //Byte auslesen, High und Low Byte müssen noch zusammengefügt werden
}
//zweiten Slave auslesen
//Daten auswerten
Wire.beginTransmission (Slaveadesse);
Wire.write (Daten); //irgendein Wert den der Slave versteht
Wire.endTransmission
delay (100);
}
//Für Slave / ATiny:
#include <TinyWireS.h>
void Setup () {
TinyWireS.begin (Slaveadresse);
}
void loop(){
byte Rec;
int Wert;
if (TinyWireS.available()){ //"Warten" bis Slave von Master angesprochen wird und egal
//welcher Wert gesendet wird, der Slave schickt den Sensorwert zurück
Rec = TinyWireS.receive();
Wert = analogRead(AnalogPin); //hier würde sich auch anbieten den 10bit-Wert auf 8bit Auflösung zu reduzieren
TinyWireS.send(byte(Wert & 0xFF)); //Lowbyte senden
TinyWireS.send(byte(Wert >> 8)); //Highbyte senden
}
}
@Marcus W: Was heißt hier nur weil billiger? Hier gehts ja nicht um ein paar Prozent günstiger! Zwischen I2C und EIB Geräten liegt einfach mal locker Faktor 10 bis 20! Bei CAN weis ich das nicht genau, was ich gesehen hatte war aber auch nicht wirklich im einstelligen Euro Bereich. Sicher hat alles seine Gründe, möchte da auch keine Diskusion in die Richtung starten. Wo ich dir natürlich recht geben muss, wenn man nur unter uC Daten überträgt kann man auch ander Bussysteme kostenneutral verwenden (oder man denkt sich selbst ein Protokoll aus ^^). Ich geh aber mal davon aus das da vielleicht auch mal andere I2C Geräte angeschlossen werden sollen ![]()