Pneumatik schält nicht konsistent + Fehlerstrom von Pyrometer

Hello,
vorneweg, ich bin Amateur , probiere mich dennoch.

Mein Problem 1: Ich will über ein Fußschalter einen Arduino ansteuern, welcher dann das Signal auf einen Generator gibt, dieser Generator wiederum startet und durchläuft seinen Prozess.
Nach Ablauf der eingestellten Zeit, soll eine Festo Pneumatik betätigt werden.
Die Zeiten befinden sich im ms und s Bereich.

Soweit funktioniert das alles auch.
Aber, der Pneumatik Zylinder fährt nicht ständig die gleiche Zeit, oft wird der verzögert ausgelöst. Obwohl die Relais optisch und akustisch schon auf den Punkt schalten.
Relais verwende ich relativ günstige.

nochmal genauer.
Der Generator gibt ein abtastsignal aus für den Fußschalter, welches 10v hat, da ist ein Relais zwischen geschaltet um den Aruino nicht zu killn.
Das zweite Relais ist zwischen dem Magnetventil vom Pneumatik Zylinder geschaltet, dieses hat 24v.

Sonst ist nichts zusätzliches verbaut. Nur Arduino Uno, zwei Relais, der Fußschalter, das Magnetventil.

Problem2: Des weiteren habe ich ein Pyrometer verbaut. Immer wenn ich den USB Anschluss von besagtem hin und her bewege startet der Generator auch sein Programm. soll er aber nicht. auch wenn ich andere Peripherie an oder abschalte startet der Generator. Wie kann ich so einen "überstrom" vermeiden, wenns überhaupt einer ist? Das Pyro läuft vom Arduino komplett autark.

Da ich nicht wirklich weiterweiß, oder ggf. was vergessen haben zwischen zu schalten, würde ich mich über jede Hilfe freuen.

Mnl

Code:

// Zustände der State-Machine
enum State { 
  IDLE,           // Warten auf Fußschalterbetätigung
  GEN_PULSE,      // Generatorimpuls (500 ms) wird ausgegeben
  WAIT_3,         // 3 Sekunden warten nach Fußschalterbetätigung
  MAGNET_ACTIVE,  // Magnetventil aktiv (10 Sekunden)
  WAIT_RELEASE    // Warten, bis der Fußschalter wieder losgelassen wurde
};

State currentState = IDLE;
unsigned long stateStartTime = 0; 

// Zeitkonstanten in Millisekunden:
const unsigned long pulseDuration        = 500;   // Dauer des Generatorimpulses: 500 ms
const unsigned long waitDuration         = 3000;  // Wartezeit: 3 Sekunden
const unsigned long magnetActiveDuration = 10000; // Magnetventil aktiv: 10 Sekunden

// Pinbelegung:
const int footSwitchPin  = 2;    // Eingang für den NC-Fußschalter (mit internem Pull-Up)
const int generatorPin   = 3;    // Ausgang zur Generatorsteuerung (z.B. Relais)
const int magnetValvePin = 4;    // Ausgang zur Steuerung des Magnetventils

// Entprellung:
int lastFootReading = HIGH;                // letzter stabiler Zustand
int stableFootState = HIGH;                // entprellter Zustand
unsigned long lastDebounceTime = 0;
const unsigned long debounceDelay = 30;    // Entprellzeit in ms

void setup() {
  pinMode(footSwitchPin, INPUT_PULLUP);
  pinMode(generatorPin, OUTPUT);
  pinMode(magnetValvePin, OUTPUT);
  
  digitalWrite(generatorPin, LOW);     // Generator anfangs aus
  digitalWrite(magnetValvePin, LOW);   // Magnetventil anfangs aus
}

void loop() {
  // --- Fußschalter mit Entprellung einlesen ---
  int rawReading = digitalRead(footSwitchPin);

  if (rawReading != lastFootReading) {
    lastDebounceTime = millis();
  }

  if ((millis() - lastDebounceTime) > debounceDelay) {
    stableFootState = rawReading;
  }

  lastFootReading = rawReading;

  // --- Zustandsmaschine ---
  switch(currentState) {
    case IDLE:
      // Im Ruhezustand ist der NC-Fußschalter geschlossen (Eingang LOW).
      // Wird der Schalter betätigt (öffnet sich, Eingang HIGH), startet der Prozess.
      if (stableFootState == HIGH) {
        currentState = GEN_PULSE;
        stateStartTime = millis();
        digitalWrite(generatorPin, HIGH);  // Starte Generatorimpuls
      }
      break;
      
    case GEN_PULSE:
      // Nach 500 ms Generatorimpuls beenden:
      if (millis() - stateStartTime >= pulseDuration) {
        digitalWrite(generatorPin, LOW);
        currentState = WAIT_3;
        stateStartTime = millis();
      }
      break;
      
    case WAIT_3:
      // 3 Sekunden warten:
      if (millis() - stateStartTime >= waitDuration) {
        digitalWrite(magnetValvePin, HIGH);  // Magnetventil aktivieren
        currentState = MAGNET_ACTIVE;
        stateStartTime = millis();
      }
      break;
      
    case MAGNET_ACTIVE:
      // Magnetventil bleibt 10 Sekunden aktiv:
      if (millis() - stateStartTime >= magnetActiveDuration) {
        digitalWrite(magnetValvePin, LOW);   // Magnetventil deaktivieren
        currentState = WAIT_RELEASE;
      }
      break;
      
    case WAIT_RELEASE:
      // Warten, bis der Fußschalter wieder losgelassen wurde (Eingang geht wieder auf LOW):
      if (stableFootState == LOW) {
        currentState = IDLE;
      }
      break;
  }
}

Welchen Arduino (Link) und welche Relais (Link) verwendest Du? Wofür der Generator gut sein soll, habe ich noch nicht verstanden. Warum betreibst Du den Fußschalter nicht aus den 5V des Arduino?

Gruß Tommy

Ich hab Dir mal was umgeschrieben.
Las den mal bitte laufen und kontrolliere im Seriellen Monitor (WERKZEUGE - SERIELLER MONITOR) die Ausgabe mit Deinen Zustaänden.
Bitte beachte, dass die Geschwindigkeit im SerMon der im Sketch entspricht (115200)

// Zustände der State-Machine
enum State
{
  IDLE,           // Warten auf Fußschalterbetätigung
  GEN_PULSE,      // Generatorimpuls (500 ms) wird ausgegeben
  WAIT_3,         // 3 Sekunden warten nach Fußschalterbetätigung
  MAGNET_ACTIVE,  // Magnetventil aktiv (10 Sekunden)
  WAIT_RELEASE    // Warten, bis der Fußschalter wieder losgelassen wurde
};

State currentState = IDLE;
unsigned long stateStartTime = 0;

// Zeitkonstanten in Millisekunden:
const unsigned long pulseDuration = 500;   // Dauer des Generatorimpulses: 500 ms
const unsigned long waitDuration = 3000;  // Wartezeit: 3 Sekunden
const unsigned long magnetActiveDuration = 10000; // Magnetventil aktiv: 10 Sekunden

// Pinbelegung:
const int footSwitchPin = 2;    // Eingang für den NC-Fußschalter (mit internem Pull-Up)
const int generatorPin = 3;    // Ausgang zur Generatorsteuerung (z.B. Relais)
const int magnetValvePin = 4;    // Ausgang zur Steuerung des Magnetventils

// Entprellung:
unsigned long lastDebounceTime = 0;
const unsigned long debounceDelay = 30;    // Entprellzeit in ms
const bool footSwActive = HIGH;
bool lastFootReading = !footSwActive;      // letzter stabiler Zustand

void setup()
{
  Serial.begin(115200);
  Serial.println(F("Start...."));
  pinMode(footSwitchPin, INPUT_PULLUP);
  pinMode(generatorPin, OUTPUT);
  pinMode(magnetValvePin, OUTPUT);
  digitalWrite(generatorPin, LOW);     // Generator anfangs aus
  digitalWrite(magnetValvePin, LOW);   // Magnetventil anfangs aus
}

