Zum Inhalt springen

Schleifen

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

    for-Schleife
    Die for-Schleife hat folgende Struktur:

    for (int i=0; i<10; i++){
      // Anweisungen
    }

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


    Sieh dir jetzt meinen neuen Arduino-Videokurs an: Jetzt ansehen!


    Alle Anweisungen, die in den geschweiften Klammern stehen, werden so lange 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.

    do {
      delay(50);
      x = analogRead(3);  // prüft den Sensorwert am Pin 3
    } while (x < 100);

    17 Gedanken zu „Schleifen“

    1. 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

    2. 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.

    3. 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.

    4. 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?

    5. 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

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

    7. 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.

    8. 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);
      }

    9. 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”

    10. 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);
      }

    11. 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

    Die Kommentarfunktion ist deaktiviert.