Was bedeutet pos = in for Schleife

Hi,

Ich möchte mir eine Useless Box bauen.
Den Code würde ich gerne selber schreiben. Im Internet hatte ich Code gefunden und habe versucht ihn zu verstehen (Programmiere sonst in Python)

void loop()
{

  //if the switch is on, then move door and hand to switch it off...
  if(digitalRead(switch_pin) == HIGH)
  {
    
  if (Testmove == 0)
  {
      
    if(randomize == false)
    {  
      if (selectedMove > 10) 
      {
      selectedMove = 0; //when all moves are played, repeat the moves from beginning 
      }
    } 
    else 
    {
    selectedMove = random(11);
    }
  }
  else 
  {
  selectedMove = Testmove;
  }
  Serial.println(selectedMove);
  if (selectedMove == 0) { switchoff(); }
  else if (selectedMove == 1) { switchoff(); }   
  else if (selectedMove == 2) { switchoffbitaraddod(); }
  
   
  if (Testmove == 0 && randomize == false) {
  selectedMove++;         //swith to next move if not in test mode
  }

}
}

// Library of moves

   // basic move 
   void switchoff() 
   {    
   //Moving door
    for(pos = 80; pos < 155; pos += 3)   
    {                                   
    doorServo.write(pos);              
    delay(15);                       
    }
   
    //Moving hand
    for(pos = 0; pos < 129; pos += 4)  
    {                                   
    handServo.write(pos);               
    delay(15);                       
    }  
    
    //hiding hand
    for(pos = 129; pos>=0; pos-=4)      
    {                                
    handServo.write(pos);               
    delay(15);                        
    } 
      
    //hiding door
    for(pos = 155; pos>=80; pos-=3)     
    {                                
    doorServo.write(pos);              
    delay(15);                      
    } 
   } 
     
   // move 3: open and wait, then move hand and wait, then switch of and hide  
    void switchoffbitaraddod()
   {
  //Moving door
    for(pos = 80; pos < 155; pos += 3)   
    {                                   
    doorServo.write(pos);              
    delay(15);                       
    }
    delay(800); 
    //Moving hand
    for(pos = 0; pos < 100; pos += 4)  
    {                                   
    handServo.write(pos);               
    delay(15);                       
    }
    delay(1000); 
    for(pos = 100; pos < 129; pos += 4)  
    {                                   
    handServo.write(pos);               
    delay(15);                       
    }    
    
    //hiding hand
    for(pos = 129; pos>=0; pos-=5)      
    {                                
    handServo.write(pos);               
    delay(15);                        
    } 
      
    //hiding door
    for(pos = 155; pos>=80; pos-=3)     
    {                                
    doorServo.write(pos);              
    delay(15);                    
     
     
   } 
     
   }
  1. Warum eine for Schleife
  2. Wofür wird das pos = in der Schleife genutzt

Danke im Vorraus

Warum? Keine Ahnung, da Du nicht beschrieben hast, was die Schleife machen soll. Ich vermute, den Riegel zu verschieben.

pos = wert; setzt den Anfangswerrt der Schleife.

Gruß Tommy

Ich habe noch den vollständigen Code falls der mehr hilft. Dieser ist nur gekürzt

Lies einfach hier nach, wozu for-schleifen nützlich sind.
Und pos gibt den Wert vor, der vom Servo angefahren werden soll.

Hi CaptianIglu,

'pos' ist hier die Variable, die in der Schleife hoch oder runter gezählt wird. Wobei hier pos lediglich der Variablen-Name und damit frei wählbar ist. Und mit pos = wird dieser Variablen der Start-Wert zugeswiesen, ab dem gezählt wird. Ich gehe davon aus, das hier pos als abkürzung für 'position' gedacht ist.

LG Stefan

Hallo,

oder auf deutsch

deutsch

Heinz

Jetzt habe ich es verstanden.

Der 2. pos Wert ändert den ersten also?

Da ich das in Python anders schreibe hat es für Verwirrung gesorgt.

Könnte ich das zweite pos (for(pos = 80; pos < 155;pos += 3)

Wird nach jedem Durchgang der pos Wert um 3 erhöht? Habe ich das so richtig verstanden?
Würde das ändern des Wertes auch in der Schleife vor der Delay() Funktion funktionieren?

Ja, in diesem Fall wird der Wert immer um 3 erhöht, bis pos 155 erreicht hat.

Das mit der delay()-Funktion habe ich nicht verstanden.

for(pos = 155; pos>=80; pos-=3)
{
doorServo.write(pos);
pos-=3
delay(15);
}

Würde das gehen? Da wo jetzt der blaue pos Wert ist nichts und stattdessen da wo der grüne ist

Das es so aussehen würde?

for(pos = 155; pos>=80;)
{
doorServo.write(pos);
pos-=3
delay(15);
}

Warum schreibst Du dann nicht gleich
for(pos = 155; pos>=80; pos-=3) ?

Gruß Tommy

Du hast dir ja nichtmal die Links von uns durchgelesen.
Dann würdest du nicht diese Frage stellen.

Ich habe mir das schon durchgelesen und wollte nur sichergehen ob es theoretisch möglich wäre. Auch wenn es nicht in der Dokumentation steht könnte es ja sein das es funktioniert

CaptianIglu:
Ich habe mir das schon durchgelesen und wollte nur sichergehen ob es theoretisch möglich wäre. Auch wenn es nicht in der Dokumentation steht könnte es ja sein das es funktioniert

Gelesen schon, aber auch verstanden ?
Was sagt denn die Syntax aus ?

Hi

Wenn Python schon kein FOR kennt - GOTO wird's aber doch wohl hoffentlich geben, oder??

... sorry für OT ...

Wenn du jetzt die for schleife meinst.

  1. Wert wird zu Beginn festgelegt.
  2. ist die Bedingung die erfüllt werden muss
    3.wenn die schleife durchläuft wird die variable geändert

Da der 1.wert die Bedingung erfüllt wird die schleife ausgeführt und in dem Fall wird der Servolenkung bewegt.
daraufhin wird der pos wert erhöht.
Das wiederholt sich bis die Bedingung false ist

Hallo,

wenn Du nicht genau weißt ob es funktioniert dann kannst Du das doch eben mal ausprobieren, das ist in dem Fall in 2 Minuten gemacht. Dazu erstellst Du einfach einen kleinen Sketch und lässt dir mit Serial.print () ausgeben was immer du willst.

In der Refferenz sind oft auch kleine Beispiele enthalten , die kann man auch mal eben kopieren und einfügen wenns denn sein muss.

in Deinem Sketch dienen die for Schleifen mit dem delay() ja dazu den Servo langsam von pos1 auf pos2 fahren zu lassen. Wenn Du irgendwann mal zwei Servos gleichzeitig unterschiedich schnell fahren lassen willst kommst du damit nicht weiter. Aber das ist ein ganz anderes Thema.

Dann hab ich da noch eine Anmerkung zu Deinem Eröffnungspost, wenn Du hier einen Sketch reinstellts dann bitte so das er lauffähig ist. Das mancht dann Sinn wenn wir das den laufen lassen wollen um eventuell einen Fehler zu finden.

Heinz

postmaster-ino:
Wenn Python schon kein FOR kennt - GOTO wird's aber doch wohl hoffentlich geben, oder??

Das hat mich jetzt tatsächlich auch interessiert!
Konnte mir nicht vorstellen, dass es da groß anders ist. Ist es aber:

Es gibt die klassische While-Schleife

while i < 5:
   print(i)
   i += 1

Und die For-Schleife, die in meinem Sprachgebrauch eine Foreach-Schleife wäre.
Es wird zwingend über eine Sequenz iteriert.

for x in range(5)
   print(x)

Oder

for x in ['a', 'b', 'c']
   print(x)

Wieder was gelernt! Zum Beispiel weshalb ich kein Python verwende ;D

Es gibt auch

for x in range(0,10)
    print(x)

was etwa unserer for-Schleife entsprechen würde.

Gruß Tommy

CaptianIglu:
Würde das gehen?

Wenn man etwas die Phantasie bemüht, kommt man auf verschiedene Varianten, hier eine Auswahl:

void setup() {
  Serial.begin(9600);
  byte var = 0;
  Serial.print("Variante: "); Serial.println(++var);
  int8_t pos;
  for (pos = 29; pos > 0; pos -= 5)
  {
    Serial.println(pos);
  }
  Serial.print("\nVariante: "); Serial.println(++var);
  for (pos = 29; pos > 0;)
  {
    Serial.println(pos);
    pos -= 5;
  }
  Serial.print("\nVariante: "); Serial.println(++var);
  pos = 29;
  for (;;)
  {
    Serial.println(pos);
    pos -= 5;
    if (!(pos > 0)) break;
  }
  Serial.print("\nVariante: "); Serial.println(++var);
  pos = 29;
  while (pos > 0)
  {
    Serial.println(pos);
    pos -= 5;
  }
  Serial.print("\nVariante: "); Serial.println(++var);
  pos = 29;
  while (1)
  {
    Serial.println(pos);
    pos -= 5;
    if (!(pos > 0)) break;
  }
  Serial.print("\nVariante: "); Serial.println(++var);
  pos = 29;
  do
  {
    Serial.println(pos);
    pos -= 5;
  }
  while (pos > 0);
  Serial.print("\nVariante: "); Serial.println(++var);
  pos = 29;
weiter:
  Serial.println(pos);
  pos -= 5;
  if (pos > 0) goto weiter;
}

void loop()
{}

Manche dieser Varianten habe ich noch nie verwendet, aber es schadet nicht, Alternativen zu kennen. So kann es nützlich sein, mittels break eine Schleife zu verlassen.

CaptianIglu:
Ich möchte mir eine Useless Box bauen.

Das habe ich auch schon gemacht.

Ganz nutzlos wird die Box dann nicht, wenn Du etwas lernst. So solltest Du gänzlich auf das blockierende delay() verzichten und Zeiten mit millis() stoppen. Laß an Deiner Box eine Herzschlag-Led blinken, dann ist die Box für Dich nützlich.