Wir haben hier eine einfache Waschmaschine als Darstellung vereinfachter Logik und Grundfunktionen von Programmiersprachen.
Im oberen Teil ersetzen wir uns die Pin Nummern des Compilers welche ursprünglich sogar PD0 und ähnlich heissen durch das Logische Bezugswort um damit weiterzuarbeiten.
Danach geht es schon los.. Der kleine Block oben entprellt einen taster und schaltet das Programm 1 aus und wieder ein. Wenn eingeschaltet ist bedeutet das das die Variable Running TRUE ist, True bedeutet hier auch 1 oder High. In der Switch Case Anweisung wird die Variable zustand überprüft und das programm je nach dem Wert in das CASE geführt oder auch direkt ab switch gesprungen. Wenn hier kein zustand passt wird switch und alles in seinen eckigen Klammern ausgelassen.
#include <Time.h> //einfaches Arduino Programm als Waschmaschine int MotorTrommel = 5; // Motorwicklung1 Langsam int Schleudern = 6; // Motorwicklung zusätzlich Schnell int Wasserventil = 7;// HIGH bedeutet Wasser fliesst, LOW Wasser stop int Pumperaus = 8; // Pinzuweisung einfacher Name int WasserstandLeer = 9; // HIGH bedeutet hier jetzt LEER und LOW ist noch was drin (kommt sowieso auf Schliesser/Öffner bzw das gegenpotential GND oder 5V an) int WasserstandVoll = 10; // HIGH bei Maximalen Wasserstand, unterhalb LOW int Trommelrichtung = 11; // 0 Links, 1rechts int KnopfProgramm1 = 12; int Programm1Zeit[] = { 10, 10, 10 }; //Programm1 Intervalle Trommeln links/rechts boolean running = false; int zustand = 0; // Zeigt Ablaufzustand als Zahl, 1 Wassereinlauf fertig,2 Trommel bewegen fertig , 3 Abpumpen ,4 Schleudern/Abpumpen , 5 fertig int zustandtrommel = 0; boolean trommelwechsel=false; //Einschaltzustand void setup() { //Pinmodes setzen ob Input oder Output pinMode(MotorTrommel, OUTPUT); //OUTPUT pinMode(Trommelrichtung, OUTPUT); //OUTPUT 1 Rechts, 0 Links pinMode(Schleudern, OUTPUT); //OUTPUT pinMode(Wasserventil, OUTPUT); //OUTPUT pinMode(Pumperaus, OUTPUT); //OUTPUT pinMode(WasserstandLeer, INPUT); //INPUT pinMode(WasserstandVoll, INPUT); //INPUT pinMode(KnopfProgramm1, INPUT); //INPUT digitalWrite(WasserstandLeer, LOW); //PullDown gegen flattern mit 50MEG gegen GND digitalWrite(WasserstandVoll, LOW); //PullDown gegen flattern mit 50MEG gegen GND digitalWrite(KnopfProgramm1, HIGH); //PullUp gegen flattern mit 50MEG gegen 5V } // Bearbeitungsloop void loop() //wird alles bis zur Prozessorfrequenz wiederholt { if (digitalRead(KnopfProgramm1) == LOW) { // Schalter wird gedrückt - der Pin wird im Normalzustand durch den Pullup auf HIGH gezogen delay(100); // Verzögerung um den Taster zu entprellen running = !running; // Wert der Variablen hin- und herschalten (toggle) // indicate via LED - Anzeige über LED } if (running) { //Loslegen switch (zustand) { case 0: //bei Zustand 0 wird der "LOOP" immer hier einswitchen also Vollpumpen bis HIGH dann sofort aus und zustand 1 if (digitalRead(WasserstandVoll) == LOW) { digitalWrite(Wasserventil, HIGH); //Ventil öffnen Pin setzen } else //Wenn voll, nicht LOW { digitalWrite(Wasserventil, LOW); zustand = 1; } break; case 1: //zustand 1 //Trommel bewegen .. 10 Minuten Links 10 minuten rechts 10 Minuten links trommelwechsel = false; while (zustandtrommel <= sizeof(Programm1Zeit)) //in dieser Schleife bleiben solang nach Programm getrommelt wird { digitalWrite(MotorTrommel, HIGH); digitalWrite(Trommelrichtung, trommelwechsel); delay(Programm1Zeit[zustandtrommel] * 60 * 1000); // Minuten aus Programm1Zeit holen und für Pause in millisekunden umrechnen zustandtrommel++; trommelwechsel = !trommelwechsel; digitalWrite(MotorTrommel, LOW); //Trommel ausschalten für wechsel delay(60 * 1000); //60Sekunden warten } digitalWrite(MotorTrommel, LOW); // Trommel ausschalten zustand = 2; //aus switchcase springen break; case 2: //Abpumpen (Kopiert von Zustand 0, selbes Prinzip) if (digitalRead(WasserstandLeer) == HIGH) { digitalWrite(Pumperaus, HIGH); //Pumpe anschalten } else //Wenn leer, nicht LOW { digitalWrite(Pumperaus, LOW); zustand = 3; } break; case 3: //Schleudern 3 mal 5 Minuten mit 2 Minuten Pause und Wasserstand überprüfen for (int zaehler = 0; zaehler <= 3; zaehler++) { digitalWrite(Pumperaus, LOW); delay(2 * 60 * 1000); //120 Sekunden warten ggf Pumpen digitalWrite(Schleudern, HIGH); digitalWrite(MotorTrommel, HIGH); delay(5 * 60 * 1000); digitalWrite(MotorTrommel, LOW); digitalWrite(Schleudern, LOW); while (digitalRead(WasserstandLeer) == HIGH) //Schleife bis leer { digitalWrite(Pumperaus, HIGH); //Pumpe anschalten } digitalWrite(Pumperaus, LOW); } zustand = 4; break; //fertig!!!!!!!! } }}