Wie kann ich denn von mehrere Arduinos die Daten an einem Master-Arduino verschicken? Wie funktioniert dort die Adressvergabe und wie spreche ich von meinem Master Arduino die einzelnen Slavas an und verlange die Daten?
Warum bleibst du nicht in deinem anderen Thread, bis deine I2C Sorgen ein Ende gefunden haben?
Ansonsten, unklar und verworren, du dich ausdrückst.....
Grundsätzlich, 2 Möglichkeiten, es gibt:
Master Reader/Slave Sender
Master Writer/Slave Receiver
Ein Slave hat eine Adresse und verhält sich passiv. Er kann Daten empfangen oder aufgefordert werden, eine bestimmte Anzahl Bytes zu senden.
Ein Master benötigt, wenn er alleine ist, keine Adresse und verhält sich aktiv. Er schickt Daten an einen Slave oder fordert eine bestimmte Anzahl Bytes vom Slave an.
Klar!
Ein int hat eine Adresse im Speicher.
Ein int hat eine Größe im Speicher. sizeof() zeigt dir diese Größe.
Niemand hält dich davon ab, diese Speicherstellen zu beschreiben.
Wie das geht, habe ich dir anhand der Strings gezeigt.
Die haben ja schließlich auch eine Adresse und eine Größe.
evtl. kannst du das mit union oder Templates übersichtlich gestalten.
// function that executes whenever data is requested by master
// this function is registered as an event, see setup()
void requestEvent() {
Wire.write("hello "); // respond with message of 6 bytes
// as expected by master
}
Aus dem schon verlinktem "Master Reader/Slave Sender"
Reference Language | Libraries | Comparison | Changes
Wire.onRequest(handler)
Description
Register a function to be called when a master requests data from this slave device.
Parameters
handler: the function to be called, takes no parameters and returns nothing, e.g.: void myHandler()
Aus der Wire Referenz.
Jetzt alle Klarheiten beseitigt?
H75FK:
es funktioniert nicht wirklich ..
Du hast mein volles Mitgefühl!
H75FK:
Ich dachte, das gehört nicht da rein, daher habe ich das neue geöffnet..Ich habe einen Wert was aber höher ist als 255, also größer 1 Byte. Ich bräcuhte min. 16bit=2Byte.. Kann ich eine Variable in 2Bytes irgendwie zuweisen=?
Wenn ich mit dieser Variante arbeiten will:
Wire.requestFrom(8,4)
Bevor du mit Master-Requests anfängst überlege dir erst mal, was du wie senden willst und mach ein paar Tests vom Master zum Slave oder umgekehrt, erst mal ohne Requests und prüfe im Seriellen Monitor mit Serial.Print ob das was du sendest auch richtig ankommt.
Wie man 16 Bit in 2 mal 8 Bit zerlegen, senden und zusammen setzen kann habe ich dir in deinem anderen Thread gepostet, aber dieser interessiert dich scheinbar nicht mehr:
wire.write(Wert&255);
wire.write(Wert>>8);
und beim Empfänger
Wert=wire.read() | wire.read()<<8;
MfG
Andi
Wobei man beachten muss dass man im requestEvent() Handler nur ein einziges mal write() machen kann. Zwei mal write() ist da nicht.
Serenifly:
Wobei man beachten muss dass man im requestEvent() Handler nur ein einziges mal write() machen kann. Zwei mal write() ist da nicht.
Wird nicht auch nach einem Master-Request erst nach einem wire.endtransmisiion der mit write gefüllte wire-Buffer auf die Reise geschickt?
Habe das selbst bis jetzt noch nicht gemacht, nur vom Master zum Slave gesendet, deshalb dumme Frage ^^
MfG
Andi
Ja, aber bei den Event Handlern läuft das anders ab.
Am bequemsten arbeitet man da mit Unions:
union Data
{
int value;
byte asArray[sizeof(int)];
};
Oder für zwei Werte:
union Data
{
int values[2];
byte asArray[sizeof(int) * 2];
};
Oder:
union Data
{
struct
{
int value1;
int value2;
}
byte asArray[sizeof(int) * 2];
};
Und wie übergibt man das dann der wire, wire.write(Data)?
MfG
Andi
Nein. Man kann mit Wire.writre() ein ganzes Array auf einmal senden. Darum geht es
Data data;
data.value = ...;
Wire.write(data.asArray)
OK, werde es selbst in kürze nicht brauchen, aber alles klar.
MfG
Andi
Habe das mal gemacht, kann dir die Codes gerne mal per Mail schicken, wenn du interesse hast schick ne PN