Arduino Forum

International => Deutsch => Topic started by: Techniker89 on Feb 01, 2017, 05:39 pm

Title: Drei Arduinos miteinander verbinden
Post by: Techniker89 on Feb 01, 2017, 05:39 pm
Hallo,

mal wieder habe ich kleines Problem:
Ich möchte gern zwei Arduinos mit einem zentralen dritten verbinden. Der Arduino in der Mitte ist jeweils über TX0 (Pin 1) und TX3 (Pin 14) mit einem anderen verbunden. Massen sind ebenfalls verbunden. Allerdings scheint der Master nur über den TX0-Pin Daten zu senden - bei TX3 funktioniert es nicht. Die beiden anderen Arduinos sind richtig programmiert, denn es funktioniert wenn ich TX0 mit TX3 vertausche.
Title: Re: Drei Arduinos miteinander verbinden
Post by: combie on Feb 01, 2017, 05:43 pm
Du hast mein volles Mitgefühl!
Title: Re: Drei Arduinos miteinander verbinden
Post by: Techniker89 on Feb 01, 2017, 05:48 pm
Na dann bin ich ja beruhigt...
Wenigstens einer, der mich verstehen kann!
Title: Re: Drei Arduinos miteinander verbinden
Post by: gregorss on Feb 01, 2017, 06:03 pm
mal wieder habe ich kleines Problem: ...
Was für Arduinos sind da im Spiel? Wie sieht der Sketch aus, mit dem es nicht funktioniert?

Gruß

Gregor
Title: Re: Drei Arduinos miteinander verbinden
Post by: Techniker89 on Feb 01, 2017, 06:08 pm
Hallo,

ich habe drei Mega 2560.

für den Master:
Code: [Select]
void setup(){

Serial.begin(9600);}

void loop(){

if(B23 == LOW) Serial.print('A');
}



jeweils für die anderen beiden:
Code: [Select]

void setup(){

Serial.begin(9600);}

