Fehler im Code, While Schleife wird immer wieder ausgeführt.

Guten Tag, ich bitte um Hilfe!
Irgendwo mache ich einen Fehler im Programm!
Ich habe eine While Schleife und sobald die Bedingung erfüllt ist (Taster gedrückt) sollte eigentlich nur der Code innerhalb der Klammern ausgeführt werden und dann zum Nächsten code übergegangen werden.
Leider ist dem nicht so! Der Code wird immer wieder erneut ausgeführt und der danach folgende Code wird ignoriert!
Was mache ich flasch?
Ich werde mich auch gerne erkenntlich zeigen!

const int buttonPin1 = 2; 
const int ledPin =  13;      
const int RelayPin1 = 11;
const int RelayPin2 = 10;
const int RelayPin3 = 9;
const int RelayPin4 = 8;
const int RelayPin5 = 7;
const int buttonPin3 = 3;
const int SensorPositionPin4 = 4;

int buttonState1 = 0;  
int buttonState3 = 0;
int SensorState4 = 0;

void setup() {
 pinMode(ledPin, OUTPUT);
 pinMode(buttonPin1, INPUT);
 pinMode(buttonPin3, INPUT);
 pinMode(RelayPin1, OUTPUT);/*Pin 11*/
 pinMode(RelayPin2, OUTPUT);/*Pin 10*/
 pinMode(RelayPin3, OUTPUT);/*Pin 9*/
 pinMode(RelayPin4, OUTPUT);/*Pin 8*/
 pinMode(RelayPin5, OUTPUT);/*Pin 7*/
 pinMode(SensorPositionPin4, INPUT);/*Pin 4*/
}

void loop() {
 digitalWrite(RelayPin1, HIGH);
 digitalWrite(RelayPin2, HIGH);
 digitalWrite(RelayPin3, HIGH);
 digitalWrite(RelayPin4, HIGH);
 digitalWrite(RelayPin5, HIGH);
 buttonState1 = digitalRead(buttonPin1);

 while (buttonState1 == HIGH) {
   digitalWrite(ledPin, HIGH);
   digitalWrite(RelayPin5, LOW);/*Pin 7 Relais Druckluft Sperrung vor Flasche zu*/
   delay(2000);
   digitalWrite(RelayPin1, LOW);/*Pin 11 Relais Motor start*/

   /*Bis hier funktioniert alles super, aber dann geht er nicht zum nächsten Teil über,
   sondern wiederholt den in Klammern gesetzten Teil der While Schleife immer wieder!*/
}
{
   delay(4000);
   digitalWrite(RelayPin1, HIGH);
   }
   }
 while (buttonState1 == HIGH) {
    digitalWrite(ledPin, HIGH);
    digitalWrite(RelayPin5, LOW);/*Pin 7 Relais Druckluft Sperrung vor Flasche zu*/
    delay(2000);
    digitalWrite(RelayPin1, LOW);/*Pin 11 Relais Motor start*/
}

Die Variable buttonState1 bleibt innerhalb der While Schlaife gleich und darum wird das eine Endlosschleife.
Du mußt innerhalb der While Schlaife die Variable einlesen um änderungen hervorzurufen.

also zB

 while (digitalRead(buttonPin1) == HIGH) {
    digitalWrite(ledPin, HIGH);
    digitalWrite(RelayPin5, LOW);/*Pin 7 Relais Druckluft Sperrung vor Flasche zu*/
    delay(2000);
    digitalWrite(RelayPin1, LOW);/*Pin 11 Relais Motor start*/
}

Ob delay sinnvoll oder Kontraproduktiv ist, ist eine andere notwendige Betrachtung Deines Sketches.

Grüße Uwe

(deleted)

vasa-fit:
Guten Tag, ich bitte um Hilfe!
Irgendwo mache ich einen Fehler im Programm!

Was mache ich flasch?
Ich werde mich auch gerne erkenntlich zeigen!

Setze Deinen Sketch in codetags - das ist das Symbol “</>” oben links im Editor. (geht auch nachträglich)

Wenn Du den Taster einfach nur an +5V und den PIN angeschlossen hast, dann hast Du einen grundlegenden Fehler.
HIGH ist alles was nicht 0 ist.
LOW ist 0 und nichts anderes.

Dein INPUT-PIN liefert Dir immer HIGH, weil Du keinen definierten Zustand einstellst.

Ändere Deinen Code an den Stellen:

pinMode(buttonPin1, INPUT_PULLUP);

 while (buttonState1 == LOW) {

Und baue den Taster von GND nach PIN

bau dir eine Variable mit der du dir merkst, dass du schon mal da warst und werte diese vor der Schleife aus.

Wenn eine Schleife nur ein mal durchlaufen werden soll, ist diese while Schleife eher überflüssig, und sollte durch eine if Anweisung ersetzt werden.
Da muss dann auch nichts mehr gemerkt werden.

(deleted)

Hi

Wie ich Das lese, soll Da ein zeitlicher Verlauf abgebildet werden, Der Sich um eine Gasflasche dreht.
Wenn Das die einzige Aufgabe sein soll, spricht nur die Ästhetik gegen delay() (und die Zukunft, wo Einem Das mit Sicherheit auf die Füße fällt).
Bis jetzt tendiere ich auch zu der Lösung, den Taster einfach innerhalb der Schleife erneut einzulesen - oder das Einlesen in die Bedingung zu verlagern, da dann nur 1x notwendig (statt vor und innerhalb der Schleife).

Was der Mars-Rover hier wirklich tun soll, bleibt ja erst Mal im Dunkeln.

MfG

Danke schon mal für die Infos.
Wenn ich das so schreibe wie "uwefed" es vorschlägt, dann funktioniert mein Taster nicht mehr.

while (digitalRead(buttonPin1) == HIGH) {
   digitalWrite(ledPin, HIGH);
   digitalWrite(RelayPin5, LOW);/*Pin 7 Relais Druckluft Sperrung vor Flasche zu*/
   delay(2000);
   digitalWrite(RelayPin1, LOW);/*Pin 11 Relais Motor start*/
}

Wenn ich es durch "if" erstze "laut Peter" funktioniert der Taster ebenfalls nicht!

if (buttonPin1 == HIGH) {
   digitalWrite(ledPin, HIGH);
   digitalWrite(RelayPin5, LOW);/*Pin 7 Relais Druckluft Sperrung vor Flasche zu*/
   delay(2000);
   digitalWrite(RelayPin1, LOW);/*Pin 11 Relais Motor start*/
   /*Bis hier funktioniert alles super, aber dann geht er nicht zum nächsten Teil über,
   sondern wiederholt den in Klammern gesetzten Teil der While Schleife immer wieder!*/
}
{
   delay(4000);
   digitalWrite(RelayPin1, HIGH);
   }
   }

Wenn ich es wie zuvor nutze, dann wartet das Programm bis ich den Taster betätige und führt dann erst den Code aus. Allerdings in endlos schleife. Ich würde das ja verstehen wenn ich einen Schalter hätte der immer HIGH hat aber wenn einmal die Bedingung HIGH erfüllt ist, sollte doch auch nur einmal der in Klammern befindliche Code ausgeführt werden, oder liege ich da falsch? Gibt es vielleicht einen "Goto" Befehl wo ich dem Programm mitteilen kann an welcher Stelle es weiter machen soll?

Hi

Du fragst den Schalter ab - und weist das Ergebnis in eine Variable.
In Deinem Sketch vrgleichst Du diese Variable, NICHT DEN TASTER, mit dem HIGH - siehst Du das Problem?

Auch ist mir noch nicht wirklich klar, WAS Du willst - Deinen Lösungsversuch sehe ich, aber Dein Problem, Welches Du Damit zu umschiffen suchst, ist mir gänzlich unbekannt.

Möglich - eher sehr wahrscheinlich, daß Dein Weg eine Sackgasse, mindestens ein Weg angefüllt mit Stolpersteinen ist.
Eine Landstraße oder gar Autobahn wird Das So nie.

