Servo über Master-Slave

Hallo,
ich bin neu hier und habe direkt eine Frage da ich im Forum nichts passendes gefunden habe.

Ich möchte an einen Arduino 2 Taster anschließen mit dem ein Servo an einem anderen Arduino 2 Positionen anfährt, auf der er bleibt bis wieder der andere Taster gedrückt wird. Leider weiß ich nicht was ich bei meinen Sketch falsch ist. :o

Hier der Sketch für den Master:

#include <Wire.h>
byte senden=0;

void setup() 
{
 Wire.begin();
 pinMode(22,INPUT);
 pinMode(23,INPUT);
 Serial.begin(9600);
}

void loop() 
{ 
 int x=digitalRead(22);
 int y=digitalRead(23);
   
if (x==1)
  {
   Wire.beginTransmission(4);
   Wire.write(1);
   Wire.endTransmission();
   Serial.println("1 senden");
  
  }
if (y==1)
  {
   Wire.beginTransmission(4);
   Wire.write(2);
   Wire.endTransmission();
   Serial.println("0 senden");
   
  }
 }

Und hier der Sketch für den Slave:

#include <Servo.h>
#include <Wire.h>

byte daten=0;
Servo servo4; 

void setup() 
{
 Wire.onReceive(receiveEvent);
 Wire.begin(4);
 servo4.attach(5);
 Serial.begin(9600);
}

void loop() 
{
 delay(1);
}

void receiveEvent(int ka)
{
 daten = Wire.read();
 Serial.println(daten);
 
 if (daten=1)
  {  servo4.write(10);
     delay(50);
  }

  if (daten=2)
  {  servo4.write(100);
     delay(50);
  }
}

Würde mich über Hilfe freuen :slight_smile:

receiveEvent() ist eine ISR! Da kannst du kein Serial.print() und delay() machen! print() geht zwar vor allem bei einem einzelnen Zeichen, aber sauber ist es nicht. delay() geht in Interrupts nie.

volatile bool dataReceived;

void loop()
{
   if (dataReceived)
   {
       dataReceived = false;

       ....
       //hier Daten verwenden
   }
}

void receiveEvent(int ka)
{
  daten = Wire.read();
  dataReceived = true;
}

Außerdem sollte dir klar sein dass es einen Unterschied zwischen = und == gibt:

if (daten=1)
if (daten=1)

Der c++ Compiler ist gemein:
Dies setzt daten auf 1 und liefert immer true.
Vermutlich meinst du if (daten==1)

Du kannst Serenifly'sbool dataReceivednatürlich auch in deinembyte datenunterbringen:
Die ISR setzt es 2 oder 1, in loop wird es nach dem Bearbeiten auf 0 gesetzt.

Ein erfahrener C Programmierer setzt Konstanten auf die linke Seite eines Vergleichs:
if (1=daten) ...
dann meckert der Compiler, daß das so nicht geht. Mit
if (1==daten)
ist dann der Tippfehler behoben :slight_smile:

Aus irgendwelchen - mir völlig unverständlichen - Gründen wird diese überaus hilfreiche Konvention von Arduino nicht empfohlen, und auch nicht in den Bibliotheken und Beispielen genutzt :frowning:

Ein erfahrener C Programmierer spürt es beim Tippen von   if (i=1)  an den Nackenhaaren. :wink: