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

Nein und nein.

5 V / 10 kΩ = 0,5 mA kann so einen Kontakt nicht verkleben.

Würdest Du also darauf tippen, dass das Metall in der Nähe für die Störung verantwortlich ist?

Dazu habe ich leider keine Erfahrungen.

Okay. Danke schonmal für Deine Einschätzung. Ich probiere es einfach später abseits der Metallplatte aus;)

Es hatte sich ein einfach Kabel im Gehäuse gelöst, kein kaputter Reed- Schalter oder sonstiges:D. Sorry, das hätte ich als Erstes überprüfen müssen.

Ich werde die beiden Figuren bald in einer Ausstellung zeigen. Es ist jedoch anstrengend wenn die Bewegung der beiden Figuren pausenlos durchläuft.

Ich will also, dass man die State Machine von einer Figur durch einen Taster in Gang setzt und diese dann nach einigen Durchgängen endet ( 5 Durchgänge). Die State Machine muss im Zustand void ArmUnten stoppen, damit ein weiteres Aktivieren durch den Taster erfolgen kann.

Das Starten der State Machine durch den Taster habe ich im Sketch hinbekommen:

//State Machine
// Die State Machine soll durch einen Taster einmalig ausgelöst werden und dann eine begrenzte Zeit aktiv sein.
// Ich brauche also ein weiteres Ereignis, das von Z_ArmUnten zu Z_ArmNachOben führt oder einen ODER- Operand.
// Wie kriege ich  es hin, dass die State- Machine nach einer bestimmten Zeit gestoppt wird? Eine Möglichkeit wäre es mit einem anderen Arduino und einem Relais einfach den Strom auszuknipsen und dann wieder anzumachen.
// Dann wäre eine Unterbrechung da und es könnte wieder von vorne losgehen.

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

const int Taster = 6;            // Taster
const int ReedSchalter = 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_ReedSchalter;
bool e_EndschalterOben;
bool e_Pausenzeitgeber;
bool e_EndschalterUnten;
bool e_Taster;                 // Taster


//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_ReedSchalter = false;
  e_EndschalterOben = false;
  e_Pausenzeitgeber = false;
}

void ArmNachOben()
{
  Serial.println("Arm geht nach oben nach Anfangspause");
  delay(20000); // Anfangspause// erst waren es 10000, das war mir ein bisschen zuschnell! 15000 sind okay aber vielleicht immer noch ein bisschen zu schnell
  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_ReedSchalter = 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_ReedSchalter = 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_ReedSchalter = false;
  e_EndschalterOben = false;
  e_Pausenzeitgeber = false;
}

void Ereignisse()
{
  if (digitalRead(Taster) == LOW)  // Taster schaltet GND und ist INPUT_PULLUP
  {
    e_Taster = true;
  }
  if (digitalRead(ReedSchalter) == LOW)  // Reedschalter schaltet GND und ist INPUT_PULLUP
  {
    e_ReedSchalter = true;
  }
  if (digitalRead(EndschalterOben) == LOW)
  {
    e_EndschalterOben = true;
    // hier darf: Pausenzeitgeber = millis(); nicht stehen, weil der Schalter ja gedrückt bleibt!!!
  }
  if (millis() - Pausenzeitgeber > 4000 && millis() - Pausenzeitgeber < 4500) // erst waren es 6000 und 6500, die Pause ist auf jeden Fall zu lang, Messung hat ergeben, dass 4000 ganz gut wären
  {
    e_Pausenzeitgeber = true;
  }
  if (digitalRead(EndschalterUnten) == LOW )
  {
    e_EndschalterUnten = true;
  }
}

void Verarbeitung()
{

  if (e_ReedSchalter || e_Taster)
  {
    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(ReedSchalter, 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_ReedSchalter = 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
}

Ich weiß aber nicht wie ich das Stoppen nach fünf Durchgängen im Zustand void ArmUnten realisieren soll. Ich denke es wäre sinnvoll wenn eine Variable das Ändern der Durchgänge mitzählen würde und nach einer festgelegten Zahl die State Machine stoppt. Das Stoppen könnte durch ein kurzes Ausschalten des Mikrocontrollers erfolgen, der danach wieder angeschaltet wird.

Hat jemand eine einfachere, bessere Idee wie sich das realisieren lässt?

LG Leonardo

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.

Liebe communitiy, ich bin damals auf einen anderen Thread umgestiegen, weil mir der Titel dieses Threads, nicht mehr geeignet erschien. Hier erwarten Euch neben neuen, inzwischen aber gelösten Problemen auch Fotos und ein Video des fertigen Projekts:

State Machine mit Stop nach fünf Durchgängen - International / Deutsch - Arduino Forum

P.S.: Ihr könnt Euch die Dokumentation dieses Projektes und Bilder von meinen anderen Projekten auch hier anschauen:
Leon Fiand (@leon_fiand) • Instagram photos and videos

Herzliche Grüße Leonardo