Also noch Mal:
WAS DU WOLLE?
Bitte so, daß auch Deine Oma Das verstehen würde (Rubberduck-Debugging)

... goto ... delay() und while - dann sollten wir Sie langsam zusammen haben :slight_smile:

MfG

Ich wollte hier nicht alles posten weil ich keinem die Zeit stehlen will sondern nur dieses eine Problem gelöst haben. Aber ich möchte im Gesamten folgendes:
Ich habe eine Abfüllmaschine gebaut und möchte diese nun ansteuern. 1,2,3,4 müssen nach der reihe abgefragt, und erledigt werden, Es kann also nicht sein das der Sensor in Punkt 2 irgendeine Aktion ausführt wenn Punkt 1 noch nicht erfüllt ist!

  1. Taster 1 wird betätigt, Förderband läuft an und Pneumatische Absperrung hinter der Flasche geht zu.

  2. Sensor 1 erkennt, dass eine Flasche gegen die Absperrung gelaufen ist, stoppt das Band, zweite Absperrung vor der Flasche geht zu, Befüllstutzen fährt runter, delay 2sec., Befüllung startet, delay 4 sec., Befüllstutzen fährt hoch, Absperrung hinter der Flasche geht auf, delay 2 sec., Förderband läuft an.

  3. Sensor 2 erkennt die vorbeifahrene gefüllte Flasche, Absperrung vor der Flasche geht auf, Absperrung hinter der Flasche geht zu. jetzt beginnt wieder Punkt 2.

Gerne könnt ihr mich auch gerne anrufen. ich zahle auch gerne für Hilfe oder spende was.
[EDIT] Telefonnummer entfernt User bitte über PM kontaktieren. Uwe[/EDIT]

Füllst Du Bier ab? Da kann man sich einigen :wink: :wink: :wink:
Ansonsten helfen wir auch unentgeldlich.

Vorsicht - der Uwe wohnt ganz weit weg :wink:

Mache eine Schritt-Kette draus - State-Maschine, endlicher Automat.

In jedem Schritt prüfst Du auf die Bedingung, Die zum nächsten Schritt führt - sonst machst Du Nichts.

Du hast noch zu viele Schritte in einem Punkt zusammen - erkennt Taster 1 eine Flasche, oder was treibt Der?
Irgendwie musst Du das Förderband an bekommen.
Irgendwie musst Du den Kram auch gezielt abschalten können - selbst wenn der Ablauf so steht, läuft die Maschine, bis keine Flasche mehr kommt - also das Förderband wird so nie abschalten.

MfG

Hat jemand bitte mal ein Beispielcode für so eine "State-Maschine, endlicher Automat."

Suche hier im Forum nach dem Nachtwächter :wink:

``

Gibt es vielleicht einen "Goto" Befehl wo ich dem Programm mitteilen kann an welcher Stelle es weiter machen soll?

Ja.

[ot]
Ich habe hier schon so viel Haue für Gotos bekommen, so dass ich sie mittlerweile so tief im Code verbuddel, dass sie kaum einer mehr sieht.
:smiling_imp: :smiling_imp: :smiling_imp:
[/ot]

Ansonsten stimme ich den anderen zu!
Du möchtest eine klassische Ablaufsteuerung bauen.

Ablaufsteuerung
Meine Standardantwort zu Ablaufsteuerungen:

Eine Stichworte Sammlung für Google Suchen:
Endlicher Automat,
ProtoThreads,
State Machine,
Multitasking,
Coroutinen,
Ablaufsteuerung,
Schrittkette,
BlinkWithoutDelay,

Blink Without Delay
Die Nachtwächter Erklärung

[MicroBahner/MobaTools/url]
Intervall Macro
Multitasking Macros
INTERVAL Ersatzstoff
CooperativeTask[/quote]

Grrr....
Der Editor fügt eigenständig einen öffnenden CodeTag hinzu!
Das nervt.](GitHub - MicroBahner/MobaTools: Arduino library for model railroaders)

