Kalibrieung duch Lichtschranken und Random Befehl 3mal

Hallo ihr Lieben!

Ich bin ganz neu auf dem Gebiet Arduino / Mircocontroller, doch will dies gerne Lernen und habe mir ein ( für mich) riesen Projekt ausgesucht was ich Starten möchte.
Ich habe mich dafür entschieden da ich, so hoffe ich, den perfekten Start was das Programmieren angeht mache. Reines Lernen / Lesen führt bei mir dazu das ich schnell Vergesse was ich gerade "gelernt" habe.

Mein Projekt ist ein Geldspielautomat wie Ihr ihn aus Kneipen kennt zu Bauen. Dafür habe ich mir alte irreperable Geldspielautomaten besort um davon die Teile zu benutzen ( Stepper, Münzprüfer, Auszahleinheit ect.)

Nun habe ich schonmal den Anfang gemacht und der ersten schritte des Codes geschrieben.
Leider weiß ich zurzeit nicht weiter.

Ich will das der Automat sich beim einschalten "kalibriert". Das soll heißen dass die Stepper ( walzen) sich zum beginn drehen bis die Lichtschranke unterbrochen wird (Nullpunkt)
dies Dachte ich kann ich durch eine if else / else if machen kann.
Leider hat er sich Kalibriert sobald eine von drei Lichtschranken betätigt wurden.
vielleicht weiß jemand was ich hier ändern müsste.
Ich denke der Absatz vom Sketch reicht aus ( damit es hier übersichtlicher bleibt)

}
//Rotation der Walzen

void rotate(int cur, int x, int y, int z)
{
  if (cur <= x) {
    stepper1Forward();
  }

  if (cur <= y) {
    stepper2Forward();
  }

  if (cur <= z) {
    stepper3Forward();
  }
}



 void kalibrieren  ()
{
  bool initKal = true;
do {
  
  //Walze 1
  lichtwert1 = digitalRead (lichtschranke1);
  Serial.println (lichtwert1);
  
  //Walze 2
  lichtwert2 = digitalRead (lichtschranke2);
  Serial.println (lichtwert2);
  
  //Walze 3
  lichtwert3 = digitalRead (lichtschranke3);
  Serial.println (lichtwert3);

  if (lichtwert1 >=1 && lichtwert2 >=1 && lichtwert3 >=1)
      rotate(1,1,1,1);

      else if (lichtwert2 >=1 && lichtwert3 >=1)
       rotate(1,0,1,1);

       else if (lichtwert3 >=1)
        rotate(1,0,0,1);

        else if (lichtwert1 >=1 && lichtwert3 >=1)
         rotate(1,1,0,1);

         else if (lichtwert1 >=1)
          rotate(1,1,0,0);

          else if (lichtwert2 >=1)
           rotate(1,0,1,0);

           else if (lichtwert1 >=1 && lichtwert2 >=1)
            rotate(1,1,1,0);
       
  else 
    initKal=false;
  delay (50);
  } while (initKal);

  kali = false;
}



void loop()
{ 
  if (kali) {
    kalibrieren();
   delay(2000);
  }

Zu meinem Zweiten problem.

Ich möchte das alle 3 Stepper ( walzen) gleichzeit starten und unterschiedlich lange Rotieren.
ich habe zwar ein Ansatz aber nicht die Lösung dazu.
Weiß da auch Jemand eine Lösung für mich?

 }

  int x = random(200, 600);
  int y = random(600, 750);
  int z = random(750, 1000);

  for (int i = 0; i < x; i++) // ich weiß das das klar ist dass die sich nur nach x richten aber ich weiß nicht wie ich es sont machen soll 
  {
    rotate(i, x, y, z);
  }
  delay( 1000 );

Zwar drehen die Sich unterschiedlich lange, aber wie man sieht möchte ich gerne das die hintereinander aufhören.

vielen Dank für tipps

Das mit der Kalibrierung habe ich jetzt hin bekommen.

Im Nachhinein total klar.
else if ist ja nur entweder oder. Also habe ich die jetzt zu if Befehle geändert. Zusätzlich ist mir aufgefallen das ich an den Analogen inputs mit digitalRead gearbeitet habe - Funktioniert, ja, aber der AnalogRead ist bei Lichtschranken doch etwas besser finde ich.

Fehlt nurnoch eine lösung für mein 2. Problemchen :confused:

vielleicht wenn Du die Rotatefunktion in dieser Art aufrufst:

int x = random(200, 600);
int y = random(200, 600);
int z = random(200, 600);

...
for (int i = 0; i < x+y+z; i++)
{
rotate(i, x, x+y, x+y+z);
}
....

Ich würde aber der Übersichtlichkeit halber die Variablen in der Funktion nicht auch x,y,z nennen.

Hey danke Jörg_L

Durch dich bin ich auf die Lösung gekommen.

Manchmal steht man echt aufn schlauch und sieht den Wald lauter... ihr Kennt es alle...

Die Lösung hatte ich schon die ganze zeit da, nur zu doof, ich Schrieb ja selbt

for (int i = 0; i < x; i++) // ich weiß das das klar ist dass die sich nur nach x richten aber ich weiß nicht wie ich es sont machen soll

Wenn ich jetzt c mit z austausche ( z dreht am längsten) klappt alles prima

Ich würde aber der Übersichtlichkeit halber die Variablen in der Funktion nicht auch x,y,z nennen.

Ja das mache ich auch nicht ( zum ende hin). sobald ich ein "themenblock" fertig habe wird es schön geschrieben und mit richtigen bezeichnung. Noch kann ichs machen weil es nicht riesen themen blöcke sind. Aber du hast recht. ich sollte es mir gleich richtig angewöhnen ::slight_smile: