Ansteuerung von elektrischer Seilwinde | kinetic sculpture | interactive art installation | GELÖST!

@paulpaulson:

Warum nimmst du nicht die "Fernsteuerung" auseinander und "simulierst" mir deiner Relaisbank den Bedienungsknopf?

Genau, das habe ich gemacht. Ich habe mit den vier Relais genau die Fernsteuerung simuliert. Zwei Relais simulieren den Schalter den man drückt wenn man die Pfeiltaste nach oben drückt und zwei Relais simulieren den Schalter den man drückt wenn man die Pfeiltaste nach unten drückt.

Wenn ich also die Fernsteuerung der Seilwinde mit den vier Relais genau simuliert habe, stellt dann die induktive Last wie von Rentner beschrieben, gar kein Problem dar und hat mir dann doch einfach der hohe Anlaufstrom des Elektromotors meine alten Relais zerstört?

Na ja es geht bei den Relaiskontakten darum ob sie schnell genug öffnen und dann der Abstand groß genug ist um einen Lichtbogen zu vermeiden. Der macht Dir dann auf Dauer die Kontakte kaputt. Bei Induktiver Last treten wegen der Induktionspannung der Spule beim ausschalten recht hohe Spannungen auf.

Hallo,

ob´s jetzt der Anlaufstrom oder ein Lichtbogen beim abschalten war ist letztlich doch egal, das Relais war für die Betriebsart nicht geeignet. Wenn an den Kontakten erst mal eine Bruzelstelle entstanden, so oder so, ist wird es wahrscheinlich so enden das die Kontakte kleben bleiben.

Heinz

Nachtrag
ich gehe auch davon aus das der original Schalter dafür ausgelegt ist und entsprecheden Sprungkontakte hat. merkst Du daran das die beim Drücken richtig clicken und beim loslassen ebenso.

@Rentner:

Mit Deinen Schaltbildern bin ich auch nicht so ganz einverstanden in dem einen Fall hast Du ein Wicklung des Motors kurzgeschlossen.

in der Vereinfachung von "Schalter 2 gedrückt", oder?

Schaltleistung bei Schützen zwischen ohmischer Last AC1 und Induktiver Last (Motoren) AC3

Link grob i.R 50%

Heißt das die induzierte Spannung des Elektromotors übersteigt die Betriebsspannung grob um 50%? Also ist die induktive Last grob 345 V? ( 230 V+ 115 V)

Kondensator
püfen was Du wirklich hast.
Drehstrommotor mit Kondensator - die Steinmetzschaltung

Würdest Du mir raten, den Elektromotor mal auseinanderzunehmen? Es kommen auf jeden Fall 3 Phasen aus dem Elektromotor. Oder reicht das schon um den Motor genau einzuordnen?

Das Thema E-Motoren ist ziemlich komplex , es gibt Leute die E-Technik studiert haben, dennoch Ihre Probleme mit Auslegung eines Drehstrommotos in Verbindung mit einem Frequenzumrichter haben wenn der Motor nicht mit Nenndrehzahl läuft. (Thema 87Hz Kennlinie)

Würdest Du mir also davon abraten, dieses ganze Problem mit einem Frequenzumrichter zu lösen?

Auf diesem Foto hier sieht man wie die 3 Phasen aus dem Elektromotor kommen:

Sorry, die Schaltpläne waren immer noch falsch:/. Sorry, dass ich Euch damit so zugespamt habe. Also hier ist jetzt wirklich nochmal der Richtige, mit den Schaltern wie sie in der Fernsteuerung der Seilwinde verbaut sind. Ich kann die Schalter der Fernsteuerung ja auch einfach durch zwei Schütze ersetzen, so wie in der Skizze darunter. Weil ich keine Schütze finde, die nur einen Schließer/Öffner haben, werde ich mir jetzt vier dieser Schütze bestellen Mikro-Leistungsschütz K0-05D | Schütze24 (schuetze24.com) mit zwei Öffnern und zwei Schließern. Warum gibt es überhaupt Hilfskontakte bei Schützen, haben die gegenüber Lastkontakten auch irgendwelche Vorteile?

Okay und jetzt weiß ich auch, dass es sich bei meinem Elektromotor um einen einphasigen Wechselstrommotor/ Kondensatormotor handelt, da kommen keine 3 Phasen aus dem Motor so wie ich behauptet habe.

Ich werde auf den Frequenzumrichter verzichten, ich habe Angst vor den EMV- Problemen

Hier die Schaltung mit den beiden Schützen:

Ich hätte da nochmal eine Frage:
Würdet Ihr Euch Schütze bestellen mit einer Spulenspannung von 230 Volt AC oder 12 Volt DC? Bei den 230 Volt AC bräuchte ich kein Netzteil, weshalb ich zu denen tendiere. Oder gibt es auch Gründe, die für 12 Volt DC sprechen?

Die Schütze mit 230 V AC Spulenspannung würde ich mit Hilfe von Relais ansteuern (siehe Skizze). Würdet Ihr das auch so machen?

Ansteuerung der Schütze:

Hallo,

Ich muss da jetzt einschreiten und rate Dir DRINGEND den Anschluss des Motors und der Schaltung, egal was Du da jetzt vorhast, von einem Elektriker vornehmen zu lassen, Es tut mir leid ich habe da jetzt ernste Bedenken. Du solltest Finger da weg lassen.

Heinz

Okay, ja das ist vielleicht echt eine gute Idee;). Ich rufe am Montag mal einen Elektriker an. Aber kurze Frage noch: Warum hast du plötzlich so ernste Bedenken? Ich würde gerne bevor ich mich mit einem Elektriker treffe noch die geeigneten Schütze bestellen. Habe ich bei meinen Frage zu der Ansteuerung der Schütze Deine Sorgen ausgelöst oder bei den x- mal falsch gezeichneten Schaltplänen? Oder gibt es etwa immer noch einen Fehler im Schaltplan?:confused:

Also wenn mir bitte, bitte jmd. noch diese beiden Fragen beantworten könnte, würde ich mich sehr freuen: Sind diese Schütze zum Schalten (Linkslauf) und (Rechtslauf) meines Kondensatormotors Mikro-Leistungsschütz K0-05D | Schütze24 (schuetze24.com) geeignet? Und seht ihr noch irgendeinen gravierenden Fehler in meinem Schaltplan, damit ich ihn dem Elektriker vorlegen kann?

Herzliche Grüße Leonardo

Hallo,

Da bei deinem Motor nur 3 Drähte herausgeführt sind , die Drehrichtung aber geändert werden kann , ist es vermutlich ein Drehstrommotor in Steinmetzschaltung. Ich würde aber den Widerstand der Wicklung nochmal messen, sollten alle gleich sein, und das Typenschild vom Motor suchen.

Kondensatormotoren mit Hilfswicklung lassen sich nur in der Drehrichtung ändern wenn alle 4 Enden der beiden Wicklungen zur Verfügung stehen.

Steinmetzschaltung Drehrichtung

Steinmetzschaltung

unter dem Link bei Drehrichtung mit Schalter findest Du den Schaltplan. Lass Dich nicht durch die 6 Klemmen vom Motor tüten, das sind die Dreiecksbrücken des Klemmbretts dargestellt. Damit deckt sich dann dann mit Deinen 3 Drähten.

da siehst Du jetzt oben die ersten beiden Kontakte von dem ersten Schütz und unten für die Drehrichtung das ist der dritte Kontakt vom ersten Schütz. Gleiches für die andere Drehrichtung mit dem 2 Schütz.

Also U und V vom Motor liegen für beide Fälle an L1 und N . Klemme W vom Motor wird einmal auf L1 geschaltete und einmal auf N .

für das Schütz würde ich eine Ausführung nehmen mit 3 Schliesser +1 Öffner dann kannst Du die Schütze gegenseitig verriegeln, sonst kanallt´s irgendwann.

Das sieht dann so aus .

Das hat dann den Vorteil das allpolig abgeschaltete wird. und sauber zwischen oben Einspeisung / unten Ausgang unterschieden wird.

aber nochmal lass das einen Elektriker verschalten, Du beschränkst dich auf die Ansteuerung der beiden Relais für den Arduino.

Heinz

@Rentner: Vielen , lieben Dank für deine Antwort!:slight_smile:

Okay, es gilt herauszufinden ob es sich um einen Kondensatormotor (kann es eigentlich nicht sein, weil sonst 4 Drähte aus dem Motor kommen müssten) oder einen Drehstrommotor in Steinmetzschaltung handelt ( 3 Drähte kommen aus dem Motor).

Leider befindet sich kein Typenschild auf dem Motor...

Ich habe mir gestern mit dem Elektriker unserer Kunsthochschule geschrieben, der hat aber gemeint er kennt sich nicht so gut mit der Materie aus und hat mich an zwei andere Personen verwiesen, die das studiert haben sollen. Ich schreibe die gleich mal an und hoffe von denen kann mir jemand bei dem Verschalten des Motors helfen.

Danke für Deinen Rat zu den Schützen mit den drei Schließern + 1 Öffner. Das mit dem gegenseitigen Abriegeln ist eine sehr gute Idee/ Sicherheitsvorkehrung. Danke auch für Deine Schaltpläne, die helfen mir extrem weiter! Absolut unmissverständlich und eindeutig!:slight_smile:

Ich hatte mal ein Problem bei einem Projekt, da hat so ein 4- Kanal- Relais 4 Kanal Relais 5V/230V Raspberry Pi Optokoppler Modul Channel Relay Arduino | eBay verrückt gespielt immer wenn ich damit vier Magnetventile (230 V) gleichzeitig geschaltet habe. Die Kontakte die dabei geschlossen wurden sind dann einfach kleben geblieben und haben dann auf Anhieb nicht mehr geöffnet. Nach dem Aus- und Anschalten haben die einzelnen Relais dann wieder problemlos geschaltet, bis ich wieder alle 4 auf einmal geschaltet habe. Dann sind sie wieder kleben geblieben und das Spiel ging von vorne los. Ich habe es dann durch ein Solid State Relais ersetzt und es gab keine Probleme mehr. Das war im Endeffekt ein ähnliches Problem wie beim Ansteuern des Elektromotors mit diesen Relais anfangs, wenn auch in einer abgeschwächten Form. Ich habe mir mein Thema damals gerade nochmal durchgelesen...

Fazit: Mit den 12VDC- Schützen bin ich in jeder Hinsicht auf der sichereren Seite, ich bestelle mir lieber welche mit dieser Spannung. Da sollte es mit den Relais 4 Kanal Relais 5V/230V Raspberry Pi Optokoppler Modul Channel Relay Arduino | eBay dann keine Probleme geben.

P.S.: Ich habe heute den State- Machine Sketch ausprobiert, mit dem ich die Seilwinde ansteuern will, der hat noch nicht funktioniert, dieser hier tut es jetzt aber:

//State Machine

// Pin - Definitionen
const int Relais1 = 8;
const int Relais2 = 9;
const int Relais3 = 10;
const int Relais4 = 11;

const int Bewegungsmelder = 7;
const int EndschalterOben = 6;
unsigned long Pausenzeitgeber;
const int EndschalterUnten = 5;


//Zustände
const int Z_ArmUnten = 0;
const int Z_ArmNachOben = 1;
const int Z_ArmOben = 2;
const int Z_ArmNachUnten = 3;

//Variablen für Ereignisse
bool e_Bewegungsmelder;
bool e_EndschalterOben;
bool e_Pausenzeitgeber;
bool e_EndschalterUnten;


//Variablen für Zustände
int Zustand;

void ArmUnten()
{
  Serial.println("Arm unten");
  digitalWrite(Relais1, HIGH);
  digitalWrite(Relais2, HIGH);
  digitalWrite(Relais3, HIGH);
  digitalWrite(Relais4, HIGH);
  Zustand = Z_ArmUnten;
  e_EndschalterUnten = false;
  e_Bewegungsmelder = false;
  e_EndschalterOben = false;
  e_Pausenzeitgeber = false;
}

void ArmNachOben()
{
  Serial.println("Arm geht nach oben");
  digitalWrite(Relais1, LOW);
  digitalWrite(Relais2, LOW);
  digitalWrite(Relais3, HIGH);
  digitalWrite(Relais4, HIGH);
  Zustand = Z_ArmNachOben;
  e_EndschalterUnten = false;
  e_Bewegungsmelder = false;
  e_EndschalterOben = false;
  e_Pausenzeitgeber = false;
}

void ArmOben()
{
  Serial.println("Arm ist oben");
  digitalWrite(Relais1, HIGH);
  digitalWrite(Relais2, HIGH);
  digitalWrite(Relais3, HIGH);
  digitalWrite(Relais4, HIGH);
  Zustand = Z_ArmOben;
  e_EndschalterUnten = false;
  e_Bewegungsmelder = false;
  e_EndschalterOben = false;
  e_Pausenzeitgeber = false;
  Pausenzeitgeber = millis();
}

void ArmNachUnten()
{
  Serial.println("Arm geht nach unten");
  digitalWrite(Relais1, HIGH);
  digitalWrite(Relais2, HIGH);
  digitalWrite(Relais3, LOW);
  digitalWrite(Relais4, LOW);
  Zustand = Z_ArmNachUnten;
  e_EndschalterUnten = false;
  e_Bewegungsmelder = false;
  e_EndschalterOben = false;
  e_Pausenzeitgeber = false;
}

void Ereignisse()
{
  if (digitalRead(Bewegungsmelder) == HIGH) {
    e_Bewegungsmelder = true;
  }
  if (digitalRead(EndschalterOben) == LOW)
  {
    e_EndschalterOben = true;
    // hier darf: Pausenzeitgeber = millis(); nicht stehen, weil der Schalter ja gedrückt bleibt!!!
  }
  if (millis() - Pausenzeitgeber > 3000 && millis() - Pausenzeitgeber <3500)
  {
    e_Pausenzeitgeber = true;
  }
  if (digitalRead(EndschalterUnten) == LOW )
  {
    e_EndschalterUnten = true;
  }
}

void Verarbeitung()
{
  if (e_Bewegungsmelder)
  {
    switch (Zustand)
    {
      case Z_ArmUnten: ArmNachOben(); break;
    }
  }
  if (e_EndschalterOben)
  {
    switch (Zustand)
    {
      case Z_ArmNachOben: ArmOben(); break;
    }
  }
  if (e_Pausenzeitgeber)
  {
    switch (Zustand)
    {
      case Z_ArmOben: ArmNachUnten(); break;
    }
  }
  if ( e_EndschalterUnten)
  {
    switch (Zustand)
    {
      case Z_ArmNachUnten: ArmUnten(); break;
    }
  }
}

void setup() {
  // Schnittstelle für den seriellen Monitor
  Serial.begin(9600);

  // Pin's vorbereiten
  pinMode(Relais1, OUTPUT);
  pinMode(Relais2, OUTPUT);
  pinMode(Relais3, OUTPUT);
  pinMode(Relais4, OUTPUT);

  pinMode(Bewegungsmelder, INPUT);
  pinMode(EndschalterOben, INPUT_PULLUP);
  pinMode(EndschalterUnten, INPUT_PULLUP);
  pinMode(Pausenzeitgeber, INPUT_PULLUP);

  //Ausgangszustand herstellen
  digitalWrite(Relais1, HIGH);
  digitalWrite(Relais2, HIGH);
  digitalWrite(Relais3, HIGH);
  digitalWrite(Relais4, HIGH);

  Zustand = Z_ArmUnten;
  e_Bewegungsmelder = false;
  e_EndschalterOben = false;
  e_Pausenzeitgeber = false;
  e_EndschalterUnten = false;
}

void loop()
{
  Ereignisse();              // Ereignisse werden abgefragt
  Verarbeitung();            // Anhand der Ereignisse werden die einzelnen Funktionen abgerufen
}

Herzliche Grüße Leonardo

Hallo,

ja wenn´s funktioniert. Allerdings Dein Swich Konstrukt finde ich schon seltsam, schau noch mal in der Hilfe unter Referenz nach.

Mit millis() stehst Du auch noch auf dem Kriegsfuß scheint mir jedenfalls. Du kannst auch in deinem Fall delay() nehmen. Ich denke zwischen den beiden Bewegungen auf/ ab gibts nie was zu tun für den Controller. Warum überschreibst Du die Statuswerte der Eingänge z.B

e_EndschalterUnten = false;
e_Bewegungsmelder = false;
e_EndschalterOben = false;

die sollen doch durch digitalRead() aktuell gehalten werden.

in Verbindumg mit swich kannst Du auch noch mal nach enum suchen link dann kannst Du deine Zuständen sinnvolle Namen geben. z.B sowas.

warten , heben , stop, pause ,senken , stop,

Heinz

Ich würde aber den Widerstand der Wicklung nochmal messen, sollten alle gleich sein, und das Typenschild vom Motor suchen.

Ich habe gestern mal die drei Kabel/ Drähte durchgemessen, die aus dem Motor kommen.

  • Multimeter eingestellt auf 200 kOhm
    -Messergebnisse:

  • blau 1 und rot = 19,8 kOhm

  • blau 2 und rot = 19,9 kOhm

  • blau 1 und blau 2 = 39,3 kOhm

Was sagen mir diese Werte? Kann ich anhand dieser Werte jetzt eindeutig den Motortyp bestimmen? Wenn mir jemand sagen könnte für was diese Werte stehen und dies vielleicht auf einer Skizze veranschaulichen könnte, ich würde mich unendlich freuen! Ich tappe da sehr im Dunkeln.

Jetzt nochmal zu den Schützen: Ich habe sie inzwischen in meine Schaltung eingebaut ( mir hat man gesagt, das schaffst Du schon selber und ich solle einfach genau die Fernsteuerung simulieren). Das habe ich dann gemacht, nach diesem Schaltplan: Nur eben, dass aus Schalter 1 Schütz 1 wurde und aus Schalter 2 wurde Schütz 2. Die Ansteuerung der Schütze habe ich genauso gemacht wie auf der Skizze von Rentner.

P.S: Ich musste jetzt doch 230 Volt- Schütze nehmen, weil ich auf die 12 Volt_ DC- Schütze sehr lange hätte warten müssen.

Mit der Schaltung und meinem Sketch lief es dann anfangs erst nicht. Wenn der Motor still stand und dann der Linkslauf oder Rechtslauf eingeschaltet wurde, schaltete nach kurzem Anlaufversuch des Motors das zuständige Relais wieder das zuständige Schütz aus. Ich habe dann bei Schütze 24 angerufen, mein Problem beschrieben und die haben gesagt ich soll versuchen das mit der Software zu lösen. Ich solle eine Zeitverzögerung einbauen, damit sich die Schütze und die Relais nicht überlappen. Ich habe das dann durch ein delay(500) in meinem Sketch versucht und zwar immer zwischen dem An/Abschalten der beiden Relais, Das hat auf Anhieb funktionert. Ich verstehe nicht wirklich wo das Problem lag, aber so funktioniert es jetzt;).
P.S: Es ist außerdem wichtig, dass in den Zuständen erst das eine Relais geschlossen wird und dann nach kurzer Zeitverzögerung das andere Relais geöffnet wird. Andersherum entsteht das gleiche Problem wie oben beschrieben. Warum? Kein Ahnung...

@Renter: Danke für Deine Tipps bezüglich des Sketches! Ich schaue mir das bald in Ruhe nochmal an, aber begnüge mich jetzt erstmal mit dem vorhandenen Sketch und der Schaltung, weil ich jetzt bei den Skulpturen weiterkommen muss, die Technik hat jetzt erstmal genug Zeit in Anspruch genommen;).

Danke für Eure Hilfe, besonders für Deine Hilfe lieber Rentner. Passt auf Euch auf und bis bald:)

Herzliche Grüße Leonardo

Ach, und hier ist der Sketch mit dem jetzt alles wie gewollt funktioniert:

//State Machine

// Pin - Definitionen
const int Relais1 = 8;
const int Relais2 = 9;
const int Relais3 = 10;
const int Relais4 = 11;

const int Bewegungsmelder = 7;
const int EndschalterOben = 13;
unsigned long Pausenzeitgeber;
const int EndschalterUnten = 12;


//Zustände
const int Z_ArmUnten = 0;
const int Z_ArmNachOben = 1;
const int Z_ArmOben = 2;
const int Z_ArmNachUnten = 3;

//Variablen für Ereignisse
bool e_Bewegungsmelder;
bool e_EndschalterOben;
bool e_Pausenzeitgeber;
bool e_EndschalterUnten;


//Variablen für Zustände
int Zustand;

void ArmUnten()
{
  Serial.println("Arm unten");
  digitalWrite(Relais1, HIGH);
  delay(500); // Software- Verzögerung zum Beheben der Störung
  digitalWrite(Relais2, HIGH);
  Zustand = Z_ArmUnten;
  e_EndschalterUnten = false;
  e_Bewegungsmelder = false;
  e_EndschalterOben = false;
  e_Pausenzeitgeber = false;
}

void ArmNachOben()
{
  Serial.println("Arm geht nach oben nach Anfangspause");
  delay(3000); // Anfangspause
  digitalWrite(Relais1, LOW); // Das muss immerso herum
  delay(500); // Software- Verzögerung zum Beheben der Störung
  digitalWrite(Relais2, HIGH); // hier stehen, sonst kommt es zu einer Störung!
  Zustand = Z_ArmNachOben;
  e_EndschalterUnten = false;
  e_Bewegungsmelder = false;
  e_EndschalterOben = false;
  e_Pausenzeitgeber = false;
}

void ArmOben()
{
  Serial.println("Arm ist oben");
  digitalWrite(Relais1, HIGH);
  delay(500); // Software- Verzögerung zum Beheben der Störung
  digitalWrite(Relais2, HIGH);
  Zustand = Z_ArmOben;
  e_EndschalterUnten = false;
  e_Bewegungsmelder = false;
  e_EndschalterOben = false;
  e_Pausenzeitgeber = false;
  Pausenzeitgeber = millis();
}

void ArmNachUnten()
{
  Serial.println("Arm geht nach unten");
  digitalWrite(Relais2, LOW);
  delay(500); //Software- Verzögerung zum Beheben der Störung
  digitalWrite(Relais1, HIGH);
  Zustand = Z_ArmNachUnten;
  e_EndschalterUnten = false;
  e_Bewegungsmelder = false;
  e_EndschalterOben = false;
  e_Pausenzeitgeber = false;
}

void Ereignisse()
{
  if (digitalRead(Bewegungsmelder) == HIGH) {
    e_Bewegungsmelder = true;
  }
  if (digitalRead(EndschalterOben) == LOW)
  {
    e_EndschalterOben = true;
    // hier darf: Pausenzeitgeber = millis(); nicht stehen, weil der Schalter ja gedrückt bleibt!!!
  }
  if (millis() - Pausenzeitgeber > 6000 && millis() - Pausenzeitgeber < 6500)
  {
    e_Pausenzeitgeber = true;
  }
  if (digitalRead(EndschalterUnten) == LOW )
  {
    e_EndschalterUnten = true;
  }
}

void Verarbeitung()
{
  if (e_Bewegungsmelder)
  {
    switch (Zustand)
    {
      case Z_ArmUnten: ArmNachOben(); break;
    }
  }
  if (e_EndschalterOben)
  {
    switch (Zustand)
    {
      case Z_ArmNachOben: ArmOben(); break;
    }
  }
  if (e_Pausenzeitgeber)
  {
    switch (Zustand)
    {
      case Z_ArmOben: ArmNachUnten(); break;
    }
  }
  if ( e_EndschalterUnten)
  {
    switch (Zustand)
    {
      case Z_ArmNachUnten: ArmUnten(); break;
    }
  }
}