postmaster-ino:
Vorsicht - der Uwe wohnt ganz weit weg :wink:

Ich denke ja nicht nur an mich, sondern auch an Euch.
Ich fahre zwar auch manchmal in den Urlaub aber heuer scheint es nur Italienurlaub zu geben. Die anderen wollen mich nicht.
Mal schauen ob es im September die Maker Faire in Hannover gibt.
Grüße Uwe

Ich danke euch allen, aber ich bin mehr verwirrt wie zuvor und jetzt alles ausprobieren bis ich etwas finde was funktioniert macht mich völlig kirre!
ich würde am liebsten meien Code behalten, verstehe aber nach wie vor nicht warum das Programm quasi in der Schleife gefangen bleibt anstelle zum nächsten Punkt über zu gehen.
Wenn sich jemand ein paar hundert Euro verdienen will um das kurzfristig zu programieren was ich brauche, dann bitte melden. Meine Firma ist in 63450 Hanau und wir arbeiten von 7:00Uhr früh bis 24:00Uhr in der Nacht. Jemand der das schon oft gemacht hat, verdient sich schnelles Geld! Danke!

Ich danke euch allen, aber ich bin mehr verwirrt wie zuvor ...

Das passiert kurz bevor alles klar wird.

ich würde am liebsten meien Code behalten, verstehe aber nach wie vor nicht warum das Programm quasi in der Schleife gefangen bleibt anstelle zum nächsten Punkt über zu gehen.

Das mit der Schleife ist: Du sitzt zuhause und wartest daß Dein Bekannter Dich über das Händy anruft um auszumachen wo Ihr Euch trefft. Du hast aber das Händy ausgeschaltet. Du wirst den ganzen Tag zuhause sitzen weil Dein Händy nie klingelt.

buttonState1 = digitalRead(buttonPin1);                                   // So klingelt das Händy

while (buttonState1 == HIGH) {                                               // Hier klingelt es nie
    digitalWrite(ledPin, HIGH);
    digitalWrite(RelayPin5, LOW);/*Pin 7 Relais Druckluft Sperrung vor Flasche zu*/
    delay(2000);
    digitalWrite(RelayPin1, LOW);/*Pin 11 Relais Motor start*/ 
}

Grüße Uwe

vasa-fit:
Ich danke euch allen, aber ich bin mehr verwirrt wie zuvor und jetzt alles ausprobieren bis ich etwas finde was funktioniert macht mich völlig kirre!

Dafür gibt es keinen Grund.
Du hast im Kopf eine Idee - die mag gut sein - aber schreib auf, was wann und wie passieren soll.

Ich hab das mal versucht und ein Ergebnis. Das tut.

ich würde am liebsten meien Code behalten, verstehe aber nach wie vor nicht warum das Programm quasi in der Schleife gefangen bleibt anstelle zum nächsten Punkt über zu gehen.

Weil Du die Bedingung nicht veränderst.
Solange Dein Code sich in der Schleife befindet und sich die Bedingung für diese Schleife nicht ändert, kommst Du da auch nicht raus.

Wenn sich jemand ein paar hundert Euro verdienen will um das kurzfristig zu programieren was ich brauche, dann bitte melden. Jemand der das schon oft gemacht hat, verdient sich schnelles Geld! Danke!

Ich bin grundsätzlich dafür JEDEM hier im Forum zu helfen und das Verständnis rund um die ARDUINO-Platform näher zu bringen.
Wenn Du lieber Geld ausgeben willst, dann wird sich hier sicher jemand finden, aber das ist dann die falsche Kategorie.
Suche hier:

Gigs and Collaborations

Are you making a project and need people to help out, calls for projects for exhibitions, fairies

Ich gebe Dir auf den Weg meinen kurze Codebau.
Da Du nicht erzählst, was das insgesamt wird und das Projekt als solches eher vage ist, kann ich hier auch nicht weiter machen.

Wenn Du was ausgeben willst: Gehe Blut spenden.

/* Sketch kommentiert */

