/*
Forum: Private Message
Wokwi: https://wokwi.com/projects/437469778645018625
State Machine ohne case-interne Schleifen!
*/
// Eingang Pins setzen
const int pushButton_green = 2;
const int pushButton_red = 3;
// Ausgang Pins setzen
const int ledPin_green = 7;
const int ledPin_red = 4;
const int ledPin_blue = 5;
const int ledPin_orange = 6;
const int nclaueftpin = 8;
const int ncstehtpin = 9;
int i = 0;
// Case Nummern setzen
enum {NC_Wartend, NC_Start, NC_Stopp, NC_Laeuft, NC_Beladen, NC_Entladen} NcStatus = NC_Wartend;
// Unterprogramme
class btClass {
private:
byte pin;
byte state = LOW;
byte lastState = LOW;
unsigned long lastChange = 0;
public:
void init(byte aPin) {
pin = aPin;
pinMode(pin, INPUT);
}
boolean pressed() {
byte actState = digitalRead(pin);
if (actState != lastState) {
lastChange = millis();
lastState = actState;
}
if (state != lastState && millis() - lastChange > 30) {
state = lastState;
return state; // Returniert true, wenn der pin-State HIGH ist!!!
}
return false;
}
};
btClass stoppButton;
btClass startButton;
void Warten() {
if (startButton.pressed()) {
NcStatus = NC_Start;
i = 0;
digitalWrite(ledPin_red, LOW);
digitalWrite(ledPin_green, HIGH);
Serial.println("NC Start - Rot aus - Grün an");
}
}
void NcStart() {
delay(1);
i++;
if (i >= 2000) {
NcStatus = NC_Beladen;
i = 0;
digitalWrite(ledPin_blue, HIGH);
Serial.println("NC Beladen - Blau an");
}
}
void NcBeladen() {
delay(1);
i++;
if (i >= 8000) {
NcStatus = NC_Laeuft;
int i = 0;
digitalWrite(ledPin_blue, LOW);
digitalWrite(nclaueftpin, HIGH);
Serial.println("NC Läuft - blau aus, grün an, NC pin Läuft an ");
}
}
void NcLaeuft() {
delay(1);
i++ ;
if (i >= 15000) {
NcStatus = NC_Entladen;
int i = 0;
digitalWrite(nclaueftpin, LOW);
digitalWrite(ledPin_orange, HIGH);
Serial.println("NC Entladen - Orange an, nc läuft pin an ");
}
}
void NcEntladen() {
delay(1);
i++ ;
if (i >= 8000) {
prepareStopp();
}
}
void prepareStopp() {
NcStatus = NC_Stopp;
int i = 0;
digitalWrite(ledPin_orange, LOW);
digitalWrite(ledPin_blue, LOW);
digitalWrite(ledPin_green, LOW);
digitalWrite(nclaueftpin, LOW);
digitalWrite(ledPin_red, HIGH);
digitalWrite(ncstehtpin, HIGH);
Serial.println("NC Stopp - orange aus, blau aus, grün aus, rot an");
}
void NcStopp() {
delay(1);
i++;
if (i >= 100) {
NcStatus = NC_Wartend;
}
}
// Setup
void setup() {
Serial.begin(9600);
// Pin Modus zuweisung Inputs
startButton.init(pushButton_green);
stoppButton.init(pushButton_red);
// Pin Modus zuweisung Outputs
pinMode(ledPin_green, OUTPUT);
pinMode(ledPin_red, OUTPUT);
pinMode(ledPin_blue, OUTPUT);
pinMode(ledPin_orange, OUTPUT);
pinMode(nclaueftpin, OUTPUT);
pinMode(ncstehtpin, OUTPUT);
digitalWrite(ledPin_red, HIGH);
}
// Hauptprogramm
void loop()
{
if (stoppButton.pressed()) {
prepareStopp();
}
switch (NcStatus)
{
case NC_Wartend:
Warten();
break;
case NC_Start:
NcStart();
break;
case NC_Stopp:
NcStopp();
break;
case NC_Laeuft:
NcLaeuft();
break;
case NC_Beladen:
NcBeladen();
break;
case NC_Entladen:
NcEntladen();
break;
}
}