void setup() {
  // Schnittstelle für den seriellen Monitor
  Serial.begin(9600);

  // Pin's vorbereiten
  pinMode(Relais1, OUTPUT);
  pinMode(Relais2, OUTPUT);
  pinMode(Relais3, OUTPUT);
  pinMode(Relais4, OUTPUT);

  pinMode(Bewegungsmelder, INPUT);
  pinMode(EndschalterOben, INPUT_PULLUP);
  pinMode(EndschalterUnten, INPUT_PULLUP);
  pinMode(Pausenzeitgeber, INPUT_PULLUP);

  //Ausgangszustand herstellen
  digitalWrite(Relais1, HIGH);
  digitalWrite(Relais2, HIGH);
  digitalWrite(Relais3, HIGH);
  digitalWrite(Relais4, HIGH);

  Zustand = Z_ArmUnten;
  e_Bewegungsmelder = false;
  e_EndschalterOben = false;
  e_Pausenzeitgeber = false;
  e_EndschalterUnten = false;
}

void loop()
{
  Ereignisse();              // Ereignisse werden abgefragt
  Verarbeitung();            // Anhand der Ereignisse werden die einzelnen Funktionen abgerufen
}

Hallo,

Ich will die Bewegungssensoren in meinem Projekt durch Reed- Kontakte ersetzen.

Das habe ich gestern probehalber bei einer Figur gemacht. Das Auslösen des Reed- Kontaktes hat gestern anfangs ein paar mal funktioniert. Nach ca. dem 5 Auslösen des Reed- Schalters hat es dann jedoch nicht mehr funktionert.

Der Reed- Kontakt ist an GND und Pin 7 (INPUT_PULLUP) angeschlossen. Ich habe in einem Raspberry- Buch gesehen, dass die noch einen Widerstand R2 zur Strombegrenzung zwischen Reed- Kontakt und GND hängen.

Ist das bei einem Arduino auch nötig und mir hat ein zu großer Stromfluss die Kontakte verklebt?

Als Fehlerquelle könnte auch eine verzinkte Stahlplatte in Betracht kommen, die direkten Kontakt mit dem Reed- Kontakt hat.

"Von magnetisierbaren Bauteilen (etwa aus Eisenwerkstoffen) sollte ein Abstand von zumindest einigen Millimetern eingehalten werden.[8]"

Kann das als Fehlerquelle durch die Plastikummantelung meines Reed- Kontakt ausgeschlossen werden?

Hier ist der Sketch dazu:

//State Machine // Bewegungsmelder ist jetzt ein Reed- Schalter

// Pin - Definitionen
const int Relais1 = 8;
const int Relais2 = 9;
const int Relais3 = 10;
const int Relais4 = 11;

const int Bewegungsmelder = 7;
const int EndschalterOben = 13;
unsigned long Pausenzeitgeber;
const int EndschalterUnten = 12;


//Zustände
const int Z_ArmUnten = 0;
const int Z_ArmNachOben = 1;
const int Z_ArmOben = 2;
const int Z_ArmNachUnten = 3;

//Variablen für Ereignisse
bool e_Bewegungsmelder;
bool e_EndschalterOben;
bool e_Pausenzeitgeber;
bool e_EndschalterUnten;


//Variablen für Zustände
int Zustand;

void ArmUnten()
{
  Serial.println("Arm unten");
  digitalWrite(Relais2, HIGH);
  delay(500); // Software- Verzögerung zum Beheben der Störung
  digitalWrite(Relais1, HIGH);
  Zustand = Z_ArmUnten;
  e_EndschalterUnten = false;
  e_Bewegungsmelder = false;
  e_EndschalterOben = false;
  e_Pausenzeitgeber = false;
}

