Chippo:
Die Flag setzt du oben einmal auf true, dies wird ja nur einmal zu Beginn ausgeführt, wenn der Arduino Strom bekommt.
Ich habe die Zeile
einmal = true;
vergessen ![]()
// falls Not Aus rein, millis einfügen, delay raus
const byte pin1B1 = A5; // kapazitiver Sensor
const byte pin2B1 = A4; // Magazin oben/unten
const byte pin3B1 = 2; //Reed "Klemmen" eingefahren
const byte pin3B2 = 3; //Reed "Klemmen" ausgefahren
const byte pin1A1 = 4; // Zylinder "Klemmen"
const byte pin2A1 = 5; // Zylinder "Sperren"
const byte pin3A1 = 6; // Zylinder "Schieben"
const byte pin4A2 = 7; // Zylinder "Sichern"
const byte pin4B1 = 8; // Reed "Sperren" eingefahren
const byte pin4B2 = 9; // Reed "Sperren" ausgefahren
const byte pin5B1 = 10; // Reed "Schieben" eingefahren
const byte pin5B2 = 11; // Reed "Schieben" ausgefahren
const byte pin6B1 = 12; // Reed "Sichern" eingefahren
const byte pin6B2 = 13; // Reed "Sichern" susgefahren
//const byte pinS1 = A0; // Schalter EIN/AUS, noch nicht eingefügt, evtl später
enum States {
stateRuhestellung, stateSperren, stateKlemmen, stateSichernWeg, stateSchieben, stateSchiebenRein, stateSichernHoch, stateKlemmenWeg, stateSperrenWeg
}; // die einzelnen Schritte
//mState = machine State
States mState = stateRuhestellung; //der Startpunkt der Schrittkette
bool einmal = true;
void setup() {
Serial.begin(9600);
pinMode(pin1A1, OUTPUT);
pinMode(pin2A1, OUTPUT);
pinMode(pin3A1, OUTPUT);
pinMode(pin4A2, OUTPUT);
pinMode(pin1B1, INPUT);
pinMode(pin2B1, INPUT);
pinMode(pin3B1, INPUT);
pinMode(pin3B2, INPUT);
pinMode(pin4B1, INPUT);
pinMode(pin4B2, INPUT);
pinMode(pin5B1, INPUT);
pinMode(pin5B2, INPUT);
pinMode(pin6B1, INPUT);
pinMode(pin6B2, INPUT);
digitalWrite(pin1A1, LOW); // bei Neustart Grundstellung
digitalWrite(pin2A1, LOW);
digitalWrite(pin3A1, LOW);
digitalWrite(pin4A2, HIGH);
Serial.println(F("Start"));
}
void loop() {
// mit "when" Schalter abfragen? Switch case nur solange Schalter Ein?
switch (mState)
{
case stateRuhestellung:
{
if (einmal)
{
einmal = false;
digitalWrite (pin2A1, LOW);
Serial.println(F("Ruhestellung"));
}
if (digitalRead(pin1B1) && digitalRead(pin2B1))
{
einmal = true;
mState = stateSperren; // der nächste Schritt
}
}
break;
case stateSperren:
{
if (einmal)
{
einmal = false;
Serial.println(F("Sperren"));
}
if (!digitalRead(pin1B1) && digitalRead(pin2B1))
{
einmal = true;
mState = stateKlemmen;
}
}
break;
case stateKlemmen:
{
if (einmal)
{
einmal = false;
digitalWrite (pin2A1, HIGH); // Zylinder soll ausfahren
Serial.println(F("Klemmen"));
}
if (digitalRead(pin4B2) && digitalRead(pin2B1))
{
einmal = true;
mState = stateSichernWeg;
}
}
break;
case stateSichernWeg:
{
if (einmal)
{
einmal = false;
digitalWrite (pin1A1, HIGH);
Serial.println(F("SichernWeg"));
}
if (digitalRead(pin3B2) && digitalRead(pin2B1))
{
einmal = true;
mState = stateSchieben;
}
}
break;
case stateSchieben:
{
if (einmal)
{
einmal = false;
digitalWrite (pin4A2, LOW);
Serial.println(F("Schieben"));
}
if (digitalRead(pin6B1) && digitalRead(pin2B1))
{
einmal = true;
mState = stateSchiebenRein;
}
}
break;
case stateSchiebenRein:
{
if (einmal)
{
einmal = false;
digitalWrite (pin3A1, HIGH);
Serial.println(F("SchiebenRein"));
}
if (digitalRead(pin5B2) && digitalRead(pin2B1))
{
einmal = true;
mState = stateSichernHoch;
}
}
break;
case stateSichernHoch:
{
if (einmal)
{
einmal = false;
digitalWrite (pin3A1, LOW);
Serial.println(F("SichernHoch"));
}
if (digitalRead(pin5B1) && digitalRead(pin2B1))
{
einmal = true;
mState = stateKlemmenWeg;
}
}
break;
case stateKlemmenWeg:
{
if (einmal)
{
einmal = false;
digitalWrite (pin4A2, HIGH);
Serial.println(F("KlemmenWeg"));
}
if (digitalRead(pin6B2) && digitalRead(pin2B1))
{
einmal = true;
mState = stateSperrenWeg;
}
}
break;
case stateSperrenWeg:
{
if (einmal)
{
einmal = false;
digitalWrite (pin1A1, LOW);
Serial.println(F("SperrenWeg"));
}
if (digitalRead(pin3B1) && digitalRead(pin2B1))
{
einmal = true;
mState = stateRuhestellung;
}
}
break;
}
}
Wird es nun verständlicher?