I²C Bus mit über den Master eine LED am Slave einschalten

Hallo,

kann mir wer sagen wie ich über den Master in diesem Fall der UNO im I²C Bus eine LED am Slave einschalte bzw. wie der Befehl dafür ist oder geht das überhaupt?

Im "Bus" sind 2 UNO´s und ein Leonardo, ein Uno ist der Master mit der Adresse (7) und der Slave Uno (9) der Leonardo (8)

#include <Wire.h>
void setup() {
  Wire.begin(7);        // Verbindet sich mit dem I²C Bus <------ Master Adresse
  Serial.begin(9600);  // Hier wird die Serieller ausgabe gestartet
}

void loop() {
 
    //Slave UNO
    Wire.requestFrom(9, 20);    // Frägt nach der Adresse #9 und nach den enthaltenen 20 Bytes
    while (Wire.available()) {     // Slave sendet weniger als angefragt wurde
    char c = Wire.read();         // Empfängt ein Charakter als Byte
    Serial.print(c);                  // Zeigt den Charakter an
    delay(100);
    }
    // Slave Leonardo
    Wire.requestFrom(8,25);
    while (Wire.available()) {
    char a = Wire.read();
    Serial.print(a);   
    delay(100);
  }
}

Der Master hat per Definition keine Adresse beim Aufruf der Wire.begin().
Der I2C BUS kann Werte übertragen. Du brauchst einen Sketch, der bei bestimmten Werten bestimmte Aktionen macht.
Grüße Uwe

Nico_A:
kann mir wer sagen wie ich über den Master in diesem Fall der UNO im I²C Bus eine LED am Slave einschalte bzw. wie der Befehl dafür ist oder geht das überhaupt?

Ja, das geht. Der Master schickt ein Byte, beispielsweise das Zeichen "E", der Slave liest es und interpretiert "E" als Einschaltbefehl. Oder der Master schickt ein "A", der Slave schaltet die LED aus.

uwefed:
Du brauchst einen Sketch, der bei bestimmten Werten bestimmte Aktionen macht.

Danke für die schnelle Antwort :slight_smile: ein Beispiel wäre mir schon recht gewesen :slight_smile:

Also ich meine damit wie soll ich den beispiel Sketch im Arduino Uno (Master) oder Uno (Slave) schreiben?

Ich habe davon keine Ahnung ich war froh jetzt erst mal 2 Arduinos in den Bus zu integrieren....
wäre dir sehr verbunden wenn du mir ein beispiel zeigen könntest.

Also sagen wir es so "DER MASTER" soll dem "SLAVE" sagen "Hey der Benutzer hat über den Seriellen Monitor gesagt LED AN" also soll der Master dem Slave z.B. Leonardo oder Uno sagen mach die Funzel an :slight_smile:

Ich hoffe ich konnte es so gut wie es geht erklären ^^

Grüße Nico :slight_smile:

Du hast das gut erklährt, auch wenn ich's schon vorher verstanden hatte, aber ich schreibe Dir keine Sketche. Ich helfe Dir es selbst zu machen.
Grüße Uwe

Na gut, zeig ich dir Beispiele:

Hier oben ist "Learning"
Dort findest du Tutorials - Examples from Libraries - Wire

(die Wire Library ist I²C)

Da sind zwei Beispiele für Datenaustausch in beide Richtungen zwischen Master und Slave.
Sollte problemlos mit zwei Unos gehen.

Die Beispiele findest du übrigens auch direkt in der IDE.

uwefed:
Der Master hat per Definition keine Adresse beim Aufruf der Wire.begin().

Hallo Uwe,
klitzekleiner, für dieses Thema irrelevanter Widerspruch: Auch ein Master kann eine Adresse haben. Das wird bei mehreren Mastern benötigt. Bei nur einem Master braucht er keine Adresse und eine Adresse ist dann auch eher irritierend.

Einspruch euer Ehren. (Ich sehe es zumindest anders)

Wer eine Adresse hat, ist ein Slave.
Der Master hat keine Adresse (oder Adresse 0). (danke für den Hinweis, combie)
Wenn es mehrere Master gibt, und einer den anderen ansprechen will, ist der angesprochene ein Slave und hat dafür natürlich eine Adresse. Eigentlich ist jeder Slave (mit Adresse), und macht sich nur manchmal zum Master.

Oft ist man aber dabei, einen Design-Fehler zu machen und sollte versuchen, mit nur einem Master auszukommen :wink:
Datentransfer geht ja in beide Richtungen, dafür braucht man es schonmal nicht.

Ein guter Master kümmert sich um seine Slaves und fragt sie regelmäsig, ob sie was sagen wollen :wink:

Der Master hat keine Adresse (oder Adresse 0).

Das ist so nicht ganz richtig.
0 gehört zur Gruppe der Spezial-Slave-Adressen.
Sie ist für den "General Call" vorgesehen.

Ein Slave kann also auf "seine" Adresse hören, und auf 0

Sorry, ja:

Wire.begin();  // Master

ist was anderes als

Wire.begin(0); // ??? sollte eigentlich eine 7bit Slave Adresse sein.

Hab's mal im alten Beitrag geändert.

michael_x:
Einspruch euer Ehren.

Dann ziehe ich mal die Robe an für meine Sicht:

michael_x:
Wer eine Adresse hat, ist ein Slave.

Wer eine Adresse hat, kann als Slave und als Master agieren.

michael_x:
Der Master hat keine Adresse

Wer keine Adresse hat, kann nur als Master agieren.

Robe aus.

Für dieses Thema: Uwe erweckte bei mir den Eindruck, es sein ein Fehler, einem Master eine Adresse zu geben. Ich würde sagen, es ist überflüssig, aber kein Fehler.