void ArmNachOben()
{
  Serial.println("Arm geht nach oben nach Anfangspause");
  delay(10000); // Anfangspause
  digitalWrite(Relais1, LOW); // Das muss immerso herum
  delay(500); // Software- Verzögerung zum Beheben der Störung
  digitalWrite(Relais2, HIGH); // hier stehen, sonst kommt es zu einer Störung!
  Zustand = Z_ArmNachOben;
  e_EndschalterUnten = false;
  e_Bewegungsmelder = false;
  e_EndschalterOben = false;
  e_Pausenzeitgeber = false;
}

void ArmOben()
{
  Serial.println("Arm ist oben");
  digitalWrite(Relais1, HIGH);
  delay(500); // Software- Verzögerung zum Beheben der Störung
  digitalWrite(Relais2, HIGH);
  Zustand = Z_ArmOben;
  e_EndschalterUnten = false;
  e_Bewegungsmelder = false;
  e_EndschalterOben = false;
  e_Pausenzeitgeber = false;
  Pausenzeitgeber = millis();
}

void ArmNachUnten()
{
  Serial.println("Arm geht nach unten");
  digitalWrite(Relais2, LOW);
  delay(500); //Software- Verzögerung zum Beheben der Störung
  digitalWrite(Relais1, HIGH);
  Zustand = Z_ArmNachUnten;
  e_EndschalterUnten = false;
  e_Bewegungsmelder = false;
  e_EndschalterOben = false;
  e_Pausenzeitgeber = false;
}

void Ereignisse()
{
  if (digitalRead(Bewegungsmelder) == LOW) { // Reedschalter schaltet GND und ist INPUT_PULLUP
    e_Bewegungsmelder = true;
  }
  if (digitalRead(EndschalterOben) == LOW)
  {
    e_EndschalterOben = true;
    // hier darf: Pausenzeitgeber = millis(); nicht stehen, weil der Schalter ja gedrückt bleibt!!!
  }
  if (millis() - Pausenzeitgeber > 6000 && millis() - Pausenzeitgeber < 6500)
  {
    e_Pausenzeitgeber = true;
  }
  if (digitalRead(EndschalterUnten) == LOW )
  {
    e_EndschalterUnten = true;
  }
}

void Verarbeitung()
{
  if (e_Bewegungsmelder)
  {
    switch (Zustand)
    {
      case Z_ArmUnten: ArmNachOben(); break;
    }
  }
  if (e_EndschalterOben)
  {
    switch (Zustand)
    {
      case Z_ArmNachOben: ArmOben(); break;
    }
  }
  if (e_Pausenzeitgeber)
  {
    switch (Zustand)
    {
      case Z_ArmOben: ArmNachUnten(); break;
    }
  }
  if ( e_EndschalterUnten)
  {
    switch (Zustand)
    {
      case Z_ArmNachUnten: ArmUnten(); break;
    }
  }
}

void setup() {
  // Schnittstelle für den seriellen Monitor
  Serial.begin(9600);

  // Pin's vorbereiten
  pinMode(Relais1, OUTPUT);
  pinMode(Relais2, OUTPUT);
  pinMode(Relais3, OUTPUT);
  pinMode(Relais4, OUTPUT);

  pinMode(Bewegungsmelder, INPUT_PULLUP);
  pinMode(EndschalterOben, INPUT_PULLUP);
  pinMode(EndschalterUnten, INPUT_PULLUP);

  //Ausgangszustand herstellen
  digitalWrite(Relais1, HIGH);
  digitalWrite(Relais2, HIGH);
  digitalWrite(Relais3, HIGH);
  digitalWrite(Relais4, HIGH);

  Zustand = Z_ArmUnten;
  e_Bewegungsmelder = false;
  e_EndschalterOben = false;
  e_Pausenzeitgeber = false;
  e_EndschalterUnten = false;
}

void loop()
{
  Ereignisse();              // Ereignisse werden abgefragt
  Verarbeitung();            // Anhand der Ereignisse werden die einzelnen Funktionen abgerufen
}

LG Leonardo