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;
}
}