Schleifen

Schleifen können Anweisungen bis zum Erreichen einer Abbruchbedingung wiederholen.

for-Schleife
Die for-Schleife hat folgende Struktur:

Als Parameter werden in den Klammern die Initialisierung (int i=0), die Abbruchbedingung(i<10) und die Fortsetzung (i++) übergeben.

Alle Anweisungen, die in den geschweiften Klammern stehen, werden solange wiederholt, bis die Abbruchbedingung erfüllt ist.

do-while Schleife
Die do-while Schleife wird auch so lange wiederholt, bis eine Abbruchbedingung eintrifft, allerdings sorgt die do-while Schleife nicht selbst dafür.

16 Comments

  1. Frank

    Hallo,
    ich habe eine Frage. Ich stehe vor dem problem dass ich eine do-while Schleife programmiert habe, welche beim Druck auf einen taster einen Motor fahren lässt, solange dieser gedrückt ist. Jetzt habe ich aber einen Endabschalter welchen den Motor natürlich stoppen soll wenn der Endabschalter gedrückt wird, egal ob man noch auf den Motor-taster drückt oder nicht. Ich probiere seit Stunden rum wie ich das Gelöst bekomme. Aktuell habe ich es so:

    do{
    delay(50);
    fusseinw = digitalRead(fussein);
    obenw = digitalRead (oben);
    digitalWrite(mm, LOW);
    digitalWrite(m, HIGH);
    motorein = 1;
    }while((fussein == 0) && (obenw == 0));

    fusseinw= wert des Tasters für den Motor
    obenw = wert des endabschalter

    Der Motor läuft super an, er hört auch wieder auf wenn man vom Motor-Taster geht, aber der endabschalter ist ihm völlig egal.

    Kann mir hier jemand Helfen ?

    Danke,

    Frank

  2. Frank

    Hey Danke für die schnelle Antwort, hier der ganze Code:

    const int oben = 6;
    const int unten = 8;
    const int fussein = 7;
    const int fussaus = 10;
    const int rueck = 9;
    const int geschw = 11;
    const int m = 3;
    const int mm = 4;
    int obenw = 0;
    int untenw = 0;
    int fusseinw = 0;
    int fussausw = 0;
    int rueckw = 0;
    int geschww = 0;
    int motorein = 0;

    void setup(){
    pinMode(oben, INPUT);
    pinMode(unten, INPUT);
    pinMode(fussein, INPUT);
    pinMode(fussaus, INPUT);
    pinMode(rueck, INPUT);
    pinMode(geschw, INPUT);
    pinMode(m, OUTPUT);
    pinMode(mm, OUTPUT);

    Serial.begin(9600);
    }

    void loop(){
    fusseinw = digitalRead(fussein);
    obenw = digitalRead(oben);

    if(fusseinw == 0)
    {
    if(obenw == 1)
    {
    do{
    delay(50);
    fusseinw = digitalRead(fussein);
    obenw = digitalRead (oben);
    digitalWrite(mm, LOW);
    digitalWrite(m, HIGH);
    motorein = 1;
    }while((fussein == 0) && (obenw == 0));

    }

    }
    fussausw = digitalRead(fussaus);
    if(fussausw == 0)
    {
    if (motorein == 1)
    {
    digitalWrite(mm, HIGH);
    digitalWrite(m, LOW);
    delay(2000);
    motorein = 0;
    }
    digitalWrite(mm, LOW);
    digitalWrite(m, LOW);
    }
    rueckw = digitalRead(rueck);
    if (rueckw == 1)
    {
    do
    {
    untenw = digitalRead(unten);
    digitalWrite(mm, HIGH);
    digitalWrite(m, LOW);
    }while (untenw == 1);
    }
    Serial.println(obenw);
    delay(1);
    }

  3. Hallo Frank,

    ganz nachvollziehen konnte ich den Code nicht, aber ich schlage Dir vor, statt der Schleifen eine State-Maschine (Switch-Case-Abfrage) zu nutzen. Hier wäre mein Vorschlag:

    // Alle Schalter mit PULL_UP Schaltung ausgelegt, d.h. LOW = geschaltet

    const int endschalterObenPin = 6;
    const int endschalterUntenPin = 8;

    const int buttonVorPin = 7;
    const int buttonRueckPin = 9;

    const int motorAPin = 3;
    const int motorBPin = 4;

    int myStatus = 1;

    void setup(){
    pinMode(endschalterObenPin, INPUT);
    pinMode(endschalterUntenPin, INPUT);
    pinMode(buttonVorPin, INPUT);
    pinMode(buttonRueckPin, INPUT);

    pinMode(motorAPin, OUTPUT);
    pinMode(motorBPin, OUTPUT);
    }

    void loop(){

    if ((digitalRead(endschalterObenPin)==LOW)||(digitalRead(endschalterUntenPin)==LOW)){
    myStatus=1; // wenn einer der Endschalter geschlossen ist, dann wird der Motor abgeschaltet
    } else {
    if (digitalRead(buttonVorPin)==LOW){
    myStatus=2;
    } else if (digitalRead(buttonRueckPin)==LOW){
    myStatus=3;
    }
    }

    switch (myStatus){
    case 1: // alles aus
    digitalWrite(motorAPin,LOW);
    digitalWrite(motorBPin,LOW);
    break;
    case 2: // vorwärts
    digitalWrite(motorAPin,HIGH);
    digitalWrite(motorBPin,LOW);
    break;
    case 3: // rückwärts
    digitalWrite(motorAPin,LOW);
    digitalWrite(motorBPin,HIGH);
    break;
    }
    delay(20);
    }

    Ich hoffe, das hilft. Testen konnte ich den nicht, da mir gerade das Setup fehlt.

    Liebe Grüße

    Stefan“

  4. hallo Stefan

    vielen Dank!

    ich habe nun mit deinen Tutorials es geschafft meinen Code für einen staubsaugerroboter zu bastel und es tut auch ABER irgendwie funktioniert im Switchacase die ODER funktion nicht:

    if ((distance > 10)||(buttonState==LOW))

    hier unten kommt der ganze code ohne die Oder-funtkion:

    DANN habe ich noch eine ganz wichtige Frage: wie kann ich es machen dass im case 2 die abstandsmessung ignoriert wird und erst der ganze case 2 durchlaufen wird, bevor er wieder mit den abfragen beginnt. das wäre superwichtig. danke für einen antwort.

    int motor1_A=8;
    int motor1_B=9;

    const int buttonPin = 2;
    int buttonState = 0;

    const int back_buttonPin = 3;
    int back_buttonState = 0;

    int motor2_A=6;
    int motor2_B=7;

    int myStatus = 1;

    #define trigPin 13
    #define echoPin 12
    #define led 11
    #define led2 10

    void setup(){

    Serial.begin (9600);
    pinMode(trigPin, OUTPUT);
    pinMode(echoPin, INPUT);
    pinMode(led, OUTPUT);
    pinMode(led2, OUTPUT);

    pinMode(motor1_A,OUTPUT);
    pinMode(motor1_B,OUTPUT);

    pinMode(motor2_A,OUTPUT);
    pinMode(motor2_B,OUTPUT);

    pinMode(buttonPin, INPUT);

    pinMode(back_buttonPin, INPUT);

    pinMode(led, OUTPUT);
    pinMode(led2, OUTPUT);

    }

    void motorStop(){
    // motor1
    digitalWrite(motor1_A,LOW);
    digitalWrite(motor1_B,LOW);
    // motor2
    digitalWrite(motor2_A,LOW);
    digitalWrite(motor2_B,LOW);
    delay(500);
    }

    void vorw(){
    // motor1
    digitalWrite(motor1_A,HIGH);
    digitalWrite(motor1_B,LOW);
    // motor2
    digitalWrite(motor2_A,LOW);
    digitalWrite(motor2_B,HIGH);

    }

    void rueckw(){
    // motor1
    digitalWrite(motor1_A,LOW);
    digitalWrite(motor1_B,HIGH);
    // motor2
    digitalWrite(motor2_A,HIGH);
    digitalWrite(motor2_B,LOW);
    }

    void ausscheren_motor_l(){
    // drehen 1
    //motor1
    digitalWrite(motor1_A,LOW);
    digitalWrite(motor1_B,HIGH);
    // motor2 ist umgedreht eingebaut- dh gleiche polung low igh M1 und M2 ist gegenläufig
    digitalWrite(motor2_A,LOW);
    digitalWrite(motor2_B,HIGH);
    delay(500);

    // rückwärts
    //motor1
    digitalWrite(motor1_A,LOW);
    digitalWrite(motor1_B,HIGH);
    // motor2
    digitalWrite(motor2_A,HIGH);
    digitalWrite(motor2_B,LOW);
    delay(1000);

    // drehen 2
    //motor1
    digitalWrite(motor1_A,HIGH );
    digitalWrite(motor1_B,LOW);
    // motor2
    digitalWrite(motor2_A,HIGH);
    digitalWrite(motor2_B,LOW);
    delay(2000);
    }

    void ausscheren_motor_r(){
    // drehen 1
    //motor1
    digitalWrite(motor1_A,HIGH);
    digitalWrite(motor1_B,LOW);
    // motor2 ist umgedreht eingebaut- dh gleiche polung low igh M1 und M2 ist gegenläufig
    digitalWrite(motor2_A,HIGH);
    digitalWrite(motor2_B,LOW);
    delay(500);

    // rückwärts
    //motor1
    digitalWrite(motor1_A,LOW);
    digitalWrite(motor1_B,HIGH);
    // motor2
    digitalWrite(motor2_A,HIGH);
    digitalWrite(motor2_B,LOW);
    delay(1000);

    // drehen 2
    //motor1
    digitalWrite(motor1_A,LOW);
    digitalWrite(motor1_B,HIGH);
    // motor2
    digitalWrite(motor2_A,LOW);
    digitalWrite(motor2_B,HIGH);
    delay(500);

    }

    void turn_r(){
    // motor1
    digitalWrite(motor1_A,HIGH);
    digitalWrite(motor1_B,LOW);
    // motor2
    digitalWrite(motor2_A,HIGH);
    digitalWrite(motor2_B,LOW);
    delay(500);
    }

    void loop(){

    long duration, distance;
    digitalWrite(trigPin, LOW); // Added this line
    delayMicroseconds(2); // Added this line
    digitalWrite(trigPin, HIGH);
    // delayMicroseconds(1000); – Removed this line
    delayMicroseconds(10); // Added this line
    digitalWrite(trigPin, LOW);
    duration = pulseIn(echoPin, HIGH);
    distance = (duration/2) / 29.1;

    if (distance > 10){
    myStatus=1; // wenn er vorwaerts fahren soll- kein Hindernis
    } else {
    if (distance < 10){
    myStatus=2;// wenn entfernung unter 10 Cm oder der taster aktiviert wurde
    } else if (digitalRead(back_buttonState)==HIGH){
    myStatus=3;// anstossen beim rueckwärtsfahren
    }
    }

    switch (myStatus){
    case 1: // vorwärts
    vorw();
    digitalWrite(led,HIGH);
    digitalWrite(led2,LOW); // When the Red condition is met, the Green LED should turn off
    break;

    case 2: // hindernis, wand
    digitalWrite(led2,HIGH);
    digitalWrite(led,LOW);
    motorStop();
    delay (2000);
    ausscheren_motor_l;
    digitalWrite(led2,HIGH);
    digitalWrite(led,HIGH);
    turn_r();
    digitalWrite(led2,HIGH);
    digitalWrite(led,LOW);
    delay(3000);
    rueckw();
    digitalWrite(led2,HIGH);
    digitalWrite(led,HIGH);
    delay(5000);
    motorStop();
    delay(1000);
    break;

    case 3: // rückwärts
    turn_r();
    delay(1000);
    break;
    }
    delay(20);
    }

  5. Matthias

    Ich arbeite an einem Arduino Projekt und dafür brauche ich eine Schleife, die nur 100 mal durchläuft. Ich weis aber nicht wie so etwas geht.

  6. Himbeertoni

    joah wadd issn dadd fürn getüddel middn adduinnoding ich glob ich hau dadd dinggens einfach inne tonne waddn fluch vonne technik

  7. Horst

    Arduino ist Klasse wenn man sich Anfangs dafür etwas Zeit nimmt. Ich hab mir schon einige brauchbare Anwendungen gebastelt ;-)

    @Mathias: … oder so…
    for(int i=0;i<99;i11)
    {
    //mach was gemacht werden muss
    }

    Grüassle, Horst

  8. Lena

    Hallo, ich möchte einen Potentiometer bauen, der mir mit 5 leds anzeigt, wie viel Volt anliegen ( also bei U<1 eine led, bei U<2 zwei leds usw.) kann ich dafür ein For-Schleife verwenden, wenn ja, wie?

  9. Hallo Ihr Schleifen-Experten,
    ich programmiere gerade eine Modelleisenbahn mit einem Arduino: Von A geht es nach B von da zu C und von C wieder zurück nach A. Das Ein- und Ausschalten der Relais mit den entsprechenden Pausen funktioniert gut. Die Abfrage an PIN 2 für die Gleisbesetzmeldungen bekomme ich nicht hin. Könnt Ihr mir helfen?
    In GW-Basic mit Zeilennummern bekomme ich es hin:
    1. Zeile: 100 Abfrage an PIN 2
    2. Zeile: 110 if m=112 then 130
    3. Zeile: 120 goto100
    4. Zeile: 130 fahre im Programm fort
    Wie bekomme ich im „Spaghetti-Programm“ des Arduino die Endlosschleife hin, die erst dann verlassen wird, wenn das Ereignis von 0 nach 1 wechselt? Solange das Ereignis 0 bleibt soll erneut abgefragt werden, bis der Zug da ist und das Ereignis 1 wird.
    Vielen Dank schon mal im voraus.
    Gruß Uli.

  10. Fred

    Kann ich in die Fortsetzungsbedingung bei der Firma Schleife auch

    digitalWrite (Teig, HiGh);
    Delay(5);
    …..

    Usw. Eingeben?

  11. Luca Amato

    Hallo,
    ich habe ein Problem:
    Ich möchte zwei Schrittmotoren getrennt und in verschiedene Richtungen gleichzeitig laufen lassen.
    Nun habe ich alle Abläufe eingegeben. Nun muss ich die Anzahl der Umdrehungen jeweils verlängern damit sich die Motoren länger drehen. Außerdem brauche ich eine geeignete Schleife die diese Abläufe häufig wiederholt.
    Ich bin auf diesem Gebiet eine Laie und benötige dringend Hilfe.

    Vielen Dank im vorraus.

  12. christian

    moin, ich möchte eine for schleife unterbrechen können und zwar per tastendruck, der taster kommt von einem lcd shild und wir analog angesteuert.
    wie kann ich in die for schleife so einen unterbrechung einbauen, hab das schon mit break versucht aber dann bricht nach einem durchgang die schleife schon ab.

    bitte um hilfe

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.