const int buttonPin1 = 2;                    // Taster 1
const int buttonPin3 = 3;                    // Taster 2
const int SensorPositionPin4 = 4;            // Sensorpin Endschalter?
const int ledPin =  13;                      // optische Ausgabe
const int RelayPin1 = 11;                    // Relais werden deklariert,
const int RelayPin2 = 10;                    // aber nur 1 und 5 genutzt
const int RelayPin3 = 9;
const int RelayPin4 = 8;
const int RelayPin5 = 7;

/*
    Hier kommt jetzt die erste entscheidende Änderung:
    Ich hatte bereits darauf hingewiesen, das an den PIN für digitalRead()
    ein definierter Zustand vorgegeben werden muss.
    Mit INPUT_PULLUP werden die PIN HIGH gezogen.
    Die Taste wird dann vom PIN nach GND gelegt
    Der definierte Zustand zur Auswertung ist dann LOW
*/

bool buttonState1 = HIGH;                    // Da nur Status abgefragt wird
bool buttonState3 = HIGH;                    // ist hier boolean vorgegeben
bool SensorState4 = HIGH;                    // Es ändert sich die Logik

void setup() {
  pinMode(ledPin, OUTPUT);                   // OnBoard LED
  pinMode(buttonPin1, INPUT_PULLUP);         // HIGH vorbelegt
  pinMode(RelayPin1, OUTPUT);                // Pin 11
  pinMode(RelayPin5, OUTPUT);                // Pin 7
  /*
   * ungenutzt
  pinMode(buttonPin3, INPUT_PULLUP);
  pinMode(SensorPositionPin4, INPUT_PULLUP);
  pinMode(RelayPin2, OUTPUT);// Pin 10
  pinMode(RelayPin3, OUTPUT);// Pin 9
  pinMode(RelayPin4, OUTPUT);// Pin 8
  */
}

void loop() {
  digitalWrite(RelayPin1, HIGH);             // Relais sind LOW-Aktiv
  /*
     ungenutzt
    digitalWrite(RelayPin2, HIGH);
    digitalWrite(RelayPin3, HIGH);
    digitalWrite(RelayPin4, HIGH);
  */
  digitalWrite(RelayPin5, HIGH);             // Beide Relais in Ruhezustand
  buttonState1 = digitalRead(buttonPin1);    // Speichert PIN-Status - Wozu?

  /* 
   * Der Status von buttonState1 verändert sich ab hier NIE mehr. 
   * Damit wird kein EXIT-Point aus dem While-Statement erreicht
   * Wird der Status der Taste als Bedingung genommen, sieht das
   * wie folgt aus:
   */

  while (digitalRead(buttonPin1) == LOW) {   // Wenn Taste gedrückt
    digitalWrite(ledPin, HIGH);              // mach LED an
    digitalWrite(RelayPin5, LOW);            // Aktiviere Relais an PIN 5
    delay(2000);                             // warte 2 Sekunden
    digitalWrite(RelayPin1, LOW);            // Aktiviere Relais an PIN 1

    /*Bis hier funktioniert alles super, aber dann geht er nicht zum nächsten Teil über,
      sondern wiederholt den in Klammern gesetzten Teil der While Schleife immer wieder!*/

  }
  /*
     Hier hört jetzt der Teil auf, wenn die Taste wieder losgelassen wird, geht es weiter.
     ABER: Die RelaisPIN haben am Ende dieses Programmteils noch immer den Zustand LOW
     und werden diesen auch nicht los.
  */

  {
    delay(4000);                            // Warte 4 Sekunden
    digitalWrite(RelayPin1, HIGH);          // Deaktiviere Relais an PIN 1 - Unnütz,
                                            // da am begin von loop() alles ausgemacht wird
  }
}

uwefed:
Mal schauen ob es im September die Maker Faire in Hannover gibt.

soviele fragende Smileys wie ich wollte, kann ich hier gar nicht eintippen.

Ich muss Dich enttäuschen und möchte Dich notgedrungen auf den aktuellen Stand bringen