michael_x:
Ein guter Master kümmert sich um seine Slaves und fragt sie regelmäsig, ob sie was sagen wollen :wink:

Oder man spendiert eine Meldeleitung, mit der die Slaves eine Abfrage anfordern können.

Okay okay.... ich hab es begriffen xD Ihr wollt mir also kein beispiel nennen ..... jaaaa ich habs verstanden ....

aber wehe ihr bettelt nochmal um was :stuck_out_tongue:

Nein spaß .... neee ich meins ernst ich komm absoult nicht mit der Wire libary klar :confused: ist für mich noch ein reines durcheinander
ein kleines beispiel hätte mir echt gereicht :frowning:

Aber durch die Master and Slave Diskussion seid ihr euch noch ziemlich unschlüssig wie ich sehe :stuck_out_tongue:

Aber durch die Master and Slave Diskussion seid ihr euch noch ziemlich unschlüssig wie ich sehe

Nein...
Nicht unschlüssig.
Wir einigen uns.
So sieht das aus wenn wir ein Thema diskutieren.

ein kleines beispiel hätte mir echt gereicht

In der Wire Lib Doku ist ein Master Slave Beispiel.
Was gefällt dir daran nicht?

Okay okay.... ich hab es begriffen xD Ihr wollt mir also kein beispiel nennen ..... jaaaa ich habs verstanden ....

Dann hast du das falsche gelernt!
Wir werden dir nicht deinen Code schreiben.
Und wenn du eine konkrete Frage hast, gibts bestimmt auch eine Antwort!

Nico_A:
... aber wehe ihr bettelt nochmal um was :stuck_out_tongue:

Gib mir bitte EIN EINZIGES Beispiel für IRGENDEINE Bettelei eines Regulars hier. Nur ein einziges, bitte!

Bittebitte!

Gruß

Gregor :wink:

gregorss:
Gib mir bitte EIN EINZIGES Beispiel für IRGENDEINE Bettelei eines Regulars hier.

Da wird mit Fachbegriffen geworfen, sagenhaft :slight_smile:
Kannte ich gar nicht: Regular - wieder was gelernt heute :slight_smile:

uxomm:
Da wird mit Fachbegriffen geworfen, sagenhaft :slight_smile:
Kannte ich gar nicht: Regular - wieder was gelernt heute :slight_smile:

Lernen macht Spaß!

Das sagt zumindest Bender (Futurama).

Jetzt erzähl nicht, dass Du Bender nicht kennst :slight_smile:

Gruß

Gregor (Fleischklops)

Untereinander stellen die Regulars eine Gruppe von Usern, die gemeinsam durch ständige Übung eine Netzkultur schaffen.
Soziale Normen [werden] vor allem durch Regulars gegenüber den Newbies ... mit mehr oder weniger starkem sozialem Druck durchgesetzt.

Danke für den wikipedia Link :wink:

Also, damit das klar ist, Freundchen (@Nico_A): Bevor du nicht sagst was dir an den Master-Slave Beispielen in der IDE nicht passt, kriegst du natürlich kein zusätzliches.

Nico_A:
ein kleines beispiel hätte mir echt gereicht :frowning:

Keine Chance ;D

Um der Theorie die Praxis folgen zu lassen, habe ich mal ein Beispiel mit Master, der eine Adresse hat, gemacht. Klappt mit UNO und Mega2560 wie erwartet. Die Funktion ist einfach gehalten: Gibt man beim Mega2560 ein 'E" ein, wird beim UNO die LED eingeschaltet, beim 'A' ausgeschaltet. So eine Funktionalität kann niemand gebrauchen, soll nur der Demonstration dienen (Quelle):

// Mega2560
#include <Wire.h>
void setup() {
  Serial.begin(9600);
  Serial.println("Bitte 'E' oder 'A' eingeben.");
  // Start the I2C Bus
  Wire.begin(8);  // Hier eine Adresse anzugeben ist überflüssig, aber kein Fehler!
}
void loop() {
  if (Serial.available())  {
    char x = Serial.read();
    if ((x == 'e') || (x == 'E') || (x == 'a') || (x == 'A')) {
      Wire.beginTransmission(9); // transmit to device #9
      Wire.write(x);           // sends x
      Wire.endTransmission();   // stop transmitting
    }
  }
}
// UNO
#include <Wire.h>
int LED = 13;
volatile char x;
void setup() {
  Serial.begin(9600);
  Serial.println("Programmanfang");
  pinMode (LED, OUTPUT);        // Define the LED pin as Output
  Wire.begin(9);                // Start the I2C Bus as Slave on address 9
  Wire.onReceive(receiveEvent); // Attach a function to trigger when something is received.
}
void receiveEvent(int bytes) {
  x = Wire.read();              // read one character from the I2C
}
void loop() {
  if (x != ' ') {
    if ((x == 'e') || (x == 'E')) {
      digitalWrite(LED, HIGH);
    }
    if ((x == 'a') || (x == 'A')) {
      digitalWrite(LED, LOW);
    }
    Serial.println(x);
    x = ' ';
  }
}

PS: Weil Uwe es gerne möchte, merke ich an, daß dieser Beitrag Anflüge von freundlich gemeinter Ironie enthält.

ein Beispiel mit Master, der eine Adresse hat

OK. Punkt für dich (und die wire Library).


Ein Beitrag ohne smileys und ohne Ironie vor dieser Zeile.

agmue:
Keine Chance ;D ...
... mal ein Beispiel mit Master, ...

Auch wenn Du kein Beispiel zeigen wolltest und es dann doch tust, bekommst Du hierfür ein Fleißbildchen resp. -punkt von mir. Denn derlei steht mir auch noch bevor und dafür kann ich Dein Beispiel sehr gut gebrauchen.

Gruß

Gregor