bool getFoodSwitch()
{
  bool ret = false;

  if (digitalRead(footSwitchPin) == footSwActive)
  {
    if (lastFootReading != footSwActive)
    {
      lastDebounceTime = millis();
      lastFootReading = footSwActive;
      ret = true;
    }
  }
  else if (lastFootReading == footSwActive)
  {
    if (millis() - lastDebounceTime > debounceDelay)
    {
      lastFootReading = !footSwActive;
    }
  }

  return ret;
}
void loop()
{
  // --- Zustandsmaschine ---
  switch (currentState)
  {
    case IDLE:

      // Im Ruhezustand ist der NC-Fußschalter geschlossen (Eingang LOW).
      // Wird der Schalter betätigt (öffnet sich, Eingang HIGH), startet der Prozess.
      if (getFoodSwitch())
      {
        Serial.println(F("Fusschalter ausgelöst"));
        digitalWrite(generatorPin, HIGH);  // Starte Generatorimpuls
        stateStartTime = millis();
        currentState = GEN_PULSE;
      }

      break;

    case GEN_PULSE:

      // Nach 500 ms Generatorimpuls beenden:
      if (millis() - stateStartTime >= pulseDuration)
      {
        Serial.println(F("Generator LOW"));
        digitalWrite(generatorPin, LOW);
        delay(100);
        stateStartTime = millis();
        currentState = WAIT_3;
      }

      break;

    case WAIT_3:

      // 3 Sekunden warten:
      if (millis() - stateStartTime >= waitDuration)
      {
        Serial.println(F("Magnetventil EIN"));
        digitalWrite(magnetValvePin, HIGH);  // Magnetventil aktivieren
        delay(100);
        stateStartTime = millis();
        currentState = MAGNET_ACTIVE;
      }

      break;

    case MAGNET_ACTIVE:

      // Magnetventil bleibt 10 Sekunden aktiv:
      if (millis() - stateStartTime >= magnetActiveDuration)
      {
        Serial.println(F("Magnetventil AUS"));
        digitalWrite(magnetValvePin, LOW);   // Magnetventil deaktivieren
        delay(100);
        currentState = WAIT_RELEASE;
      }

      break;

    case WAIT_RELEASE:

      // Warten, bis der Fußschalter wieder losgelassen wurde (Eingang geht wieder auf LOW):
      if (!getFoodSwitch())
      {
        Serial.println(F("Programmende"));
        currentState = IDLE;
      }

      break;
  }
}

Hallo,
ich denke mal deine 24V Stromversorgung ist nicht stabil genug und die Ventilspule zieht nicht zügig durch. Welchen Strom kann die 24V Versorgung denn liefern? Der Ventilstecker sollte einen Schuztbeschaltung haben (mindestens Freilaufdiode, besser Varistor). die gibt es in verschieden Ausführungen auch als Adapter . Damit werden vermeidest Du EMV Probleme.

such mal nach Murr Entstörglied Murr Ventilstecker.

Da liegt vermutlich eine kalte Lötstelle oder ein Kabelbruch im USB Kabel vor. Die unkontrollierten Schaltvorgänge sollte man erst mal EMV mäßig betrachten , siehe Stecker oben

Grüße!
Erstmals danke für eure Kommentare!
Ich habs heute früh hinbekommen!

Genau, wie @Rentner meinte, die Stromversorgung.

Wie Folgt: Alles wurde ausgeschlossen, bis auf den Strom für das Magnetventil, also da mit nem Labornetzteil rangegangen, die Zeiten waren konstanter als mit dem Netzteil davor, dann ist Irgendwann aufgefallen, das der Zylinder immer auf den Punkt zurückfährt, die Rückfahrt ist mir zeitlich egal, also Prozess umkehren. Mit dem Labornetzteil sieht man, wann Strom anliegt und wann nicht. Also Ruhezustand liegt 0v an. Erst wenn der Zylinder gefahren werden soll baut das Netzteil Spannung auf und schält. Eben erst dann.
Im code dann Low und high vom Magnetventil getauscht, dass praktisch die ganze zeit 24v anliegen also auf high und zieht beim zurückziehen über Low, weil die Zeit egal ist.
Passt perfekt jetzt!

Danke trotzdem für die mithilfe!
MNL

Das check ich die Tage!

Dann wäre es sinnvoll, bei ihm den Solution-Haken zu setzen.

Hallo erlaube mir noch einen Hinweis.
Na gut, wenn Du das so einfach drehen kannst. Die Maschine ( Einrichtung) sollte im spannungslosen Zustand immer einen sichern Zustand annehmen. Um ungewollte Bewegungen bei Stromausfall zu vermeiden setzt man in der Regel 5/3 Wege Ventile ein.
Ich gehe jetzt mal davon aus, das nicht noch die Maschinenrichtlinien zum Tragen kommen. Wenn da ein Fußschalter ist dann hängt an dem Fuß womöglich eine Person dran. Falls die mit Ihren Händen in die Bewegung des Zylinders eingreifen kann wird es etwas komplizierter.