void loop(){
if(Serial.available())  {
  i = Serial.read();
}
if(i=='A')  B23 = LOW;
if(B23 == LOW)  digitalWrite(rot23, LOW);
Title: Re: Drei Arduinos miteinander verbinden
Post by: combie on Feb 01, 2017, 06:15 pm
Na dann bin ich ja beruhigt...
Wenigstens einer, der mich verstehen kann!
Ja, ich kann das auch nicht leiden, wenn meine Arduinos mir nicht gehorchen wollen!

Meistens findet sich das Problem dann, im OSI Schichtenmodell, auf Ebene 8.


Quote
für den Master:
Quote
jeweils für die anderen beiden:
Serial ist mit dem 16U2 verbunden, darf also nicht verwendet werden.

Title: Re: Drei Arduinos miteinander verbinden
Post by: michael_x on Feb 01, 2017, 06:21 pm
Quote
Serial ist mit dem 16U2 verbunden, darf also nicht verwendet werden.
Das würde ich nicht so krass formulieren. Aber bei Megas mit so vielen Seriellen Schnittstellen wäre es blöd.

Warum verwendest du im Master nur Serial, wenn du behauptest, du wolltest mit 2 Slave-Arduinos kommunizieren? 
Warum verwendest du Serial, wenn du auf TX3 senden willst?
Title: Re: Drei Arduinos miteinander verbinden
Post by: combie on Feb 01, 2017, 06:36 pm
Quote
Das würde ich nicht so krass formulieren.
Klar, kann man den 16U2 im Reset halten, aber dann ist USB auch tot.
Will man das?
KA!
(ist da überhaupt ein 16U2 drauf?)

Nee..
Ich glaube, man sollte das erstmal "flach" angehen, also Serial ignorieren.
Und wenn dann alle anderen Seriellen "verbraucht" sind, kann man ja nochmal nachdenken...


Quote
Warum verwendest du im Master nur Serial, wenn du behauptest, du wolltest mit 2 Slave-Arduinos kommunizieren? 
Warum verwendest du Serial, wenn du auf TX3 senden willst?
Ich glaube, du sollst ihm das Programm schreiben!
 :o  :o  :o
Title: Re: Drei Arduinos miteinander verbinden
Post by: agmue on Feb 01, 2017, 07:15 pm
Ein Blick in den Schaltplan kann ja so informativ sein ;D

(ist da überhaupt ein 16U2 drauf?)
Ja, ATMEGA16U2-MU.

@Techniker89: Die serielle Schnittstelle ist im Unterschied zu I2C nicht busfähig. Der Mega 2560  (https://www.arduino.cc/en/Main/ArduinoBoardMega2560)hat aber drei freie, nicht durch USB verwendete serielle Schnittstellen, die mittels Serial1, Serial2 und Serial3 angesprochen werden können. Siehe "Input and Output" und Serial (https://www.arduino.cc/en/Reference/Serial). So kannst Du sternförmig verdrahten und kommunizieren.
Title: Re: Drei Arduinos miteinander verbinden
Post by: combie on Feb 01, 2017, 07:25 pm
Quote
Ja, ATMEGA16U2-MU.
Jain... (http://www.ebay.de/itm/291751658995)

Und der alte, hat einen 8U2 drauf....
(Aber, das tut hier nichts zur Sache)

Title: Re: Drei Arduinos miteinander verbinden
Post by: agmue on Feb 01, 2017, 07:34 pm
Und der alte, hat einen 8U2 drauf....
Mir war nicht klar, daß es den alten noch zu kaufen gibt. Also meine Aussage gilt für R3.
Title: Re: Drei Arduinos miteinander verbinden
Post by: combie on Feb 01, 2017, 07:44 pm
Quote
noch zu kaufen gibt
Das weiß ich auch nicht!
Title: Re: Drei Arduinos miteinander verbinden
Post by: michael_x on Feb 01, 2017, 08:59 pm
Selbst wenn ein 16U2, 8U2 oder auch CH340 dran ist, könnte man direkt an TX0 und GND was anschliessen. (Wenn man es müsste)
Aber, wie schon mehrfach erwähnt, muss man ja nicht.

Wenn es wirklich nur drum ginge, vom Master beiden Empfängern das gleiche zu senden und nichts zu lesen, könnte man sternförmig TX3 mit beiden RX1 verbinden. Und bräuchte
   Serial3.println("Hallo Ihr beiden"); 
nur einmal zu senden.
Title: Re: Drei Arduinos miteinander verbinden
Post by: agmue on Feb 01, 2017, 09:12 pm
Das weiß ich auch nicht!
Dein Link sagt "Mehr als 10 verfügbar" in Berlin. Wenn der Anbieter zählen kann, sollte es ihn zu kaufen geben. Oder?

Leider gibt der TO nur spärliche Informationen, daher halte ich mich mit "nimm doch I2C, das ist ein Bus für viele Teilnehmer" zurück. Will er möglicherweise auch garnicht lesen.
Title: Re: Drei Arduinos miteinander verbinden
Post by: michael_x on Feb 01, 2017, 09:50 pm
Quote
Dein Link sagt "Mehr als 10 verfügbar" in Berlin
Der Link sagt auch klar, dass es gar kein Arduino Mega ist, weder mit 16U2 noch mit 8U2.
Aber die 3 bis 4 HardwareSerials sollten, wenn "Kompatibel" schon auf Pins rausgeführt sein.
Title: Re: Drei Arduinos miteinander verbinden
Post by: HotSystems on Feb 01, 2017, 10:12 pm
Mal was anderes nebenbei.

@Techniker89
Läuft denn mittlerweile deine Relaissteuerung, mit der du Probleme hast ?
Eine Rückmeldung ist hier schon angebracht, da ja einige dir geholfen haben.

Das gehört schon zum guten Ton dieses Forums.
Title: Re: Drei Arduinos miteinander verbinden
Post by: combie on Feb 01, 2017, 11:52 pm
Quote
Aber die 3 bis 4 HardwareSerials sollten, wenn "Kompatibel" schon auf Pins rausgeführt sein.
Richtig!
Das Pinout eines Mega R3.
Also ja.

Nur eben keinen Atmel als USB Dingen.

Beim CH340 weiß ich nicht, ob er den Seriellen Pin blockiert, wenn er nicht an USB steckt.

Bei den ATMega 16U1/8U2, weiß ich, dass man sie tot schalten kann und darf.
Spart auch Strom wg. der Batterie, wenn denn nötig.
Title: Re: Drei Arduinos miteinander verbinden
Post by: Techniker89 on Feb 02, 2017, 04:37 pm
Hallo,

danke für eure Antworten! Ich hab es jetzt so verstanden:

Code: [Select]
Serial3.print('A');

Läuft aber leider nicht.

@HotSystems: Da kümmer ich mich wahrscheinlich morgen wieder drum. Mal schauen. Laufen tut's ja erstmal.
Title: Re: Drei Arduinos miteinander verbinden
Post by: combie on Feb 02, 2017, 08:47 pm
Quote
Läuft aber leider nicht.
Doch!
Tut es wohl!
Title: Re: Drei Arduinos miteinander verbinden
Post by: Techniker89 on Feb 03, 2017, 06:10 pm
Sender:
Code: [Select]

void setup() {
Serial.begin(9600);
}
void loop(){
if(B23 == LOW) Serial3.print('A');
else Serial3.print('B');
}


Empfänger:
Code: [Select]

char i;
void setup() {
Serial.begin(9600);
}
void loop(){
if(Serial3.available())  {
  i = Serial3.read();
}
if(i=='A')  B23 = LOW;
if(i=='B')  B23 = HIGH;
}


Beide Arduinos sind über GND und TX3 bzw. RX3 miteinander verbunden. Ich weiß nicht mehr weiter...
Title: Re: Drei Arduinos miteinander verbinden
Post by: agmue on Feb 03, 2017, 06:23 pm
Wenn Du Serial3.print verwendest, brauchst Du auch Serial3.begin(9600); für die Initialisierung.
Title: Re: Drei Arduinos miteinander verbinden
Post by: Techniker89 on Feb 03, 2017, 08:36 pm
Danke, das hatte ich vergessen.
Wie kann ich denn jetzt Zeichenketten aus mehreren Buchstaben übergeben? Mit "ABC" funktioniert es nämlich nicht.
Title: Re: Drei Arduinos miteinander verbinden
Post by: combie on Feb 03, 2017, 08:43 pm
Doch, das funktioniert.
Title: Re: Drei Arduinos miteinander verbinden
Post by: Techniker89 on Feb 03, 2017, 10:43 pm
Wenn ich es auf dem Seriellen Monitor eingebe, funktioniert es genauso wenig, wie wenn ich es von Arduino zu Arduino übertrage. Was ist denn die maximale Zeichenanzahl für ein char?
Title: Re: Drei Arduinos miteinander verbinden
Post by: Tommy56 on Feb 03, 2017, 10:46 pm
Was ist denn die maximale Zeichenanzahl für ein char?
Na 1 char, was denn sonst.

Gruß Tommy
Title: Re: Drei Arduinos miteinander verbinden
Post by: combie on Feb 03, 2017, 10:56 pm
Quote
Beide Arduinos sind über GND und TX3 bzw. RX3 miteinander verbunden.
Dir ist schon klar, dass du die Leitungen kreuzen musst?
Also jeweils Tx mit Rx verbinden.
Title: Re: Drei Arduinos miteinander verbinden
Post by: Techniker89 on Feb 04, 2017, 07:12 am
Na 1 char, was denn sonst.
Also ein Zeichen, oder wie? Also kann ich gar kein "ABC" in einer char-Variable speichern? Wie soll ich es dann auch übertragen können?

Dir ist schon klar, dass du die Leitungen kreuzen musst?
Logisch, so doof bin ich nun auch wieder nicht. Allerdings in meinem Fall nur in eine Richtung.
Wie gesagt: Über den seriellen Monitor funktioniert es ja auch nicht.
Title: Re: Drei Arduinos miteinander verbinden
Post by: combie on Feb 04, 2017, 09:13 am
Quote
Also kann ich gar kein "ABC" in einer char-Variable speichern?
Du könntest dir ein char Array basteln...(mit einer Null hinten dran)
Sowas nennt man dann auch schon mal C-String...
Und sowas kann man dann natürlich auch versenden.
Title: Re: Drei Arduinos miteinander verbinden
Post by: agmue on Feb 04, 2017, 10:43 am
Dir ist schon klar, dass du die Leitungen kreuzen musst?
Logisch, so doof bin ich nun auch wieder nicht.
Mir hat so ein Hinweis mal geholfen, mit doof hat das nichts zu tun. Bei I2C mußt Du SCL mit SCL und SDA mit SDA verbinden, weil es ein Bus ist. Bei RS232 verbindest Du RX des Computers mit RX des Akustikkopplers (https://de.wikipedia.org/wiki/Akustikkoppler), ebenso TX mit TX. Computer und Akustikkoppler auf der anderen Seite der Telefonleitung machen es genauso. Entfällt nun die Telefonleitung einschließlich Akustikkoppler, benötigst Du ein Nullmodemkabel mit RX und TX gekreuzt.

Schwierig wird es beispielsweise bei Druckern, da sie sich als auf der anderen Seite der Telefonleitung befindlich wähnen können (Nullmodemkabel) oder als Modem angeschlossen werden möchten (RX-RX, TX-TX).

Schnee von gestern? Durchaus nicht, da beispielsweise MOSI und MISO auf Perepherieboards mal so beschriftet sind, wie sie mit dem Arduino verbunden werden wollen (MOSI-MOSI, MISO-MISO) oder wie die Funktionalität es vorgibt (MOSI-MISO, MISI-MOSI). Auch bei Netzwerkkabeln gibt es welche mit und ohne Kreuzung. Siehe Patchkabel (https://de.wikipedia.org/wiki/Patchkabel) und Crosskabel (https://de.wikipedia.org/wiki/Crosskabel).

Korrektur: MOSI und MISO sind auch ein Bus (SPI), also MOSI mit MOSI und MISO mit MISO verbinden.
Title: Re: Drei Arduinos miteinander verbinden
Post by: combie on Feb 04, 2017, 10:55 am
Quote
oder wie die Funktionalität es vorgibt (MOSI-MISO, MISI-MOSI).
Nein!
Das raucht.
Da darf nichts gekreuzt werden.

Mosi -- Master Out, Slave In
Miso -- Master In, Slave Out

Title: Re: Drei Arduinos miteinander verbinden
Post by: agmue on Feb 04, 2017, 12:28 pm
Nein!
Stimmt, danke, ist korrigiert!

@Techniker89: Da ich keine zwei Mega2560 habe, nutze ich einen UNO als Datensender. Anstelle Serial. mußt Du beim Mega halt Serial3. benutzen. Verbunden habe ich TX vom UNO mit RX3 vom Mega. Der UNO sendet Text zum Mega, der es auf dem seriellen Monitor anzeigt.

Code: [Select]
// UNO als Sender
uint32_t aktMillis, ausgabeMillis, intervall = 200;
char zeichen = 'A', kette[20] = {"Hallo  "};

void setup() {
  Serial.begin(9600);
}

void loop() {
  aktMillis = millis();
  if (aktMillis - ausgabeMillis >= intervall) {
    ausgabeMillis = aktMillis;
    kette[6] = zeichen;
    Serial.println(kette);
    zeichen++;
    if (zeichen > 'Z') {
      zeichen = 'A';
    }
  }
}


Code: [Select]
// Mega2560 als Empfänger
void setup() {
  Serial.begin(9600);
  Serial3.begin(9600);
  Serial.println("Anfang");
}
void loop() {
  if (Serial3.available())  {
    char x = Serial3.read();
    Serial.print(x);
  }
}


Ausgabe:
Hallo A
Hallo B
Hallo C
Hallo D
Hallo E
Hallo F
Hallo G
Hallo H

Ich hoffe, es hilft Dir
Title: Re: Drei Arduinos miteinander verbinden
Post by: Techniker89 on Feb 04, 2017, 01:48 pm
Code: [Select]
uint32_t aktMillis, ausgabeMillis, intervall = 200;
char zeichen = 'A', kette[20] = {"Hallo  "};

Wenn du mir die beiden Zeilen noch erklären könntest, wäre ich dir sehr dankbar.
Title: Re: Drei Arduinos miteinander verbinden
Post by: agmue on Feb 04, 2017, 02:38 pm
uint32_t 32 Bits = 4 Bytes große vorzeichenlose (u) ganzzahline (int) Variable, wird für millis() benötigt
aktMillis Variable für die aktuelle Zeit in Millisekunden seit Reset
ausgabeMillis Zeitpunkt seit der letzten Aktion in in Millisekunden seit Reset
intervall Zeitdifferenz bis zur nächsten Aktion in Millisekunden
zeichen Variable für das zu verändernde Zeichen
kette[] Zeichenkette für mehrere Buchstaben

Puristen würden intervall als Konstante festlegen.

Die Zeichenkette enthält tatsächlich "Hallo  " und '\0' als Abschlußzeichen. In kette[20] kannst Du daher nur maximal 19 Zeichen speichern.

Alle Klarheiten beseitigt?
Title: Re: Drei Arduinos miteinander verbinden
Post by: Techniker89 on Feb 04, 2017, 05:25 pm
Danke, aber was genau macht

Code: [Select]
kette[20] = {"Hallo  "}
?

kette ist wieder ein Variablenname? 20 steht für die Anzahl der Zeichen, die in ihr gespeichert werden sollen. = {"Hallo  "} versteh ich noch nicht so wirklich. Hast du dazu irgendeinen Link?
Title: Re: Drei Arduinos miteinander verbinden
Post by: agmue on Feb 04, 2017, 05:56 pm
kette ist wieder ein Variablenname?
Ja. Nicht Integer oder Float, sonder Zeichenkette, ein Feld (array) aus Elementen mit einem Zeichen je Element.

20 steht für die Anzahl der Zeichen, die in ihr gespeichert werden sollen.
Ja fast, da am Ende noch '\0' als Abschluß stehen muß, sind es nur 19 "verwertbare" Zeichen.

= {"Hallo  "} versteh ich noch nicht so wirklich.
Damit wird ein zum Teil mit Zeichen vorbesetztes Feld erzeugt. kette[0] hat den Inhalt 'H'.

string (https://www.arduino.cc/en/Reference/String)
C von A bis Z (http://openbook.rheinwerk-verlag.de/c_von_a_bis_z/stichwort.htm#_top) dort Arrays (http://openbook.rheinwerk-verlag.de/c_von_a_bis_z/011_c_arrays_001.htm)
Das C Tutorial (http://www.c-howto.de/)
Title: Re: Drei Arduinos miteinander verbinden
Post by: Tommy56 on Feb 04, 2017, 07:38 pm
Von mir auch noch eine Ergänzung: Zeichenketten in C (https://www.wikinger-tommy.de/arduino/tut_zeichenketten.html)

Gruß Tommy
Title: Re: Drei Arduinos miteinander verbinden
Post by: Techniker89 on Feb 13, 2017, 07:55 pm
Danke, es klappt. Allerdings stelle ich mich mal wieder etwas schlecht an, was das Verändern einzelner Zeichen mitten in der Zeichenkette angeht.
Title: Re: Drei Arduinos miteinander verbinden
Post by: Tommy56 on Feb 13, 2017, 07:57 pm
Was willst Du denn machen?

Gruß Tommy
Title: Re: Drei Arduinos miteinander verbinden
Post by: Techniker89 on Feb 13, 2017, 08:11 pm
Ich möchte fünfstellige Zeichenketten übertragen, die alle mit einem 'B' beginnen und im Rest aus Ziffern (dann halt als Buchstaben) bestehen. Je nach Information, die übergeben werden soll, wird diese Zeichenkette beispielsweise auf "B6606" oder "B21" gesetzt und über TX zum anderen Arduino geschickt.
Title: Re: Drei Arduinos miteinander verbinden
Post by: Tommy56 on Feb 13, 2017, 08:19 pm
Schön und wo ist das Problem? Man muss Dir doch wohl nicht jeden Erklärungsbuchstaben einzeln aus der Nase ziehen.

Schreib mal 2 Beispiele hin, was Du wi verketten willst.

Gruß Tommy
Title: Re: Drei Arduinos miteinander verbinden
Post by: Techniker89 on Feb 13, 2017, 09:44 pm
Drücke ich mich wirklich so kompliziert aus?

Wenn Ereignis 1 (z.B. Taster), setze die Zeichenkette auf B6606 und übertrage sie.
Bei Ereignis 2 auf B6607 usw.
...
Title: Re: Drei Arduinos miteinander verbinden
Post by: Tommy56 on Feb 13, 2017, 09:54 pm
Ja, machst Du. Ich probiers trotzdem mal.
Code: [Select]

char buffer[10];
...
strcpy(buffer,"B");
strcat(buffer("6606"); // Wenn Du was anhängen willst.
Serial.println(buffer);

Falls ich Deine "Beschreibung" richtig verstanden habe.
Ansonsten kannst Du den Rest hier (https://www.wikinger-tommy.de/arduino/tut_zeichenketten.html) nachlesen.

Gruß Tommy
Title: Re: Drei Arduinos miteinander verbinden
Post by: HotSystems on Feb 13, 2017, 10:43 pm
Drücke ich mich wirklich so kompliziert aus?

Wenn Ereignis 1 (z.B. Taster), setze die Zeichenkette auf B6606 und übertrage sie.
Bei Ereignis 2 auf B6607 usw.
...
Ich habe nicht gesamten Thread verfolgt, aber erkläre bitte mal kurz, warum du die Strings zusammensetzten musst und nicht einfach folgendes sendest:

Beispielcode!
Code: [Select]

if (digitalRead.PinDx == LOW) {
  Serial1.write("B9101");                             
  Serial1.print('\n');
}

else if (digitalRead.PinDy == LOW) {
  Serial1.write("B9201");                             
  Serial1.print('\n');
}
Title: Re: Drei Arduinos miteinander verbinden
Post by: Doc_Arduino on Feb 13, 2017, 11:10 pm
Hallo,

ich würde die zu sendende Nachricht als struct bauen, einzelne Elemente immer ändern, dann kann man das struct als ganzes übertragen.
Title: Re: Drei Arduinos miteinander verbinden
Post by: HotSystems on Feb 13, 2017, 11:55 pm
Code: [Select]

...
strcpy(buffer,"B");
strcat(buffer("6606"); // Wenn Du was anhängen willst.
Serial.println(buffer);

Hi Tommy, dir ist ein kleiner Fehler unterlaufen.

Sollte so sein:

Code: [Select]

strcat(buffer, "6606");


Title: Re: Drei Arduinos miteinander verbinden
Post by: Tommy56 on Feb 14, 2017, 01:43 pm
@hotsystems: Stimmt.

Ich weiß aber trotzdem nicht, was er eigentlich will.

Gruß Tommy
Title: Re: Drei Arduinos miteinander verbinden
Post by: HotSystems on Feb 14, 2017, 01:47 pm
Ich weiß aber trotzdem nicht, was er eigentlich will.
Genau, leider sind seine Erklärungen nicht sehr aussagekräftig.

Evtl. hat er ja demnächst noch weitere Infos für uns.
Jedenfalls ist dein Tipp schon mal der richtige Ansatz, er muss es nur verstehen und umsetzen.
Title: Re: Drei Arduinos miteinander verbinden
Post by: Techniker89 on Feb 14, 2017, 05:30 pm
Code: [Select]

if (digitalRead.PinDx == LOW) {
  Serial1.write("B9101");                             
  Serial1.print('\n');
}

else if (digitalRead.PinDy == LOW) {
  Serial1.write("B9201");                             
  Serial1.print('\n');
}

Mit dem Zusammensetzen wäre es insgesamt übersichtlicher geworden, weil mit den Zahlen, die hinter das 'B' kommen, bereits gearbeitet wird. Danke für deinen Code. Ich glaube, so werde ich es machen. Warum verwendest du einmal 'write' und einmal 'print'?
Title: Re: Drei Arduinos miteinander verbinden
Post by: HotSystems on Feb 14, 2017, 05:48 pm
Mit dem Zusammensetzen wäre es insgesamt übersichtlicher geworden, weil mit den Zahlen, die hinter das 'B' kommen, bereits gearbeitet wird. Danke für deinen Code. Ich glaube, so werde ich es machen. Warum verwendest du einmal 'write' und einmal 'print'?
Ups, habe ich übersehen. Sollte eigentlich "print" sein, funktioniert hier aber beides.
Hier eine Erklärung: Serial.write (https://www.arduino.cc/en/Serial/write)

Das mit dem Zusammensetzen kannst du doch auch noch machen, wenn du den Code von Tommy nimmst. Das funktioniert dann auch.

Aber eine Erklärung was genau du machen möchtest, fehlt noch. Dann können wir besser helfen.

Title: Re: Drei Arduinos miteinander verbinden
Post by: Techniker89 on Feb 22, 2017, 02:52 pm
Hallo,

ich habe nun als Code des Senders den von agmue aus Post 30 genommen, der Empfänger hat den Code von HotSystems aus Post 42. Wenn ich setzt aber

Code: [Select]
if(x=="W1") digitalWrite(W1, LOW);

schreibe, funktioniert es nicht.

Auch mit
Code: [Select]
if(x=="W1\n") digitalWrite(W1, LOW); klappt es nicht.
Title: Re: Drei Arduinos miteinander verbinden
Post by: Tommy56 on Feb 22, 2017, 02:57 pm
Zeichenketten kann man so nicht vergleichen. Wie ist x definieret? Evtl. wäre da ein strcmp sinnvoll. Infos über Zeichenketten gibt es hier (https://www.wikinger-tommy.de/arduino/tut_zeichenketten.html).

Gruß Tommy
Title: Re: Drei Arduinos miteinander verbinden
Post by: Techniker89 on Feb 22, 2017, 03:10 pm
x ist als character definiert.

Code: [Select]

char y = "W1";

if(strcmp(x,y)==0) digitalWrite(W1, LOW);


So funktioniert es leider nur, wenn y ein einzelnes Zeichen ist.
Title: Re: Drei Arduinos miteinander verbinden
Post by: Tommy56 on Feb 22, 2017, 03:12 pm
es macht ja auch keinen Sinn, ein einzelnes Zeichen mit einer Zeichenkette zu vergleichen. Schau Dir mal die verlinkten Grundlagen zu Zeichenketten in C an, dann wirst Du es evtl. verstehen.

Gruß Tommy

Edit: Die Zeile ist auch falsch: char y = "W1";
Title: Re: Drei Arduinos miteinander verbinden
Post by: Techniker89 on Feb 22, 2017, 03:25 pm
Quote
// Vergleiche ergeben die Differnz des Zeichencodes des ersten ungleichen Zeichens
// aber eigentlich interessiert nur < 0, > 0 oder gleich 0
zahl = strcomp(quelle,vergleich); // ergibt 8 -> größer 0 also ist quelle größer
zahl = strcomp(vergleich,quelle); // ergibt -8 -> kleiner 0 also ist quelle kleiner
So habe ich es ja gemacht (Was ist der Unterschied zwischen 'strcomp' und 'strcmp'?) Quelle und Vergleich sind bei mir x und y. Also sollte es ja eigentlich funktionieren.

Quote
Die Zeile ist auch falsch: char y = "W1";
Was ist daran falsch?
Edit: Denkfehler, hab's jetzt verstanden.

Hier nochmal der komplette Code:

Code: [Select]
 
char x;
char y = 'W';

-LOOP-
if (Serial3.available())  {
    x = Serial3.read();
  }
  if(strcmp(x,y)==0) digitalWrite(W1, LOW);
  else digitalWrite(W1, HIGH);


Kann ich, anstatt y zu benutzen, den zu vergleichenden String auch direkt in die strcmp-Klammer schreiben?
Title: Re: Drei Arduinos miteinander verbinden
Post by: michael_x on Feb 22, 2017, 03:43 pm

char y[] und char* y sind sehr ähnlich, aber etwas völlig anderes als ein char x .

Auch "W" und 'W' sind zwei komplett verschiedene Sachen.

strcmp geht nur mit "Texten in Doppelten Anführungszeichen" , char* oder char array[].
Sonst bekommst du den Hinweis
Quote
invalid conversion from 'char' to 'const char*'
Title: Re: Drei Arduinos miteinander verbinden
Post by: Tommy56 on Feb 22, 2017, 03:46 pm
Einzelne Zeichen musst Du wieder mit == vergleichen.
Code: [Select]

char x = 'W';
char c;

if (c==x) tu was


Gruß Tommy
Title: Re: Drei Arduinos miteinander verbinden
Post by: Techniker89 on Feb 22, 2017, 04:43 pm
Ok, soweit habe ich das verstanden. Allerdings habe ich keine Ahnung, wie ich jetzt eine empfangene Zeichenkette so in einer Variable speichern kann, dass ich sie mit einer anderen vergleichen kann.
Title: Re: Drei Arduinos miteinander verbinden
Post by: agmue on Feb 22, 2017, 05:39 pm
Ok, soweit habe ich das verstanden. Allerdings habe ich keine Ahnung, wie ich jetzt eine empfangene Zeichenkette so in einer Variable speichern kann, dass ich sie mit einer anderen vergleichen kann.
Eine Zeichenkette speicherst Du in einem Feld  (https://www.arduino.cc/en/Reference/String)ab. Dann vergleichst Du zwei Felder auf Gleichheit. Ein Demosketch (Zeilenende beim seriellen Monitor auf "NL" stellen):

Code: [Select]
const byte ledPin = 13;
const char y[] = {"W1"};
char x[10], c;
byte j;

void setup() {
  Serial.begin(9600);
  Serial.println("Anfang");
  pinMode(ledPin, OUTPUT);
}

void loop() {
  if (Serial.available()) {
    c = Serial.read();
    if (c == '\n') {
      x[j] = '\0';
      j = 0;
      Serial.println(x);
    } else {
      x[j] = c;
      j++;
    }
  }
  if (strcmp(x, y) == 0) {
    digitalWrite(ledPin, HIGH);
  } else {
    digitalWrite(ledPin, LOW);
  }
}