const byte pneumatikPin = 8; // Steuert Vor/Rücklauf des Kolbens
const byte endschalterVorPin = 7; // Endschalter für Vorwärtslauf Kolben
const byte endschalterRueckPin = 4; // Endschalter für Rückwärtslauf Kolben
const byte mainschalterPin = 12; // Hauptschalter
const byte ruehrwerkPin = 10; // Schaltet Rührwerk im Spänebehälter an/aus
const unsigned long bouncetime = 100; // zeit in ms
const unsigned long failtime = 5000;
unsigned long startZeit = 0;
const bool an = LOW; // Vorgabe für Antriebe
const bool aus = HIGH;
const bool ausgeloest = HIGH; // Vorgabe für Endschalter
enum {warten, ruehren, pressen, loesen, error};
byte schritt = warten;
void setup ()
{
Serial.begin(115200);
Serial.println(F("Start..."));
pinMode(pneumatikPin, OUTPUT);
pinMode(ruehrwerkPin, OUTPUT);
pinMode(mainschalterPin, INPUT);
pinMode(endschalterVorPin, INPUT);
pinMode(endschalterRueckPin, INPUT);
}
void loop ()
{
if (mainSwitch() != ausgeloest)
{
schritt = warten;
}
switch (schritt)
{
case warten:
ruehrwerk(aus);
presse(aus);
if (mainSwitch() == ausgeloest)
{
schritt = ruehren;
}
break;
case ruehren:
ruehrwerk(an);
Serial.println(F("ruehren ausgelöst"));
schritt = pressen;
Serial.println(F("Starte Presse"));
startZeit = millis();
break;
case pressen:
if (vorwaerts() == ausgeloest)
{
Serial.println(F("unten angekommen - fahre hoch"));
schritt = loesen;
startZeit = millis();
}
if (millis() - startZeit > failtime)
schritt = error;
break;
case loesen:
if (rueckwaerts() == ausgeloest)
{
Serial.println(F("oben angekommen - fahre runter"));
schritt = pressen;
startZeit = millis();
}
if (millis() - startZeit > failtime)
schritt = error;
break;
case error:
Serial.println(F("Zeit abgelaufen"));
Serial.println(F("Warte auf abschalten"));
presse(aus);
ruehrwerk(aus);
while (mainSwitch() == ausgeloest);
Serial.println(F("MainSwitch aus"));
break;
}
}
void ruehrwerk(const bool anaus)
{
digitalWrite(ruehrwerkPin, anaus);
}
bool rueckwaerts()
{
presse(aus);
return digitalRead(endschalterRueckPin);
}
bool vorwaerts()
{
presse(an);
return digitalRead(endschalterVorPin);
}
void presse (const bool richtung)
{
digitalWrite(pneumatikPin, richtung);
}
bool mainSwitch()
{
static unsigned long startZeit = 0;
static bool tik = !ausgeloest;
if (millis() - startZeit >= bouncetime)
{
if (digitalRead(mainschalterPin) == ausgeloest)
{
startZeit = millis();
tik = ausgeloest;
}
else
tik = !ausgeloest;
}
return tik;
}